如果没有指定页面破损(\clearpage、\newpage),则 \thispagestyle 无效

如果没有指定页面破损(\clearpage、\newpage),则 \thispagestyle 无效

在文章的某个位置,它所属的页面,需要一种特殊的花式样式,这是我从\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}

编辑:

为了更清楚地表达我的意图,我想给出以下修改后的 MWE。

我的愿望是:所有页面都应具有在 中定义的相同的页眉/页脚内容\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(但这可能会破坏例如 twocolumn 或 multicolumn)。

答案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}

在此处输入图片描述

相关内容