带有或不带有参数的自己的文档变量

带有或不带有参数的自己的文档变量

我使用下面的方法将新的文档变量引入到我的文档中。它们的行为应该类似于\author\title。因此,当它们不带参数使用时,它们应该打印相应的变量。如果使用参数调用它们,它们应该将相应的变量设置为此值。

\newcommand*{\tutor}[1]{\gdef\@tutor{#1}}

工作正常,但我必须使用

\tutor{new defined name}

定义价值和

\@tutor

打印名称,而不仅仅是使用

\tutor

按照需要引入的最简单的方法是什么\tutor

答案1

这种用法在 LaTeX 中很少见(它不是\author等的工作方式),但可以让宏提前查看\@ifnextchar下一个字符是否为括号(需要写成\bgroup因为您需要在宏中匹配的一对括号)。

\newcommand*\tutor{%
   \@ifnextchar\bgroup
      {\gdef\@tutor}%
      {\@tutor}%
}

\gdef\@tutor如果存在参数(然后它将采取该参数),则这将扩展为,\@tutor如果没有参数,则扩展为。


还有一个xparse包允许使用可选的括号参数定义宏,并可以测试参数是否存在。有关详细信息,请参阅包手册。对于这种情况,恕我直言,这有点过头了。


您还可以\tutor按照您在帖子中的形式进行定义,然后在文档开头将其重新定义为等于\@tutor

\newcommand*{\tutor}[1]{\gdef\@tutor{#1}}
% or
% \newcommand*{\tutor}{\gdef\@tutor}

\AtBeginDocument{\let\tutor\@tutor}

\tutor{<argument>}那么您只能在序言和\tutor文档正文中使用。


名称中带有 的宏@需要用\makeatletter...\makeatother包装,包或类文件除外,它们会自动执行此操作。

答案2

xparse

\usepackage{xparse}
\makeatletter

\def\@tutor{\ClassError{myclass}{Undefined \string\tutor}
  {You need to say \string\tutor{<NAME>} before using \protect\tutor by itself}}

\NewDocumentCommand{\tutor}{g}{\IfNoValueTF{#1}{\@tutor}{\gdef\@tutor{#1}}}

\makeatother

我还添加了一条错误消息,以防\tutor在定义其值之前就被使用(这种定义通常在类文件中使用)。

然而,通常的策略是避免让用户明确打印导师的姓名;因此只\tutor{<NAME>}应在用户级别,并且班级可以用来\@tutor打印标题页。

答案3

你可以这样做:

\makeatletter
\newcommand{\tutor}[1]{\newcommand{\@tutor}{#1}}
\makeatother

然后像这样使用它

\makeatletter\@tutor\makeatother

这不是你想要的。但是,如果你要经常使用这些内容,那么将上述内容封装在一个newcommand

\makeatletter\newcommand{\thetutor}[0]{\@tutor}\makeatother

\@tutor现在您可以使用with的内容了\thetutor

简而言之,只需制作两个名称之间具有可预测差异的命令(在本例中the)就更简单了。

相关内容