\thispagestyle не имеет эффекта, если не указана ни одна страница broken(\clearpage, \newpage)

\thispagestyle не имеет эффекта, если не указана ни одна страница broken(\clearpage, \newpage)

В определенном месте статьи, на странице, к которой она относится, необходим особый причудливый стиль, который я реализую с помощью \thispagestyleпакета fancyhdr.

В моем примере, как показано в MWE ниже, страница, и только страница, где находится текст "bbb" (в этом примере это вторая страница, но может быть и на другой странице, в зависимости от длины статьи), нуждается в \chead. Однако содержимое \cheadна самом деле находится на первой странице, а не на второй, как я ожидал.

Я думаю, это потому, что не задан разрыв страницы. Но позиция текста "bbb" соответствует длине статьи, так как же решить эту проблему?

Мой 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}

РЕДАКТИРОВАТЬ:

Чтобы более ясно выразить свои намерения, я хотел бы дать следующую измененную версию МВЭ.

Мое желание таково: все страницы должны иметь одинаковое содержимое верхнего/нижнего колонтитула, определенное в \fancypagestyle{allpages}, за исключением того, что страница, на которой находится «bbb» (в этом примере это вторая страница), имеет другой верхний/нижний колонтитул, определенный в \fancypagestyle{onlythispage}.

Но реальный набор далек от моего намерения. Я думаю, это потому, что нет никаких разрывов страниц.

Поскольку позиция «bbb» соответствует длине статьи, я не могу предсказать, на какой странице она окажется. Так есть ли нестандартный метод решения такого рода проблем?

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

решение1

Вы можете использовать \markкоманду:

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

Вы также можете передать логическое значение с помощью команды mark, используя это в заголовке. Значениепервый\markright на странице победит.

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

В случае, если вам нужны \markright/\rightmark, например, чтобы получить некоторую \section в заголовках, вы можете использовать свои собственные \marks (но это может нарушить работу, например, при двухколоночном или многоколоночном формате).

решение2

Полагаю, вы используете заголовки, но это не имеет значения.

Проблема в том, что разрыв страницы асинхронен: обычно TeX считывает больше, чем помещается на странице, прежде чем решить, что нужно отправить страницу. В вашем случае, \thispagestyleзамечен и обработан, пока TeX еще не решил выбросить страницу 1.

Команда \thispagestyleнадежна только в том случае, если она задана вскоре после разрыва страницы, например, при начале новой главы, — эту функцию стандартные классы используют для выдачи \thispagestyle{plain}.

Единственный надежный метод - использовать механизм \label- \pageref. Здесь я реализую работу с помощью , refcountкоторый предоставляет расширяемую версию \pageref, а именно \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}

введите описание изображения здесь

Я использую его \pdf@strcmpдля того, чтобы обеспечить поддержку любого вида нумерации страниц.

Следующее поддерживает любое количество вариантных заголовков.Пожалуйста, не смейте просить версию без \ExplSyntaxOn.

Альтернативные заголовки собираются в списке свойств, индексированном по меткам, которые мы хотим использовать. В начале документа этот список свойств переиндексируется с использованием номера страницы, соответствующего ссылке. Благодаря этому, более поздние метки будут иметь приоритет в случае, если две метки для альтернативных заголовков попадут на одну и ту же страницу.

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

введите описание изображения здесь

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