我一直在尝试创建一个.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包中,它只是删除里面的东西,我认为维护者有另一个实现来跟踪一些待办事项列表。
这回答了我最初的问题。
答案 0 :(得分:0)
\newcommand{\foo}
是一个LaTeX命令,它根据是否存在要定义的命令 - \foo
- 来判断。如果它已经存在,则会生成错误,否则会生成错误。 \renewcommand{\foo}
检查\foo
是否已定义并随后重新定义,否则会生成错误。
上面提到的LaTeX宏已经进行了一些检查(关于宏/参数的存在)。但是,如果您恢复为宏的TeX定义,\def
将始终覆盖任何定义,无论其是否存在。这就是LaTeX宏层的这一部分的设计方式。
因此,如果您不关心重新定义任何现有作品,可以使用\def
并将其覆盖。如果您担心覆盖现有内容,可以使用\providecommand{\foo}
(如果它不存在则仅创建\foo
)或使用&#34;命名空间&#34;将您的定义与其他定义分开(例如\newcommand{\myPackagefoo}
特定于myPackage
- 类型宏)。
参考: