Wenn \RequirePackage{tocloft} vor \documentclass nicht funktioniert, wie fordere ich dann das Paket an?

Wenn \RequirePackage{tocloft} vor \documentclass nicht funktioniert, wie fordere ich dann das Paket an?

Ich möchte eine neue Liste von Dingen definieren, die \newlistofim tocloftPaket verwendet werden. Ich habe es tocloftauf 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\cftdotanstatt \newlistof. Der Benutzer fragte, was los sei, anstatt wie man das tocloftPaket tatsächlich einbindet. Jetzt weiß ich also, dass es daran liegt, dass so tocloftimplementiert 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 sequenceFehler (vermutlich, weil an dieser Stelle noch keine Abschnittsunterteilungen vorhanden sind). Das Auskommentieren \newlistofergibt:

Package tocloft Warning: \@starttoc has already been redefined; tocloft bailing out. on input line 1156.

Meine Frage ist, wie ich es tocloftin eine *.dtx-Datei einbinden kann. (Ich verwende das etoolboxPaket, 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 \RequirePackageBefehle enthält. Daher behebt das Verschieben des <driver>Abschnitts vor diesen <package>Abschnitt das Problem: \begindocumentwird 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}

verwandte Informationen