\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}%

相關內容