我想定义一个在包\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
David Carlisle 指出我的 dtx 结构不太正确。<driver>
包含 的部分\begindocument
需要在<package>
包含\RequirePackage
命令的部分之前处理。因此,将该<driver>
部分移到该部分之前<package>
可以解决问题:\begindocument
在需要任何包之前调用。
我也因为 David 的评论而恢复了原样\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}