如果文档只有一页,则自动删除页码(但如果有两页则不会)

如果文档只有一页,则自动删除页码(但如果有两页则不会)

memoir我根据该选项撰写了很多文件(协议)article。正常情况pagestyleplain(页码在页脚居中)。有时文件只有一页长,页码是不必要的。

\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即时修补,这是我在“真实”文档中为其他目的加载的包:\patchcmdetoolbox

\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}

基于这个答案,我找到了一个使用scrartclscrpage2和 的解决方案zref-totpages,它也保留了。您可以通过在测试的或部分\pagenumbering{Roman}添加其他代码来使其更有用:falsetrue

\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}

相关内容