如何创建一个带有参数的变量,如 \title 或 \author?

如何创建一个带有参数的变量,如 \title 或 \author?

用Java解释我想要什么:

String myTitle = "";

// Later on in the main method

myTitle = "";

System.out.println(myTitle);

我基本上只是想用 newcommand 创建一个新变量,稍后在序言中赋予它一个值,这样我就可以在开始文档后输出该变量。

\documentclass{scrartlc}

\newcommand{\myVariable}{}


\myVariable{FOOBAR}

\begin{document}

\myVariable

\end{document}

答案1

标准方法是使用命令为某些宏赋予含义,然后在需要时使用该宏。

可能

\newcommand{\myVariable}[1]{\renewcommand{\myVariable}{#1}}

但这有几个缺点:

  1. 您必须事先知道要命名和使用什么变量;
  2. 一旦设置该值,则无法更改;
  3. 这会不必要地混淆设置和使用。

最好执行一个通用变量定义命令:

\newcommand{\defineVariable}[2]{\newcommand{#1}{#2}}

并像使用它一样

\defineVariable{\myVariable}{FOOBAR}

但是这不允许重新定义。使用\def#1{#2}非常危险,因为它会接受类似

\definevariable{\def}{FOOBAR}

显然,混乱将随之而来。

有一种更巧妙的方法,甚至可以让您摆脱 后面空格的问题\myVariable。此外,user@variable@前缀还可以避免重新定义重要命令的风险。

\documentclass{article}

\makeatletter
\newcommand{\defineVariable}[2]{%
  \expandafter\def\csname user@variable@#1\endcsname{#2}%
}
\newcommand{\useVariable}[1]{%
  \ifcsname user@variable@#1\endcsname
    \csname user@variable@#1\endcsname
  \else
    \@latex@error{Undefined variable '#1'}{The variable '#1' has never been defined}%
    ERRONEOUS VARIABLE%
  \fi
}
\makeatother

\begin{document}

\defineVariable{myVar}{FOOBAR}

\useVariable{myVar} is very useful.

\defineVariable{myVar}{something else}

\useVariable{myVar} is very useful.

\useVariable{undefined} is undefined

\end{document}

在此处输入图片描述

控制台输出:

! LaTeX Error: Undefined variable 'undefined'.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...

l.27 \useVariable{undefined}
                             is undefined
? h
The variable 'undefined' has never been defined
?

一种expl3实现(没有引发错误以保持可扩展性,尽管可以添加)。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\defineVariable}{mm}
 {
  \prop_put:Nnn \l__user_variables_prop { #1 } { #2 }
 }

\NewExpandableDocumentCommand{\useVariable}{m}
 {
  \prop_if_in:NnTF \l__user_variables_prop { #1 }
   {
    \prop_item:Nn \l__user_variables_prop { #1 }
   }
   {
    ERRONEOUS~VARIABLE
   }
 }

\prop_new:N \l__user_variables_prop

\ExplSyntaxOff

\begin{document}

\defineVariable{myVar}{FOOBAR}

\useVariable{myVar} is very useful.

\defineVariable{myVar}{something else}

\useVariable{myVar} is very useful.

\useVariable{undefined} is undefined

\end{document}

答案2

您可以声明\myVariable为令牌寄存器

\newtoks\myVariable

然后用户可以为其设置一个值

\myVariable{FOOBAR}

然后你可以在宏中使用该值

\the\myVariable

答案3

我非常喜欢@wipet 的回答(我不知道你可以这样做!),但我想我会发布我通常如何解决与你相同的问题, \providecommand定义变量(及其默认值),并\renewcommand为其分配一个新值(可能多次):

\documentclass{article}    
\providecommand{\myVariable}{Default Value}
\begin{document}
\begin{itemize}
\item Default value is: ``\myVariable''
\item \renewcommand{\myVariable}{First Updated value}
First updated value is: ``\myVariable''
\item \renewcommand{\myVariable}{Second Updated value}
Second updated value is: ``\myVariable''
\end{itemize}
\end{document}

编译上述代码将得到以下输出: 默认值更新两次的 LaTeX 代码输出

希望能帮助到你!

相关内容