如果沒有給予 pagebroken(\clearpage, \newpage) 則 \thispagestyle 無效

如果沒有給予 pagebroken(\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}.

但真正的排版卻與我的本意相差甚遠。我認為這是因為沒有給出分頁符號。

由於「b​​bb」的位置取決於文章的長度,我無法預見它會出現在哪個頁面。

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

在此輸入影像描述

相關內容