Aktualisierung von \leftmark und \rightmark

Layout von Seiten, Rändern, Fusszeilen, usw, modifizieren


DoSchoe
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Sa 4. Nov 2017, 12:31

Aktualisierung von \leftmark und \rightmark

Beitrag von DoSchoe »

Hallo zusammen,

ich versuche seit einiger Zeit den Inhalt der Kopfzeile im Dokument verwenden zu können. Wie im Beispiel zu sehen, besteht meine Kopfzeile aus der chapter-Überschrift und aus der section-Überschrift welche ich mit "\leftmark" und "\rightmark" in die Kopfzeile schreibe.
Daher dachte ich mir, ich verwende diese beiden Befehle direkt im Dokument. Leider hinken "\leftmark" und "\rightmark"-Befehl immer eine Seite hinterher. Gibt es dazu eine Lösung, dass ich auf der Seite den aktuellen Kopfzeileneintrag verwenden kann?
\documentclass[11pt,a4paper,oneside]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[naustrian]{babel}
\usepackage{blindtext}
\usepackage[headsepline,automark,autooneside=false]{scrlayer-scrpage}
\ihead{\rightmark}
\chead{}
\ohead{\leftmark}
\begin{document}
	\chapter{Kapitel 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\newpage
	\section{Abschnitt 3}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\chapter{Kapitel 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage
	\section{Abschnitt 3}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
\end{document}
Danke bereits im Voraus für eure Beiträge/Vorschläge und Hilfe

Gast

Beitrag von Gast »

Die Marken sind explizit für Kopf und Fuß, wobei meist \headmark genügt. Es gibt neben den genannten Marken auch noch weitere. Die Marken werden aber AFAIK erst in der output-Routine von TeX aktualisiert.

Im Text sehe ich aber auch keinen Sinn darin, denn im Text weiß man ja eigentlich in welchem Kapitel oder Abschnitt man ist. Man kann also problemlos direkt deren Titel nutzen und mit \label und \ref oder nameref arbeiten.

DoSchoe
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Sa 4. Nov 2017, 12:31

Beitrag von DoSchoe »

Danke für den schnellen Beitrag und für den Hinweis mit der Output-Routine. Vielleicht finde ich darin eine Lösung.
Die Verwendung von \label und anschließend mit \ref, \nameref, \pageref ist mir bekannt. Leider funktioniert dies in meinem Fall nicht.

Ich hätte vielleicht den genauen Background zu meiner Frage anführen sollen. In meiner Kopfzeile überschneiden sich die Einträge der Kopfzeile. Darum habe ich mir eine Berechnung überlegt, mit der ich automatisch eine zweizeilig Kopfzeile erstelle, sobald \leftmark und \rightmark zusammen breiter sind, als die \textwidth. Außerdem werden die Breiten von \leftmark und \rightmark (für die zweizeilige Kopfzeile verwende ich eine \parbox) dynamisch angepasst.
Da aber \rightmark und \leftmark nicht aktuell sind, funktioniert die ganze Berechnung nicht (bzw. mit einer Seite Verzögerung).

P.S.: Die Verwendung von Kurztitel in der Kopfzeile kenne ich. Kann ich aber in meinem Fall auch nicht benützen.

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Mach doch mal ein Code-Beispiel, dass dein eigentliches Ziel zeigt ;-) Ich verstehe nämlich nicht, wozu du die Marken im Text brauchst, wenn du ne Berechnung machen willst, die nur für die Kopfzeile relevant ist … führ die Berechnung doch dann auch innerhalb der Kopfzeile durch ;-)
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

DoSchoe
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Sa 4. Nov 2017, 12:31

Beitrag von DoSchoe »

Danke für den Vorschlag mit der Berechnung direkt in der Kopfzeile. Keine Ahnung warum ich nicht gleich daran gedacht habe, ich schieb es mal auf den Tunnelblick-Effekt :oops: !

Grundsätzlich hätte ich jetzt mal einen Ansatz gefunden der eigentlich funktioniert. Er hat noch kleinere Mängel, denke aber die bekommt man noch in den Griff!

Das Dokument:
\documentclass[11pt,a4paper,oneside]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[left=4.00cm, right=2.00cm, top=3.50cm, bottom=2.00cm]{geometry}
\usepackage[naustrian]{babel}
\usepackage{blindtext}
\usepackage{MulitLineHeader}

\usepackage[headsepline,automark,autooneside=false]{scrlayer-scrpage}
\pagestyle{scrheadings}
\ihead{\multilineRightmark}
\chead{}
\ohead{\multilineLeftmark}
%\ohead{\parbox{0.5\textwidth}{\raggedleft\leftmark}}

\begin{document}
	\chapter{Kapitel 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	Textweite: \the\textwidth \\
	Zeilenabstand: \the\baselineskip
	
	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage{}
	\section{Abschnitt 34}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\chapter{Kapitel 2 mit einem zu langem Titel für die Kopfzeile, wirklich viel viel viel viel zu lang}
	Rightmark: \rightmark \\
	Leftmark: \leftmark

	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage
	\section{Abschnitt 3 mit einem zu langem Titel für die Kopfzeile, wirklich viel viel viel viel zu lang}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
\end{document}
Mit den Berechnungen:
%% Length leftmark
\newlength{\Llm}
%% Length rightmark
\newlength{\Lrm}
%% Length current header
\newlength{\Lch}
%% Gap between \leftmark \rightmark
\def\headerGap{15pt}
\def\halfHeaderGap{7.5pt}
%% Maximal length of the header
\newlength{\maxLh}
%% Maximal length for the marks
\newlength{\maxLm}
%% Temporal length
\newlength{\tmp}

\newcommand{\calcHeaderLengths}{
	\settowidth{\Llm}{\leftmark}
	\settowidth{\Lrm}{\rightmark}
	\setlength{\Lch}{\Llm}
	\advance\Lch by \Lrm
	\advance\Lch by \headerGap
	\setlength{\maxLh}{\textwidth}
	\advance\maxLh by -\headerGap
	\setlength{\maxLm}{\maxLh}
	\divide\maxLm by 2
	\tmp=0pt
}
\newcommand{\multilineRightmark}
{
	\calcHeaderLengths
	\ifdim \Lch>\textwidth
	{
		\ifdim \Llm>\Lrm
		{
			\ifdim \Lrm>\maxLm
			{
				\parbox{\maxLm}{\rightmark}
			}
			\else
			{
				\parbox{\Lrm}{\rightmark}
			}\fi
		}
		\else
		{
			\ifdim \Llm>\maxLm
			{
				\parbox{\maxLm}{\rightmark}
			}
			\else
			{
				\setlength{\tmp}{\maxLh}
				\advance\tmp by -\Llm
				\parbox{\tmp}{\rightmark}
			}\fi
		}\fi
	}
	\else
	{
		\rightmark
	}\fi
}
\newcommand{\multilineLeftmark}
{
	\calcHeaderLengths
	\ifdim \Lch>\textwidth
	{
		\ifdim \Llm>\Lrm
		{
			\ifdim \Lrm>\maxLm
			{
				\parbox{\maxLm}{\raggedleft\leftmark}
			}
			\else
			{
				\setlength{\tmp}{\maxLh}
				\advance\tmp by -\Lrm
				\parbox{\tmp}{\raggedleft\leftmark}
			}\fi
		}
		\else
		{
			\ifdim \Llm>\maxLm
			{
				\parbox{\maxLm}{\raggedleft\leftmark}
			}
			\else
			{
				\parbox{\Llm}{\raggedleft\leftmark}
			}\fi
		}\fi
	}
	\else
	{
		\leftmark
	}\fi
}
Jetzt gibt es noch folgende Probleme:
  1. Die \rightmark wird aufgrund der Formatierung(Zeilenumbrüche/Leerzeichen/...) der MulitLineHeader.sty nach innen verschoben.
  2. Sobald eine \parbox für die \leftmark verwendet wird, wird auch diese vom Rand etwas nach innen versetzt. Dies hängt aber auch mit dem Style-Paket zusammen, da bei einer direkten Verwendung einer \parbox in \ohead passiert dies nicht (siehe auskommentierte Zeile).
Ich freue mich über jeden Verbesserungshinweis bzw. Tipp für die zwei Probleme.

P.S.: Die Formatierung/Längenbezeichnung/usw. der MultiLineHeader.sty lässt noch zu wünschen über. Wird in weiteren Schritten noch verbessert.
Dateianhänge
MulitLineHeader.zip
(591 Bytes) 300-mal heruntergeladen

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Lies mal https://komascript.de/signifikanteLeerzeichen und ergänze in deinem Code die vielen fehlenden %, wenn es dann immer noch Verschiebungen gibt, kann man nochmal schauen woher die kommen …

Hier für’s Forum, wärs nett, wenn du deinen Code möglichst in einer „Datei“ postest, damit man das direkt kopieren oder in Overleaf öffnen kann ;-)

