如何在条件表达式中使用总页数?

如何在条件表达式中使用总页数?

我希望根据文档是否有一页或多页来设置不同的页脚或页面样式。我对 TeX 编程不是很有经验,所以答案关于“当参数是使用 etoolbox 命令的结果时,将参数与字符串进行比较”对我没什么帮助,“何时使用 \edef、\noexpand 和 \expandafter?”对于我第一次来说有点复杂。

我尝试了这个,但是没有用:

\documentclass{article}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage{lastpage}
\begin{document}

\expandafter\ifstrequal{\pageref*{LastPage}}{1}{
  \pagestyle{empty}
  }{
  \pagestyle{plain}}

\lipsum[2-3]

\end{document}

我可能会继续尝试。

有人能告诉我一个好方法吗?

答案1

您也lastpage可以使用totcount包。

\documentclass{article}
\usepackage{lipsum}
\usepackage{etoolbox}
\usepackage{totcount}
\regtotcounter{page}

\begin{document}

\ifnumcomp{\totvalue{page}}{>}{1}{\pagestyle{plain}}{\pagestyle{empty}}

\lipsum[2]

\end{document}

在此处输入图片描述

这将需要 2 次编译运行才能解决。

答案2

我遇到了与文档页码相同的问题,并找到了几种解决方案。

借用 Ulrike Fisher 的回答中的一些代码这个问题我能够定义这个宏:

\documentclass{article}
\usepackage{lipsum,ifthen}
\usepackage[lastpage]{zref}

\makeatletter
\zref@newprop*{numpage}{\the\value{page}}
\zref@addprop{main}{numpage}
\newcommand{\oneormorepages}%
    {\ifthenelse{\zref@extractdefault{LastPage}{numpage}{1}>1}%
        {\thispagestyle{plain}}%
        {\thispagestyle{empty}}%
    }
\makeatother

\title{Test}
\author{Test Testson}

\begin{document}
\maketitle
\oneormorepages
\lipsum[1-60] %More than one page
%\lipsum[1]   % One page
\end{document}

这是我至今为止使用的结果。我使用from\maketitle即时修补,这是我在“真实”文档中为其他目的加载的包:\patchcmdetoolbox

\documentclass{article}
\usepackage{lipsum,etoolbox}

%% No page number  if the document ai a onepager
\makeatletter
\AtEndDocument{%
  \ifnum\value{page} > \@ne
    \immediate\write\@auxout{\global\let\string\@multipage\relax}%
  \fi
}
\newcommand*{\oneormorepages}{%
    \ifdefined\@multipage
        \thispagestyle{plain}%
    \else
        \thispagestyle{empty}%
    \fi
 }
\patchcmd{\maketitle}
    {\thispagestyle{plain}}%
    {\oneormorepages}{}{}
%% Change `plain` to `title` if you are using a `memoir` class
\makeatother

\title{Test}
\author{Test Testson}

\begin{document}
\maketitle
\lipsum[1-60] % More than one page
%\lipsum[1]   % One page
\end{document}

正如 egreg 在下面的评论中(以及对原始答案的评论中)强调的那样,该解决方案并非百分之百万无一失(例如,它在 下不起作用scrartcl)。我现在已经更正了 jfbu 指出的错误。

今天我甚至找到了另外两个不需要修补的解决方案ETC.:

根据讨论这个问题这个答案对于另一个问题,我修改了一个可行的解决方案,不需要任何额外的包,并且可以在 KOMAscript 和标准类下工作。它幸存了下来\pagenumbering{Roman}。正如 egreg 指出的那样,它仍然不是万无一失的,但我尝试通过从-bundle 中加载atendvi- 和- 包并使用这些包中的命令来推迟测试。然后测试失败。因此,对于下面的 MWE,我们必须信任。atveryendoberdiek\AtEndDocument

以下是 MWE:

\documentclass{article}
\usepackage{lipsum}
\makeatletter % You may remove this line if you change\@ne to 1
\AtEndDocument{\ifnum\value{page]=\@ne\thispagestyle{empty}{}\fi} % survives `\pagenumbering{Roman}`
\makeatother % You may remove this line if you change\@ne to 1
\title{Test}
\author{Test Testson}

\begin{document}
\maketitle
\lipsum[1]
\lipsum[1-6] % Turn on/off this line...
\end{document}

如果您需要罗马数字,您也可以加载zref-totpages并更改测试为:

\AtEndDocument{\ifnum\ztotpages=\@ne\thispagestyle{empty}{}\fi}

基于这个答案,我找到了一个使用scrartclscrpage2和 的解决方案zref-totpages,它也保留了\pagenumbering{Roman}。您可以在测试的false和部分中添加附加代码:true

\documentclass{scrartcl}
\usepackage{zref-totpages,lipsum,scrpage2}
\pagestyle{scrplain}
\clearscrheadfoot
% You may use \@ne instead of 1 if you enclose the line in a `\makeatletter\makeatother`
\cfoot[\ifnum\ztotpages=1 \else\pagemark\fi]{\pagemark}

\begin{document}

\lipsum[1] % automatically remove page number in a document with this line
%\lipsum[1-6] % automatically keep page numbers in a document with this line
\end{document}

希望它是有用的。

相关内容