\autoref \nameref Probleme Thema ist als GELÖST markiert

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


derGast

\autoref \nameref Probleme

Beitrag von derGast »

Hallo,
für eine Semesterarbeit habe ich unten stehendes Konstrukt für Überschrift/Inhaltsverzeichnis und Kopfzeile. Deshalb, da die Titel im Inhaltsverzeichnis anders aussehen sollen als die Titel der jeweiligen Seite und das Inhaltsverzeichnis des PDF wieder anders, da die Titel sehr lang sind.
Funktioniert alles super, jetzt habe ich aber das Problem, dass ich im Text gerne die Kapitel referenzieren würde und durch mein Konstrukt ein ungewolltes Ergebnis habe.
Hat jemand eine Idee, wie ich das alles zufriedenstellend umsetzen kann?

MWE:

\documentclass[10pt,a4paper]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\begin{document}
\section[tocentry=\texorpdfstring{Dr. Dieter Dietmar, Universität Buxtehude\\ \textbf{Warum bin ich? Transformationsprozesse in meinem Wasserkopf}}{Warum bin ich?},head={Transformationsprozesse in meinem Wasserkopf}]{Warum bin ich? Transformationsprozesse in meinem Wasserkopf\newline \small \textnormal{\hyperref[subsec:profil_dietmar]{Dr. Dieter Dietmar, Universität Buxtehude}}}
\label{sec:vortrag_dietmar}

Hier ist alles schön, außer, dass ich nicht weiß, wie ich den Titel mit ref bekomme.\\

autoref macht das:\\
\autoref{sec:vortrag_dietmar}\\

nameref das:\\
\nameref{sec:vortrag_dietmar}\\

ich möchte aber:\\
Warum bin ich? Transformationsprozesse in meinem Wasserkopf\\

\subsection*{Dr. Dieter Dietmar}
\label{subsec:profil_dietmar}
Dr. Dieter Dietmar ist sehr schlau und darf deswegen einen Vortrag halten.
\end{document}

Gast

Beitrag von Gast »

Zunächst einmal kann das gar nicht funktionieren, da Du die Erweiterung für das optionale Argument der Gliederungsbefehle gar nicht aktiviert hast. Dazu ist Option headings mit einem der Werte optiontotocandhead, optiontoheadandtoc, optiontotoc, oder optiontohead notwendig. Wenn Du Kolumnentitel aktiviert hättest oder ein Inhaltsverzeichnis in Dein Beispiel eingebaut hättest, wäre Dir das sicher auch aufgefallen.

