Aktualisierung von \leftmark und \rightmark

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Aktualisierung von \leftmark und \rightmark

von DoSchoe » Di 14. Nov 2017, 10:30

Hallo Beinschuss,

danke für deinen Beitrag. Die selbe Frage habe ich auch den Verantwortlichen gestellt. Begonnen habe ich ebenfalls mit Kapitel-Unterkapitel und den entsprechenden Kurztiteln.
Leider sind die Vorgaben für dieses Dokument sehr konkret (einseitig, Titel + Kapitel in Kopfzeile - ohne Kurztitel, und vieles vielse mehr... ) und daher musste ich diesen "hübsch hässlichen" ( :lol: ) work-around umsetzten.
Mir ist bewusst, dass das package dem "dirty-coding" Standard entspricht. Leider hatte(habe ich zur Zeit) keine Zeit mich in die Programmierung von Latex2E genau einzulesen.

Ich hoffe aber trotzdem, dass es vl irgendwann jemanden hilft.

von Beinschuss » Di 14. Nov 2017, 10:16

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.

von DoSchoe » Mo 13. Nov 2017, 22:18

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) 270-mal heruntergeladen

von iTob » Do 9. Nov 2017, 10:06

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.

von DoSchoe » Mi 8. Nov 2017, 21:58

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!

von iTob » So 5. Nov 2017, 14:18

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

von DoSchoe » So 5. Nov 2017, 14:01

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) 304-mal heruntergeladen

von iTob » Sa 4. Nov 2017, 16:00

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 ;-)

von DoSchoe » Sa 4. Nov 2017, 15:49

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.

von Gast » Sa 4. Nov 2017, 13:35

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.

Nach oben