176 lines
7.7 KiB
TeX
176 lines
7.7 KiB
TeX
|
|
% or_pdf_header.tex
|
||
|
|
% Gemeinsame LaTeX-Zusatzpraeambel fuer den PDF-Bau der Arbeitskopie UND
|
||
|
|
% der Version 02. Einbindung per pandoc --include-in-header <diese Datei>.
|
||
|
|
|
||
|
|
% --- SVG-Grafiken auf die Textbreite begrenzen -----------------------------
|
||
|
|
% Pandoc setzt \setkeys{Gin}{width=\maxwidth,...}, damit zu breite Bilder
|
||
|
|
% automatisch verkleinert werden. Das wirkt aber nur auf \includegraphics.
|
||
|
|
% SVG-Bilder bindet pandoc als \includesvg{...} OHNE Breitenangabe ein; das
|
||
|
|
% Paket svg rendert sie dann in ihrer natuerlichen Groesse - und alles, was
|
||
|
|
% breiter als der Textblock ist, laeuft ueber den rechten Rand hinaus.
|
||
|
|
%
|
||
|
|
% Der folgende Wrapper stellt das pandoc-Verhalten fuer \includesvg her:
|
||
|
|
% Bilder werden auf \linewidth verkleinert, wenn sie breiter sind, und
|
||
|
|
% ansonsten unveraendert gesetzt (also nie kuenstlich vergroessert).
|
||
|
|
%
|
||
|
|
% \LetLtxMacro statt \let ist noetig, weil \includesvg ein optionales
|
||
|
|
% Argument hat; ein einfaches \let wuerde zu einer Endlosrekursion fuehren.
|
||
|
|
%
|
||
|
|
% Die Abfrage auf \includesvg ist wichtig: Pandoc laedt das Paket svg nur
|
||
|
|
% dann, wenn das Dokument ueberhaupt SVG-Bilder enthaelt. Ohne die Abfrage
|
||
|
|
% scheitert der Lauf bei Dokumenten ohne SVG mit "Undefined control sequence".
|
||
|
|
\usepackage{letltxmacro}
|
||
|
|
\makeatletter
|
||
|
|
\@ifundefined{includesvg}{}{%
|
||
|
|
\LetLtxMacro\origincludesvg\includesvg
|
||
|
|
\renewcommand*{\includesvg}[2][]{%
|
||
|
|
\begingroup
|
||
|
|
\sbox0{\origincludesvg[#1]{#2}}%
|
||
|
|
\ifdim\wd0>\linewidth
|
||
|
|
\resizebox{\linewidth}{!}{\usebox0}%
|
||
|
|
\else
|
||
|
|
\usebox0
|
||
|
|
\fi
|
||
|
|
\endgroup}%
|
||
|
|
}
|
||
|
|
\makeatother
|
||
|
|
|
||
|
|
% --- Lange Codezeilen umbrechen statt ueber den Rand laufen lassen ----------
|
||
|
|
% fvextra erweitert die von pandoc verwendete fancyvrb-Umgebung um
|
||
|
|
% Zeilenumbruch. Ohne das werden Zeilen jenseits der Textbreite abgeschnitten.
|
||
|
|
\usepackage{fvextra}
|
||
|
|
\fvset{
|
||
|
|
breaklines=true, % lange Zeilen umbrechen
|
||
|
|
breakanywhere=true, % notfalls auch mitten im Wort (lange Strings)
|
||
|
|
breaksymbolleft={\tiny\ensuremath{\hookrightarrow}}, % Fortsetzungszeichen
|
||
|
|
fontsize=\small,
|
||
|
|
}
|
||
|
|
|
||
|
|
% Auch fuer die von pandoc erzeugte Highlighting-Umgebung wirksam machen
|
||
|
|
% (das sind die Bloecke mit Sprachangabe, z. B. ```python).
|
||
|
|
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{
|
||
|
|
commandchars=\\\{\},
|
||
|
|
breaklines=true,
|
||
|
|
breakanywhere=true,
|
||
|
|
breaksymbolleft={\tiny\ensuremath{\hookrightarrow}},
|
||
|
|
fontsize=\small
|
||
|
|
}
|
||
|
|
|
||
|
|
% Bloecke OHNE Sprachangabe (```) erzeugt pandoc als klassisches verbatim.
|
||
|
|
% Das kennt keinen Zeilenumbruch und laeuft daher ebenfalls ueber den Rand -
|
||
|
|
% betroffen sind hier vor allem die abgedruckten Programmausgaben.
|
||
|
|
% \RecustomVerbatimEnvironment baut verbatim auf fancyvrbs Verbatim um.
|
||
|
|
\RecustomVerbatimEnvironment{verbatim}{Verbatim}{
|
||
|
|
breaklines=true,
|
||
|
|
breakanywhere=true,
|
||
|
|
breaksymbolleft={\tiny\ensuremath{\hookrightarrow}},
|
||
|
|
fontsize=\small
|
||
|
|
}
|
||
|
|
|
||
|
|
% --- Tabellen etwas kompakter, damit breite Tabellen besser passen ---------
|
||
|
|
\usepackage{array}
|
||
|
|
\renewcommand{\arraystretch}{1.08}
|
||
|
|
|
||
|
|
% --- Umbruchverhalten fuer lange URLs und Bezeichner -----------------------
|
||
|
|
% Lange Bezeichner wie Kap_05_MILP_Portfolio_Fixgebuehren.py setzt pandoc als
|
||
|
|
% \texttt{...}. LaTeX trennt darin nicht und laesst solche Namen ueber den
|
||
|
|
% rechten Rand laufen, wenn sie ans Zeilenende geraten. Ein \allowbreak nach
|
||
|
|
% jedem Unterstrich erlaubt einen Umbruch an genau diesen Stellen.
|
||
|
|
% Bewusst OHNE Trennstrich: Ein Bindestrich waere hier irrefuehrend, weil er
|
||
|
|
% wie ein Bestandteil des Dateinamens aussaehe.
|
||
|
|
\let\origtextunderscore\_
|
||
|
|
\renewcommand{\_}{\origtextunderscore\allowbreak}
|
||
|
|
|
||
|
|
\sloppy % lieber grosszuegigere Wortabstaende als Ueberhang
|
||
|
|
\emergencystretch=3em
|
||
|
|
|
||
|
|
% --- Stichwortregister (Phase 4) --------------------------------------------
|
||
|
|
% Begriffe werden im Markdown mit {idx:Begriff} bzw. fuer Unterbegriffe mit
|
||
|
|
% {idx:Oberbegriff!Unterbegriff} markiert (siehe resolve_index() in
|
||
|
|
% build_version_03.py) und dort zu einem rohen `\index{...}`{=latex}-Block
|
||
|
|
% aufgeloest. Fuer HTML wird dieser Rohblock von Pandoc automatisch verworfen
|
||
|
|
% (kein Seitenzahlen-Konzept dort) - kein Sonderfall im Buildskript notwendig.
|
||
|
|
% Sortierung uebernimmt texindy (xindy mit German-Modul) statt makeindex,
|
||
|
|
% damit Umlaute korrekt einsortiert werden (ä nach a, ö nach o, ü nach u),
|
||
|
|
% ohne dass Autor:innen von Hand ASCII-Sortierschluessel angeben muessen.
|
||
|
|
\usepackage{makeidx}
|
||
|
|
\makeindex
|
||
|
|
|
||
|
|
% --- Modernes Layout: Ueberschriften, Kopfzeile, Umbruch (Phase 5) ----------
|
||
|
|
% Farben aus der Titelseiten-Palette (bilder/titelseite.svg), damit das PDF
|
||
|
|
% und das Deckblatt als ein zusammenhaengendes System wirken.
|
||
|
|
\usepackage{xcolor}
|
||
|
|
\definecolor{ORindigo}{HTML}{4338CA}
|
||
|
|
\definecolor{ORcyan}{HTML}{0891B2}
|
||
|
|
\definecolor{ORviolett}{HTML}{7C3AED}
|
||
|
|
\definecolor{ORslate}{HTML}{1A1A2E}
|
||
|
|
|
||
|
|
% --- Witwen-/Waisenstrafen (e-TeX) ---
|
||
|
|
% Schusterjungen (erste Zeile eines Absatzes allein am Seitenende) und
|
||
|
|
% Hurenkinder (letzte Zeile allein am Seitenanfang) weitgehend unterdruecken.
|
||
|
|
% \widows=1/\orphans=1 waeren zusaetzlich, sind aber in der article-Klasse
|
||
|
|
% nicht definiert (KOMA/widows-Paket-Syntax) - \widowpenalty/\clubpenalty
|
||
|
|
% reichen als Strafen.
|
||
|
|
\widowpenalty=10000
|
||
|
|
\clubpenalty=10000
|
||
|
|
|
||
|
|
% --- titlesec: modernere Ueberschriften + keine Waisenueberschriften ---
|
||
|
|
% Option nobottomtitles: rutscht eine Ueberschrift ans Seitenende, ohne dass
|
||
|
|
% noch ausreichend Folgeplatz (Default: ~2\baselineskip) bleibt, wird sie auf
|
||
|
|
% die naechste Seite geschoben. explicit: ermoeglicht #1 (Titeltext) im after-
|
||
|
|
% code, um \sectionmark fuer die Kopfzeile manuell zu setzen (noetig, weil
|
||
|
|
% Pandoc \section* verwendet, das \rightmark nicht automatisch befuellt).
|
||
|
|
\usepackage[explicit,nobottomtitles]{titlesec}
|
||
|
|
\titleformat{\section}[block]
|
||
|
|
{\Large\bfseries\color{ORindigo}}
|
||
|
|
{}{0pt}
|
||
|
|
{#1}
|
||
|
|
[\vspace{2pt}{\color{ORviolett}\titlerule[1.2pt]}\vspace{2pt}\sectionmark{#1}]
|
||
|
|
\titleformat{\subsection}[block]
|
||
|
|
{\large\bfseries\color{ORcyan}}
|
||
|
|
{}{0pt}
|
||
|
|
{#1}[\subsectionmark{#1}]
|
||
|
|
\titleformat{\subsubsection}[block]
|
||
|
|
{\normalsize\bfseries\color{ORslate}}
|
||
|
|
{}{0pt}
|
||
|
|
{#1}
|
||
|
|
\titlespacing*{\section}{0pt}{2.5ex plus 1ex minus .2ex}{1.2ex plus .2ex}
|
||
|
|
\titlespacing*{\subsection}{0pt}{2ex plus .8ex}{1ex plus .2ex}
|
||
|
|
\titlespacing*{\subsubsection}{0pt}{1.5ex plus .6ex}{0.8ex plus .1ex}
|
||
|
|
|
||
|
|
% --- Sicherungsnetz: needspace fuer den Fall, dass nobottomtitles greift ---
|
||
|
|
% titlesec hat \section bereits umdefiniert; \preto haengt \needspace vorne an,
|
||
|
|
% wirkt also auf \section und \section* gleichermaessen. 3\baselineskip
|
||
|
|
% garantiert mindestens 3 Folgezeilen unter der Ueberschrift.
|
||
|
|
\usepackage{needspace}
|
||
|
|
\usepackage{etoolbox}
|
||
|
|
\preto\section{\needspace{3\baselineskip}}
|
||
|
|
\preto\subsection{\needspace{2.5\baselineskip}}
|
||
|
|
\preto\subsubsection{\needspace{2\baselineskip}}
|
||
|
|
|
||
|
|
% --- Kopf-/Fusszeile (fancyhdr) ---
|
||
|
|
% article ist einseitig (oneside) -> es gibt nur L/R, kein Innen/Aussen.
|
||
|
|
% \rightmark = aktueller Abschnittstitel (article: \sectionmark -> \markright).
|
||
|
|
% Wir setzen \sectionmark explizit via titlesec-after-code, weil \section* den
|
||
|
|
% Mark nicht selbst befuellt. \nouppercase laesst Gross-/Kleinschreibung intakt.
|
||
|
|
\usepackage{fancyhdr}
|
||
|
|
% Kopfzeile braucht ~22pt Hoehe (fancyhdr warnt sonst); topmargin anpassen,
|
||
|
|
% damit der Textkörper nicht nach unten wandert.
|
||
|
|
\setlength{\headheight}{22pt}
|
||
|
|
\addtolength{\topmargin}{-10pt}
|
||
|
|
\pagestyle{fancy}
|
||
|
|
\fancyhf{}
|
||
|
|
\fancyhead[L]{\small\nouppercase{\rightmark}}
|
||
|
|
\fancyhead[R]{\small\thepage}
|
||
|
|
\fancyfoot{}
|
||
|
|
\renewcommand{\headrulewidth}{0.4pt}
|
||
|
|
\renewcommand{\headrule}{%
|
||
|
|
\hbox to\headwidth{\color{ORviolett}\leaders\hrule height\headrulewidth\hfill}}
|
||
|
|
% plain = erste Seite eines (mit \clearpage begonnenen) Kapitels: nur Seitenzahl.
|
||
|
|
\fancypagestyle{plain}{%
|
||
|
|
\fancyhf{}\fancyfoot[C]{\small\thepage}\renewcommand{\headrulewidth}{0pt}}
|
||
|
|
|
||
|
|
% --- Titelseite (Seite 1, reines Bild) bekommt keine Kopfzeile ---
|
||
|
|
% Ohne diese Zeile erbt Seite 1 den globalen fancy-Stil (Trennlinie +
|
||
|
|
% Seitenzahl oben rechts), was auf dem Deckblatt fehl am Platz ist.
|
||
|
|
\AtBeginDocument{\thispagestyle{plain}}
|