goLaTeX - Mein LaTeX-Forum

Mein LaTeX-Forum


Login  | Registrieren
Forum
      Option
[Erweitert]
  • Diese Seite weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Aktualisierung von \leftmark und \rightmark

 

DoSchoe
Forum-Newbie
Forum-Newbie

Beiträge: 7
Anmeldedatum: 04.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2017, 12:56     Titel: Aktualisierung von \leftmark und \rightmark
  Antworten mit Zitat      
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?

Code • Öffne in Overleaf
\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
Private Nachricht senden Benutzer-Profile anzeigen

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2017, 13:35     Titel:
  Antworten mit Zitat      
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 Paket auf CTANnameref arbeiten.

DoSchoe
Forum-Newbie
Forum-Newbie

Beiträge: 7
Anmeldedatum: 04.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2017, 15:49     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen

iTob
Forum-Meister
Forum-Meister


Beiträge: 1200
Anmeldedatum: 19.04.10
Wohnort: ---
Version: TeX Live auf OS X
     Beitrag Verfasst am: 04.11.2017, 16:00     Titel:
  Antworten mit Zitat      
Mach doch mal ein Code-Beispiel, dass dein eigentliches Ziel zeigt Wink 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 Wink
_________________

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).
Private Nachricht senden Benutzer-Profile anzeigen

DoSchoe
Forum-Newbie
Forum-Newbie

Beiträge: 7
Anmeldedatum: 04.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2017, 14:01     Titel:
  Antworten mit Zitat      
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 Embarassed !

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:
Code • Öffne in Overleaf

\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:
Code • Öffne in Overleaf
%% 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.

MulitLineHeader.zip
 Beschreibung:

Download
 Dateiname:  MulitLineHeader.zip
 Dateigröße:  591 Bytes
 Heruntergeladen:  12 mal
Private Nachricht senden Benutzer-Profile anzeigen

iTob
Forum-Meister
Forum-Meister


Beiträge: 1200
Anmeldedatum: 19.04.10
Wohnort: ---
Version: TeX Live auf OS X
     Beitrag Verfasst am: 05.11.2017, 14:18     Titel:
  Antworten mit Zitat      
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 Wink

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).
Private Nachricht senden Benutzer-Profile anzeigen

DoSchoe
Forum-Newbie
Forum-Newbie

Beiträge: 7
Anmeldedatum: 04.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2017, 21:58     Titel:
  Antworten mit Zitat      
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?


Code • Öffne in Overleaf

\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!
Private Nachricht senden Benutzer-Profile anzeigen

iTob
Forum-Meister
Forum-Meister


Beiträge: 1200
Anmeldedatum: 19.04.10
Wohnort: ---
Version: TeX Live auf OS X
     Beitrag Verfasst am: 09.11.2017, 10:06     Titel:
  Antworten mit Zitat      
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 …)

Code • Öffne in Overleaf

\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 [t]\relax[\t] zu ergänzen, damit TeX das Ende des Vergleichs vom Beginn des Fall-Codes unterscheiden kann.

Code • Öffne in Overleaf

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


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).
Private Nachricht senden Benutzer-Profile anzeigen

DoSchoe
Forum-Newbie
Forum-Newbie

Beiträge: 7
Anmeldedatum: 04.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2017, 22:18     Titel:
  Antworten mit Zitat      
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

Code • Öffne in Overleaf
\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}


MultiLineHeader.zip
 Beschreibung:

Download
 Dateiname:  MultiLineHeader.zip
 Dateigröße:  1.3 KB
 Heruntergeladen:  7 mal
Private Nachricht senden Benutzer-Profile anzeigen

Beinschuss
Forum-Meister
Forum-Meister

Beiträge: 776
Anmeldedatum: 02.10.12
Wohnort: NRW
Version: MiKTeX, Windows 10, TeXstudio
     Beitrag Verfasst am: 14.11.2017, 10:16     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen

Neues Thema eröffnen Neue Antwort erstellen Gehe zu Seite 1, 2  Weiter



Options and Permissions
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen
.

goLaTeX ist Teil der goForen
goForen.de goMATLAB.de goLaTeX.de goPCB.de


  Impressum | FAQ | goLaTeX RSS Button RSS-Feed

Copyright © 2008 - 2017 goLaTeX.de