기사의 특정 위치, 그것이 속한 페이지에는 \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가 필요한 경우, 예를 들어 헤더에 \섹션을 가져오려면 자신만의 \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
.
대체 헤더는 우리가 사용하려는 레이블로 색인화된 속성 목록에 수집됩니다. 문서 시작 시 이 속성 목록은 참조에 해당하는 페이지 번호를 사용하여 다시 색인화됩니다. 이로 인해 대체 헤더에 대한 두 개의 라벨이 같은 페이지에 있는 경우 나중에 나타나는 라벨이 우선적으로 적용됩니다.
\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}