\RequirePackage{tocloft} が \documentclass の前で動作しない場合、パッケージを require するにはどうすればよいでしょうか?

\RequirePackage{tocloft} が \documentclass の前で動作しない場合、パッケージを require するにはどうすればよいでしょうか?

\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}

関連情報