我习惯在 Markdown+MathJax 中使用\tag
不带括号的 like\tag3
代替\tag{3}
,它的效果与普通 LaTeX 一样好\frac12
。但是当我尝试在.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 输出。所以我想知道,为什么\tag
需要括号而不\frac
需要?对象的“类型”是否有一些差异,例如,\tag
它是包提供的工具,而\frac
它来自语言核心(至少不需要\usepackage
)或类似的东西?
答案1
该宏被\frac
(稳健地)定义为
\frac#1#2 -> \begingroup #1 \endgroup \@@over #2
其中\@@over
是 TeX 原语的副本。因此,在这种情况下,您确实可以这样写\frac12
,它与 相同\frac{1}{2}
。很多人(包括我自己)会告诉您不要这样做。(虽然对于如此短的分数,我并不总是遵循自己的建议……)
另一方面,displaymath的开头\tag
是\let
to \tag@in@display
,其定义如下
\def\tag@in@display#1#{\relax\tag@in@display@a{#1}}
棘手的部分是#
替换文本的左括号之前。TeX 会查找第一个参数直到左括号(稍后它会检查这个第一个参数是否是星号*
)。有关此机制如何工作的详细信息,请参阅问题抓取 #{ 宏参数(尤其Martin Scharrer 的回答) 和以 # 作为最后一个参数的宏。但简短的回答是:TeX 正在扫描左括号来收集参数#1
,并在某个时候发现空行(转换为新段落),这是不允许的,因此出现错误Paragraph ended
。