目前我正在使用\mod
附带的命令amsmath
,虽然我总体上对它感到满意,但我不喜欢它处理文本样式中的间距的方式。
我尝试\mod
按如下方式更新命令:
\usepackage{amsmath}
\makeatletter
\renewcommand{\mod}[1]{\mathchoice
{\allowbreak \if@display \mkern 18mu\else \mkern 5mu\fi
{\operator@font mod} \mkern 6mu #1}
{\allowbreak \if@display \mkern 18mu\else \mkern 5mu\fi
{\operator@font mod} \mkern 6mu #1}
{\mkern4mu {\operator@font mod} \mkern 6mu #1}
{\mkern4mu {\operator@font mod} \mkern 6mu #1}
}
\makeatother
现在,如果我输入 ,就会出现各种错误\mod \mathfrak p
,为了避免这些错误,我必须输入\mod {\mathfrak p}
。但是,在我更新命令之前,输入是没问题的,\mod \mathfrak p
而且不会产生任何错误。有什么办法可以解决这个问题,还是我应该坚持输入\mod {\mathfrak p}
?
答案1
要模仿amsmath
定义,您应该将参数移到 之外\mathchoice
。您也可以移动6mu
单词的间距和键入方式(mod
在所有情况下都一样)。正如@egreg 指出的那样,应该\allowbreak
将 移出\mathchoice
; 里面没有任何效果。
\documentclass{article}
\usepackage{amsmath,amssymb}
\makeatletter
\renewcommand{\mod}[1]{\allowbreak
\mathchoice
{\if@display \mkern 18mu\else \mkern 5mu\fi}
{\if@display \mkern 18mu\else \mkern 5mu\fi}
{\mkern4mu}
{\mkern4mu} {\operator@font mod} \mkern 6mu #1
}
\makeatother
\begin{document}
\( 5 \mod \mathfrak f \)
\begin{equation*}
5 \mod \mathfrak f
\end{equation*}
\end{document}
在某种程度上,幸运的是,它在这里#1
可以正常工作\mathfrak
;添加\tracingmacros=1
以查看此内容。命令操作参数的方式根本不必要,您只需定义即可。
\makeatletter
\renewcommand{\mod}{\allowbreak
\mathchoice
{\if@display \mkern 18mu\else \mkern 5mu\fi}
{\if@display \mkern 18mu\else \mkern 5mu\fi}
{\mkern4mu}
{\mkern4mu} {\operator@font mod} \mkern 6mu
}
\makeatother
答案2
这里不需要,只需要一些算术;不过,我要强调的是,和\mathchoice
的正确语法是\mod
\mathfrak
a\equiv b \mod{\mathfrak{p}}
标准定义确实似乎\mod \mathfrak p
可行,但仅此而已:它似乎上班。
TeX 提供\nonscript
指定未在下标或上标中添加的数学胶水或字距:
\documentclass{article}
\usepackage{amsmath,amssymb}
\textwidth=.5\textwidth % just not to waste space
\begin{document}
\section*{Standard}
$a\equiv b\mod{\mathfrak{p}} + X_{a\equiv b\mod{\mathfrak{p}}}$
\[
a\equiv b\mod{\mathfrak{p}} + X_{a\equiv b\mod{\mathfrak{p}}}
\]
\section*{Modified}
\makeatletter
\renewcommand{\mod}[1]{%
\allowbreak
\nonscript\if@display \mkern 14mu \else \mkern 1mu \fi
\mkern 4mu
{\operator@font mod}
\mkern 6mu
#1
}
\makeatother
$a\equiv b\mod{\mathfrak{p}} + X_{a\equiv b\mod{\mathfrak{p}}}$
\[
a\equiv b\mod{\mathfrak{p}} + X_{a\equiv b\mod{\mathfrak{p}}}
\]
\end{document}