Dann ist das, was Du haben willst, derzeit keine Information, die irgendwo gespeichert wird. Es entspricht weder tocentry noch head und noch nicht einmal der Überschrift selbst. Ergänzt man die genannte Option wird derzeit der Titel gespeichert, siehe dazu die Definition des Labels in der aux-Datei:
\newlabel{sec:vortrag_dietmar}{{1}{1}{\Sectionformat {Warum bin ich? Transformationsprozesse in meinem Wasserkopf\newline \small \textnormal {\hyperref [subsec:profil_dietmar]{Dr. Dieter Dietmar, Universität Buxtehude}}}{\numexpr \csname sectionnumdepth\endcsname \relax }}{section.1}{}}
Nun könnte man das Argument \Sectionformat {Warum bin ich? Transformationsprozesse in meinem Wasserkopf\newline \small \textnormal {\hyperref [subsec:profil_dietmar]{Dr. Dieter Dietmar, Universität Buxtehude}} irgendwie aufwändig zerlegen. Besser ist aber, wenn man stattdessen einfach etwas mehr Markup verwendet:
\documentclass[10pt,a4paper,headings=optiontotocandhead]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\makeatletter
\newcommand*{\namereftitle}{%
  \kernel@ifstar {\s@namereftitle}{\@namereftitle}
}
\newcommand*{\s@namereftitle}[1]{%
  \begingroup
    \renewcommand*{\Authorformat}[1]{}% Autorenteil einfach ignorieren
    \nameref*{#1}%
  \endgroup
}    
\newcommand*{\@namereftitle}[1]{%
  \begingroup
    \renewcommand*{\Authorformat}[1]{}% Autorenteil einfach ignorieren
    \nameref{#1}%
  \endgroup
}
\makeatother
\DeclareRobustCommand*{\Titleformat}[1]{#1}
\DeclareRobustCommand*{\Authorformat}[1]{\newline{\small\textnormal{#1}}}

\usepackage{mwe}
\pagestyle{headings}
\begin{document}
\tableofcontents
\section[tocentry=\texorpdfstring{Dr. Dieter Dietmar, Universität Buxtehude\\\textbf{Warum bin ich? Transformationsprozesse in meinem Wasserkopf}}{Warum bin ich?},head={Transformationsprozesse in meinem Wasserkopf}]{\Titleformat{Warum bin ich? Transformationsprozesse in meinem Wasserkopf}\Authorformat{\hyperref[subsec:profil_dietmar]{Dr. Dieter Dietmar, Universität Buxtehude}}}
\label{sec:vortrag_dietmar}

\raggedright

Hier ist alles schön, außer, dass ich nicht weiß, wie ich den Titel mit ref
bekomme.
\bigskip

autoref macht das:\\
\autoref{sec:vortrag_dietmar}
\bigskip

nameref das:\\
\nameref{sec:vortrag_dietmar}
\bigskip

ich möchte aber:\\
Warum bin ich? Transformationsprozesse in meinem Wasserkopf
\bigskip

\verb|\tocentryref|:\\
\namereftitle{sec:vortrag_dietmar}

\subsection*{Dr. Dieter Dietmar}
\label{subsec:profil_dietmar}
Dr. Dieter Dietmar ist sehr schlau und darf deswegen einen Vortrag halten.

\Blindtext[10]
\end{document}
Ich habe das im Beispiel gleich so definiert, dass es auch wie bei \nameref eine Sternform gibt.

Natürlich wäre es sinnvoll ähnliche Markup-Anweisungen auch für den Teil zu verwenden, der im Inhaltsverzeichnis landen soll. Je nachdem wie das ganze (immer wieder) im Dokument vorkommt, wäre es ggf. sogar sinnvoll einen eigenen Überschriftenbefehl zu definieren, damit man die einzelnen Teile der Überschrift nicht mehrfach angeben muss und daraus automagisch ein \section-Befehl wie oben gebastelt wird.

Fazit: Je besser man zwischen Form und Inhalt trennt, desto einfacher ist es, die Form an unterschiedlichen Stellen unterschiedlich zu wählen.

Es sei auch noch darauf hingewiesen, dass man \\ niemals am Absatzende verwenden sollte (siehe stattdessen Option parskip in der KOMA-Script-Anleitung oder im KOMA-Script-Buch). Außerdem hat \\ im Fließtext eigentlich gar nichts zu suchen, erst recht nicht im Blocksatz!

Gast

Beitrag von Gast »

PS: Es sei noch darauf hingewiesen, dass das ganze eine aktuelle TeX-Installation benötigt. Bei der Version von Overleaf ist entweder KOMA-Script oder nameref oder hyperref zu alt. Was davon zu alt ist, habe ich nicht überprüft. Mit aktuellen Paketen funktioniert es schließlich.

derGast

Beitrag von derGast »

Vielen Dank für die sehr ausführliche Erklärung. Natürlich hatte die notwendigen Optionen in meinem Originaldokument, habe sie im MWE aber weggelassen, da ich davon ausging, dass sie für die Lösung unwesentlich sind.
Das Dokument baute bei mir auch erst mit dem gewünschten Ergebnis, nachdem ich tlmgr update --all ausgeführt habe.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Nur als Ergänzung:

Overleaf verwendet derzeit noch KOMA-Script Version 3.21 und das ist Grund, warum das Beispiel von Gast oben dort noch nicht das gewünschte Ergebnis zeigt.

\nameref verwendet zum Referenzieren auf einen Gliederungsbefehl stets das optionale Argument, so eines angegeben wurde. Wurde nun bis KOMA-Script Version 3.21 die erweiterte Interpretation dieses optionalen Arguments aktiviert und dann dort beispielsweise tocentry=... angegeben, dann gab \nameref das genau so aus.

Allerdings lässt sich die Key-Value-Syntax auch erweitern, um Abhilfe zu schaffen. Dazu wurde in Version 3.22 die nicht dokumentierte Option reference definiert. Die sorgt einerseits dafür, dass man mit
\documentclass[
  headings=optiontoheadandtoc
]{scrartcl}[2017/01/03]% braucht Version 3.22
\usepackage{hyperref}
\pagestyle{headings}
\begin{document}
\tableofcontents
\clearpage
\section[
  tocentry=Testabschnitt im Inhaltsverzeichnis,
  head=Testabschnitt in der Kopfzeile
]{Testabschnitt}
\label{sec:test}

Der Titel des Abschnittes ist: "`\nameref{sec:test}"'.
Es geht auch ohne Verlinkung: "`\nameref*{sec:test}"'.
\end{document}
Bild

erhält und der Code von Gast oben funktioniert. Andererseits ist es damit sogar möglich den als Referenz ausgegebenen Text selbst festzulegen, in dem man die Option reference explizit setzt.

Beispiel:
\documentclass[
  headings=optiontoheadandtoc
]{scrartcl}[2017/01/03]% braucht Version 3.22
\usepackage{hyperref}
\pagestyle{headings}
\begin{document}
\tableofcontents
\clearpage
\section[
  tocentry=Testabschnitt im Inhaltsverzeichnis,
  head=Testabschnitt in der Kopfzeile,
  reference=Testabschnitt als Referenz
]{Testabschnitt}
\label{sec:test}

Der Titel des Abschnittes ist: "`\nameref{sec:test}"'.
Es geht auch ohne Verlinkung: "`\nameref*{sec:test}"'.
\end{document}
Bild
Dateianhänge
gl_KSreference1.png
gl_KSreference1.png (4.91 KiB) 2703 mal betrachtet
gl_KSreference2.png
gl_KSreference2.png (5.56 KiB) 2742 mal betrachtet

Auch ein

Beitrag von Auch ein »

Schöne Lösung. :wink:

reference war bisher übrigens noch nicht dokumentiert, weil es bezüglich KOMA-Script-Option headings dafür bisher keine Voreinstellung vgl. zu headings=optionstotoc gibt. Ab der nächsten (Pre-)Release wird die Dokumentation trotzdem als Erweiterung ab KOMA-Script 3.22 ergänzt sein.

Antworten