当我创建一个“存储宏”时,我经常用以下方法将其初始化为空
\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
显然如果您更改内部结构,它就会中断。