我正在设计一个新的 LaTeX 类,并尝试编写一个方便的辅助命令来声明类中使用的新的“变量”。
具体来说,假设我想使用一个名为的变量\foo
。我希望作者能够编写\foo{bar}
,然后能够\@foo
在类文件中使用(它本身将扩展为)bar
。这可以通过以下代码实现:
\let\@foo\relax
\def\foo#1{\def\@foo{#1}}
作者可以用 来定义它\foo{bar}
。我想创建一个辅助命令,允许使用类似 的命令来声明变量\DeclareAuthorVariable
,我将在 LaTeX 类文件中使用该命令来声明变量。例如,我希望能够\DeclareAuthorVariable{foo}
在类文件中写入,而不是上面丑陋的两行混乱。我尝试了许多不同的方法,但我无法弄清楚如何做到这一点,因为我试图替换的命令本身涉及参数。我想知道是否有人知道如何做到这一点,或者这是否不可能?谢谢!
(此外,抱歉,我对 LaTeX 课程设计还很陌生!)
答案1
我还会添加一些函数。你可以将变量声明为强制或可选;例如,title
可能是强制的,而subtitle
只是可选的。我建议使用以下语法
\DeclareAuthorVariable*{title} % mandatory
\DeclareAuthorVariable{subtitle} % optional
这是代码。将ting
前缀更改为最适合您的前缀。
% Do the branching between * and normal version
\newcommand{\DeclareAuthorVariable}{%
\@ifstar{\ting@DeclareAuthorVariable{\ting@mandatory@var}}
{\ting@DeclareAuthorVariable{\ting@optional@var}}%
}
% The main command; the internal version of \foo is \ting@foo
% The macro \ting@foo is initialized to give an error or an info
% message when used, so if the user doesn't provide a value for a
% mandatory variable, we'll catch the issue
\newcommand{\ting@DeclareAuthorVariable}[2]{%
\@namedef{ting@#2}{#1{#2}}%
\@namedef{#2}##1{\@namedef{ting@#2}{##1}}%
}
% The error and info messages
\newcommand{\ting@mandatory@var}[1]{%
\ClassError{ting}
{Missing value for mandatory variable
\expandafter\string\csname#1\endcsname}
{You have to provide a value with
\expandafter\string\csname#1\endcsname{...}}%
}
\newcommand{\ting@optional@var}[1]{%
\ClassInfo{ting}
{Missing value for optional variable
\expandafter\string\csname#1\endcsname}%
}
%%% Define two variables
\DeclareAuthorVariable*{title}
\DeclareAuthorVariable{subtitle}
如果需要根据变量是否被赋值来分支,可以修改\ting@DeclareAuthorVariable
:
\newcommand{\ting@DeclareAuthorVariable}[2]{%
\@namedef{ting@#2}{#1{#2}}%
\@namedef{#2}##1{\@namedef{ting@#2}{##1}\@namedef{ting@#2@defined}{}}%
}
并添加
\newcommand{\@ifauthorvariable}[3]{\@ifundefined{ting@#1@defined}{#3}{#2}}
你可以这样说
\@ifauthorvariable{subtitle}
{\vspace{3ex}\textsc{\ting@subtitle}\par\vspace{3ex}}
{\vspace{1ex}---\par\vspace{1ex}}
(这里我假设标题页将设置在\centering
;将打印副标题,如果缺失,则打印破折号。)
答案2
\makeatletter
\def\DeclareAuthorVariable#1{\@namedef{#1}##1{\@namedef{@#1}{##1}}}
\DeclareAuthorVariable{foo}
\show\foo
\foo{abc}
\show\@foo
\stop
生产
> \foo=macro:
#1->\@namedef {@foo}{#1}.
l.7 \show\foo
?
> \@foo=macro:
->abc.
l.11 \show\@foo
?
)
No pages of output.
答案3
你可能想研究KOMA-classes
和它们的宏\newkomavar
。