'마지막 페이지' 참조가 정의되지 않았습니다. 라텍스를 두 번만 실행하면 원하는 결과가 표시됩니다.

'마지막 페이지' 참조가 정의되지 않았습니다. 라텍스를 두 번만 실행하면 원하는 결과가 표시됩니다.

.tex 파일에서 lualatex를 실행하면 ??내 문서의 'lastpage' 결과만 얻습니다. 그런 다음 lualatex를 두 번째 실행하면 2문서 바닥글에 올바른 결과( )가 표시됩니다.

주요 질문:동일한 문서(.tex 파일)에서 Latex를 두 번 실행하지 않으려면 어떻게 해야 합니까?

lualatex doc.texJava에서 라텍스 파일을 동적으로 생성하고 있고 모든 콘솔 호출에 약 2.5초가 걸리기 때문에 이에 대한 솔루션이 있다면 좋을 것입니다.

사용된 소스:콘솔 및 test.tex의 lualatex -> 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
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}  

답변1

일반적으로 TeX은 첫 번째 페이지의 페이지 수와 같은 데이터를 사용할 수 없습니다. LaTeX는 아직 페이지 수를 알 수 없기 때문입니다. 하지만 트릭이 있습니다. 페이지 수가 있어야 하는 모든 페이지에 PDF XObject에 대한 참조를 삽입할 수 있습니다. XObject는 PDF 파일에서 순서 없이 참조될 수 있는 별도의 개체입니다. 그런 다음 나중에 이 XObject를 페이지 수로 채울 수 있습니다.

또 다른 문제는 LuaTeX가 XObject를 사용하기 전에 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: 목차)가 있으면 비슷한 문제가 다시 나타납니다.

관련 정보