
Я хочу определить новый список вещей, используемых \newlistof
в tocloft
пакете. Я включил его tocloft
обычным способом для пакетов ( \RequirePackage{tocloft}
; полный минимальный код ниже). Однако, когда я запускаю его pdflatex
, я получаю:
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
Я обнаружил, что кто-то другой имелта же проблема, но для\cftdot
а не \newlistof
. Тот пользователь спросил, что происходит, а не как на самом деле включить пакет tocloft
, так что теперь я знаю, что это потому, tocloft
что реализовано так, чтобы давать сбой, если не находит никаких глав, разделов и т. д. Но я все еще не знаю, как включить tocloft
. Я не смог найти ничего более подходящего в Интернете или в документации.
(Использование \RequirePackage[titles]{tocloft}
, как я и хочу использовать, дает ! LaTeX Error: Unknown option 'titles' for package 'tocloft'.
, что, вероятно, по той же причине.)
Вместо этого \RequirePackage{tocloft}
я попробовал:
\AtBeginDocument{\usepackage{tocloft}}
...
\newlistof{things}{tng}{\listthingsname}
так что он загружается в начале документа, но я получаю ту же Undefined control sequence
ошибку (вероятно, потому что в этой точке еще нет разделов). Комментирование \newlistof
дает:
Package tocloft Warning: \@starttoc has already been redefined; tocloft bailing out. on input line 1156.
У меня вопрос: как включить tocloft
файл *.dtx? (Я использую пакет etoolbox
, если это поможет.)
МВЭ(или, скорее, минимальный пример, демонстрирующий мою первоначальную попытку):
% \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}
решение1
Дэвид Карлайл указал, что моя структура dtx не совсем правильная. Раздел <driver>
, включающий \begindocument
, необходимо обработать до <package>
раздела, включающего \RequirePackage
команды. Поэтому перемещение <driver>
раздела перед этим <package>
разделом устраняет проблему: \begindocument
вызывается до того, как потребуются какие-либо пакеты.
Я также вернулся \usepackage{things}
из \usepackage{\jobname}
-за комментария Дэвида. Я не уверен, почему я изменил его в первую очередь :)
МВЭ(зафиксированный)
% \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}