\edef 中宏之间的空格

\edef 中宏之间的空格

我想知道如何在语句中的两个宏之间留出空格edef。我的目标是将格式的文件名保存FirstName LastName到宏中,然后在命令中使用该宏includegraphics

问题是我尝试的所有方法都返回了不理想的结果。

\edef\PictureName{\FirstName \LastName}    ➞ "FirstNameLastName"
\edef\PictureName{\FirstName{} \LastName}  ➞ "FirstName{} LastName"
\edef\PictureName{{\FirstName} \LastName}  ➞ "{FirstName} LastName"
\edef\PictureName{\FirstName\ \LastName}   ➞ "FirstName\ LastName"

因此,要么不存储空格\PictureName,要么存储额外的括号或反斜杠。我该如何正确执行此操作?

答案1

您看到的问题是常见的“TeX 忽略控制序列后的空格”,但此处无法像生成排版输出时那样进行修复。在这种情况下,任何将空格字符与控制序列分隔开的方法(当然会产生空格)都可以在输入中起作用:

\FirstName{} \LastName
\FirstName{ }\LastName
{\FirstName} \LastName
\FirstName\ \LastName
\FirstName\space\LastName
\@firstofone{\FirstName} \LastName % assuming the usual definition of \@firstofone

然而,在这里你处于一个只扩展的环境中,在这种情况下,你需要一个空间标记或某个东西扩展到空格标记,同时将其与控制序列分开。带括号和带控制空格的方法在这里不起作用,因为括号不会扩展,所以它们不受\edef扩展的影响。它们在排版时确实有效,因为在那种情况下它们(形成一个组并)消失。控制空格\也不会扩展,所以\edef让它保持原样。

Plain 和 LaTeX 都定义了\def\space{ },因此您可以执行以下操作:

\edef\PictureName{\FirstName\space\LastName}

在 的仅扩展上下文中\edef,它将扩展\FirstName(甚至不需要\space立即查看),然后它将扩展\space为空格标记,然后扩展\LastName

\@firstofone方法也将起作用,因为\@firstofone它也通过(一次)扩展起作用:

\edef\PictureName{\@firstofone{\FirstName} \LastName}

这将扩展\@firstofone{\FirstName},变为\FirstName,然后也会扩展。然后看到空格标记,然后\LastName展开。请参阅此相关问题:将空格字符转换为空格标记

答案2

为了好玩,
我们安排两个任务,而不是一个。您可以 通过“回收”
来玩游戏:
\PictureName

例如:

\def\PictureName{ \LastName}%
\edef\PictureName{\FirstName\PictureName}%

或者:

\def\PictureName{ }%
\edef\PictureName{\FirstName\PictureName\LastName}%

或者:

\def\PictureName#1{%
  \edef\PictureName{\FirstName#1\LastName}%
}%
\PictureName{ }%

或者:

\def\PictureName#1{#1}%
\edef\PictureName{\PictureName{\FirstName} \LastName}%

或者:

\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{ \LastName}}%

或者:

\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{} \LastName}%

或者:

\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{ }\LastName}%

或者:

\def\PictureName!{}%
\edef\PictureName{\FirstName\PictureName! \LastName}%

相关内容