如何在 LaTeX 中声明动态变量名称?

如何在 LaTeX 中声明动态变量名称?

我想在主文件中包含多个 latex 文件。每个文件中都会有像这样的变量名

\filenameXXX

在哪里

文件名

是文件的名称,XXX是变量名称的组成部分,XXX将是一些字母。

例如,如果我包含文件名 myFirstfile.tex,则变量名称将是

\myFirstfileXXX

等等。

我的问题是,如何在不明确定义的情况下做到这一点。我想用命令获取变量中的文件名。

有可能吗?怎样做?

答案1

据我所知,您希望能够定义一个命令,其中某些部分是动态生成的。为此,您需要命令\csname\endcsname。它们之间的任何内容都将被解释为命令。例如,\LaTeX您可以编写

\csname LaTeX\endcsname

这可以在命令定义中使用,但你需要小心,不要试图重新定义\csname它自己,为此你需要\expandafter。例如

\newcommand\SomeLetters{ABC}
\expandafter\newcommand\csname MyFirstFile\SomeLetters\endcsname{---Output from MyFirstFile---}

将定义一个命令\MyFirstFileABC。要获取文件名,您可以使用\jobname。在我的例子中,我使用文件Test.tex,然后

\expandafter\newcommand\csname\jobname\SomeLetters\endcsname{---Output from jobname command---}

将定义命令\TestABC

如果你想定义一个带有输入的新命令,并使用动态命令名称,你可以执行以下操作

\newcommand\mycommandgenerator[3]{% {Basename}{Postfix}{Number inputs}
  \expandafter\newcommand\csname #1#2\endcsname[#3]}
\mycommandgenerator{Name}{abc}{1}{**#1**}

然后,通过使用,\mycommandgenerator您可以定义一个新命令,其名称由第一个和第二个输入组成。第三个输入指定新命令的输入数量。在这种情况下,的定义\Nameabc相当于

\newcommand\Nameabc[1]{**#1**}

您甚至可以在命令名称中使用非字母,但需要使用\csname\endcsname来使用它。该命令

\mycommandgenerator{AB34}{XYZ}{0}{My command output}

定义一个具有名称的命令AB34XYZ,但由于名称中不允许有数字,因此必须用 来调用\csname AB34XYZ\endcsname

整个示例以文件形式给出Test.tex

\documentclass{article}
\newcommand\SomeLetters{ABC}
\expandafter\newcommand\csname MyFirstFile\SomeLetters\endcsname{---Output from MyFirstFile---}
\expandafter\newcommand\csname\jobname\SomeLetters\endcsname{---Output from jobname command---}
\newcommand\mycommandgenerator[3]{% {Basename}{Postfix}{Number inputs}
  \expandafter\newcommand\csname #1#2\endcsname[#3]}
\mycommandgenerator{Name}{abc}{1}{**#1**}
\mycommandgenerator{AB34}{XYZ}{0}{My command output}
\begin{document}
\csname LaTeX\endcsname

.\MyFirstFileABC.

.\TestABC.

.\Nameabc{hjk}.

.\csname AB34XYZ\endcsname.
\end{document}

enter image description here

相关内容