$(2n)!/\bigl(n!\,(n+1)!\bigr)$
$${52!\over13!\,13!\,26!} + 33!! - y$$
$(2n)!/\bigl(n!(n+1)!\bigr)$
$${52!\over13!13!26!} + 33!! - y$$\bye
我们如何才能自动处理 后面的间距!
?正如 TeXBook 中所述,!
需要手动处理 后面的间距。我想看看您有什么想法,可以让输入与通常的(最后两行)类似,从而获得正确的间距(前两行)。
我添加了其中不应有空格的情况!!
,其余部分来自 TeXBook。因此它是一个纯 TeX,但任何解决方案都很好。
答案1
您可以尝试一下宏\mathexclam
:
\def\mathexclam{\futurelet\next\mathexclamA}
\def\mathexclamA{%
\expandafter\ifx\space\next
\def\next{\afterassignment\mathexclam\let\next= }\expandafter\next
\else \edef\tmpb{\meaning\next}\let\tmpa=\mathpunct
\expandafter\expandafter\expandafter\mathexclamB\expandafter\tmpb\string\mathchar\end
\iftrue \expandafter\mathexclamC\tmpb\end
\else \mathexclamD !+-*/=<>,.)]\}\bigr\biggr\Bigr\Biggr\right\over\egroup$\relax
\fi
\tmpa{\mathchar`!}%
\ifx\tmpa\mathpunct \mathchoice{}{}{\,}{\,}\fi
\fi
}
\expandafter\def\expandafter\mathexclamB\expandafter#\expandafter1\string\mathchar#2\end#3{%
\ifx^#1^%
}
\def\mathexclamC#1"#2#3\end{%
\ifnum#2=1 \let\tmpa=\mathord \fi % Big OP
\ifnum#2=2 \let\tmpa=\mathord \fi % Bin
\ifnum#2=3 \let\tmpa=\mathord \fi % Rel
\ifnum#2=5 \let\tmpa=\mathord \fi % Close
\ifnum#2=6 \let\tmpa=\mathord \fi % Punct
}
\def\mathexclamD#1{\ifx#1\relax \else
\ifx#1\next \let\tmpa=\mathord\fi
\expandafter\mathexclamD \fi
}
{\catcode`!=13 \global\let!=\mathexclam} \mathcode`!="8000
$(2n)!/\bigl(n!(n+1)!\bigr)$, $1\over 2!3!$.
$${52!\over13!13!26!} + 33!! - y$$
\bye
此宏首先忽略 后的空格!
。空格在数学模式中不重要。然后 测试\mathexclamB
下一个标记是否被声明为\mathchardef
(例如\le
)。如果为真,则\mathexclamC
处理 。否则,显式异常列表由 处理\mathexclamD
。默认!
情况下, 被排版为\mathpunct
。但如果下一个标记是 Op、Bin、Rel Close 或 Punct(由 声明\mathchadef
),则!
被排版为。此外,如果下一个标记是之后\mathord
使用的异常列表中的一个,则 也被排版为。\mathexclamD
!
mathord