2012-02-26 21 views
6

En Látex estándar, se puede usar algo como ...Org-mode & Latex export: ¿alguna forma de poner nombres cortos y largos en comandos de seccionamiento? ¿Soluciones provisionales?

\section[short head]{A longer and more meaningful heading version for the section} 

... que da a la vez una versión larga y corta de una sección (u otro comando de seccionamiento) Por lo tanto, teniendo en cuenta los dos títulos significativos de seccionamiento ' 'y, también, cabezas de ejecución de aspecto razonable, TOCs, navegación de beamer, etc.

¿Hay alguna manera de lograr esto fácilmente en modo org? (Esto es sin una codificación rigurosa de los comandos de seccionamiento en fragmentos de LATEX y, por lo tanto, derrotando la mayor parte de la flexibilidad de cambiar los niveles de seccionamiento y reutilizar el contenido para beamer, libros y clases de artículos, ¿cuál es mi razón para querer probar orgmode, en primer lugar?)

Intenté una "solución" que no funcionó. Intenté editar las posibles clases de exportación de látex añadiendo otra clase al org-export-latex-classes. Esta nueva clase cambia los comandos de seccionamiento de \section{%s} a \section%s (EDIT-Fixed typo in slashes). Luego probé usando [short]{longer version} en secciones de modo orgánico del archivo. Funcionó, excepto que actuaba como si el encabezado de la sección de versión más larga fuera solo "{" y "versión más larga" era el texto del cuerpo. ¿Qué pasa con eso?

+1

¿Seguro que utilizó '/ section {% s} 'y'% s' sección de/en lugar de '\ section {% s}' y '\ section% s'? –

+1

¡Usa barras diagonales en emacs reales! Por lo tanto, ** no ** el problema. (aunque el uso de IDE de LaTex crea un problema ocasional en "la memoria de los dedos", como muestra mi estúpido error en el cuadro de comentarios ;-)). Por supuesto,% s está escapando de las llaves ... dado que se hace pirateo en org Hay una alternativa (por ejemplo,% foo) que no escapa al contenido? ¿Hay un mejor truco para el problema central? Me parece que no soy la única persona que probablemente tenga títulos de sección larga que quiera usar la variante corta para TOCs y otra navegación. –

Respuesta

1

Has tenido la idea correcta al crear tu propia clase LaTeX. El problema radica en la forma en que las plantillas se llenan con la función predeterminada org-fill-template. No soy tan bueno con Lisp, pero este truco hará el truco. Añadir lo siguiente a su .emacs archivo:

(defun my-section (level text) 
    (let* ((in "") (out "") 
     (short-title (if (string-match "\\[.*\\]" text) 
          (substring text (match-beginning 0) 
            (match-end 0)) 
            nil))) 
    (if short-title (setq text (substring text (match-end 0) -1))) 
    (setq in (org-fill-template 
       "\\section%S{%s}" 
       (list (cons "S" (or short-title "")) 
        (cons "s" (or text "")))) 
      out (copy-sequence "\\end{section}")) 
    (cons text (list in out in out)))) 

(add-to-list 'org-export-latex-classes 
      '("test" 
       "\\documentclass{article}" 
       my-section)) 

Esto declara una nueva clase de látex mediante la adición de una clase de "prueba" a la org-export-latex-classes. Aquí declaramos, en lugar de las cosas normales \\section{%s}, una función que toma dos parámetros --- el nivel actual y el texto del titular --- y devuelve una celda de cons modificada. Se pueden encontrar algunos detalles de esta información en org-latex-export.el.

Por encima de la adición a la lista es donde realmente definimos la función. Esta es honestamente una versión hacky, y saqué mucho de la función org-beamer-sectioning en el archivo org-beamer.el. Esta función básicamente busca en el título cualquier cosa que sea como una etiqueta corta LaTeX (es decir, [....]) lo quita del título y lo pega antes de la etiqueta de la sección real. En este momento, este hack solo generará declaraciones \section, sin importar cuán profundo sea el nivel; si quieres algo más inteligente como \chapter o \subsection o incluso elementos sin numerar, necesitarás hacer más Lisping; nuevamente, vea org-beamer.el para obtener ayuda.

Este bit de org-mode código

#+latex_class: test                

* [short 1] this is 1 star 
test 
** this is a 2 star 
test 
*** [short 3] this is a 3 star 
test 
**** what happens 

exportaciones al látex como (sólo las secciones pertinentes se muestran aquí):

\section[short 1]{ this is 1 star} 
\label{sec-1} 

test 
\section{ this is a 2 star } 
\label{sec-1-1} 

test 
\section[short 3]{ this is a 3 star} 
\label{sec-1-1-1} 

test 
\section{ what happens } 
\label{sec-1-1-1-1} 
\end{section} 
\end{section} 
\end{section} 
\end{section} 

Aunque no es una solución recta org-mode, parece que funciona y se puede un punto de partida para ti. Uno de estos días podría tratar de escribirlo correctamente y doblarlo en la distribución org-mode.

0

Es posible usar los siguientes comandos en latex para definir el texto que debe aparecer en el encabezado para reemplazar los nombres de las secciones. Pero el TOC todavía contendrá los nombres originales.

\chaptermarks 
\sectionmarks 
\subsectionmarks 
... 

Así, en el modo Org puede escribir

* Long section title 
#+LaTeX: \sectionmark{Short title} 

edición: en realidad no funciona en la misma página en la que aparece el nombre de sección. Solo en este caso, el nombre completo aún se coloca en el encabezado.

4

Desde la versión 8.0, la estrategia "org-export-latex-classes" ya no funcionará.

En cambio, y me atrevo a decir mucho más elegantemente, puede establecer la propiedad ALT_TITLE para el encabezado.
Ver http://orgmode.org/manual/Table-of-contents.html.

El siguiente código org:

* The Long Title of Section 1 
:PROPERTIES: 
:ALT_TITLE: Section 1 
:END: 
Lorem ipsum. 

** The Long Title of Subsection 1-1 
:PROPERTIES: 
:ALT_TITLE: Subsection 1-1 
:END: 
Dolor sit amet. 

exportará a LaTeX como:

[...] 

\section[Section 1]{The Long Title of Section 1} 
\label{sec-1} 
Lorem ipsum. 

\subsection[Subsection 1-1]{The Long Title of Subsection 1-1} 
\label{sec-1-1} 
Dolor sit amet. 
Cuestiones relacionadas