Lineal automatisch entfernen, wenn keine Kopfzeile vorhanden ist

Lineal automatisch entfernen, wenn keine Kopfzeile vorhanden ist

Diese Frage wird aufgeworfen durchSeitenzahl in einseitigen Dokumenten automatisch entfernen.

Bei der Aktivierung desAbonnierenPaket ist es notwendig, die Kopfzeilen zu löschen, was ich unten mit mache \fancyhf{}, weil es sonst MY FIRST SECTIONals Kopfzeile für das darunterliegende Dokument gedruckt wird. Das Lineal wird jedoch weiterhin unter der leeren Kopfzeile gedruckt, also entferne ich es mit \renewcommand{\headrulewidth}{0pt}.

Das Problem ist folgendes: Ich habe diese Zeilen in meine benutzerdefinierte .styDatei eingefügt. Wenn ichTunWenn ich eine Kopfzeile in meinem Dokument haben möchte, möchte ich diese Kopfzeile natürlich nicht fest in meine .styDatei einbinden. Sie sollte eher in die Präambel des Dokuments, das ich schreibe, wie unten beschrieben. Aber da ich sie \renewcommand{\headrulewidth}{0pt}in meine .styDatei eingefügt habe, wird jetzt kein Lineal gedruckt, obwohl ich eine Kopfzeile hinzugefügt habe.

Ich suche nach einer Möglichkeit, LaTeX \renewcommand{\headrulewidth}{0pt}nur dann automatisch zu aktivieren, wenn der Header tatsächlich leer ist.

\documentclass{article}
\usepackage{filecontents}

\begin{filecontents}{mystyle.sty}
%% My package starts here
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\usepackage{fancyhdr}
    \pagestyle{fancy}
    \fancyhf{}
    \renewcommand{\headrulewidth}{0pt}
\endinput
%% And ends here
\end{filecontents}

\usepackage{mystyle}
\fancyhead[C]{Woah! There's no ruler here!}

\begin{document}
\section{My first section}
\end{document}

Bildbeschreibung hier eingeben

Antwort1

Das folgende Beispiel platziert die Header-Elemente (links, zentriert, rechts) in einer Box und misst deren Breite. Wenn die Breite Null ist, wird die Header-Regel unterdrückt:

\documentclass{article}
\usepackage{filecontents}

\begin{filecontents}{mystyle.sty}
%% My package starts here
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\RequirePackage{fancyhdr}
\let\org@fancyhead\@fancyhead
\renewcommand*{\@fancyhead}[5]{%
  \sbox0{#2#3#4}%
  \ifdim\wd0=\z@
    \let\headrule\relax
  \fi
  \org@fancyhead{#1}{#2}{#3}{#4}{#5}%
}
\pagestyle{fancy}
\fancyhf{}
\endinput
%% And ends here
\end{filecontents}

\usepackage{mystyle}

\begin{document}
\section{My first section}

\newpage
\fancyhead[C]{Header is set}
\section{My next section}

\end{document}

Bemerkungen:

  • Die Neudefinition \headruleist lokal für den aktuellen Header, da LaTeX den Header-Code innerhalb einer Box/Gruppe aufruft.

Antwort2

Vielleicht so etwas wie:

\documentclass{article}
\usepackage{filecontents}

\begin{filecontents}{mystyle.sty}
%% My package starts here
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\usepackage{fancyhdr}
    \pagestyle{fancy}
    \fancyhf{}
    \makeatletter
    \AtBeginDocument{% don't make the comparison until the start of the document as the header may get specified later in the preamble
      \xdef\tempa{\f@ncyoch\f@ncyech\f@ncyorh\f@ncyerh\f@ncyolh\f@ncyelh}% get the value of the header parts
      \xdef\tempb{\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x}% value for comparison: contents of header parts if no content is specified
      \ifx\tempa\tempb% test to see if they are the same
        \renewcommand{\headrulewidth}{0pt}% if they are, the centre header is empty to set the rule width to 0pt
      \fi% otherwise, do nothing
    }
    \makeatother
\endinput
%% And ends here
\end{filecontents}

\usepackage{mystyle}
\fancyhead[C]{Woah! There's no ruler here!}
% \fancyhead[C]{}

\begin{document}
\section{My first section}
\end{document}

Der Code funktioniert, indem er den Wert der Header-Komponenten ( \f@ncyoch\f@ncyech\f@ncyorh\f@ncyerh\f@ncyolh\f@ncyelh) mit dem Wert des Headers vergleicht, wenn dieser keinen inhaltlichen Inhalt ( \unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x\unhbox \voidb@x) hat. Wenn sie gleich sind, setzt er die Regelbreite auf 0pt. Wenn sie unterschiedlich sind, greift er nicht ein.

Der Code macht zwei wichtige Annahmen. Eine ist wahrscheinlich in den meisten Fällen sinnvoll. Die andere wahrscheinlich nicht.

  • Der Code geht davon aus, dass Sie beispielsweise auf geraden Seiten keine leere Kopfzeile und auf ungeraden Seiten keine mit Inhalt haben. Ich gehe davon aus, dass dies in den meisten Fällen eine vernünftige Annahme ist.
  • Der Code aktiviert oder deaktiviert die Kopfzeilenregel für das gesamte Dokument (oder bis Sie einen Befehl zum Ändern der Einstellung erteilen), je nachdem, ob die Kopfzeile am Anfang des Dokuments leer ist oder nicht. Es funktioniert also nicht, wenn Ihre Konfiguration wie in Heiko Oberdieks Beispiel ist, wo die Regel beispielsweise auf der ersten Seite nicht aktiv sein soll, auf der nächsten jedoch schon. Die Annahme, dass die Kopfzeile entweder für das gesamte Dokument Inhalt hat oder nicht, ist in den meisten Fällen wahrscheinlich nicht sinnvoll.

Kopfzeile mit Regel

Auskommentieren der Kopfzeile:

Kein Header - keine Regel

verwandte Informationen