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