我使用下面的方法将新的文档变量引入到我的文档中。它们的行为应该类似于\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
)就更简单了。