用于在类文件中声明变量的宏

用于在类文件中声明变量的宏

我正在设计一个新的 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

相关内容