我習慣使用\tag
不帶大括號的方式,就像\tag3
在 Markdown+MathJax 中那樣,它的工作方式與普通 LaTeX 中\tag{3}
一樣好。\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 尋找第一個參數直到左大括號(稍後它將檢查第一個參數是否為星號*
)。有關此機制如何工作的詳細信息,我參考問題抓取#{巨集參數(尤其馬丁·沙勒的回答) 和最後一個參數為 # 的宏。但簡短的答案是:TeX 正在掃描左大括號來收集參數#1
,並在某個時刻發現空白行(它被轉換為新段落),這是不允許的,因此會出現錯誤Paragraph ended
。