引用「最後一頁」未定義,僅運行乳膠兩次顯示想要的結果

引用「最後一頁」未定義,僅運行乳膠兩次顯示想要的結果

如果我在 .tex 檔案上執行 lualatex,我只能??從文件中的「lastpage」中取得結果。然後,如果我第二次執行 lualatex,則正確的結果 ( 2) 將顯示在文件頁腳中。

主要問題:如何避免在同一個文件(.tex 檔)上執行 Latex 兩次?

如果有一個解決方案就好了,因為我從 Java 動態生成乳膠文件,並且每個控制台lualatex doc.tex調用都需要大約 2.5 秒。

使用的來源:控制台上的 lualatex 和 test.tex -> mwe
控制台命令: lualatex test.tex
失敗輸出:
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
微量元素:

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

答案1

通常 TeX 不能使用像第一頁的頁數這樣的數據,因為 LaTeX 還不知道會有多少頁。但有一個技巧:您可以在每個頁面上應有頁數的位置插入 PDF XObject 的參考。 XObject 是 PDF 檔案中的一個單獨對象,可以亂序引用。然後您可以稍後用頁數填充此 XObject。

另一個複雜之處是 LuaTeX 強制您在使用 XObject 之前決定它的內容,但您可以透過在較低層級操作 PDF 結構來欺騙它:

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

當然,這只影響頁數。如果您的文件中有其他引用(例如\label/\ref或只是目錄),類似的問題將再次出現。

相關內容