operations_research/bilder_04/or_pdf_header.tex

176 lines
7.7 KiB
TeX
Raw Permalink Normal View History

Version 04 als eigenes Repository Erster Commit des Strangs "Optimierte Entscheidungsfindung mit Python" (Version 04). Die Historie der 71 Commits bis zur Trennung bleibt im uebergeordneten Repository OR_mit_Python liegen, das ab jetzt nur noch Version_03 (eingefroren) verwaltet und Version_04/ ignoriert. Bewusst kein "git subtree split": Der Pfad Version_04/ existiert erst seit der Verzeichnistrennung, ein Split braechte daher nur 7 der 41 einschlaegigen Commits - eine Teilhistorie, die vollstaendig aussieht und es nicht ist. Stand: 5 Teile, 23 Kapitel, 5 Anhaenge, 292 Abschnitte, 703 Querverweise, 325 Indexmarken, 73 Beispielprogramme, 32 SVGs, 4 Plotly-Figuren, 25 Notebooks, PDF mit 715 Seiten. Zusaetzlich in diesem Commit: * pyproject.toml mit Abhaengigkeitsgruppen finance, large-scale, api, figures, dev, empfehlungen. Die abgedruckte requirements.txt bleibt unveraendert daneben bestehen. ortools steht in der Grundausstattung, highspy erst in [large-scale] - so kann der HiGHS-Symbolkonflikt bei der schlanken Installation gar nicht erst auftreten. * Dabei zwei Funde: graphviz wird von erzeuge_architektur_diagramme.py importiert, fehlt aber in requirements.txt (jetzt in [figures]); pymoo steht in requirements.txt, wird aber von keinem Programm importiert, sondern nur im Kapitel Metaheuristiken empfohlen (jetzt in [empfehlungen]). * NEUER_TITEL.md nach Kritik_und_Verbesserungsvorschlaege/ verschoben - es ist die Vorlage des Titelblatts, kein Bestandteil des Werks. Die beiden Fundstellen in PROGRESS.md und erzeuge_titelseite.py nachgezogen. * PROGRESS.md nannte noch den Untertitel der ersten Fassung; auf den tatsaechlichen aus erzeuge_titelseite.py korrigiert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 01:20:09 +02:00
% 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}}