\thispagestyle não tem efeito se nenhuma página quebrada (\clearpage, \newpage) for fornecida

\thispagestyle não tem efeito se nenhuma página quebrada (\clearpage, \newpage) for fornecida

Em uma determinada posição do artigo, a página a que pertence, precisa de um estilo especial e sofisticado que eu faço a \thispagestylepartir do pacote fancyhdr.

No meu exemplo, conforme mostrado no MWE abaixo, a página, e apenas a página onde está o texto "bbb" (está na segunda página neste exemplo, mas também pode estar na outra página, determinado pelo comprimento do artigo) , necessito de um \chead. No entanto, o conteúdo \cheadestá na primeira página, e não na segunda página, como eu esperava.

Acho que isso ocorre porque nenhuma quebra de página é fornecida. Mas a posição do texto “bbb” depende da extensão do artigo, então como lidar com esse problema?

Meu MWE é:

\documentclass{article}
\usepackage{fancyhdr}

\begin{document}
\fancypagestyle{common}{\chead{I want my header only on the page at which  ``bbb'' is located}}
aaa\par\vspace{80em}
bbb\thispagestyle{common}\par\vspace{80em}
ccc
\end{document}

EDITAR:

Para deixar minha intenção mais clara, gostaria de apresentar o seguinte MWE modificado.

Meu desejo é: todas as páginas devem ter o mesmo conteúdo de cabeçalho/rodapé definido em \fancypagestyle{allpages}, exceto que a página em que "bbb" está (neste exemplo, é a segunda página), possui um cabeçalho/rodapé diferente definido por \fancypagestyle{onlythispage}.

Mas a composição real está longe da minha intenção. Acho que isso ocorre porque nenhuma quebra de página é fornecida.

Como a posição de "bbb" depende do tamanho do artigo, não consigo prever em qual página ele estará. Então, existe um método incomum para lidar com esse tipo de problema?

\documentclass{article}
\usepackage{fancyhdr,}

\begin{document}

\fancypagestyle{onlythispage}{\chead{only this page}\cfoot{only this page}}
\fancypagestyle{allpages}{\fancyhf{}\chead{all pages}\cfoot{all pages}}

\pagestyle{allpages}

aaa\par\vspace{80em}
bbb\thispagestyle{onlythispage}\par\vspace{80em}
ccc
\end{document}

Responder1

Você pode usar um \markcomando:

\documentclass{article}
\usepackage{fancyhdr}
\fancypagestyle{common}{\fancyhf{}\chead{\rightmark}}
\pagestyle{common}
\begin{document}

aaa\par\vspace{80em}
bbb\markright{I want my header only on the page at which  ``bbb'' is located}\markright{}\par\vspace{80em}
ccc
\end{document}

Você também pode passar um booleano com o comando mark use this no cabeçalho. O valor doprimeiro\markright na página vencerá.

\documentclass{article}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\newbool{bbbpage}

\begin{document}

\fancypagestyle{allpages}{\fancyhf{}%
 \chead{\rightmark\ifbool{bbbpage}{only this page}{all pages}}
 \cfoot{\rightmark\ifbool{bbbpage}{only this page}{all pages}}}

\pagestyle{allpages}

aaa\par\vspace{80em}
bbb\markright{\booltrue{bbbpage}}\markright{\boolfalse{bbbpage}}\par\vspace{80em}
ccc
\end{document}

Caso você precise de \markright/\rightmark, por exemplo, para obter alguma \section nos cabeçalhos, você pode usar seu próprio \marks (mas isso pode quebrar, por exemplo, com duas colunas ou múltiplas colunas).

Responder2

Acho que você está usando cabeçalhos, mas isso não é realmente relevante.

O problema é que a quebra de página é assíncrona: normalmente o TeX lê mais do que cabe em uma página antes de decidir que precisa enviá-la. No seu caso, \thispagestyleé visto e processado enquanto o TeX ainda não decidiu ejetar a página 1.

