memoir
我根据该选项撰写了很多文件(协议)article
。正常情况pagestyle
是plain
(页码在页脚居中)。有时文件只有一页长,页码是不必要的。
\thispagestyle{empty}
在后面添加一个并不需要做太多工作\maketitle
(因为\maketitle
已经在某处硬编码了一个\thispagestyle{plain}
)。但有时我会忘记这一点,有时我会添加一两个单词,文档突然就长了两页。当然,让 LaTeX 自动执行此操作会更有趣。
借用 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}
有没有更好更简单的解决方案?例如不涉及额外软件包的解决方案?
\oneormorepages
在文本中包含宏是一种临时解决方案。我可以重新定义\maketitle
,但我不太情愿。有没有更好的解决方案可以将测试集成到序言中?我的目标是将此类测试包含在单独的私有样式或类文件中?
编辑:这是我至今为止使用的结果。我使用from\maketitle
即时修补,这是我在“真实”文档中为其他目的加载的包:\patchcmd
etoolbox
\documentclass{article}
\usepackage{lipsum,etoolbox}
%% No page number if the document is 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}
编辑:MWE 于 2014 年 9 月 28 日更新,并根据 egreg 和 JFBU 的评论进行了改进。
非常感谢大家的帮助!
最终编辑日期:2014.09.28
根据讨论这个问题和这个答案对于另一个问题,我有一个可行的解决方案,不需要任何额外的包,在 KOMAscript 和标准类下工作并存活下来\pagenumbering{Roman}
。正如 egreg 指出的那样,它仍然不是万无一失的,但我尝试通过从 -bundle 加载atendvi
- 和atveryend
- 包oberdiek
并使用这些包中的命令来推迟测试。然后测试失败。因此,对于下面的 MWE,我们必须信任\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}
最后,针对标准类,有条件地重新定义-pagestyle plain
。(let\ps@plain\ps@empty
没有用)。
\documentclass{article}
\usepackage{lipsum,zref-totpages}
\pagenumbering{Roman}
\makeatletter
\renewcommand{\ps@plain}{%
\ifnum\ztotpages=\@ne\let\@mkboth\@gobbletwo
\let\@oddhead\@empty\let\@oddfoot\@empty
\let\@evenhead\@empty\let\@evenfoot\@empty{}%
\fi}
\makeatother
\title{Test}
\author{Test Testson}
\begin{document}
\maketitle
\lipsum[1]
\lipsum[1-6] % Turn on/off this line...
\end{document}
希望它是有用的。
答案1
这不需要任何额外的包或\label
最后的额外内容,但它仍然会写入 aux 文件。
\documentclass{article}
\usepackage{lipsum}
\title{Test}
\author{Test Testson}
\makeatletter
\AtEndDocument{%
\ifnum\value{page} > 1%
\immediate\write\@auxout{\string\xdef\string\@multipage\string{\string}}%
\fi%
}
\newcommand{\oneormoreside}{\ifdefined\@multipage\else\thispagestyle{empty}\fi}
\makeatother
\begin{document}%
\maketitle
\oneormoreside
%\lipsum[1-60] %More than one page
\lipsum[1] % One page
\end{document}
由于信息被写入辅助文件,因此您需要两次传递才能使其正常工作。
答案2
您请求的解决方案不包含“额外软件包”。以下是不含 的解决方案zref
,但仍需要ifthen
:
\documentclass{article}
\usepackage{lipsum,ifthen}
\begin{document}
\newcommand{\mypagestyle}%
{\ifthenelse{\pageref{LastPage}>1}%
{\thispagestyle{plain}}%
{\thispagestyle{empty}}%
}
\mypagestyle
\lipsum[2-10]
\label{LastPage}
\end{document}
PS 就我个人而言,我更喜欢像您这样的解决方案,但使用lastpage
(http://ctan.org/tex-archive/macros/latex/contrib/lastpage)而不是zref
。
答案3
\@abspage@last
当前 LaTeX 已通过文件自动定义.aux
。需要运行两次编译,但无需任何额外的包:
\documentclass{article}
\usepackage{lipsum}
\makeatletter
\newcommand{\oneormorepages}{%
\def\singelpage{1}%
\ifx\singelpage\@abspage@last \thispagestyle{empty}%
\else \thispagestyle{plain}%
\fi}
\makeatother
\title{Test}
\author{Test Testson}
\begin{document}
\pagenumbering{Roman}
\maketitle
\oneormorepages
%\lipsum[1-60] % Several pages
\lipsum[1] % Single page
%\newpage
%\pagenumbering{arabic}
%\lipsum[1]
\end{document}