
Интересно, как сделать пробел между двумя макросами в 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}%