Falha com babel [grego] e lastpage, \frontmatter?

Falha com babel [grego] e lastpage, \frontmatter?

Tenho um documento grande para o qual queria gerar "cabeçalhos pré-compilados" (Exteriorização e mylatex do TikZ(observe que \jobname deve ser o mesmo)) e pensei em usar mylatexformatpara isso (pdflatex ultrarrápido com pré-compilação). Isso terminou em fracasso, então, ao tentar derivar um MWE para postar, acho que me deparei com um problema mais preciso.

A estrutura é mais ou menos assim:

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}

Se eu compilar isso com pdflatex test.tex, ele compilará bem.

Eu "compilo" o test.fmtarquivo assim:

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

Então eu construo o .pdfarquivo usando o .fmtarquivo pré-compilado como este (não incluo o %&testcomentário como a primeira linha do test.texarquivo, mas especifico-o na linha 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.

Portanto, o MWE como está funciona com o .fmtarquivo "pré-compilado".

Agora, se você comentar \usepackage[english]{babel}e descomentar a \usepackage[greek,english]{babel}linha setup/_preamble.tex: o .fmtarquivo pode ser construído com sucesso, MAS a construção .pdffalha com:

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

? 

... e o fracasso \lipsumé, eu acho, apenas um sintoma de algum outro problema.

No entanto, a .pdfcompilação será bem-sucedida com pré-compilado .fmte [greek,]{babel}se \usepackage{lastpage}(in _preamble.tex) for comentado; OU se \frontmatter(in test.tex) for comentado?

E depois disso, descobri que a .pdfcompilação irá falhar mesmo sem usar .fmto arquivo pré-compilado (ou seja, apenas com pdflatex test.tex) - mesmo que no meu documento original, nunca tenha recebido um erro como esse, antes de começar a mexer nos .fmtarquivos?! (Embora, devo observar, o erro que recebo no meu documento original não seja expresso como um erro com \lipsum, a mensagem de erro é diferente)

O que estou fazendo de errado - e como posso fazer com que esse conjunto de pacotes seja compilado com um .fmtarquivo pré-compilado sem erros?

(PS: pode estar relacionado aPossível bug no babel-greek, TexLive 2014- pois também houve um problema com um .fmtarquivo ali, mas não tenho certeza).

Responder1

Ok, acontece que este é exatamente o mesmo problema resolvido pela resposta de @egreg emErro ao usar o grego babel, mparhack e \pagenumbering{roman}. Aqui também [greek,]{babel}redefine \thepageusar o inexpansível \textlatin- mas o problema aqui ocorre porque {lastpage}quer escrever \thepageno .auxarquivo, através de sua function/macro \lastpage@putl@bel.

Portanto, uma solução é adicionar isso ao 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

... e então, aparentemente, tudo funciona bem [greek,english]{babel}- mesmo ao gerar e usar o .fmtarquivo pré-compilado.

Então, afinal, isso não teve muito a ver com mylatexformatisso (então ainda terei que procurar um MWE para demonstrar o problema que ainda tenho :))

A propósito, eu vi isso usando o pacote {trace}assim 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}

... e depois comparar os .logarquivos (para [greek,english]{babel}execução versus [english]{babel}um) em meld.

informação relacionada