ES-TEX Archivos

Usuarios hispanohablantes de TeX

ES-TEX@LISTSERV.REDIRIS.ES

Opciones: Vista Clásica

Use Monospaced Font
Por defecto enseñar Text Part
Esconda cabeceras de correo

Tema: [<< Primero] [< Prev] [Siguiente >] [Último >>]

Print Responder
Received: by LISTSERV.REDIRIS.ES (LISTSERV-TCP/IP release 17.0) with spool id 5175411 for [log in para visualizar]; Thu, 12 May 2022 11:57:39 +0200 from mx01.puc.rediris.es (outbound4mad.lav.puc.rediris.es [130.206.19.145]) by listserv.backend.rediris.es (Postfix) with ESMTP id 96E60192F12 for <[log in para visualizar]>; Thu, 12 May 2022 11:57:39 +0200 (CEST) from mout01.posteo.de (mout01.posteo.de [185.67.36.65]) by mx01.puc.rediris.es with ESMTP id 24C9vbl9019870-24C9vblB019870 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO) for <[log in para visualizar]>; Thu, 12 May 2022 11:57:39 +0200 from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id 599A9240026 for <[log in para visualizar]>; Thu, 12 May 2022 11:57:37 +0200 (CEST) from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4KzRz407jlz9rxY for <[log in para visualizar]>; Thu, 12 May 2022 11:57:35 +0200 (CEST)
Content-Type: text/plain; charset=utf-8
Date: Thu, 12 May 2022 09:57:44 +0000
Emisor: Juan Manuel Macías <[log in para visualizar]>
X-FEAS-SPF: spf-result=pass, ip=185.67.36.65, helo=mout01.posteo.de, [log in para visualizar]
Sender: Usuarios hispanohablantes de TeX <[log in para visualizar]>
Reply-To: Usuarios hispanohablantes de TeX <[log in para visualizar]>
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-FEAS-DKIM: Valid
X-FE-Policy-ID: 21:3:1:listserv.rediris.es
Parts/Attachments: text/plain (153 lines)
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
------------------------------------------------------

ATOM RSS1 RSS2