
Ich möchte eine Liste wie toc, lof, lot erstellen. Sie sollte listofsongs oder ähnlich heißen. Die Frage ist: Gibt es ein Paket, mit dem ich ähnliche Listen erstellen kann, oder muss ich das alles selbst machen?
Gibt es eine Liste der in LaTeX bereits verwendeten Dateierweiterungen? Ich sollte z. B. nicht MyDocument.toc verwenden, da dies zu Konflikten mit dem Inhaltsverzeichnis führen würde.
Am Ende sollte ich so schreiben können, \listofsongs
wie ich schreibe \tableofcontents
, und es sollte sich ähnlich verhalten.
Antwort1
Sie können wahrscheinlich die LaTeX2e-Kernel-Makros \@starttoc
und verwenden \addtocontents{<file-extension>}{<tokens>}
.
\addtocontents
schreibt (unerweitert) einige Anweisungen zum unerweiterten Schreiben <tokens>
in die AUX-Datei \jobname.<file-extension>
, falls diese Datei zur Eingabe geöffnet ist, wenn die AUX-Datei am Ende des LaTeX-Laufs verarbeitet wird.
\@starttoc{<file-extension>}
bewirkt, dass TeX die Datei liest/verarbeitet \jobname.<file-extension>
, falls sie existiert, und diese Datei dann zerstört, neu erstellt und zur Eingabe geöffnet wird, sodass diese Datei zur Eingabe geöffnet ist, wenn die AUX-Datei am Ende des LaTeX-Laufs verarbeitet wird.
Falls Sie ausgefallenere Dinge tun möchten, werfen Sie einen Blick auf das \addcontentsline
-Makro des LaTeX2e-Kernels.
In die Aux-Datei werden grundsätzlich \addcontentsline{<file-extension>}{<command name>}{<tokens>}
einige Direktiven geschrieben, die das unexpandierte Schreiben der Token-Sequenz \contentsline{<command name>}{<tokens>}{<page number>}
in die Datei ermöglichen \jobname.<file-extension>
, falls diese Datei zur Eingabe geöffnet ist, wenn die Aux-Datei am Ende des LaTeX-Laufs verarbeitet wird. Nachdem Sie \jobname.<file-extension>
während der Verarbeitung der Aux-Datei am Ende des LaTeX-Laufs geschrieben haben, finden Sie diese Direktive
\contentsline{<command name>}{<tokens>}{<page number>}
darin. Somit wird diese Direktive ausgeführt, wenn – aufgrund dessen \@starttoc
– die Datei \jobname.<file-extension>
gelesen/verarbeitet wird.
\contentsline{<command name>}{<tokens>}{<page number>}
ruft wiederum ein Makro auf \l@<command name>
, das zwei Argumente verarbeitet, nämlich das <tokens>
-Argument und das <page number>
-Argument.
Wenn dieser Mechanismus mit der Inhaltsverzeichnisdatei und den Abschnittsbefehlen verwendet wird, ergibt sich in <command name>
etwa die Ausführung der Makros oder Sie können aber auch Ihre eigenen Makros für Ihre eigenen Rubrikierungskategorien definieren.section
subsection
\l@section
\l@subsection
\l@..
Der \addtocontents...
-Mechanismus \@starttoc{<file-extension>}
definiert unter anderem eine Steuersequenz \tf@<file-extension>
. Um herauszufinden, ob dieser Mechanismus bereits einen \write
-Handle zum Schreiben einer Datei zugewiesen hat \jobname.<file-extension>
, können Sie daher das \@ifundefined
-Makro verwenden, um zu prüfen, ob die Steuersequenz \tf@<file-extension>
bereits definiert ist.
Dies funktioniert allerdings nur, solange das scrwfile-Paket nicht verwendet wird – übrigens: Das scrwfile-Paket könnte für Sie interessant sein, wenn Sie vorhaben, viele Listen wie toc, lof oder lot in Ihrem Dokument zu erstellen. Weitere Informationen zu diesem Paket finden Sie auf CTAN:https://www.ctan.org/pkg/scrwfile
Der LaTeX2e-Kernel wird in der Datei source2e.pdf erklärt und kommentiert, die verfügbar ist unterhttps://www.ctan.org/pkg/source2e.
Der \addtocontents
-Mechanismus \@starttoc
und das \addcontentsline
-Makro, das diesen Mechanismus verwendet, werden im Abschnitt mit dem Namen Datei F ltsect.dtx → 59 Abschnittsbefehle → 59.3 Inhaltsverzeichnis usw. erklärt.
\documentclass{article}
\usepackage{hyperref}
\usepackage{verbatim}
\makeatletter
\newcommand\l@songline[2]{%
\par Now we have data about another song:\\
Title of song: #1. Song is printed on page: #2.%
}%
\makeatother
\begin{document}
\LaTeX{} will now write directives to aux-file for writing the first
line into \jobname.weird. These directives will be carried out at
the end of the \LaTeX-run when the aux-file is read/processed in
case at that time the file \jobname.weird is open for writing to it.\\
\addtocontents{weird}{First line in file \jobname.weird.}%
\bigskip
This is what \jobname.weird looks like before calling \verb|\@starttoc|: \\
\verbatiminput{\jobname.weird}
\bigskip
This is how \verb|\l@songline| is defined:\\{%
\csname verbatim@font\endcsname\selectfont
\expandafter\meaning\csname l@songline\endcsname
}%
\bigskip
The file \jobname.weird is \csname @ifundefined\endcsname{tf@weird}{not}{already} allocated.
\bigskip
\LaTeX will now read/process \jobname.weird and then destroy that file
and create it anew and open it for writing. Thus at the end of the
\LaTeX-run, when the aux-file is read/processed, that file will be open
for writing to it:\bigskip
\csname @starttoc\endcsname{weird}%
\bigskip
The file \jobname.weird is \csname @ifundefined\endcsname{tf@weird}{not}{already} allocated.
\bigskip
\LaTeX{} will now write directives to aux-file for writing the second
line into \jobname.weird. These directives will be carried out at
the end of the \LaTeX-run when the aux-file is read/processed in
case at that time the file \jobname.weird is open for writing to it.\\
\addtocontents{weird}{Second line in file \jobname.weird.}%
\bigskip
Now two \verb|\addcontentsline|-entries for writing things to \jobname.weird
that need to be "rubrified" by means of applying the \verb|l@songgline|-macro.
\addcontentsline{weird}{songline}{Morning has broken}
\addcontentsline{weird}{songline}{Final Countdown}
\end{document}
Antwort2
Leider ist in der Frage kein MWE enthalten. Ich weiß also nicht, was du wirklich machen willst. Wenn ich mir dein Profil anschaue, nehme ich an, dass du verwendest scrbook
. Hier ist also ein Vorschlag, der ein aktuelles KOMA-Script benötigt.
\documentclass[listof=totoc,ngerman]{scrbook}[2016/06/14]% needs at least KOMA-Scritp version 3.21
\usepackage{babel}
\DeclareNewTOC[
type=song,
tocentryindent=0pt,
tocentrynumwidth=2.3em,
tocentrystyle=tocline,
tocentrylinefill=\hfill,
tocentryentryformat=\sffamily,
tocentrypagenumberformat=\sffamily
]{los}
\newcaptionname{ngerman}{\listsongname}{Liederverzeichnis}
\DeclareNewSectionCommand[
style=chapter,
level=0,
beforeskip=-1sp,
innerskip=0pt,
afterskip=\baselineskip,
font=\usekomafont{section},
prefixfont=\usekomafont{chapter},
pagestyle=plain
]{song}
\renewcommand\songformat{}
\renewcommand\addsongtocentry[2]{\addxcontentsline{los}{song}{#2}}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\addchap{Einleitung}
Text
\listofsongs
\song{Ein Liedtitel}
\end{document}
Hier ist eine andere Version, die die Standardklasse book
und das KOMA-Paket verwendet tocbasic
. Beachten Sie jedoch, dass ich nicht weiß, wie Sie Ihren \song
Befehl oder song
Ihre Umgebung definieren:
\documentclass[ngerman]{book}
\usepackage{babel}
\usepackage{tocbasic}[2016/06/14]% needs at least KOMA-Scritp version 3.21
\DeclareNewTOC[
type=song,
tocentryindent=0pt,
tocentrynumwidth=2.3em,
tocentrystyle=tocline,
tocentrylinefill=\hfill,
tocentryentryformat=\sffamily,
tocentrypagenumberformat=\sffamily
]{los}
\newcaptionname{ngerman}{\listsongname}{Liederverzeichnis}
\usepackage{lipsum}
\usepackage{hyperref}
\begin{document}
\listofsongs
\clearpage
\phantomsection\addxcontentsline{los}{song}{Ein Liedtitel im Verzeichnis}
\section*{Ein Liedtitel}
\lipsum
\clearpage
\phantomsection\addxcontentsline{los}{song}{Ein anderer Liedtitel im Verzeichnis}
\section*{Ein anderer Liedtitel}
\end{document}