Пробел между макросами в \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}%

Связанный контент