O comando \thispagestylesó é confiável se for dado logo após uma quebra de página, por exemplo, quando um novo capítulo é iniciado, um recurso que as classes padrão usam para emitir arquivos \thispagestyle{plain}.

O único método confiável é usar o mecanismo \label- \pageref. Aqui eu implemento o trabalho com a ajuda de refcountuma versão expansível do \pageref, ou seja \getpagerefnumber, .

\documentclass{article}
\usepackage{fancyhdr}
\usepackage{refcount,pdftexcmds}

\pagestyle{fancy}

\makeatletter
\chead{%
  \ifnum\pdf@strcmp{\thepage}{\getpagerefnumber{bbb}}=\z@
    I want my header only on the page at which  ``bbb'' is located%
  \else
    Normal header%
  \fi
}
\makeatother

\begin{document}

aaa\par\vspace{80em}
bbb\label{bbb}\par\vspace{80em}
ccc

\end{document}

insira a descrição da imagem aqui

Eu uso \pdf@strcmppara garantir que qualquer tipo de numeração de página seja compatível.

O seguinte oferece suporte a qualquer número de cabeçalhos de variantes.Por favor, não se atreva a pedir uma versão sem \ExplSyntaxOn.

Os cabeçalhos alternativos são coletados em uma lista de propriedades, indexada pelos rótulos que queremos usar. No início do documento, esta lista de propriedades é reindexada utilizando o número da página correspondente à referência. Devido a isso, os rótulos que aparecerem posteriormente terão precedência caso dois rótulos para cabeçalhos alternativos caiam na mesma página.

\documentclass{article}
\usepackage[a6paper]{geometry} % just to make a smaller picture
\usepackage{fancyhdr}
\usepackage{refcount,xparse}

\ExplSyntaxOn
\NewDocumentCommand{\definelylheaders}{mm}
 {% #1: default header
  % #2: label=alternate header, label=alternate header, ...
  \tl_gset:Nn \g_lylheader_default_tl { #1 }
  \prop_gset_from_keyval:Nn \g_lylheader_headers_prop { #2 }
  \prop_map_inline:Nn \g_lylheader_headers_prop
   {
    \seq_gput_right:Nn \g_lylheaders_labels_seq { ##1 }
   }
 }

\AtBeginDocument
 {
  \seq_map_inline:Nn \g_lylheaders_labels_seq
   {
    \prop_gput:Nxx \g_lylheaders_headers_body_prop
     { \getpagerefnumber{#1} }
     { \prop_item:Nn \g_lylheader_headers_prop { #1 } }
   }
 }

\NewDocumentCommand{\lylheaders}{}
 {
  \prop_if_in:NxTF \g_lylheaders_headers_body_prop { \thepage }
   {
    \prop_item:Nx \g_lylheaders_headers_body_prop { \thepage }
   }
   {
    \tl_use:N \g_lylheader_default_tl
   }
 }

\cs_generate_variant:Nn \prop_if_in:NnTF { Nx }
\cs_generate_variant:Nn \prop_item:Nn { Nx }
\cs_generate_variant:Nn \prop_gput:Nnn { Nxx }

\tl_new:N \g_lylheader_default_tl
\prop_new:N \g_lylheaders_headers_prop
\prop_new:N \g_lylheaders_headers_body_prop
\seq_new:N \g_lylheaders_labels_seq

\ExplSyntaxOff

\pagestyle{fancy}
\chead{\lylheaders}

\definelylheaders{Default header}{
  bbb = This is the header for bbb,
  ccc = This is the header for ccc,
}

\begin{document}

aaa\par\vspace{\dimexpr\textheight-\topskip}
bbb\label{bbb}\par\vspace{\dimexpr\textheight-\topskip}
ccc\label{ccc}\par\vspace{\dimexpr\textheight-\topskip}
ddd

\end{document}

insira a descrição da imagem aqui

informação relacionada