![\thispagestyle は、ページ区切り(\clearpage、\newpage)が指定されていない場合は効果がありません。](https://rvso.com/image/390912/%5Cthispagestyle%20%E3%81%AF%E3%80%81%E3%83%9A%E3%83%BC%E3%82%B8%E5%8C%BA%E5%88%87%E3%82%8A(%5Cclearpage%E3%80%81%5Cnewpage)%E3%81%8C%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E5%8A%B9%E6%9E%9C%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
記事内の特定の位置、つまりそれが属するページでは、\thispagestyle
パッケージから実行する特別な派手なスタイルが必要ですfancyhdr
。
下の MWE に示されている私の例では、ページ、およびテキスト「bbb」が含まれるページのみ (この例では 2 ページ目ですが、記事の長さによって他のページにある場合もあります) に が必要です\chead
。ただし、 のコンテンツは\chead
実際には 1 ページ目にあり、予想どおり 2 ページ目にはありません。
これは改ページが指定されていないためだと思います。しかし、テキスト「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」が含まれるページ (この例では 2 ページ目) は で定義されている異なるヘッダー/フッターを持ちます\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}
マークコマンドでブール値を渡すこともできます。ヘッダーでこれを使用します。初め\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 列または複数列の場合などに機能しなくなる可能性があります)。
答え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
。
代替ヘッダーは、使用したいラベルでインデックス付けされたプロパティ リストに収集されます。ドキュメントの開始時に、このプロパティ リストは参照に対応するページ番号を使用して再インデックス付けされます。このため、代替ヘッダーの 2 つのラベルが同じページにたまたまある場合は、後から表示されるラベルが優先されます。
\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}