Ich verstehe nicht, warum du \(half)headerGap als Befehl und nicht als Länge definiert.

Und wenn du magst, versuch dich doch mal an einer Implementierung mit LaTeX3 bzw. expl3. Da ist die Rechnerei mit den Längen etwas bequemer. Zum Einstieg, lade ich dich zum Lesen meines Blogs ein: http://tobiw.de/tbdm/tag:LaTeX3. Das Beispiel zu den Funktionssymbolen enthält ne knappe Einführung in LaTeX 3
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

DoSchoe
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Sa 4. Nov 2017, 12:31

Beitrag von DoSchoe »

Ich möchte mich nochmals bei iTob für die hilfreichen Tips bedanken.
Grundsätzlich hab ich ich geschafft, dass meine Kopfzeilen nun dynamisch angepasst werden.
Aber:
Das Package wurde "dirty-coding" Style geschrieben. Ich wollte jetzt das ganze etwas eleganter schreiben bzw. vereinfachen (auch in Hinblick auf zukünftige Erweiterungen) und bin sofort auf ein Problem gestoßen. Und zwar werden bei mir die Befehle "\mLeftmark" und "\mRightmark" mit 'renewcommand{}{}' nicht mehr überschrieben. Sie bleiben immer auf den Defaultwerten obwohl ich diese im Befehl "\multiLine" überschreibe. Liegt es eventuell daran, dass ich Befehle nicht verschachteln darf?

\documentclass[11pt,a4paper,oneside]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[left=4.00cm, right=2.00cm, top=3.50cm, bottom=2.00cm]{geometry}
\usepackage[naustrian]{babel}
\usepackage{blindtext}

\usepackage[headsepline,automark,autooneside=false]{scrlayer-scrpage}
\pagestyle{scrheadings}
\ihead{\multilineRightmark}
\chead{}
\ohead{\multilineLeftmark}

