Knuth 的定义\,
是\mskip\thinmuskip
。
LaTeX 将此定义更改为
\DeclareRobustCommand{\,}{%
\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi
}
\def\thinspace{\kern .16667em }
amsmath.sty
说是
\DeclareRobustCommand{\tmspace}[3]{%
\ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
\renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
我可能理解 LaTeX 让命令在文本模式下也能使用的目的。但是 amsmath 重新定义的目的是什么?
答案1
你应该看一下完整的图片:
152 │ \ifx\leavevmode@ifvmode\@undefined
153 │ \DeclareRobustCommand{\tmspace}[3]{%
154 │ \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
155 │ \else
156 │ \DeclareRobustCommand{\tmspace}[3]{%
157 │ \ifmmode\mskip#1#2\else\leavevmode@ifvmode\kern#1#3\fi\relax}
158 │ \fi
159 │ \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
160 │ \let\thinspace\,
161 │ \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}}
162 │ \let\negthinspace\!
163 │ \renewcommand{\:}{\tmspace+\medmuskip{.2222em}}
164 │ \let\medspace\:
165 │ \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}}
166 │ \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}}
167 │ \let\thickspace\;
168 │ \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}}
的两个定义\tmspace
是由于最近决定让此类命令无论如何都启动段落模式。对于最近的 LaTeX 内核,将使用第二个。
将其与 LaTeX 内核中的代码进行对比:
1619 │ \DeclareRobustCommand{\,}{%
1620 │ \relax\ifmmode\mskip\thinmuskip\else\thinspace\fi
1621 │ }
1630 │ \def\thinspace{\leavevmode@ifvmode\kern .16667em }
1631 │ \def\negthinspace{\leavevmode@ifvmode\kern-.16667em }
4543 │ \def\>{\mskip\medmuskip}
4544 │ \def\;{\mskip\thickmuskip}
4545 │ \def\!{\mskip-\thinmuskip}
4547 │ \let\:=\>
的方法amsmath
更加合理和简洁。它们还提供了所有宏的文本模式等效项,而如果没有加载则\!
无法在文本模式下使用,其他宏也是如此。最终结果基本相同。但是,命令在辅助文件中写入时将被翻译成,而不是。其实没什么大不了的。amsmath
\,
\tmspace+\thinmuskip{.1667em}
\,