ES-TEX Archivos

Usuarios hispanohablantes de TeX

ES-TEX@LISTSERV.REDIRIS.ES

Opciones: Vista Forum

Use Monospaced Font
Por defecto enseñar Text Part
Mostrar todas las cabeceras de correo

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

Print Responder
Subject:
Emisor:
Juan Manuel Macías <[log in para visualizar]>
Reply To:
Usuarios hispanohablantes de TeX <[log in para visualizar]>
Fecha:
Sun, 5 Sep 2021 12:41:23 +0000
Content-Type:
text/plain
Parts/Attachments:
text/plain (115 lines)
Hola de nuevo:

Pues parece que he encontrado una solución (al menos para un escenario
concreto) que me empieza a satisfacer: usando el paquete flowfram y todo
dentro de Org Mode, sin necesidad de recurrir a Scribus.

Como había comentado, el escenario es el siguiente: el texto de las
páginas de la derecha, el de la traducción, debe formar parte del
documento principal. Pero el de las páginas de la izquierda, que es una
edición crítica en griego, consiste en un PDF compilado a partir de otro
documento. Cada página de ese PDF debe enfrentarse con cada página del
texto de la traducción. Y aquí es donde viene flowfram.

Para entender un poco lo que viene a hacer flowfram, el texto del
documento fluye a través de "flowframes" previamente definidos, cada uno
con su forma y tamaño y asociados a rangos de páginas. Como en los
programas de maquetación. Esto nos permite componer la traducción sólo
en las páginas impares, dejando vacías las pares. Es decir, partiendo de
un mínimo ejemplo, podemos definir estos dos flowframes:

Uno para la parte introductoria, donde el texto irá por páginas pares e
impares. En nuestro caso, este flowframe irá de la pág. 1 a la 3:

\newflowframe[1-3]{\textwidth}{\textheight}{0pt}{0pt}[antes]

El flowframe de la traducción estará en las páginas impares:

\newflowframe[odd]{\textwidth}{\textheight}{0pt}{0pt}[traduccion]

de éste excluiremos las páginas anteriores de la parte introductoria

\setflowframe*{traduccion}{excludepages={1,2,3}}

Vale, ya tenemos arreglada la parte de la traducción. Además, como
formará parte del documento principal, podemos añadir índices,
referencias cruzadas en las notas y demás. ¿Cómo solucionamos lo de
colocar cada página del PDF en griego enfrentada a su correspondiente
pág. de la traducción? Pues aquí es donde viene otro tipo de caja que
tiene flowfram, las cajas dinámicas. Se puede definir una caja dinámica
por cada página par en blanco y añadirle un contenido, que será una
página del pdf insertada con pdf pages (la estructura se pude ver en
este esquema que he hecho: https://ibb.co/b1j3mGv).

Claro, el problema es que cada caja dinámica hay que definirla
expresamente en el preámbulo, darle un nombre y luego su contenido
asociado. Si el PDF que queremos insertar tiene 300 páginas no es un
trago agradable, pues hay que definir 300 cajas dinámicas, junto a su
contenido: total=600 líneas. Pero aquí es donde viene Org Mode y Elisp.
Si trabajamos desde Org Mode, podemos escribir una función que se
ejecute durante la exportación y que escriba todo eso en el preámbulo
por nosotros. Esta función que he escrito admite dos argumentos: la
página donde queramos que se inicie el texto en griego y el número de
páginas que queremos insertar del PDF. Tan sencillo como eso. La función
viene a ser esta:

(defun mi-flowfram-paginas-pares (desde pags-pdf)
    (let* ((contador 0)
	   (contador-desde (- desde 2)))
      (with-temp-buffer
	(dotimes (num pags-pdf)
	  (let ((numero (number-to-string (setf contador (+ contador 1))))
		(numero-desde (number-to-string (setf contador-desde (+ contador-desde 2)))))
	    (insert (concat
		     "#+LaTeX_Header: \\newdynamicframe["
		     numero-desde
		     "]{\\textwidth}{\\textheight}{0pt}{0pt}[orig"
		     numero
		     "]\n#+LaTeX_Header: \\setdynamiccontents*{orig"
		     numero
		     "}{\\includepdf[pages={"
		     numero
		     "},noautoscale=true,pagecommand={\\thispagestyle{plain}}]{doc1.pdf}}\n\n"))))
	(setq mi-flowfram-res (buffer-string)))
      mi-flowfram-res))

Luego, en cualquier lugar de mi documento de Org incluyo este cuadro de
código, que llama a la función durante el proceso de la exportación. En
este caso quiero que el texto del pdf comience en la página 4 de mi
documento y que se carguen cuatro páginas del pdf:

#+begin_src emacs-lisp :results raw :exports results :var trad-desde=4 pags-pdf=4
   (mi-flowfram-paginas-pares trad-desde pags-pdf)
#+end_src

Y ya con eso bastaría. Y un plus: como el PDF que viene del otro
documento hay que tenerlo al día y compilarlo antes, añado también este
código con un proceso centinela: primero compila el otro documento, y
hasta que no esté el PDF generado no exporta el documento principal. Así
todo se hace desde el documento principal, sin necesidad de compilar
varias veces:

#+begin_src emacs-lisp :eval never-export :exports none :results silent
  (let* ((archivo "doc1.tex")
	 (comando-latexmk
	  (start-process "latexmk" nil "/usr/bin/latexmk" "-lualatex" "-e" "'$lualatex=q/lualatex %O -shell-escape %S/'" archivo)))
    (set-process-sentinel
     comando-latexmk
     (lambda (p e)
       (when (= 0 (process-exit-status p))
	 (org-open-file
	  (org-latex-export-to-pdf))))))
#+end_src

He hecho este vídeo de muestra para ver el proceso en acción:
https://vimeo.com/598237960

Saludos,

Juan Manuel 

----------------------------------------------------
Normas para el correcto uso del correo electrónico:
		http://www.rediris.es/mail/estilo.html
----------------------------------------------------

ATOM RSS1 RSS2