Ist es möglich, auf Kapitel und Abschnitte eines Dokuments zu verweisen, ohne jeden Abschnitt und Unterabschnitt manuell zu kennzeichnen?
Ich habe ungefähr 8 Kapitel und Dutzende darin eingerückte Abschnitte/Unterabschnitte. Die Beschriftung jedes einzelnen Abschnitts ist ziemlich mühsam.
Gibt es einen schnelleren und bequemeren Weg?
Antwort1
Dies ist möglich, kann aber riskant sein. Im folgenden Beispiel wird das erste Wort jedes Kapitels oder Abschnitts verwendet, um bei jedem Aufruf von \chapter
oder automatisch die Bezeichnung zu erstellen \section
. titlesec
Die explicit
Option wurde verwendet, um den Titel zu erfassen. Mit xstring
wird das erste Wort extrahiert:
\documentclass[10pt]{book}
\usepackage[explicit]{titlesec}
\usepackage{xstring}
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge\StrBefore{#1}{ }[\mlabel]#1\label{\mlabel}}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{\StrBefore{#1}{ }[\mlabel]#1\label{\mlabel}}
\begin{document}
Some references to chapters: \ref{Some} and \ref{Other} and some references to sections: \ref{A} and \ref{Another}
\chapter{Some Chapter}
\section{A Test Section}
\chapter{Other Chapter}
\section{Another Test Section}
\end{document}
Dies schlägt fehl, wenn in den Titeln zweier Unterteilungseinheiten das gleiche Anfangswort enthalten ist. Sie können dann jedoch zum Erstellen der Beschriftungen eine andere Zeichenfolge auswählen.
In meiner ersten Lösung ging ich davon aus, dass die Titel mindestens ein Leerzeichen enthalten, aber man könnte auch eine andere Zeichenfolge verwenden, zum Beispiel (wie inNicolai Rostov's Antwort) den vollständigen Namen der Sektionseinheit. In diesem Fall wird das xstring-Paket nicht mehr benötigt und man könnte einfach sagen
\documentclass[10pt]{book}
\usepackage[explicit]{titlesec}
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge#1\label{#1}}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{#1\label{#1}}
\begin{document}
Some references to chapters: \ref{Some Chapter} and \ref{Other Chapter} and some references to sections: \ref{A Test Section} and \ref{Another Test Section}
\chapter{Some Chapter}
\section{A Test Section}
\chapter{Other Chapter}
\section{Another Test Section}
\end{document}
Meine Beispiele zeigen nur den Mechanismus für Kapitel und Abschnitte, er lässt sich aber problemlos auf andere Abschnittseinheiten erweitern.
Antwort2
Sie können denGanzer Titelvon Kapiteln oder Abschnitten als Beschriftungen und verweisen Sie mittels eigener Titel darauf zurück.
\documentclass{book}
\let\origchapter=\chapter
\let\origsection=\section
\renewcommand\chapter[1]{\origchapter{#1}\label{#1}}
\renewcommand\section[1]{\origsection{#1}\label{#1}}
\begin{document}
\chapter{My first chapter}
\section{My first section}
I said in section~\ref{My first section} at the
beginning of chapter~\ref{My first chapter} that
\end{document}
Antwort3
Sie können den Prozess der Etikettenerstellung automatisieren. Ein sehr einfaches Perl-Skript reicht dafür aus. Das Perl-Skript muss alle Ihre .tex
Dateien durchgehen und nacheinander einen Substitutions-Regex auf sie anwenden. Hier ist ein Beispiel für den Regex, den Sie verwenden sollten:
my $input_str = do{ local $/; <> };
$input_str =~ s/(\\section{(.*?)}(?!\s*\\label))/$1\n\\label{sec:$2}/mg;
$input_str =~ s/(\\chapter{(.*?)}(?!\s*\\label))/$1\n\\label{chap:$2}/mg;
print $input_str;
Diese beiden regulären Ausdrücke suchen einfach nach jedem \chapter{Chapter Title}
und \section{Section Name}
in Ihrem Tex-Code. Wenn danach ein Label definiert ist, ignoriert das Skript sie. Wenn nicht, fügt das Skript eine Label-Anweisung für sie in einer neuen Zeile hinzu, die lautet \label{chap:Chapter Title}
und \label{sec:Section Name}
. Sie können dieses Perl-Skript erstellen und es ausführen, wann immer Sie neue Abschnitte/Kapitel erstellen.
HAFTUNGSAUSSCHLUSS:Ich bin nicht verantwortlich für Datenverluste, die beim Ausführen von Regex auf Ihre .tex
Dateien auftreten können. Obwohl ich die oben genannten Regex getestet habe, habe ich absichtlich nicht den Code für ein vollständiges Perl-Skript eingefügt, um dieses Risiko zu vermeiden. Sie können meinen Perl-Code immer noch in Aktion sehen, wenn Sie ihn ausschneiden und in ein Skript einfügen und auf einer .tex
Datei ausführen. Er wird funktionieren und die Ergebnisse auf dem Bildschirm ausgeben, ohne Ihre Datei zu ändern. Stellen Sie sicher, dass Sie Ihr eigenes Perl-Skript schreiben und es an Dummy- .tex
Dateien testen. Stellen Sie außerdem sicher, dass Sie immer eine Kopie Ihrer Arbeit erstellen, bevor Sie solche Skripte darauf ausführen.