
В LaTeX можно записывать выражения типа \frac12
, которые должны быть эквивалентны выражениям типа \frac{1}{2}
. Существует ли формальный термин для первой формы записи?
решение1
Нет.
Это всего лишь часть обычного способа, которым TeX поглощает неразделенные макроаргументы. Если вы определяете
\def\foo#1{Something using #1 (or not).}
или эквивалентно
\newcommand\foo[1]{Something using #1 (or not).}
когда \foo
расширяется, он поглощает следующий токен или сбалансированную группу во входном потоке в качестве своего аргумента (который доступен как #1
в определении). Предполагая нормальные коды категорий
- токен — это один символ (за исключением
\
,{
,}
,%
пробела или символа новой строки (поскольку они игнорируются)) или последовательность команд (что-то начинающееся с\
), - сбалансированная группа начинается
{
и заканчивается первым}
, который не принадлежит другой группе (которая началась позже). Скобки удаляются из группы при поглощении (то есть#1
не содержит их).
Вот почему \foo x
и \foo{x}
, \newcommand{\foo}
и \newcommand\foo
или \frac 12
, \frac{1}{2}
и эквивалентны \frac{1}2
.\frac1 2
Хорошей практикой является выбор версии, которая наиболее понятна, что обычно означает использование группы. Лично я явно опускаю группу в тех случаях, когда япридетсявведите один токен, например \newcommand\foo
.
решение2
Возможно, стоит добавить, что различие между аргументами с одним токеном и аргументами в фигурных скобках более явно в LaTeX3/ expl3
. По соглашению каждое expl3
имя макроса должно заканчиваться на , :
за которым следует последовательность букв, называемых спецификаторами аргументов, каждая из которых отражает тип соответствующего аргумента.
Помимо многих других у нас есть
n
для аргументов с фигурными скобками или однозначных аргументов, иN
только для однозначных аргументов, обычно имен макросов/функций или имен переменных.
Эти спецификаторы по-прежнему не изменяют способ обработки отдельных аргументов (La)TeX, но дают пользователю подсказку о том, как аргументы используются внутри макроса.
Например, l3tl
пакет предоставляет две функции \tl_if_empty:nTF
и \tl_if_empty:NTF
. Хотя обе функции проверяют, является ли список токенов пустым, и выполняют код условно, первая, как ожидается, будет вызвана с группой токенов в фигурных скобках, тогда как вторая ожидает переменную списка токенов, которая сначала раскрывается, прежде чем будет выполнена проверка ее содержимого.