Я прочитал ответы на
но альтернатива, которую я сейчас использую, не упомянута:
\newcommand{\arnold}{Arnold Schwarzenegger{}}
что, конечно, требует меньшего набора текста и меньше подвержено ошибкам, чем добавление {}
после вызова команды. Я не столкнулся с какими-либо проблемами до сих пор; напротив, я заметил, что в некоторых сложных случаях, когда \xspace
вставляется нежелательный пробел, {}
он делает это правильно.
Поэтому мне просто интересно, почему, по-видимому, никто больше этим не пользуется, и может ли это вызвать проблемы, о которых я не знаю.
Редактировать: После комментариев я понял, что всегда использовал этот подход с командой, имеющей параметр, поэтому мой пример должен был быть таким:
\newcommand{\arnold}[1]{Arnold #1 Schwarzenegger}
Это научит меня всегда проверять свои примеры, независимо от того, насколько они похожи на мой код.
Так что на самом деле именно аргумент, а не {}, вызывает правильный интервал. Если бы кто-нибудь объяснил мне, почему аргумент имеет значение, я был бы полностью счастлив.
решение1
Вопрос в том, почему пробел в источнике не создает пробел в выводе. Пробел после \arnold
используется для завершения имени команды и не токенизирован, поэтому не создаст никакого вывода. Так что в форме без аргументов
\arnold text
расширяется до
Arnold Schwarzenegger{}text
который будет набран как «Арнольд Шварценеггертекст» и не будет {}
выполнять никаких полезных действий.
Наоборот, в форме с аргументом пробел после него по-прежнему \arnold
не токенизирован, поэтому
\arnold {} text
и
\arnold{} text
анализируются одинаково и оба расширяются до
Arnold␣␣Schwarzenegger␣text
Таким образом, пробел после аргумента обрабатывается как обычный пробел между словами, но между Арнольдом и Шварценеггером вы получите два пробела.