В определенном месте статьи, на странице, к которой она относится, необходим особый причудливый стиль, который я реализую с помощью \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}