Почему \tag требует скобок, а \frac — нет?

Почему \tag требует скобок, а \frac — нет?

Я привык использовать \tagбез скобок, как \tag3вместо \tag{3}в Markdown+MathJax, где это работает так же хорошо, как и \frac12в обычном LaTeX. Но когда я попытался сделать это в реальном .texисточнике, обработанном с помощью pdflatex, я получил некоторые ошибки.

Вот код:

\documentclass[]{article}
\usepackage{amsmath}
\begin{document}

\[f(x)=\frac32\tag1\]

\end{document}

И вот что pdflatexговорит

This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2017-04-15>
Babel <3.18> and hyphenation patterns for 3 language(s) loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
For additional information on amsmath, use the `?' option.
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty))
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty)
(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty))
No file test.aux.
Runaway argument?
1\] 
! Paragraph ended before \tag was complete.
<to be read again> 
                   \par 
l.6 

Когда я заключаю в 1фигурные скобки, компиляция проходит нормально, и я получаю ожидаемый вывод PDF. Так что мне интересно, почему \tagrequire скобки, а \fracне нет? Есть ли какая-то разница в «типе» объекта, например, \tagявляется ли он пакетом-поставляемым средством, а is из языкового ядра ( по крайней мере, \fracне требуется ) или что-то в этом роде?\usepackage

решение1

Макрос \fracопределяется (надёжно) как

\frac#1#2 -> \begingroup #1 \endgroup \@@over #2

где \@@overнаходится (копия) примитива TeX. Так что в этом случае вы действительно можете написать, \frac12и это будет то же самое, что и \frac{1}{2}. Многие люди, включая меня, скажут вам не делать этого. (Хотя для таких коротких дробей я не всегда следую своему собственному совету...)

С другой стороны, в начале displaymath \tagстоит \letto \tag@in@display, определение которого гласит:

\def\tag@in@display#1#{\relax\tag@in@display@a{#1}}

Сложность заключается в том, что #текст замены находится перед открывающейся скобкой. TeX ищет первый аргумент до открывающейся скобки (позже он проверит, является ли этот первый аргумент звездочкой *). Подробности о том, как работает этот механизм, я отсылаю к вопросамПерейти к аргументам макроса #{(в частностиОтвет Мартина Шаррера) иМакросы с # в качестве последнего параметра. Но если коротко, то TeX ищет открывающую фигурную скобку, чтобы собрать аргумент #1, и в какой-то момент находит пустую строку (которая преобразуется в новый абзац), что недопустимо, и отсюда возникает ошибка Paragraph ended.

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