在数学模式下自动纠正 ! 后的间距

在数学模式下自动纠正 ! 后的间距

在此处输入图片描述

$(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

相关内容