我想在主文件中包含多个 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}