Como usar a contagem total de páginas em uma expressão condicional?

Como usar a contagem total de páginas em uma expressão condicional?

Gostaria de ter um rodapé ou estilo de página diferente, dependendo se o documento possui uma ou mais páginas. Não tenho muita experiência com programação TeX, então as respostassobre "Comparando um argumento com uma string quando o argumento é resultado de um comando com etoolbox"não me ajudou muito e"Quando usar \edef, \noexpand e \expandafter?"é um pouco complicado para mim pela primeira vez.

Eu tentei isso, mas não funcionou:

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

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

\lipsum[2-3]

\end{document}

Posso continuar experimentando.

Alguém poderia me mostrar uma boa maneira de fazer isso, por favor?

Responder1

Em vez de lastpagevocê pode usar 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}

insira a descrição da imagem aqui

Isso levará 2 execuções de compilação para se estabilizar.

Responder2

Tenho o mesmo problema em relação ao número de páginas de documentos e encontrei várias soluções.

Pegando emprestado algum código da resposta de Ulrike Fisher paraessa questãoConsegui definir esta macro:

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

Aqui está o resultado que usei até hoje. Eu corrijo \maketitlerapidamente usando \patchcmdfrom etoolbox, um pacote que carrego para outros fins no documento 'real':

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

Como egreg enfatiza no comentário abaixo (e em um comentário à resposta original), a solução não é cem por cento à prova de erros (por exemplo, não funciona em scrartcl). Agora corrigi os erros que o jfbu identificou.

Hoje consegui até encontrar duas soluções adicionais que não precisam de patchetc..:

Com base na discussão emessa questãoeesta respostapara outra pergunta, criei uma solução funcional que não requer nenhum pacote adicional e trabalha com KOMAscript e as classes padrão. Ele sobrevive \pagenumbering{Roman}. Como egreg apontou, ainda não é infalível, mas tentei adiar os testes carregando os pacotes atendvi- e atveryend- do oberdiek-bundle e usando comandos desses pacotes. Então os testes falham. Portanto, para os MWEs abaixo, temos que confiar \AtEndDocument.

Aqui estão os MWEs:

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

Se precisar de numeração romana, você também pode carregar zref-totpagese alterar o teste para:

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

Baseado emesta resposta, encontrei uma solução usando scrartcl, scrpage2e zref-totpages, que também sobrevive \pagenumbering{Roman}. Você pode adicionar código adicional às falsepartes truedo teste:

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

Esperançosamente, é útil.

informação relacionada