Ich bin es gewohnt, \tag
ohne Klammern wie \tag3
statt \tag{3}
in Markdown+MathJax zu verwenden, wo es genauso gut funktioniert wie \frac12
in normalem LaTeX. Aber als ich versuchte, dies in einer echten .tex
Quelle zu tun, die mit verarbeitet wurde pdflatex
, traten einige Fehler auf.
Hier ist der Code:
\documentclass[]{article}
\usepackage{amsmath}
\begin{document}
\[f(x)=\frac32\tag1\]
\end{document}
Und das pdflatex
sagt
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
Wenn ich es mit Klammern umschließe 1
, wird es einwandfrei kompiliert und ich erhalte die erwartete PDF-Ausgabe. Daher frage ich mich, warum \tag
Klammern erforderlich sind, während \frac
dies nicht der Fall ist. Gibt es einen Unterschied im „Typ“ des Objekts, z. B. dass \tag
es sich um eine vom Paket bereitgestellte Funktion handelt, während \frac
es aus dem Sprachkern stammt ( \usepackage
zumindest nicht erforderlich) oder so etwas in der Art?
Antwort1
Das Makro \frac
ist (robust) definiert als
\frac#1#2 -> \begingroup #1 \endgroup \@@over #2
wobei \@@over
(eine Kopie) des TeX-Grundelements ist. In diesem Fall können Sie also tatsächlich schreiben \frac12
und es wird dasselbe sein wie \frac{1}{2}
. Viele Leute, mich eingeschlossen, werden Ihnen davon abraten. (Obwohl ich bei so kurzen Bruchteilen meinen eigenen Rat nicht immer befolge...)
Andererseits \tag
steht am Anfang von displaymath \let
to \tag@in@display
, dessen Definition lautet
\def\tag@in@display#1#{\relax\tag@in@display@a{#1}}
Der schwierige Teil ist der #
vor der öffnenden Klammer des Ersetzungstextes. TeX sucht nach dem ersten Argument bis zu einer öffnenden Klammer (später wird geprüft, ob dieses erste Argument ein Stern ist *
). Einzelheiten zur Funktionsweise dieses Mechanismus finden Sie in den FragenGreifen Sie auf #{ Makroargumente zu(insbesondereAntwort von Martin Scharrer) UndMakros mit # als letztem Parameter. Aber die kurze Antwort ist: TeX sucht nach einer öffnenden Klammer, um das Argument zu erfassen #1
, und findet irgendwann die leere Zeile (die in einen neuen Absatz umgewandelt wird), was nicht zulässig ist, und daher der Paragraph ended
Fehler.