\thispagestyle hat keinen Effekt, wenn keine Seite broken(\clearpage, \newpage) angegeben ist

\thispagestyle hat keinen Effekt, wenn keine Seite broken(\clearpage, \newpage) angegeben ist

An einer bestimmten Stelle im Artikel ist auf der Seite, zu der er gehört, ein spezieller, ausgefallener Stil erforderlich, den ich mithilfe \thispagestyledes Pakets erstelle fancyhdr.

In meinem Beispiel, wie im MWE unten gezeigt, benötigt die Seite, und zwar nur die Seite, auf der sich der Text „bbb“ befindet (in diesem Beispiel ist es die zweite Seite, aber je nach Länge des Artikels kann es auch die andere Seite sein), ein \chead. Der Inhalt von \cheadbefindet sich jedoch tatsächlich auf der ersten Seite und nicht auf der zweiten Seite, wie ich erwarte.

Ich denke, das liegt daran, dass kein Seitenumbruch vorhanden ist. Aber die Position des Textes „bbb“ hängt von der Länge des Artikels ab. Wie also mit diesem Problem umgehen?

Mein MWE ist:

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

BEARBEITEN:

Um meine Absicht deutlicher zu machen, möchte ich das folgende modifizierte MWE angeben.

Mein Wunsch ist: Alle Seiten sollten die gleichen Kopf-/Fußzeileninhalte haben, die in definiert sind \fancypagestyle{allpages}, außer dass die Seite, auf der sich „bbb“ befindet (in diesem Beispiel ist es die zweite Seite), eine andere Kopf-/Fußzeile hat, die durch definiert ist \fancypagestyle{onlythispage}.

Der eigentliche Schriftsatz liegt aber nicht in meiner Absicht. Ich denke, das liegt daran, dass keine Seitenumbrüche vorgesehen sind.

Da die Position von „bbb“ von der Länge des Artikels abhängt, kann ich nicht vorhersagen, auf welcher Seite es stehen wird. Gibt es also eine universelle Methode, um mit dieser Art von Problem umzugehen?

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

Antwort1

Sie können einen \markBefehl verwenden:

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

Sie können auch einen Boolean-Wert mit dem Mark-Befehl use this im Header übergeben. Der Wert desErste\markright auf der Seite wird gewinnen.

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

Falls Sie \markright/\rightmark benötigen, um beispielsweise einen \section in den Kopfzeilen zu erhalten, können Sie Ihre eigenen \marks verwenden (dies könnte jedoch beispielsweise bei zwei- oder mehrspaltigem Format nicht funktionieren).

Antwort2

Ich nehme an, Sie verwenden Header, aber das ist nicht wirklich relevant.

Das Problem besteht darin, dass der Seitenumbruch asynchron erfolgt: Normalerweise liest TeX mehr, als auf eine Seite passt, bevor es entscheidet, dass eine Seite ausgegeben werden muss. In Ihrem Fall \thispagestylewird angezeigt und verarbeitet, während TeX noch nicht entschieden hat, Seite 1 auszuwerfen.

Der Befehl \thispagestyleist nur zuverlässig, wenn er kurz nach einem Seitenumbruch gegeben wird, beispielsweise beim Beginn eines neuen Kapitels, eine Funktion, die Standardklassen zum Ausgeben verwenden \thispagestyle{plain}.

Die einzige zuverlässige Methode ist die Verwendung des \label-Mechanismus \pageref. Hier implementiere ich den Job mit Hilfe von , refcountdas eine erweiterbare Version von bereitstellt \pageref, nämlich \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}

Bildbeschreibung hier eingeben

Ich verwende \pdf@strcmp, um sicherzustellen, dass jede Art der Seitennummerierung unterstützt wird.

Im Folgenden wird eine beliebige Anzahl von Variantenüberschriften unterstützt.Bitte fragen Sie nicht nach einer Version ohne \ExplSyntaxOn.

Die alternativen Überschriften werden in einer Eigenschaftenliste gesammelt und nach den Beschriftungen indiziert, die wir verwenden möchten. Zu Beginn des Dokuments wird diese Eigenschaftenliste mit der Seitenzahl, die der Referenz entspricht, neu indiziert. Aus diesem Grund haben später erscheinende Beschriftungen Vorrang, falls zwei Beschriftungen für alternative Überschriften zufällig auf derselben Seite liegen.

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

Bildbeschreibung hier eingeben

verwandte Informationen