
我想知道如何在語句中的兩個巨集之間獲得空格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}%