¿Es posible exportar contenido de subárboles sin sus encabezados?

28

Borro documentos en modo org y los exporto a LaTeX, HTML, etc., según sea necesario. Frecuentemente uso la etiqueta :no_export:cada vez que no quiero que se muestre un determinado subárbol en la salida.

Lo que también quiero es que la exportación ignore por completo ciertos encabezados de subárbol , pero no ignore el contenido del subárbol bajo ese encabezado. En otras palabras, ciertos subárboles deben exportarse como si su contenido fuera solo una continuación del padre, en lugar de tener su propio subárbol.

Idealmente estoy imaginando una etiqueta como :no_title:. Quiero que mi esquema del modo de organización se vea más o menos como estoy acostumbrado. Pero consideraría otros enfoques con resultados similares.

Para ilustrar, aquí hay un MWE de un documento redactado en modo org.

* Chapter 1
** Section 1
*** Paragraph 1      :no_title:
First paragraph of text in the section.
*** Paragraph 2      :no_title:
Second paragraph of text in the section.
* Chapter 2
** Section 1
*** Subsection 1
**** Paragraph 1      :no_title:
First paragraph of text in the subsection.
**** Paragraph 2      :no_title:
Second paragraph of text in the subsection

Cuando exporto eso actualmente, obtengo algo como esto:

1 Capítulo 1

1.1 Sección 1

1.1.1 Párrafo 1: no_title:

Primer párrafo del texto en la sección.

1.1.2 Párrafo 2: no_title:

Segundo párrafo del texto en la sección.

2 Capítulo 2

2.1 Sección 1

2.1.1 Subsección 1

◊ 2.1.1.1 Párrafo 1: no_title:

Primer párrafo del texto en la subsección.

Pero lo que quiero es más así:

1 Capítulo 1

1.1 Sección 1

Primer párrafo del texto en la sección.

Segundo párrafo del texto en la sección.

2 Capítulo 2

2.1 Sección 1

2.1.1 Subsección 1

Primer párrafo del texto en la subsección.

Brian Z
fuente

Respuestas:

27

Esta puede ser una forma preferida (debido a su simplicidad) de lograr su objetivo: parece haber quedado enterrado en los comentarios de otra respuesta:

  1. Agregue lo siguiente a su .emacsarchivo:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Use la ignoreetiqueta en los titulares que le gustaría haber ignorado (sin ignorar su contenido)

NOTA: si está utilizando ELPA para instalar org-mode, debe agregar el repositorio de org-mode a su lista de repositorios de ELPA. Ver aquí para más detalles. Una vez hecho esto, actualice la lista de paquetes ( M-x package-refresh-contents) e instale el org-plus-contribpaquete (por ejemplo, con M-x package-install). No olvide deshacerse de las instalaciones antiguas de modo org.

marca
fuente
2
Esta es la respuesta correcta.
rasmus
Acepté esto como la respuesta a pesar de que no funcionará para mí. Intenté cargar org-extra.el pero todavía faltaba alguna otra función (estoy atascado con Org 8.2.4).
Brian Z
No puedo encontrar el paquete ox-extra ...
Toothrot
1
@Toothrot está en la contrib/lispcarpeta - vea orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - en su archivo de configuración de emacs, puede que necesite agregar una línea como (add-to-list 'load-path "/path/to/contrib/lisp").
Mark
Tenga en cuenta que esto solo palabras en org 8.3+. Y no puede simplemente tomar ox-extra.el, que tiene dependencias org 8.3+. Obtendrá errores al exportar sobre no poder encontrar los archivos necesarios.
Dodgie
16

, esto es completamente posible. Agregue el siguiente código a su archivo init:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)

Expresiones de gratitud

Esta pregunta ya se ha hecho en StackOverflow antes (con un enfoque y una redacción diferentes, lo que probablemente sea la razón por la que no pudo localizarlo cuando buscó en Internet antes de publicar aquí). El código anterior es una versión simplificada del código en la respuesta aceptada ; funciona para el nuevo exportador introducido en org-mode8.0 y es independiente del backend .

Actualizar

Como se discutió en los comentarios, el código anterior hace que los contenidos de las entradas etiquetadas :no_title:desaparezcan si están precedidas por una entrada etiquetada para excluirse del documento exportado. Por ejemplo, exportar el siguiente documento producirá un documento con un título y TOC, pero sin contenido:

#+EXCLUDE_TAGS: no_export

* No export                          :no_export:
  This is not meant for you to see.
* No title                           :no_title:
  You should see this.

La razón de esto es que org-modeelimina el título etiquetado :no_title:antes de eliminar la entrada cuyo título está etiquetado :no_export:. Como resultado, cuando se no_exporttrata de eliminar la entrada, trata el contenido de la no_titleentrada como perteneciente a la no_exportentrada anterior . Esto tiene mucho sentido porque ya no hay ningún elemento estructural (encabezado) que separe el contenido de las entradas originales.

Para resolver este problema, podemos transferir la responsabilidad de eliminar no_exportentradas a org-remove-headlines. De esta manera, nos aseguramos de que todas las no_exportentradas hayan desaparecido antes de que se eliminen los titulares de las no_titleentradas:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (let ((beg (point)))
                                (outline-next-visible-heading 1)
                                (backward-char)
                                (delete-region beg (point))))
                   "no_export" tree)
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)
itsjeyd
fuente
He estado usando esto mucho, ¡así que gracias! Pero noté un problema ... Si un encabezado etiquetado con no_exportencabezado viene justo antes de uno etiquetado no_title, entonces el contenido del segundo encabezado tampoco se exporta.
Brian Z
@BrianZ ¡De nada! ¿Son los hermanos no_exporty no_titleencabezados (es decir, tienen el mismo número de estrellas principales)? Si no, ¿cuál de los dos títulos tiene más estrellas?
itsjeyd
Ellos son hermanos. La exportación de este ejemplo de juguete no tiene contenido para mí (solo título, tabla de contenido, etc.) pastebin.com/KaiK9qJm
Brian Z
1
@BrianZ Por sí mismo, org-remove-headlineses solo una función; no te ayudará mucho si nunca se llama desde cualquier lugar. Entonces sí, aún necesita evaluar la línea (add-hook 'org-export-before-processing-hook #'org-remove-headlines)para permitir el comportamiento correcto. Probablemente debería haber sido explícito sobre eso en las ediciones de mi respuesta original. En cuanto a las advertencias que estás viendo: no las tengo con Emacs 24.4 de vainilla y la versión 8.2.10 del Modo Org. Para deshacerse de la advertencia que menciona, puede intentar (require 'org-agenda)antes de evaluar la add-hooklínea.
itsjeyd
2
Esta característica también se implementa como org contrib. Ref: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/…
rudolfo.christ