Как использовать общее количество страниц в условном выражении?

Как использовать общее количество страниц в условном выражении?

Я хотел бы иметь другой нижний колонтитул или стиль страницы в зависимости от того, содержит ли документ одну или несколько страниц. Я не очень опытен в программировании 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можно использовать totcountpackage.

\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

У меня та же проблема с номерами страниц в документах, и я нашел несколько решений.

Заимствуя часть кода из ответа Ульрике Фишера наэтот вопросМне удалось определить этот макрос:

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

Вот результат, который я использовал до сегодняшнего дня. Я патчу \maketitleна лету, используя \patchcmdfrom 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.

Сегодня мне даже удалось найти два дополнительных решения, которые не требуют исправления.и т. д..:

На основе обсуждения вэтот вопросиэтот ответна другой вопрос, я собрал работающее решение, не требующее дополнительных пакетов и работающее под KOMAscript и стандартными классами. Оно выживает \pagenumbering{Roman}. Как указал egreg, оно все еще не защищено от дурака, но я пробовал откладывать тесты, загружая 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}

Надеюсь, это будет полезно.

Связанный контент