我希望根据文档是否有一页或多页来设置不同的页脚或页面样式。我对 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
即时修补,这是我在“真实”文档中为其他目的加载的包:\patchcmd
etoolbox
\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,我们必须信任。atveryend
oberdiek
\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}
基于这个答案,我找到了一个使用scrartcl
、scrpage2
和 的解决方案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}
希望它是有用的。