我想知道如何在语句中的两个宏之间留出空格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}%