如何在序言中获取正确的总页数?

如何在序言中获取正确的总页数?

语境:在个人课程中(针对双面文档),我想geometry根据总页数将布局区域平移到内边距或外边距(感谢包的设置)。

为了获取总页数,我使用了\zref@extractdefault{LastPage}{page}{0}fromzref-lastpage包。不幸的是,正如以下 MWE 所指出的那样:

  • \zref@extractdefault{LastPage}{page}{0}只有在(比较文件和文档中的\begin{document}总页码)后才能给出正确的数字,.log
  • \geometry设置必须在序言中完成。

我想知道是否有办法即使在序言中也能获得正确的总页数。

\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
%
\RequirePackage{zref-lastpage}
\RequirePackage[letterpaper]{geometry}
%
\LoadClass{article}
%
\newcommand{\totpagenumber}{%
  This document has
  \zref@extractdefault{LastPage}{page}{0}
  pages.
}
\message{^^J\totpagenumber^^J^^J}
%
\ifnum\zref@extractdefault{LastPage}{page}{0}<10
\geometry{%
  inner=10mm,
  outer=35mm
}
\else
\geometry{%
  inner=15mm,
  outer=30mm,
}
\fi
\end{filecontents*}
%
\documentclass{myclass}
\usepackage{mwe}
\begin{document}
\totpagenumber

\lipsum[1-15]
\end{document}

答案1

文件.aux是在 中读取的,因此前言中所有基于标签的引用均不可用。但是,可以通过包\begin{document}导入标签:\zexternaldocumentzref-xr

\RequirePackage{zref-xr}
\zexternaldocument[self]{\jobname}
\edef\selftotpages{\zref@extractdefault{internLastPage}{abspage}{0}}

然后\selftotpages序言中已经包含了前一次 LaTeX 运行的页数(或零)。

完整示例:

\RequirePackage{filecontents}
\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
%
\RequirePackage{zref-totpages, zref-xr}
\RequirePackage[letterpaper]{geometry}
%
\LoadClass{article}

\zexternaldocument[self]{\jobname}

\edef\selftotpages{\zref@extractdefault{selfLastPage}{abspage}{0}}

\newcommand{\totpagenumber}{%
  This document has
  \ifcase\selftotpages\space
    no (not yet) pages.%
  \or
    1 page.%
  \else
    \selftotpages\space pages.
  \fi
}
\message{^^J\totpagenumber^^J^^J}
%
\ifnum\selftotpages<10
  \geometry{%
    inner=10mm,
    outer=35mm
  }
\else
  \geometry{%
    inner=15mm,
    outer=30mm,
  }
\fi
\end{filecontents*}
%
\documentclass{myclass}
\usepackage{lipsum}
\begin{document}
\totpagenumber

\lipsum[1-15]
\end{document}

相关内容