PDF-TOC-Links: \phantomsection vor \addcontentsline für unnummerierte Überschriften

Pandoc generiert für {-}-Überschriften \section* + \addcontentsline,
aber ohne \phantomsection davor. Die TOC-Links zeigen dann auf die
falsche Position — erst ab der ersten nummerierten \section (Notation
und Abkürzungen) stimmen sie wieder, weil diese ihren hyperref-Anker
automatisch bekommt.

Fix in baue_pdf(): nach dem Pandoc-Lauf jeden \addcontentsline{toc}
ein \phantomsection voranstellen; eine zweite Sub verhindert Dopplung
beim Stichwortregister, das bereits eines hat.
This commit is contained in:
dschlueter 2026-09-09 22:31:56 +02:00
commit 141178f4a1
3 changed files with 21 additions and 0 deletions

View file

@ -1175,6 +1175,27 @@ def baue_pdf() -> None:
print("Erzeuge LaTeX ...")
subprocess.run(befehl, cwd=BASIS, check=True)
# Pandoc generiert fuer unnummerierte Ueberschriften ({-}) \section* +
# \addcontentsline, aber OHNE \phantomsection dazwischen. Die TOC-Links
# zeigen dann alle auf die falsche Position (auf den zuletzt von hyperref
# gesetzten Anker statt auf die eigene Seite). Ab der ersten nummerierten
# \section stimmt es wieder, weil diese ihren Anker automatisch bekommt.
# Fix: \phantomsection vor jedes \addcontentsline setzen, das auf eine
# unnummerierte Ueberschrift folgt. Das Stichwortregister hat es bereits
# (siehe _STICHWORTREGISTER_BLOCK) - die zweite Sub verhindert Dopplung.
with open(tex, encoding="utf-8") as f:
tex_inhalt = f.read()
tex_inhalt = re.sub(
r"(\\addcontentsline\{toc\})",
r"\\phantomsection\n\1",
tex_inhalt)
tex_inhalt = re.sub(
r"\\phantomsection\s*\\phantomsection",
r"\\phantomsection",
tex_inhalt)
with open(tex, "w", encoding="utf-8") as f:
f.write(tex_inhalt)
print("Uebersetze mit xelatex (3 Durchlaeufe, dazwischen texindy fuer "
"das Stichwortregister) ...")
for durchlauf in range(1, 4):