
Ich beschäftige mich mit übersetzten Texten, die „Absatz“-Nummern haben, die bereits in der Quelle definiert sind und mit denen ich Konsistenz wahren muss. Daher kann ich \theparagraph
die Nummern nicht generieren. Um die Komplexität noch zu erhöhen, haben viele Absätze keine Nummern; außerdem haben einige Absätze einen Bereich (1-10 usw.). Diese vordefinierten Nummern sind in meinem Dokument bereits vorhanden.
Aus ästhetischen Gründen möchte ich diese Nummern lieber im Seitenkopf als vor dem Absatz anzeigen. Ich verwende fancyhdr. Im Seitenkopf würden sie auf beiden Seiten erscheinen und die Abschnittsnummer (nicht die Kapitelnummer) vorangestellt. Jeder Seitenkopf würde also Folgendes enthalten:
ABC
Dabei ist A die Abschnittsnummer, B die Nummer des ersten Absatzes auf der Seite (der natürlich oft eine Fortsetzung des letzten Absatzes der vorherigen Seite ist) und C die Nummer des letzten Absatzes auf der Seite.
Dies sollte kompliziert genug sein, aber zusätzlich müssen wir Bereiche verarbeiten. In solchen Fällen wählen wir für unsere B-Nummer die erste Ziffer im Bereich aus; für die C-Nummer wählen wir die letzte.
Wenn also der erste Absatz auf der Seite den Bereich 10–14 hätte und der letzte den Bereich 16–18, würde die Kopfzeile für diese Seite A.10–18 lauten.
Ich hoffe, das ist klar. Bitte lassen Sie mich wissen, wenn weitere Erklärungen erforderlich sind.
Noch ein paar Details. Abschnitte beginnen auf einer neuen Seite, was ich mit titlesec mache. (Aus irgendeinem Grund fügt das unten angegebene MWE Abschnitt 2 in die Kopfzeile ein, bevor er tatsächlich beginnt; ich habe das nicht überprüft.)
Die Abschnitte haben wie die Absätze fest codierte Nummern, daher können wir diese verwenden, wenn es die Sache einfacher macht. Im Gegensatz zu den Absätzen sind die Abschnittsnummern jedoch einfach und fortlaufend, daher denke ich, dass es wahrscheinlich einfacher ist, sie von LaTeX zählen zu lassen, da es dies standardmäßig tun möchte. Aber beide Möglichkeiten sind in Ordnung.
Hier ist ein MWE. Ich bin mir nicht sicher, wie ich das am besten mache, aber ich habe das MWE aus meinem ursprünglichen Beispiel in eines geändert, das aus Andrews Antwort unten adaptiert wurde. Ich habe seine Antwort als richtig akzeptiert, was sie größtenteils auch ist, aber bei der Verwendung des Codes habe ich eine Reihe von Fehlern entdeckt, die ich unten aufliste.
\documentclass{book}
\usepackage{lipsum}
\setlipsumdefault{1}
\usepackage{titlesec}
% fancy headings as defined by the OP except we need to be more careful
% with plain headings
\usepackage{fancyhdr}
\fancypagestyle{plain}{% need to reset \firstpara on pages without headers
\fancyhf{} % clear all header and footer fields
\renewcommand{\headrulewidth}{0pt}
\fancyfoot[C]{\bfseries \thepage}
\xdef\firstpara{\lastpara}
}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[LE,RO]{\thepage}
\fancyhead[CO]{\rightmark}
\renewcommand{\sectionmark}[1]{%
\markright{#1}%
\def\firstpara{1}\def\lastpara{1}% reset counters each section
}
\fancyhead[CE]{\leftmark}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\fancyhead[LO,RE]{\thesection.\theparagraph}
\newcommand{\sectionbreak}{\clearpage\thispagestyle{plain}}
\renewcommand\thesection{\arabic{section}}
% now the macros for tracking the paragraph numbers
\def\firstpara{1}% set to 1 by default
\def\lastpara{1}% set to 1 by default
\def\setparagraph#1-#2-#3|{%
% if \firstpara=0 => new page => set \firstpara
\ifnum\firstpara=0\def\firstpara{#1}\fi%
% if #2=0 => only #1 is meaningful to set \lastpara to this
% otherwise use #2
\ifnum#2=0\def\lastpara{#1}\else\def\lastpara{#2}\fi%
}
\def\paragraph#1{%\textbf{#1}\space
\setparagraph#1-0-|%
}
\def\theparagraph{%
% if \firstpara=\lastpara print only \firstpara otherwise print a range
\ifnum\firstpara=\lastpara\firstpara\else\firstpara--\lastpara\fi
% reset firstpara and lastpara
\xdef\firstpara{\lastpara}%
%\let\lastpara\relax%
}
% back to the MWe
\begin{document}
\null
\pagestyle{empty}
\newpage
\newpage
\pagestyle{fancy}
\chapter{A Chapter}
\section{First Section}
\paragraph{1}\lipsum
\paragraph{2}\lipsum
\paragraph{3-5}\lipsum
\paragraph{6}\lipsum
\paragraph{7-17}\lipsum
\paragraph{18}\lipsum
\paragraph{19-20}\lipsum
\paragraph{21-28}\lipsum
\paragraph{29}\lipsum
\paragraph{30}\lipsum
\section{Second Section}
\paragraph{1}\lipsum
\paragraph{2}\lipsum
\paragraph{3-5}\lipsum
\paragraph{6}\lipsum
\paragraph{7-17}\lipsum
\paragraph{18}\lipsum
\paragraph{19-20}\lipsum
\paragraph{21-28}\lipsum
\paragraph{29}\lipsum
\paragraph{30}\lipsum
\section{Third Section}
\paragraph{1}\lipsum
\paragraph{2}\lipsum
\paragraph{3}\lipsum
\paragraph{4}\lipsum
\paragraph{5}\lipsum
\paragraph{6}\lipsum
\paragraph{7}\lipsum
\paragraph{8}\lipsum
\paragraph{9}\lipsum
\paragraph{10}\lipsum
\paragraph{11}\lipsum
\paragraph{12}\lipsum
\paragraph{13}\lipsum
\paragraph{14}\lipsum
\paragraph{15}\lipsum
\paragraph{16}\lipsum
\paragraph{17}\lipsum
\paragraph{18}\lipsum
\paragraph{19}\lipsum
\paragraph{20}\lipsum
\end{document}
Hier sind die Fehler, die mir bekannt sind:
Der Seitenstil mit einem neuen Abschnitt ist schlicht, es gibt also keine Kopfzeile, was richtig ist. Auf der nächsten Seite, also der ersten Seite in einem Abschnitt mit einer Kopfzeile, ist die erste Absatznummer jedoch immer 1, obwohl dies die relevante Absatznummer für den ersten Absatz auf dieser Seite sein sollte, wie überall sonst auch. Tatsächlich kann ich diesen Fehler nicht im MWE anzeigen lassen, aber in meinem gesamten Dokument schon. Andrews Vorschlag, 1 durch 0 zu ersetzen, hat
\sectionmark
das Problem nicht behoben. Ich werde das MWE aktualisieren, wenn ich diesen Fehler anzeigen lassen kann.Im Vorspann erscheinen einige Kopf-/Fußzeilen, die alle im Seitenstil leer sein sollten. Sie erscheinen auf den Seiten, die einer Überschrift vorangehen. Siehe die zweite leere Seite des MWE.
In einigen Fällen ist die Zählung der Absatznummern falsch. Dies erscheint im MWE auf den letzten beiden Seiten. Die vorletzte Seite sollte 16-19 sein, ist aber 16-20; und die letzte Seite sollte 19-20 sein. Dies kommt in meinem gesamten Dokument ziemlich häufig vor und scheint aufzutreten, wenn es ein Waisenelement gibt.
Die letzte Seite weist noch einen weiteren kleinen Fehler auf: Wenn ein „Bereich“ von nur einem Absatz vorhanden ist, sollte nur einer angezeigt werden. Beispielsweise sollte statt „20-20“ nur „20“ stehen.
Die Handhabung von Absatzbereichen ist nicht genau wie angegeben. Der dritte Absatz hat beispielsweise einen Bereich von 3-5, daher sollte die Überschrift auf Seite 4 mit demErsteAbsatz dieses Bereichs, aber stattdessen hat er 5-20.
Die letzte Überschrift eines Abschnitts gibt die falsche Abschnittsnummer an. Sie hat die Abschnittsnummer des folgenden Abschnitts. Seite 5 des MWE hat beispielsweise die Nummer 2.20-30, steht aber im ersten Abschnitt, also müsste es 1.20-30 heißen.
Antwort1
Gute Frage! Hier ist eine Möglichkeit, dies zu tun. Ich habe den \paragraph
Befehl gekapert, sodass er das ihm übergebene Argument mit ausgibt \textbf{#1}
und dann Absatzzähler \firstpara
und setzt \lastpara
, indem er den Befehl \setparagraph
mit #1-0-|
als Argument aufruft.
Das \setparagraph
Makro ist etwas knifflig, da es Argumente akzeptieren muss, die entweder wie eine einzelne Zahl aussehen können, wie 6
, oder wie ein Zahlenbereich, wie 7-21
. Dies wird erreicht, indem drei Argumente erwartet werden, die im Format angegeben werden müssen #1-#2-#3|
. Wenn also 6
das Argument für \paragraph then the arguments for
\setparagraph are
#1=6 ,
#2=0 and
#3 is empty. If
7-21 is the argument to
\paragraph ist, dann #1=7
, #2=21
und #3=0
für \setparagaph
.
Danach spiele ich einige Spiele, um sicherzustellen, dass \firstpara
und \lastpara
mit Prüfungen wie immer auf die richtigen Werte eingestellt sind \ifnum\firstpara=0...
. Die Absatzbereiche in den Überschriften werden mit gedruckt \theparagraph
und dieses Makro setzt auch \firstpara
und zurück \lastpara
, sodass die Zähler für die nächste Seite korrekt sind.
Hier ist eine Beispielausgabe (mit den Absatznummern zur Verdeutlichung):
und hier ist der Code (mit den Absatznummern als Referenz):
BEARBEITENDer Code wurde leicht aktualisiert, um 1–6 im aktualisierten Beitrag zu berücksichtigen.
\documentclass{book}
\usepackage{lipsum}
\setlipsumdefault{1}
\usepackage{titlesec}
%\usepackage[hmargin=63mm,vmargin=68mm]{geometry}
% fancy headings as defined by the OP except we need to be more careful
% with plain headings
\usepackage{fancyhdr}
\fancypagestyle{empty}{
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
}
\fancypagestyle{plain}{
\fancyhf{}% clear all header and footer fields
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\fancyfoot[C]{\bfseries \thepage}%
% need to reset \firstpara on pages without headers
\xdef\firstpara{\midpara}%
}
\fancypagestyle{paragraphs}{
\fancyhead[LE,RO]{\thepage}
\fancyhead[CO]{\rightmark}
\fancyhead[CE]{\leftmark}
\fancyhead[LO,RE]{\ifnum\firstpara>0\relax\thesection.\theparagraph\fi}
}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{%
\markright{#1}%
% reset paragraph counters in each section
\def\firstpara{0}\def\midpara{0}\def\lastpara{0}
}
%\newcommand{\sectionbreak}{\newpage\thispagestyle{plain}}
\let\realSection\section
\renewcommand\section[2][\relax]{\clearpage%
\thispagestyle{plain}%
\ifx#1\relax\relax\realSection{#2}%
\else\realSection[#1]{#2}%
\fi
}
\renewcommand\thesection{\arabic{section}}
% now the macros for tracking the paragraph numbers
\def\firstpara{0}% set to 1 by default
\def\midpara{0}% set to 1 by default
\def\lastpara{0}% set to 1 by default
\def\setparagraph#1-#2-#3|{\def\midpara{#1}%
% if \firstpara=0 => new page => set \firstpara
\ifnum\firstpara=0\relax\def\firstpara{#1}\fi%
% if #2=0 => only #1 is meaningful to set \lastpara to this
% otherwise use #2
\ifnum#2=0\relax\def\lastpara{#1}%
\else\def\lastpara{#2}%
\fi%
}
\def\paragraph#1{\textbf{#1}\space
\setparagraph#1-0-|%
}
\def\theparagraph{%
% if \firstpara=\lastpara print only \firstpara otherwise print a range
\ifnum\firstpara=\lastpara\relax\firstpara\else\firstpara--\lastpara\fi
% reset firstpara and lastpara
\xdef\firstpara{\midpara}%
%\let\lastpara\relax%
}
% back to the MWe
\begin{document}
\null
\pagestyle{empty}
\newpage
\newpage
\pagestyle{paragraphs}
\chapter{A Chapter}
\section{First Section}
\paragraph{1}\lipsum
\paragraph{2}\lipsum
\paragraph{3-5}\lipsum
\paragraph{6}\lipsum
\paragraph{7-17}\lipsum
\paragraph{18}\lipsum
\paragraph{19-20}\lipsum
\paragraph{21-28}\lipsum
\paragraph{29}\lipsum
\paragraph{30}\lipsum
\section{Second Section}
\paragraph{1}\lipsum
\paragraph{2}\lipsum
\paragraph{3-5}\lipsum
\paragraph{6}\lipsum
\paragraph{7-17}\lipsum
\paragraph{18}\lipsum
\paragraph{19-20}\lipsum
\paragraph{21-28}\lipsum
\paragraph{29}\lipsum
\paragraph{30}\lipsum
\section{Third Section}
\paragraph{1}\lipsum
\paragraph{2}\lipsum
\paragraph{3}\lipsum
\paragraph{4}\lipsum
\paragraph{5}\lipsum
\paragraph{6}\lipsum
\paragraph{7}\lipsum
\paragraph{8}\lipsum
\paragraph{9}\lipsum
\paragraph{10}\lipsum
\paragraph{11}\lipsum
\paragraph{12}\lipsum
\paragraph{13}\lipsum
\paragraph{14}\lipsum
\paragraph{15}\lipsum
\paragraph{16}\lipsum
\paragraph{17}\lipsum
\paragraph{18}\lipsum
\paragraph{19}\lipsum
\paragraph{20}\lipsum
\end{document}
Anmerkungen
Das Problem
2
lag daran, dass der leere Pagetysle nicht wirklich leer war. Genauer gesagt wurde er nicht\headrulewidth
auf null Null gesetzt.Ich verwende es nicht
fancyhdr
, also könnte das durchaus falsch sein, aber ich finde, Sie sind besser dran, wenn Sie Ihren eigenen, ausgefallenen Seitenstil definieren. Ich habeparagraph
oben einen Seitenstil definiert. Ich habe das getan, weil ich festgestellt habe, dass derfancy
Seitenstil nicht gut mit den anderen Stilen harmonierte.Der
\sectionbreak
verwendete Befehltitlesec
scheint die Ursache Ihres Problems zu sein6
. Ich vermute, dass er den Abschnittszähler vor dem Aufruf erhöht,\sectionbreak
sodass dies den falschen Header verursacht hat. Ich habe das Problem umgangen, indem ich\sectionbreak
den Abschnittsbefehl vermieden und stattdessen neu definiert habe.