带有名为\ task

时间:2017-11-30 10:54:41

标签: latex

我一直在尝试创建一个.dtx文件来生成.sty样式文件。这样做我发现了一些我不理解的奇怪事物。在我的.dtx文件中,我想要一个名为\ task的宏。如果我使用\newcommand{\task}[2]{Two arguments: #1 and #2}创建宏,那么文档生成不起作用,而如果我使用TeX声明方式(\def\task#1#2{Two arguments: #1 and #2})则它可以工作。 下面是skeleton.dtx文件。

% \iffalse
%<*driver>
\ProvidesFile{skeleton.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{skeleton}
%<*package>
    [2004/11/05 v1.0 .dtx skeleton file]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{skeleton}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{skeleton.dtx}
\end{document}
%</driver>
% \fi
% \CheckSum{0}
% \DescribeMacro{\task}
% \task{first}{second}
% \StopEventually{}
%    \begin{macrocode}
\newcommand{\task}[2]{Two arguments: #1 and #2}
%    \end{macrocode}
% \Finale
\endinput

这是skeleton.ins文件:

\input docstrip.tex
\keepsilent
\usedir{tex/latex/skeleton}
\generate{\file{skeleton.sty}{\from{skeleton.dtx}{package}}}
\endbatchfile

要测试,只需运行:

latex skeleton.ins
latex skeleton.dtx

第一个命令创建.sty文件,第二个命令生成文档。

使用\ newcommand版本,输出为

! LaTeX Error: Command \task already defined.
               Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.26 ...ommand{\task}[2]{Two arguments: #1 and #2}

使用宏的TeX版本时一切正常。要使其有效,只需将\newcommand替换为\def\task#1#2{Two arguments: #1 and #2}

即可

需要注意的是,使用“task”之外的其他名称不会产生问题,因此它与宏的名称有关。处理TeX工作正常,但我想理解为什么这个\任务宏名称是一个问题。

非常感谢能解释原因。

最后我发现了这个问题。 ltxdoc类声明了一个空的宏\task。我发现此命令用于各种基本Latex包(ltoutput,ltpage,ltfloat,...),并用作todo命令。在官方的ltxdoc.cls包中,它只是删除里面的东西,我认为维护者有另一个实现来跟踪一些待办事项列表。

这回答了我最初的问题。

1 个答案:

答案 0 :(得分:0)

\newcommand{\foo}是一个LaTeX命令,它根据是否存在要定义的命令 - \foo - 来判断。如果它已经存在,则会生成错误,否则会生成错误。 \renewcommand{\foo}检查\foo是否已定义并随后重新定义,否则会生成错误。

上面提到的LaTeX宏已经进行了一些检查(关于宏/参数的存在)。但是,如果您恢复为宏的TeX定义,\def将始终覆盖任何定义,无论其是否存在。这就是LaTeX宏层的这一部分的设计方式。

因此,如果您不关心重新定义任何现有作品,可以使用\def并将其覆盖。如果您担心覆盖现有内容,可以使用\providecommand{\foo}(如果它不存在则仅创建\foo)或使用&#34;命名空间&#34;将您的定义与其他定义分开(例如\newcommand{\myPackagefoo}特定于myPackage - 类型宏)。

参考: