设置存储宏的初始值

设置存储宏的初始值

当我创建一个“存储宏”时,我经常用以下方法将其初始化为空

\newcommand{\@mymacro}{}
\newcommand{\mymacro}[1]{\renewcommand{\@mymacro}{#1}}

我可以这样做,而不是将其初始化为空\let\@mymacro\relax。在letter.cls存储宏(有没有更好的术语)中定义为

\newcommand{\mymacro}[1]{\def\@mymacro{#1}}
\mymacro{}

在这种方法中,甚至不必初始化\@mymacro,并且可以省略\mymacro{}。这可能会导致潜在的神秘错误消息,并且在 LaTeX 内核中,存储宏\@title\@author初始化为

\def\@title{\@latex@error{No \noexpand\title given}\@ehc}
\def\@author{\@latex@warning@no@line{No \noexpand\author given}}

给出更少的神秘信息。是否有正确的方法来初始化存储宏?

答案1

注意定义

\def\@title{\@latex@error{No \noexpand\title given}\@ehc}

实际上是发现了一种不同类型的错误。

如果你有

\newcommand{\mymacro}[1]{\renewcommand{\@mymacro}{#1}}

第一次使用时会出现错误,因为你不能重新定义未定义的\@mymacro

正如您所说,您可以使用它\def来避免区分第一种情况。

但是无论您使用\def还是\renewcommand将内部宏初始化为,\relax或者{}如果您不使用文档中的命令,那么这将被默认接受,默认值为初始值。

LaTeX 使用了\def\gdef实际上),但是大多数类都希望它在没有以前使用的情况下\def\title#1{\gdef\@title{#1}}使用时出现错误, 因此初始化为您显示的错误消息。\maketitle\title

很难对此给出全局规则。使初始值成为错误并不总是可能的(或理想的)。\baselinestretch例如,初始化为 1,因为它需要在 tex 原始长度乘法中使用,并且通常不需要由用户设置,因此如果没有设置,将其设为错误就没什么用了。

通过广告设置命令设置默认值可能是最干净的,因此使用

\title{\@latex@error{No \noexpand\title given}\@ehc}

而不是乳胶实际使用的

\def\@title{\@latex@error{No \noexpand\title given}\@ehc}

这样,如果您决定在命令后面使用更复杂的内部结构(例如 LaTeX3 属性列表或其他),\title事情仍将正常工作,因为您没有假设内部数据以特定方式存储。(这意味着您也总是通过定义的访问器访问数据,如果您直接使用,\@title显然如果您更改内部结构,它就会中断。

相关内容