Hola a todos:

- Versión corta: una función que he escrito para definir plantillas de
preámbulo en Org a partir de un documento LaTeX.

- Versión larga:

Mucha gente que empieza a usar Org para crear documentos de LaTeX se
pregunta al principio si hay alguna forma de definir nuestros propios
preámbulos personalizados, sin necesidad de tener que añadir las líneas
del preámbulo a mano mediante la directiva '#+latex_header'. Hay varias
formas de lograrlo, a gusto de cada cual. Una manera muy práctica es ir
creando nuestras propias plantillas de preámbulo, que es lo que Org
denomina, impropiamente, "latex-classes". El origen de este nombre viene
porque las plantillas que trae Org de fábrica se corresponden con las
clases estándar de LaTeX, pero es algo que puede confundir al usuario de
LaTeX que aterriza en Org. O sea, que cuando Org dice "latex-classes"
está diciendo algo como "plantillas de preámbulos". Estas plantillas las
va almacenando en la lista `org-latex-classes' y cada una se encarga de
definir el contenido del preámbulo así como el nombre y estructura de
las secciones que han de tener los documentos generados con ella.

Para un usuario novato plantean, no obstante, un par de inconvenientes:
a) Deben estar escritas en la sintaxis de Elisp; b) cuando se trata de
preámbulos largos con mucho código puede ser latoso traducir todo a
Elisp. Para mitigar esto he escrito hace poco una función que se encarga
de hacer todo ese trabajo sucio: convierte el búfer abierto de LaTeX en
una expresión Lisp adecuada para poder añadirla a 'org-latex-classes'.
El procedimiento es simple. Basta con que el documento de LaTeX que
queremos usar como plantilla tenga esta estructura:

- preámbulo (aquí cabe de todo)

- \begin{document}

- Una lista de nombres (literales) de sección (un nombre por línea). P. ej., algo
así como:

   part
   chapter
   section
   subsection

- \end{document}

Llamamos a la función, nos preguntará por el nombre que queremos darle a
nuestra plantilla y al momento se abrirá una ventana con el código Lisp
generado a partir del documento LaTeX. Copiamos ese código y lo añadimos
a nuestro archivo de inicio así:

(add-to-list 'org-latex-classes 'nuestro-código-copiado)

Ojo, hay que poner antes de nuestro código copiado una comilla simple,
que es un requerimiento de la sintaxis de Lisp para que eso pase sin
evaluar.

Si queremos usar esa plantilla en alguno de nuestros documentos,
añadiremos, en cualquier parte del documento, esto:

#+latex_class: nombre-plantilla

Podemos, también, añadir esto otro si queremos modificar las opciones de
\documentclass:

#+latex_class_options: [draft,10pt]

Si alguien quiere probar mi función, la pego aquí como postdata a este
correo. En otra ocasión veremos cómo crear nuestros propios archivos
*.sty usando las funcionalidades de programación literaria de Org, que
es mucho más sencillo que mediante la utilidad de LaTeX docstrip.
Podremos crear de esa forma, por un lado, el archivo sty (ubicado en la
ruta adecuada, automáticamente); y por otro lado, la documentación del
código, en PDF, HTML, odt, docx, etc.

Saludos,

Juan Manuel

PD: Aquí va la función. Está en inglés macarrónico, porque también la
compartí en la lista de Org:

(defun my-org/create-new-class-from-latex-buffer ()
    "Convert the current LaTeX buffer to an appropriate Elisp
  expression to add to `org-latex-classes'. The LaTeX document must
  have the following structure:
   - Preamble
   - `\begin{document}'
   - A list of section names (one name per line). For example:
     section
     subsection
     susbsubsection
     etc
  - `\end{document}'"
    (interactive)
    (if (not (equal (format "%s" major-mode) "latex-mode"))
	(error "Not in a LaTeX buffer")
      (let* ((class-name (read-from-minibuffer "Class name: "))
	     (preamble-beg (with-current-buffer
			       (buffer-name)
			     (save-excursion
			       (goto-char (point-min))
			       (point))))
	     (preamble-end (with-current-buffer
			       (buffer-name)
			     (save-excursion
			       (goto-char (point-min))
			       (re-search-forward "\\\\begin{document}" nil t)
			       (beginning-of-line)
			       (point))))
	     (packages "[NO-DEFAULT-PACKAGES]
		       [PACKAGES]
		       [EXTRA]")
	     (preamble (concat
			(buffer-substring-no-properties preamble-beg preamble-end)
			packages))
	     (preamble-list (list preamble))
	     (sections-list)
	     (sections-list-populate (with-current-buffer (buffer-name)
				       (save-excursion
					 (goto-char (point-min))
					 (let ((beg-sec
						(save-excursion
						  (re-search-forward "\\\\begin{document}" nil t)
						  (point)))
					       (end-sec
						(save-excursion
						  (re-search-forward "\\\\end{document}" nil t)
						  (beginning-of-line)
						  (point))))
					   (save-restriction
					     (narrow-to-region beg-sec end-sec)
					     (while (re-search-forward "\\(^.+\\)" nil t)
					       (push (substring-no-properties (match-string 1)) sections-list)))
					   (reverse sections-list)))))
	     (section-list-final (mapcar
				  (lambda (x)
				    (let ((car (format "\\%s{%%s}" x))
					  (cdr (format "\\%s*{%%s}" x)))
				      (cons car cdr)))
				  sections-list-populate))
	     (list-final (append (list class-name) preamble-list section-list-final))
	     (format-list (format "%S" list-final)))
	(when (get-buffer "*class*")
	  (kill-buffer "*class*"))
	(get-buffer-create "*class*")
	(with-current-buffer "*class*"
	  (insert format-list))
	(temp-buffer-window-show "*class*"))))

----------------------------------------------------
Archivos de ES-TEX: http://listserv.rediris.es/archives/es-tex.html
------------------------------------------------------