如果 \RequirePackage{tocloft} 在 \documentclass 之前不起作用,我該如何請求該套件?

如果 \RequirePackage{tocloft} 在 \documentclass 之前不起作用,我該如何請求該套件?

我想定義一個新的包\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在需要任何套件之前調用。

我也因為大衛的評論\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}

相關內容