如何使 \@abspage@last 作为总页数

如何使 \@abspage@last 作为总页数

通过以下代码,我希望排版一个两页的pdf文件。在第一页,我想打印(1)(2)

但它不起作用。我猜这是因为错误使用了 LaTeX 宏\@abspage@last,或者错误使用了编译器选项参数。有人有办法让它工作吗?

代碼:

\documentclass{article}
\usepackage{pgffor}
\makeatletter
\newcommand{\lastpagenumber}{\@abspage@last}
\makeatother
%\newcommand{\lastpagenumberA}{\PreviousTotalPages}

\begin{document}
\foreach \i in {1,...,\lastpagenumber}{(\i)}
%\rule{\numexpr 4/\lastpagenumberA\relax in}{5pt}
\clearpage\mbox{}
\end{document}

答案1

.aux文件不存在时,\@abspage@last设置为1073741823,当然您不想生成那么多页面。

因此,让我们尝试通过告诉 LaTeX 如果\@abspage@last等于则\maxdimen设置\lastpagenumber为零来“修复”。

\documentclass{article}
\usepackage{pgffor}

\makeatletter
\newcommand{\lastpagenumber}{%
  \ifnum\@abspage@last=\maxdimen
    \expandafter 0%
  \else
    \expandafter\@abspage@last
  \fi
}
\makeatother

\begin{document}

\foreach \i in {1,...,\lastpagenumber}{(\i)}

\clearpage

\mbox{LAST}

\end{document}

现在,如果.aux文件不存在(或者由于某种原因,它没有为 设定值\@abspage@last),您将获得两页。第一页有“(1)(0)”(因为工作方式\foreach),第二页有“LAST”。

好的,现在.aux文件存在并且包含

\gdef \@abspage@last{2}

我们再次运行 LaTeX,在第一页得到“(1)(2)”,在第二页得到“LAST”。

也许甚至更好,因为它避免了使用时的一个扩展步骤\lastpagenumber

\documentclass{article}
\usepackage{pgffor}

\makeatletter
\newcommand{\lastpagenumber}{}
\AtBeginDocument{%
  \ifnum\@abspage@last=\maxdimen
    \def\lastpagenumber{0}%
  \else
    \let\lastpagenumber\@abspage@last
  \fi
}
\makeatother

\begin{document}

\foreach \i in {1,...,\lastpagenumber}{(\i)}

\clearpage

\mbox{LAST}

\end{document}

我这样做是\newcommand{\lastpagenumber}{}为了安全:如果您加载的某个包定义了\lastpagenumber,您会收到错误,并且您知道您不能使用此命令。

接下来,.aux读入文件后(假设它存在),我们检查是否\@abspage@last\maxdimen;在这种情况下,我们定义\lastpagenumber扩展为0,否则我们使其等于\@abspage@last

答案2

你可以说:

\documentclass{article}
\ExplSyntaxOn
\iow_new:N \l_lastpage_file 
\file_if_exist:nTF{\c_sys_jobname_str.page}
{
  \file_input:n{\c_sys_jobname_str.page}
}
{
  % \cs_set_eq:NN \lastpage \relax
  \cs_set:Npn \lastpage {1}
}
\AtEndDocument{
\iow_open:Nn \l_lastpage_file{\c_sys_jobname_str.page}
\iow_now:Nx \l_lastpage_file 
{
  \cs_set:Npn \exp_not:N \lastpage 
  {
    \thepage
  }
}
\iow_close:N \l_lastpage_file 
}
\ExplSyntaxOff


\usepackage{pgffor}
\begin{document}

\foreach \i in {1,...,\lastpage}{(\i)}
\rule{\numexpr 4/\lastpage\relax in}{5pt}

\newpage
test

\foreach \i in {1,...,\lastpage}{(\i)}
\rule{\numexpr 4/\lastpage\relax in}{5pt}
\newpage
test

\foreach \i in {1,...,\lastpage}{(\i)}
\rule{\numexpr 4/\lastpage\relax in}{5pt}
\end{document}

这个也可以,但是仍然需要编译两次!

\documentclass{article}
\usepackage{pgffor}
\begin{document}
\makeatletter
\ifnum\@abspage@last > 1000
\newcommand{\lastpagenumber}{1}
\else
\newcommand{\lastpagenumber}{\@abspage@last}
\fi
\makeatother
\foreach \i in {1,...,\lastpagenumber}{(\i)}
AA
%\rule{\numexpr 4/\lastpagenumberA\relax in}{5pt}
\clearpage\mbox{}
\end{document}

在此处输入图片描述

相关内容