是否可以从 .dtx 中提取 .cls 并避免两个 \LoadClass 命令错误?

是否可以从 .dtx 中提取 .cls 并避免两个 \LoadClass 命令错误?

我已经尝试适应Joseph Wright 的模型 dtx 文件对于我基于该类编写的类article(下面是一个简化的工作示例,我将其命名为democlass.dtx)。但是当我运行时,pdflatex democlass.dtx我收到错误! LaTeX Error: Two \LoadClass commands. 显然,只有一个\LoadClass语句,因此它必须在某处第二次加载。

那么,当 .cls 文件基于类时,是否可以从 .dtx 文件中提取 .cls 文件article?我到处寻找解决方案,但我不知所措。

% \iffalse meta-comment
% !TEX program  = pdfLaTeX
%<*internal>
\iffalse
%</internal>
%<*readme>
demopkg --- readme text and license (truncated for this example)
%</readme>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
demopkg --- readme text and license (truncated for this example)

\endpreamble
\postamble

Copyright, maintenance, and included files (truncated for this example)

\endpostamble
\usedir{tex/latex/demopkg}
\generate{
  \file{\jobname.cls}{\from{\jobname.dtx}{class}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\usedir{source/latex/demopkg}
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\usedir{doc/latex/demopkg}
\generate{
  \file{README.txt}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
%<*class>
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{demopkg}[2009/10/06 v1.0 description text]
%</class>
%<*driver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{\jobname}
\usepackage[numbered]{hypdoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
% 
%\GetFileInfo{\jobname.cls}
%
%\title{^^A
%  \textsf{demopkg} --- description text\thanks{^^A
%    This file describes version \fileversion, last revised \filedate.^^A
%  }^^A
%}
%\author{^^A
%  You\thanks{E-mail: [email protected]}^^A
%}
%\date{Released \filedate}
%
%\maketitle
%
%\changes{v1.0}{2009/10/06}{First public release}
%
%\DescribeMacro{\examplemacro}
% Some text about an example macro called \cs{examplemacro}, which
% might have an optional argument \oarg{arg1} and mandatory one
% \marg{arg2}. 
%
%\StopEventually{^^A
%  \PrintChanges
%  \PrintIndex
%}
%
%    \begin{macrocode}
%<*class>
%    \end{macrocode}
%    
%\begin{macro}{\LoadClass}
%    \begin{macrocode}
\LoadClass{article}
%    \end{macrocode}
%\end{macro} 
%
%    \begin{macrocode}
%</class>
%    \end{macrocode}
%\Finale

答案1

在禁用 之后,\usepackage{\jobname}它只应包含在包中,而不是类中,您的示例对我来说编译得很好。我没有收到任何错误。但是,我猜问题的原因是\ProvidesClass之前的行\documentclass。它应该在那里,至少不是以这种形式,因为它被视为驱动程序文档的一部分。有些\iffalse..\fi缺失或使用%<class>\ProvidesClass代替。在 Joseph 的原文中,对于包来说也是如此,但这可能不会造成这么多麻烦。

相关内容