Я привык использовать \tag
без скобок, как \tag3
вместо \tag{3}
в Markdown+MathJax, где это работает так же хорошо, как и \frac12
в обычном LaTeX. Но когда я попытался сделать это в реальном .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
require скобки, а \frac
не нет? Есть ли какая-то разница в «типе» объекта, например, \tag
является ли он пакетом-поставляемым средством, а is из языкового ядра ( по крайней мере, \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
.