通过以下代码,我希望排版一个两页的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}