
Ich möchte eine neue Liste von Dingen definieren, die \newlistof
im tocloft
Paket verwendet werden. Ich habe es tocloft
auf die übliche Weise für Pakete eingefügt ( \RequirePackage{tocloft}
; vollständiger Minimalcode unten). Wenn ich es jedoch durchführe pdflatex
, erhalte ich:
Package tocloft Warning: I don't recognize any sectional divisions so I'll do nothing on input line ##.
...
! Undefined control sequence.
<recently read> \newlistof
l.## \newlistof
Ich fand heraus, dass jemand anderes hattedas gleiche Problem, aber für\cftdot
anstatt \newlistof
. Der Benutzer fragte, was los sei, anstatt wie man das tocloft
Paket tatsächlich einbindet. Jetzt weiß ich also, dass es daran liegt, dass so tocloft
implementiert ist, dass es fehlschlägt, wenn es keine Kapitel, Abschnitte usw. findet. Aber ich bin immer noch nicht schlauer, wie man einbindet tocloft
. Ich konnte im Internet oder in der Dokumentation nichts anderes Relevantes finden.
(Die Verwendung von \RequirePackage[titles]{tocloft}
, und so möchte ich es verwenden, ergibt ! LaTeX Error: Unknown option 'titles' for package 'tocloft'.
, vermutlich aus dem gleichen Grund.)
Stattdessen \RequirePackage{tocloft}
habe ich Folgendes versucht:
\AtBeginDocument{\usepackage{tocloft}}
...
\newlistof{things}{tng}{\listthingsname}
damit es am Anfang des Dokuments geladen wird, aber ich bekomme den gleichen Undefined control sequence
Fehler (vermutlich, weil an dieser Stelle noch keine Abschnittsunterteilungen vorhanden sind). Das Auskommentieren \newlistof
ergibt:
Package tocloft Warning: \@starttoc has already been redefined; tocloft bailing out. on input line 1156.
Meine Frage ist, wie ich es tocloft
in eine *.dtx-Datei einbinden kann. (Ich verwende das etoolbox
Paket, falls das hilft.)
MWE(oder eher ein Minimalbeispiel, das meinen ersten Versuch zeigt):
% \iffalse meta-comment
%<*internal>
\iffalse
%</internal>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
\expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\nopreamble\nopostamble
\usedir{tex/latex/things}
\generate{
\file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\ifx\fmtname\nameofplainTeX
\expandafter\endbatchfile
\else
\expandafter\endgroup
\fi
%</internal>
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{things}
\RequirePackage{etoolbox}
\RequirePackage{tocloft}
% \AtBeginDocument{\usepackage{tocloft}}
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{things}
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
%\GetFileInfo{\jobname.sty}
%
% \title{Title}
% \author{Author}
% \date{\today}
%
% \maketitle
% ^^A\listofthings
%
% \begin{macrocode}
%<*package>
%
\ newcommand{\listthingsname}{List of Things}
\newlistof{things}{tng}{\listthingsname}
%
% \newcommand{\thing}[1]{%
% \refstepcounter{things}\textsuperscript{\thethings}#1%
% \addcontentsline{tng}{things}{\protect{\thethings}#1}%
% }
%
%</package>
% \end{macrocode}
Antwort1
David Carlisle wies darauf hin, dass meine dtx-Struktur nicht ganz richtig war. Der <driver>
Abschnitt, der enthält \begindocument
, muss vor dem <package>
Abschnitt verarbeitet werden, der die \RequirePackage
Befehle enthält. Daher behebt das Verschieben des <driver>
Abschnitts vor diesen <package>
Abschnitt das Problem: \begindocument
wird aufgerufen, bevor irgendwelche Pakete erforderlich sind.
Ich bin auch aufgrund von Davids Kommentar \usepackage{things}
zu zurückgekehrt \usepackage{\jobname}
. Ich bin mir nicht sicher, warum ich es überhaupt geändert habe :)
MWE(Fest)
% \iffalse meta-comment
%<*internal>
\iffalse
%</internal>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
\expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\nopreamble\nopostamble
\usedir{tex/latex/things}
\generate{
\file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\ifx\fmtname\nameofplainTeX
\expandafter\endbatchfile
\else
\expandafter\endgroup
\fi
%</internal>
%<*driver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{\jobname}
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{things}
\RequirePackage{etoolbox}
\RequirePackage[titles]{tocloft}
% \AtBeginDocument{\usepackage{tocloft}}
% \AtEndDocument{\usepackage{tocloft}}
%</package>
% \fi
%
%\GetFileInfo{\jobname.sty}
%
% \title{Title}
% \author{Author}
% \date{\today}
%
% \maketitle
% \listofthings
%
% \thing{A thing}
%
% \begin{macrocode}
%<*package>
%
\newrobustcmd{\listthingsname}{List of Things}
\newlistof{things}{tng}{\listthingsname}
%
\newrobustcmd{\thing}[1]{%
\refstepcounter{things}\textsuperscript{\thethings}#1%
\addcontentsline{tng}{things}{\protect\numberline{\thethings}#1}%
}
%
%</package>
% \end{macrocode}