Referenz „letzte Seite“ undefiniert, nur zweimaliges Ausführen von Latex zeigt das gewünschte Ergebnis

Referenz „letzte Seite“ undefiniert, nur zweimaliges Ausführen von Latex zeigt das gewünschte Ergebnis

Wenn ich lualatex auf einer .tex-Datei ausführe, erhalte ich ??als Ergebnis nur „letzte Seite“ in meinem Dokument. Wenn ich lualatex dann ein zweites Mal ausführe, 2wird das richtige Ergebnis () in der Fußzeile des Dokuments angezeigt.

Hauptfrage:Wie kann ich vermeiden, Latex zweimal auf demselben Dokument (.tex-Datei) ausführen zu müssen?

Es wäre schön, wenn es dafür eine Lösung gäbe, da ich Latex-Dateien dynamisch aus Java generiere und jeder Konsolenaufruf lualatex doc.texungefähr 2,5 Sekunden dauert.

Verwendete Quellen:lualatex auf der Konsole und test.tex -> mwe
Konsolenbefehl: lualatex test.tex
Fehlerausgabe:
LaTeX Warning: Reference `LastPage' on page 1 undefined on input line 23 Package lastpage Warning: Rerun to get the references right on input line 23
MWE:

\documentclass[8pt,a4paper]{extarticle}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{lastpage}
\usepackage[left=1.5cm, right=1.5cm, top=0.0cm, bottom=0.0cm, headheight=42pt, includeheadfoot]{geometry}
\usepackage{fancyhdr}
\usepackage{lipsum}

\fancypagestyle{style1}{
    \fancyhf{}
    \fancyhead[L]{}
    \fancyhead[R]{}
    \fancyfoot[L]{\scriptsize Test}
    \fancyfoot[R]{\scriptsize Seite \textbf{\thepage} von \textbf{\pageref{LastPage}}}
    \setlength{\topmargin}{-70pt}
    \setlength{\headsep}{10pt}
    \setlength{\footskip}{20pt}
}

\begin{document}
    \pagestyle{style1}
    \lipsum[1-15]
\end{document}  

Antwort1

Normalerweise kann TeX Daten wie die Seitenzahl auf den ersten Seiten nicht verwenden, da LaTeX noch nicht weiß, wie viele Seiten es sein werden. Es gibt aber einen Trick: Man kann auf jeder Seite, auf der die Seitenzahl stehen soll, eine Referenz auf ein PDF-XObject einfügen. Ein XObject ist ein separates Objekt in einer PDF-Datei, auf das in beliebiger Reihenfolge verwiesen werden kann. Dieses XObject kann man dann später mit der Seitenzahl füllen.

Eine weitere Komplikation besteht darin, dass LuaTeX Sie zwingt, den Inhalt von XObject festzulegen, bevor Sie es verwenden können. Sie können es jedoch austricksen, indem Sie die PDF-Strukturen auf einer niedrigeren Ebene manipulieren:

\documentclass[8pt,a4paper]{extarticle}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage[left=1.5cm, right=1.5cm, top=0.0cm, bottom=0.0cm, headheight=42pt, includeheadfoot]{geometry}
\usepackage{fancyhdr}
\usepackage{lipsum}

\directlua{
  local n = pdf.reserveobj()% `n` will be a PDF object storing
                            % a reference to the XObject created later.
  local list = token.scan_list() % First we read a list to get the dimensions.
  node.flush_list(list.head) % The actual content isn't important
  local whatsit = node.new('whatsit', 'pdf_literal') % Now "call" the XObject /Form "manually"
  whatsit.mode = 1
  whatsit.data = "/Form Do"
  list.head = whatsit
  % Create a XObject managed by LuaTeX which only references our manual reference
  pages_xform = tex.saveboxresource(list, nil, '/XObject ' .. n .. ' 0 R')
  final_form_hack = n % And save the identifiers
}\hbox{\scriptsize\textbf{29}}% This \hbox decides how much space to reserve for the page number. 29 makes sure that all numbers up to 99 should be fine
\fancypagestyle{style1}{
    \fancyhf{}
    \fancyhead[L]{}
    \fancyhead[R]{}
    \fancyfoot[L]{\scriptsize Test}
    % Reference the XObject from TeX
    \fancyfoot[R]{\scriptsize Seite \textbf{\thepage} von \directlua{node.write((tex.useboxresource(pages_xform)))}}
    \setlength{\topmargin}{-70pt}
    \setlength{\headsep}{10pt}
    \setlength{\footskip}{20pt}
}

\AtEndDocument{
  \clearpage
  \directlua{
    % Now we know how many pages there are, so we can fill the XObject.
    local n = final_form_hack
    final_form_hack = nil
    local list = token.scan_list() % Scan the list with the number of pages
    local w, h, d, m = tex.getboxresourcedimensions(pages_xform)
    list.height, list.depth, list.width = h, d, w % Make sure our boxes have consistant sizes (otherwise LuaTeX will be confused)
    local xform = tex.saveboxresource(list, nil, nil, true, m)% And save it in a XObject
    pdf.immediateobj(n, "<</Form " .. xform .. " 0 R>>")% Finally store a reference in the object `n` created above
  }\hbox{%
    \scriptsize\textbf{\the\numexpr\value{page}-1\relax}% The actual number of pages
  }
}

\begin{document}
    \pagestyle{style1}
    \lipsum[1-30]
\end{document}  

Dies betrifft natürlich nur die Seitenanzahl. Wenn Du in Deiner Datei noch weitere Verweise hast (z.B. \label/\refoder nur ein Inhaltsverzeichnis), treten ähnliche Probleme erneut auf.

verwandte Informationen