깨진 페이지(\clearpage, \newpage)가 없으면 \thispagestyle은 효과가 없습니다.

깨진 페이지(\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}.

하지만 실제 조판은 내 의도와는 거리가 멀다. 페이지 나누기가 주어지지 않았기 때문이라고 생각합니다.

"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는 페이지를 내보내야 한다고 결정하기 전에 페이지에 맞는 더 많은 것을 읽습니다. 귀하의 경우에는 \thispagestyleTeX가 아직 페이지 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}

여기에 이미지 설명을 입력하세요

관련 정보