![¿Fracaso con babel [griego] y lastpage, \frontmatter?](https://rvso.com/image/305904/%C2%BFFracaso%20con%20babel%20%5Bgriego%5D%20y%20lastpage%2C%20%5Cfrontmatter%3F.png)
Tengo un documento grande para el cual quería generar "encabezados precompilados" (Exteriorización de TikZ y mylatex(nota, \jobname debería ser el mismo)) y pensé en usarlo mylatexformat
(pdflatex ultrarrápido con precompilación). Eso terminó en fracaso, así que al intentar derivar un MWE para publicar, creo que me topé con un problema más preciso.
La estructura se parece a esto:
setup/_preamble.tex
\documentclass[10pt]{book}
\usepackage{cmap}% (causes pdflatex: dangling objects discarded, no output file produced. with -ini/mylatexformat)
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % ok
% \usepackage[greek,english]{babel} % BAD with lastpage (+\frontmatter)!!!!
\usepackage{amsmath,amssymb}
\usepackage{csquotes}
\usepackage[backend=biber]{biblatex}
\usepackage{tikz}
\usepackage{siunitx}
\usepackage{lastpage}
test.tex
%% This is the file `test.tex'
\input{setup/_preamble.tex}
\csname endofdump\endcsname%
\usepackage{lipsum}
\begin{document}
\frontmatter
\clearpage
\section{Something}
\lipsum[1-5]
\end{document}
Si compilo esto con pdflatex test.tex
, se compila bien.
"Compilo" el test.fmt
archivo así:
$ pdflatex -ini -jobname="test" "&pdflatex" mylatexformat.ltx "test.tex"
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (INITEX)
...
Beginning to dump on file test.fmt
(preloaded format=test 2015.2.18)
31400 strings of total length 611843
661162 memory locations dumped; current usage is 654&652915
28229 multiletter control sequences
\font\nullfont=nullfont
\font\OMX/cmex/m/n/10=cmex10
...
20 words of pdfTeX memory
8 indirect objects
No pages of output.
pdfTeX warning: pdflatex: dangling objects discarded, no output file produced.
Transcript written on test.log.
Luego construyo el .pdf
archivo usando el archivo precompilado .fmt
de esta manera (no incluyo el %&test
comentario como la primera línea del test.tex
archivo, sino que lo especifico en la línea de comando):
$ pdflatex --file-line-error --synctex=1 "&test" test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=pdflatex)
restricted \write18 enabled.
...
==============================================================================
JOB NAME : "test"
CUSTOMISED FORMAT: "test"
PRELOADED FILES:
setup/_preamble.tex
book.cls 2014/09/29 v1.4h Standard LaTeX document class
...
==============================================================================
(mylatexformat)Info: start reading document "test"
(mylatexformat) on input line 6. (\endofdump)
==============================================================================
(/media/disk/texlive/2014/texmf-dist/tex/latex/lipsum/lipsum.sty)
...
Output written on test.pdf (1 page, 41826 bytes).
SyncTeX written on test.synctex.gz.
Transcript written on test.log.
Entonces, el MWE tal como está funciona con el .fmt
archivo "precompilado".
Ahora, si comenta \usepackage[english]{babel}
y descomenta la \usepackage[greek,english]{babel}
línea en setup/_preamble.tex
: el .fmt
archivo se puede compilar correctamente, PERO la compilación .pdf
falla con:
$ pdflatex --file-line-error --synctex=1 "&test" test.tex
...
==============================================================================
JOB NAME : "test"
CUSTOMISED FORMAT: "test"
PRELOADED FILES:
setup/_preamble.tex
...
==============================================================================
(mylatexformat)Info: start reading document "test"
(mylatexformat) on input line 6. (\endofdump)
==============================================================================
(/media/disk/texlive/2014/texmf-dist/tex/latex/lipsum/lipsum.sty)
...
(/media/disk/texlive/2014/texmf-dist/tex/latex/siunitx/siunitx-abbreviati
ons.cfg)<<ot1.cmap>><<ot1tt.cmap>><<t1.cmap>>
AED: lastpage setting LastPage
[1{/media/disk/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
]
./test.tex:16: Use of \\@lipsum doesn't match its definition.
\text@command #1->\def \reserved@a {
#1}\ifx \reserved@a \@empty \let \check@...
l.16 \end{document}
?
... y el fallo de \lipsum
es, supongo, sólo un síntoma de algún otro problema.
Sin embargo, la .pdf
compilación se realizará correctamente con la versión precompilada .fmt
y [greek,]{babel}
si se comenta \usepackage{lastpage}
(in _preamble.tex
); ¿O si se comenta \frontmatter
(en )?test.tex
Y después de esto, descubrí que la .pdf
compilación fallará incluso sin usar .fmt
un archivo precompilado (es decir, solo con pdflatex test.tex
), incluso si en mi documento original, nunca recibí un error como este, antes de comenzar a alterar los .fmt
archivos. (Aunque debo tener en cuenta que el error que recibo en mi documento original no se expresa como un error con \lipsum
, el mensaje de error es diferente)
¿Qué estoy haciendo mal y cómo puedo hacer que este conjunto de paquetes se cree con un .fmt
archivo precompilado sin errores?
(PD: puede estar relacionado conPosible error en babel-greek, TexLive 2014(ya que también hubo un problema con un .fmt
archivo allí, pero no estoy seguro).
Respuesta1
Ok, resulta que este es exactamente el mismo problema resuelto por la respuesta de @egreg enError al utilizar el griego babel, mparhack y \pagenumbering{roman}. Aquí también [greek,]{babel}
se redefine \thepage
el uso de no expandible \textlatin
, pero el problema aquí ocurre porque {lastpage}
quiere escribir \thepage
en el .aux
archivo, a través de su función/macro \lastpage@putl@bel
.
Entonces una solución es agregar esto a setup/_preamble.tex
:
\usepackage{lastpage}
\makeatletter
\let\oldlastpage@putl@bel\lastpage@putl@bel
\renewcommand*\lastpage@putl@bel{%
\bgroup
\let\textlatin\@firstofone % make \textlatin a no-op
\oldlastpage@putl@bel%
\egroup
}
\makeatother
... y luego, aparentemente, todo funciona bien [greek,english]{babel}
, incluso cuando se genera y usa el .fmt
archivo precompilado.
Entonces, después de todo, esto no tuvo mucho que ver mylatexformat
como tal (por lo que aún tendré que buscar un MWE para demostrar el problema que todavía tengo :)
)
Por cierto, vi esto usando el paquete {trace}
así test.tex
:
\input{setup/_preamble.tex}
\csname endofdump\endcsname%
\usepackage{lipsum}
\usepackage{trace}
\begin{document}
\frontmatter
\clearpage
\section{Something}
\lipsum[1-5]
\traceon % trace only the \end{document} part
\end{document}
... y luego comparar los .log
archivos (para [greek,english]{babel}
ejecutar versus [english]{babel}
uno) en meld
.