%%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%% MULTI-LINE HEADER
%%======================================================================
%%            Variablen
%%----------------------------------------------------------------------
%% Declarierung:
%%
% Length leftmark
\newlength{\lengthLeftmark}%
% Length rightmark
\newlength{\lengthRightmark}%
% Length current header
\newlength{\currentHeaderLength}%
% Gap between \leftmark and \rightmark
\newlength{\headerGap}%
\newlength{\halfHeaderGap}%
% Maximal length of the header
\newlength{\maxHeaderLength}
% Maximal length for the marks
\newlength{\maxMarkLength}
% Temporal length
\newlength{\tmp}
%%----------------------------------------------------------------------
%% Defaultwerte festlegen:
%%
\lengthLeftmark = 0pt%
\lengthRightmark = 0pt%
\currentHeaderLength = 0pt%
\headerGap=15pt%
\halfHeaderGap=0.5\headerGap%
\maxHeaderLength = \textwidth%
\maxMarkLength = 0.5\maxHeaderLength%
\tmp = 0pt%
%%======================================================================
%%            Befehle
%%----------------------------------------------------------------------
\newcommand{\mLeftmark}{linke Marke}%
\newcommand{\multiLeftmark}[1]%
{%
	\renewcommand{\mLeftmark}{#1}%
}
\newcommand{\mRightmark}{rechte Marke}%
\newcommand{\multiRightmark}[1]%
{%
	\renewcommand{\mRightmark}{#1}%
}
%%----------------------------------------------------------------------
%% aktuelle Längen berechnen:
\newcommand{\calcHeaderLengths}{%
	\settowidth{\lengthLeftmark}{\leftmark}%
	\settowidth{\lengthRightmark}{\rightmark}%
	\setlength{\currentHeaderLength}{\lengthLeftmark}%
	\advance\currentHeaderLength by \lengthRightmark%
	\advance\currentHeaderLength by \headerGap%
	\setlength{\maxHeaderLength}{\textwidth}%
	\advance\maxHeaderLength by -\headerGap%
	\setlength{\maxMarkLength}{\maxHeaderLength}%
	\divide\maxMarkLength by 2%
	\tmp=0pt%
}
%%----------------------------------------------------------------------
%% Berechnung \rightmark
\newcommand{\multilineRightmark}%
{%
	\calcHeaderLengths%
	\multiLine%
	\mRightmark%
}
%%----------------------------------------------------------------------
%% Berechnung \leftmark
\newcommand{\multilineLeftmark}%
{%
	\calcHeaderLengths%
	\multiLine%
	\mLeftmark%
}
%%----------------------------------------------------------------------
%% Berechnung Kopfzeile
\newcommand{\multiLine}%
{%
	\calcHeaderLengths%
	\ifdim \currentHeaderLength>\textwidth%
	{%
		\ifdim \lengthLeftmark>\lengthRightmark%
		{%
			\ifdim \lengthRightmark>\maxMarkLength%
			{%
				\multiRightmark{\parbox{\maxMarkLength}{\rightmark}}%
				\multiLeftmark{\parbox{\maxMarkLength}{\raggedleft\leftmark}}%
			}%
			\else%
			{%
				\setlength{\tmp}{\maxHeaderLength}%
				\advance\tmp by -\lengthRightmark%
				\multiRightmark{\parbox{\lengthRightmark}{\rightmark}}%
				\multiLeftmark{\parbox{\tmp}{\raggedleft\leftmark}}%
			}\fi%
		}%
		\else%
		{%
			\ifdim \lengthLeftmark>\maxMarkLength%
			{%
				\multiRightmark{\parbox{\maxMarkLength}{\rightmark}}%
				\multiLeftmark{\parbox{\maxMarkLength}{\raggedleft\leftmark}}%
			}%
			\else%
			{%
				\setlength{\tmp}{\maxHeaderLength}%
				\advance\tmp by -\lengthLeftmark%
				\multiRightmark{\parbox{\tmp}{\rightmark}}%
				\multiLeftmark{\parbox{\lengthLeftmark}{\raggedleft\leftmark}}%
			}\fi%
		}\fi%
	}%
	\else%
	{%
		\multiRightmark{\rightmark}%
		\multiLeftmark{\leftmark}%	
	}\fi%
}
%%======================================================================
%%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

\begin{document}
	\chapter{Kapitel 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	Textweite: \the\textwidth \\
	Zeilenabstand: \the\baselineskip \\
	
	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark  \\
	
	\newpage{}
	\section{Abschnitt 3 mit einem zu langem Titel für die Kopfzeile, wirklich viel viel viel viel zu lang}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\chapter{Kapitel 2 mit einem zu langem Titel für die Kopfzeile, wirklich viel viel viel viel zu lang}
	Rightmark: \rightmark \\
	Leftmark: \leftmark

	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
	
	\newpage
	\section{Abschnitt 3 mit einem zu langem Titel für die Kopfzeile, wirklich viel viel viel viel zu lang}
	Rightmark: \rightmark \\
	Leftmark: \leftmark 
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark
\end{document}
Danke im Voraus für alle Tips!

Benutzeravatar
iTob
Forum-Meister
Forum-Meister
Beiträge: 1221
Registriert: Mo 19. Apr 2010, 22:19
Kontaktdaten:

Beitrag von iTob »

Das Problem ist deine Verwendung der ganzen \if-Konstrukte: Du benutzt dort geschweifte Klammern, so als gebe es Argumente, die die TeX-Primitiven hier aber nicht haben. Folglich werden diese als Gruppen-Klammern interpretiert und damit deine Umdefinition der Kopfmarken lokal auf diese Gruppe beschränkt. Die Lösung ist also, alle diese Klammern zu entfernen …

Hier mal ein vereinfachtes Beispiel (ohne auskommentiere Zeilenenden etc …)
\documentclass{article}
\begin{document}
   Zuweisungen in TF-Konstrukten
   
   \ifnum0=1\relax
      \def\XXX{TRUE}
   \else
      \def\XXX{FALSE}
   \fi
   
   Ergebnis: \XXX
   
   Zuweisungen in TF-Konstrukten mit (falschen) Gruppen
   
   \ifnum0=1
   {
      \def\YYY{TRUE}
   }
   \else
   {
      \def\YYY{FALSE}
   }
   \fi
   
   Ergebnis: \YYY (undefined)
\end{document}
Bei solchen Vergleichen ist es (häufig) sinnvoll oder sogar nötig, nach dem Vergleich ein \relax[\t] zu ergänzen, damit TeX das Ende des Vergleichs vom Beginn des Fall-Codes unterscheiden kann.

[code]
\documentclass{article}
\begin{document}
\ifnum11=1%
1 mal 11 ist \textbf{nicht} 121
\else
11 mal 11 ist 121
\fi

\ifnum11=1\relax
11 mal 11 ist \textbf{nicht} 121
\else
11 mal 11 ist 121
\fi
\end{document}
[/code]

Noch ein kleiner Hinweis: Wenn eine Zeile it einem Befehl ohne Argumente endet, z.B. Z. 65 bei dir, kannst du dir das Prozentzeichen auch spare, weil der Befehl das folgende Leerzeichen eh verschluckt, da dieses als Befehlende gelesen wird, folgt auf den Befehl aber ein anderes Zeichen als ein Leerzeichen (z.B. Argumentklammern) wird das darauf folgende Leerzeichen ausgeben und das Prozentzeichen wird Pflicht. Das musst du aber auch nur beachten, an Stellen, die tatsächlich mehr oder weniger unmittelbar zu einer Textausgabe führen. Zuweisungen in der Präambel (bei dir Z. 38–45) ist es überflüssig.
Diese Sorgen hat man mit LaTeX3 übrigens nicht, in Definitionen werden alle (!) Leerzeichen ignoriert, was durchaus praktisch ist.
Ich biete Hilfe, Beratung und Schulung für alle Fragen rund um TeX, Buchgestaltung und Textsatz, sowie Grafik- und Kommunikationsdesign.
Mehr Infos und Kontakt unter tobiw.de.

Hier schreibe ich über TeX: Mein Blog „TeX-Beispiel des Monats“ (Deutsch) und TeX.tips (Englisch).

DoSchoe
Forum-Newbie
Forum-Newbie
Beiträge: 7
Registriert: Sa 4. Nov 2017, 12:31

Beitrag von DoSchoe »

Durch intensive Unterstützung von iTob, nochmals herzlichen Dank, ist es mir gelungen, eine automatischen mehrzeiligen Kopfzeile zu schreiben. Ich hoffe Anderen damit helfen zu können und freue mich aber auch auf Rückmeldungen. Das ganze hab ich auch in ein Package gepackt, damit man nicht den ganzen Code im Dokument hat. ACHTUNG: Das Package hat keinen offiziellen Charakter, dazu muss ich mich zuerst noch in den clsguide einlesen. Das Einbinden funktioniert aber solange die Datei im selben Ordner wie die *.tex-Datei liegt.

BR
\documentclass[11pt,a4paper,oneside]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[left=4.00cm, right=2.00cm, top=3.50cm, bottom=2.00cm]{geometry}
\usepackage[naustrian]{babel}
\usepackage{blindtext}



\usepackage[headsepline,automark,autooneside=false]{scrlayer-scrpage}
\pagestyle{scrheadings}
%\renewcommand{\chapterpagestyle}{scrheadings}
\ihead[]{\multilineIHeader{\rightmark}{}{\leftmark}}
%\ihead{}
\chead{\multilineCHeader{\rightmark}{}{\leftmark}}
\ohead{\multilineOHeader{\rightmark}{}{\leftmark}}
%\ohead{}
\makeatletter

\newcommand{\docTitle}{Mein sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr sehr langer Titel}
\title{\docTitle}
%%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
%% MULTI-LINE HEADER
%%======================================================================
%%            Variablen
%%----------------------------------------------------------------------
%% Declarierung:
%%
% Length inner header
\newlength{\LengthIHeader}%
% Length center header
\newlength{\LengthCHeader}%
% Length outer header
\newlength{\LengthOHeader}%
% Length current header
\newlength{\LengthHeader}%
% Gap between inner/center/outer header
\newlength{\HeaderGap}%
\newlength{\HalfHeaderGap}%
% Maximal length of the header
\newlength{\LengthHeaderMax}%
% Maximal length for the marks
\newlength{\LengthHeaderpartMax}%
% Temporal length
\newlength{\Tmp}%
% Zero length
\newlength{\Zero}%
%%----------------------------------------------------------------------
%% Defaultwerte festlegen:
%%
\HeaderGap=15pt%
\HalfHeaderGap=0.5\HeaderGap%
\LengthHeaderMax = \textwidth%
\LengthHeaderpartMax = 0.33\LengthHeaderMax%
\Zero=0.0pt%
%%======================================================================
%%            Befehle
%%----------------------------------------------------------------------
% Testbefehle

%%----------------------------------------------------------------------
% Eingabewerte:
\newcommand{\@tmpIHeader}{}%
\newcommand{\tmpIHeader}[1]%
{%
	\renewcommand{\@tmpIHeader}{#1}%
}
\newcommand{\@tmpCHeader}{}%
\newcommand{\tmpCHeader}[1]%
{%
	\renewcommand{\@tmpCHeader}{#1}%
}
\newcommand{\@tmpOHeader}{}%
\newcommand{\tmpOHeader}[1]%
{%
	\renewcommand{\@tmpOHeader}{#1}%
}
%%----------------------------------------------------------------------
% Rückgabewerte:
\newcommand{\@multiIHeader}{not defined}%
\newcommand{\multiIHeader}[1]%
{%
	\renewcommand{\@multiIHeader}{#1}%
}
\newcommand{\@multiCHeader}{not defined}%
\newcommand{\multiCHeader}[1]%
{%
	\renewcommand{\@multiCHeader}{#1}%
}
\newcommand{\@multiOHeader}{not defined}%
\newcommand{\multiOHeader}[1]%
{%
	\renewcommand{\@multiOHeader}{#1}%
}
%%----------------------------------------------------------------------
\newcommand{\setHeaderGap}[1]%
{%
	\setlength\HeaderGap{#1}%
	\setlength\HalfHeaderGap{0.5\HeaderGap}%
}
%%----------------------------------------------------------------------
%% aktuelle Längen berechnen:
\newcommand{\calcHeaderLengths}{%
	\settowidth{\LengthIHeader}{\@tmpIHeader}%
	\settowidth{\LengthCHeader}{\@tmpCHeader}%
	\settowidth{\LengthOHeader}{\@tmpOHeader}%
	\ifdim\LengthCHeader>\Zero\relax%
		\setlength{\LengthHeader}{\LengthIHeader}%
		\advance\LengthHeader by \LengthCHeader%
		\advance\LengthHeader by \LengthOHeader%
		\advance\LengthHeader by 2\HeaderGap%
		\setlength{\LengthHeaderMax}{\textwidth}%
		\advance\LengthHeaderMax by -2\HeaderGap%
		\setlength{\LengthHeaderpartMax}{\LengthHeaderMax}%
		\divide\LengthHeaderpartMax by 3%
	\else%
		\setlength{\LengthHeader}{\LengthIHeader}%
		\advance\LengthHeader by \LengthOHeader%
		\advance\LengthHeader by \HeaderGap%
		\setlength{\LengthHeaderMax}{\textwidth}%
		\advance\LengthHeaderMax by -\HeaderGap%
		\setlength{\LengthHeaderpartMax}{\LengthHeaderMax}%
		\divide\LengthHeaderpartMax by 2%
	\fi%
	\Tmp=0pt%
}
%%----------------------------------------------------------------------
%% Calculation inner header
\newcommand{\multilineIHeader}[3]%
{%
	\tmpIHeader{#1}%
	\tmpCHeader{#2}%
	\tmpOHeader{#3}%
	\multiLine%
	\@multiIHeader%
}
%%----------------------------------------------------------------------
%% Calculation center header
\newcommand{\multilineCHeader}[3]%
{%
	\tmpIHeader{#1}%
	\tmpCHeader{#2}%
	\tmpOHeader{#3}%
	\multiLine%
	\@multiCHeader%
}
%%----------------------------------------------------------------------
%% Calculation outer header
\newcommand{\multilineOHeader}[3]%
{%
	\tmpIHeader{#1}%
	\tmpCHeader{#2}%
	\tmpOHeader{#3}%
	\multiLine%
	\@multiOHeader%
}
%%----------------------------------------------------------------------
%% Berechnung Kopfzeile
\newcommand{\multiLine}%
{%
	\calcHeaderLengths%
	\ifdim\LengthCHeader>\Zero\relax%
		\ifdim\LengthCHeader>\LengthHeaderpartMax\relax%
			\multiIHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\@tmpIHeader}}%
			\multiCHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\@tmpCHeader}}%
			\multiOHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\raggedleft\@tmpOHeader}}%
		\else%
			\setlength{\Tmp}{\LengthHeaderMax}%
			\advance\Tmp by -\LengthCHeader%
			\divide\Tmp by 2%
			\multiIHeader{\parbox[b][0cm][b]{\Tmp}{\@tmpIHeader}}%
			\multiCHeader{\parbox[b][0cm][b]{\LengthCHeader}{\centering\@tmpCHeader}}%
			\multiOHeader{\parbox[b][0cm][b]{\Tmp}{\raggedleft\@tmpOHeader}}%				
		\fi%
	\else%
		\multiCHeader{\@tmpCHeader}%
		\ifdim\LengthHeader>\textwidth\relax%
			\ifdim\LengthOHeader>\LengthIHeader\relax%
				\ifdim\LengthIHeader>\LengthHeaderpartMax\relax%
					\multiIHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\@tmpIHeader}}%
					\multiOHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\raggedleft\@tmpOHeader}}%
				\else%
					\setlength{\Tmp}{\LengthHeaderMax}%
					\advance\Tmp by -\LengthIHeader%
					\multiIHeader{\parbox[b][0cm][b]{\LengthIHeader}{\@tmpIHeader}}%
					\multiOHeader{\parbox[b][0cm][b]{\Tmp}{\raggedleft\@tmpOHeader}}%
				\fi%
			\else%
				\ifdim\LengthOHeader>\LengthHeaderpartMax\relax%
					\multiIHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\@tmpIHeader}}%
					\multiOHeader{\parbox[b][0cm][b]{\LengthHeaderpartMax}{\raggedleft\@tmpOHeader}}%
				\else%
					\setlength{\Tmp}{\LengthHeaderMax}%
					\advance\Tmp by -\LengthOHeader%
					\multiIHeader{\parbox[b][0cm][b]{\Tmp}{\@tmpIHeader}}%
					\multiOHeader{\parbox[b][0cm][b]{\LengthOHeader}{\raggedleft\@tmpOHeader}}%
				\fi%
			\fi%
		\else%
			\multiIHeader{\@tmpIHeader}%
			\multiOHeader{\@tmpOHeader}%
		\fi%
	\fi%
}
%%======================================================================
%%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
\makeatother

\begin{document}
	\maketitle
	\chapter{Kapitel 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	Textweite: \the\textwidth \\
	Zeilenabstand: \the\baselineskip \\
	
	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark  \\
	
	\newpage{}
	\section{Abschnitt 3 mit einem sehr sehr sehr sehr sehr sehr sehr sehr sehr langem Titel}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\chapter{Kapitel 2 mit einem sehr sehr sehr sehr sehr sehr sehr sehr sehr langem Titel}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\

	\section{Abschnitt 1}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
	
	\newpage
	\section{Abschnitt 2}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\ 
	
	\newpage
	\section{Abschnitt 3 mit einem sehr sehr sehr sehr sehr sehr sehr sehr sehr langem Titel}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\

	\section{Abschnitt 4}
	Rightmark: \rightmark \\
	Leftmark: \leftmark \\
\end{document}
Dateianhänge
MultiLineHeader.zip
(1.3 KiB) 241-mal heruntergeladen

Beinschuss
Forum-Meister
Forum-Meister
Beiträge: 809
Registriert: Di 2. Okt 2012, 21:42
Wohnort: NRW

Beitrag von Beinschuss »

Danke, das zeigt mal wieder, was man alles mit LaTeX machen kann. Aber den Sinn dieser hübsch hässlichen Lösung erfasse ich nicht. Denn entweder habe ich ein langes Dokument, das ich zumeist zweiseitig setze, und dann setze ich auf der einen Seite das Kapitel und auf der anderen das Unterkapitel in die Kopfzeile. Oder ich habe ein - zumeist kürzeres - einseitiges Dokument, und da reicht mir das Kapitel in der Kopfzeile zur Orientierung aus. Und wenn ich mal eine lange Kapitelüberschrift habe, nutze ich das optionale Argument und setze die Kurzüberschrift in die Kopfzeile, was m.E. deutlich aufgeräumter und schöner aussieht.

Antworten