\tag には中括弧が必要なのに、 \frac には必要ないのはなぜですか?

\tag には中括弧が必要なのに、 \frac には必要ないのはなぜですか?

私は Markdown+MathJax での代わりに の\tagように中括弧なしで使用することに慣れています。これは通常の LaTeX と同じように機能します。しかし、で処理された実際のソースでこれを実行しようとすると、エラーが発生しました。\tag3\tag{3}\frac12.texpdflatex

コードは次のとおりです:

\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 braces は必要なのに、 require braces\fracは必要ないのか疑問に思います。オブジェクトの「タイプ」に、たとえば、\tagパッケージ提供の機能であるのに対し、 は\frac言語コアからのもの (\usepackage少なくとも必要ありません) など、何か違いがあるのでしょうか。

答え1

マクロは\frac(堅牢に)次のように定義される。

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

ここで、 は\@@overTeX プリミティブ (のコピー) です。したがって、この場合、 と書くことができ\frac12、 と同じになります\frac{1}{2}。私を含め、多くの人が、これを行わないようにと言うでしょう。(ただし、このような短い分数の場合、私は自分のアドバイスに常に従えるわけではありません...)

一方、displaymathの冒頭にはがあり\tag、その定義は次のようになる。\let\tag@in@display

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

難しいのは、#置換テキストの開き括弧の前の部分です。TeXは開き括弧までの最初の引数を探します(後でこの最初の引数が星印かどうかをチェックします*)。このメカニズムがどのように機能するかの詳細については、次の質問を参照してください。#{マクロ引数を取得する(特にマーティン・シャラーの回答) そして最後のパラメータとして # を使用するマクロしかし、簡単に答えると、TeX は引数を収集するために開き中括弧をスキャンしており#1、ある時点で空行 (新しい段落に変換される) を見つけますが、これは許可されていないため、Paragraph endedエラーが発生します。

関連情報