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 ------------------------------------------------------