Por que \tag requer colchetes enquanto \frac não?

Por que \tag requer colchetes enquanto \frac não?

Estou acostumado a usar \tagsem colchetes, como \tag3em \tag{3}Markdown + MathJax, onde funciona tão bem quanto \frac12no LaTeX normal. Mas quando tentei fazer isso em uma .texfonte real processada com pdflatex, recebi alguns erros.

Aqui está o código:

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

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

\end{document}

E é isso que pdflatexdiz

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 

Quando coloco 1colchetes, ele compila perfeitamente e obtenho a saída PDF esperada. Então eu me pergunto: por que \tagexige aparelho e \fracnão? Existe alguma diferença no "tipo" do objeto, como, por exemplo, \tagser um recurso fornecido por pacote enquanto \fracpertence ao núcleo da linguagem (não precisa \usepackagede pelo menos) ou algo parecido?

Responder1

A macro \fracé definida (robustamente) como

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

onde \@@overestá (uma cópia) da primitiva TeX. Então, neste caso, você pode realmente escrever \frac12e será igual a \frac{1}{2}. Muitas pessoas, inclusive eu, dirão para você não fazer isso. (Embora para frações tão curtas eu nem sempre siga meu próprio conselho...)

Por outro lado, no início do displaymath \tagestá \letto \tag@in@display, cuja definição é

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

A parte complicada é #antes da chave de abertura do texto de substituição. O TeX procura o primeiro argumento até uma chave de abertura (mais tarde ele irá verificar se este primeiro argumento é uma estrela *). Para obter detalhes sobre como esse mecanismo funciona, refiro-me às perguntasPegue #{argumentos de macro(em particularA resposta de Martin Scharrer) eMacros com # como último parâmetro. Mas a resposta curta é: o TeX está procurando uma chave de abertura para coletar o argumento #1e em algum momento encontra a linha vazia (que é convertida em um novo parágrafo), o que não é permitido e, portanto, o Paragraph endederro.

informação relacionada