Создавайте списки типа toc, lof или lot

Создавайте списки типа toc, lof или lot

Я хочу создать список типа toc, lof, lot. Он должен называться listofsongs или что-то в этом роде. Вопрос: есть ли какой-нибудь пакет, который позволяет мне создавать подобные списки, или мне придется делать все это самому?

Есть ли список уже используемых расширений файлов в LaTeX? То есть мне не следует использовать MyDocument.toc, так как это вызовет конфликты с tableofcontents.

В конце концов, я должен уметь писать \listofsongsтак, как я пишу, \tableofcontentsи это должно вести себя похожим образом.

решение1

Вероятно, вы можете использовать LaTeX2e-kernel-macros \@starttoc и \addtocontents{<file-extension>}{<tokens>}.

\addtocontentsзапишет (неразвернуто) в вспомогательный файл некоторые директивы для неразвернутой записи <tokens>в файл \jobname.<file-extension>в случае, если этот файл открыт для ввода, когда вспомогательный файл обрабатывается в конце выполнения LaTeX.

\@starttoc{<file-extension>}заставит TeX прочитать/обработать файл \jobname.<file-extension>, если он существует, а затем уничтожить этот файл, а затем создать его заново и открыть для ввода, так что когда вспомогательный файл будет обработан в конце выполнения LaTeX, этот файл будет открыт для ввода.

Если вы хотите сделать что-то более необычное, взгляните на \addcontentslineмакрос LaTeX2e-kernel.

В основном \addcontentsline{<file-extension>}{<command name>}{<tokens>}запишет в aux-файл некоторые директивы для неразвернутой записи последовательности токенов \contentsline{<command name>}{<tokens>}{<page number>}в файл \jobname.<file-extension>в случае, если этот файл открыт для ввода, когда aux-файл обрабатывается в конце запуска LaTeX. После записи \jobname.<file-extension>во время обработки aux-файла в конце запуска LaTeX вы найдете \contentsline{<command name>}{<tokens>}{<page number>}в нем эту директиву. Таким образом, эта директива будет выполнена, когда -- из-за \@starttoc-- файл \jobname.<file-extension>будет прочитан/обработан.

\contentsline{<command name>}{<tokens>}{<page number>}в свою очередь вызовет макрос \l@<command name>, который обрабатывает два аргумента, а именно -аргумент <tokens>и <page number>-аргумент.

При использовании этого механизма с toc-файлом и командами секционирования <command name>будет что-то вроде sectionили , subsectionприводящее к выполнению макросов \l@sectionили , \l@subsectionно вы также можете определить свои собственные \l@..макросы для собственных категорий рубрификации.

Механизм \addtocontents...- - \@starttoc{<file-extension>}определяет, помимо прочего, управляющую последовательность \tf@<file-extension>. Поэтому для выяснения, выделил ли этот механизм уже -дескриптор \writeдля записи файла \jobname.<file-extension>, можно использовать \@ifundefinedмакрос -, чтобы проверить, \tf@<file-extension>определена ли уже управляющая последовательность.

Но это работает только до тех пор, пока scrwfile-package не используется -- кстати: scrwfile-package может быть вам интересен, если вы собираетесь создавать много списков, таких как toc, lof или lot в вашем документе. Более подробную информацию об этом пакете можно найти на CTAN:https://www.ctan.org/pkg/scrwfile

Ядро LaTeX2e объясняется и комментируется в файле source2e.pdf, который доступен по адресуhttps://www.ctan.org/pkg/source2e
Механизм и макрос \addtocontents, который использует этот механизм , описаны в разделе Файл F ltsect.dtx → 59 Команды секционирования → 59.3 Содержание и т. д.\@starttoc\addcontentsline

\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} 

решение2

К сожалению, в вопросе нет MWE. Так что я не знаю, что вы на самом деле хотите сделать. Читая ваш профиль, я предполагаю, что вы используете scrbook. Так что вот предложение, которое требует обновленного KOMA-Script.

\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}

Вот еще одна версия, использующая стандартный класс bookи пакет KOMA tocbasic. Но учтите, что я не знаю, как вы определяете свою \songкоманду или songсреду:

\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}

Связанный контент