\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도움이 된다면 패키지를 사용하고 있습니다 .)


MWE(또는 내 초기 시도를 보여주는 최소한의 예):

% \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}애초에 왜 바꿨는지 모르겠네요 :)


MWE(결정된)

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

관련 정보