![如果沒有給予 pagebroken(\clearpage, \newpage) 則 \thispagestyle 無效](https://rvso.com/image/390912/%E5%A6%82%E6%9E%9C%E6%B2%92%E6%9C%89%E7%B5%A6%E4%BA%88%20pagebroken(%5Cclearpage%2C%20%5Cnewpage)%20%E5%89%87%20%5Cthispagestyle%20%E7%84%A1%E6%95%88.png)
在文章的某個位置,它所屬的頁面,需要一個特殊的花哨樣式,我是從\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 (但這可能會破壞例如雙列或多列)。
答案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}