宏“\m@th”的含义是什么?

宏“\m@th”的含义是什么?

我从 Voss 的Math modev2.47 第 21 页找到了这个宏:

\makeatletter
\newif\if@borderstar
\def\bordermatrix{\@ifnextchar*{%
    \@borderstartrue\@bordermatrix@i}{\@borderstarfalse\@bordermatrix@i*}%
}
\def\@bordermatrix@i*{\@ifnextchar[{\@bordermatrix@ii}{\@bordermatrix@ii[()]}}
\def\@bordermatrix@ii[#1]#2{%
\begingroup
  \m@th\@tempdima8.75\p@\setbox\z@\vbox{%
    \def\cr{\crcr\noalign{\kern 2\p@\global\let\cr\endline }}%
    \ialign {$##$\hfil\kern 2\p@\kern\@tempdima & \thinspace %
    \hfil $##$\hfil && \quad\hfil $##$\hfil\crcr\omit\strut %
    \hfil\crcr\noalign{\kern -\baselineskip}#2\crcr\omit %
    \strut\cr}}%
  \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
  \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
  \setbox\tw@\hbox{%
    $\kern\wd\@ne\kern -\@tempdima\left\@firstoftwo#1%
      \if@borderstar\kern2pt\else\kern -\wd\@ne\fi%
    \global\setbox\@ne\vbox{\box\@ne\if@borderstar\else\kern 2\p@\fi}%
    \vcenter{\if@borderstar\else\kern -\ht\@ne\fi%
      \unvbox\z@\kern-\if@borderstar2\fi\baselineskip}%
      \if@borderstar\kern-2\@tempdima\kern2\p@\else\,\fi\right\@secondoftwo#1 $%
    }\null \;\vbox{\kern\ht\@ne\box\tw@}%
\endgroup
}
\makeatother

尽管新\bordermatrix命令在我的文档中有效,但我想知道此代码片段的每个部分的含义。其中一些宏可以在中找到macros2e,但是\m@th却找不到。那么,是什么\m@th意思,我应该阅读哪些文档来了解这些宏?

答案1

该定义见于latex.ltx

% latex.ltx, line 481:
\def\m@th{\mathsurround\z@}

好吧,这只是一个缩写,\mathsurround\z@反过来又是

\mathsurround=0pt

那么,是什么\mathsurround?语法表明它是一个参数,其值是长度。它包含插入到内联数学公式两侧的空格量。让我们看一个简单的例子:

\documentclass{article}
\begin{document}
An inline formula $E=mc^{2}$ and some text.

\setlength{\mathsurround}{10pt}
An inline formula $E=mc^{2}$ and some text.
\end{document}

在此处输入图片描述

从技术上讲,这样的空格就是字距;它会在换行时消失。为什么 TeX 中会有这样的空格?一些排版师习惯在公式周围添加一些空格,以便从视觉上将它们与其余的字体块区分开来。不过,这并不常见,而且据我所知没有文档类会设置非零值\mathsurround。当然,没有人会将其设置为大值:也许最多 2pt 左右的值是一个选择。

当内联数学模式用于除在文本中插入公式以外的目的时,最好将其设置\mathsurround为零以避免出现虚假空格。因此,在为 构建的对齐方式中\bordermatrix,如果文档设置 ,则将其设置为零,以便不添加这些字距。用于环境的宏以及使用数学模式的许多其他地方\mathsurround的宏也执行相同的操作,例如:\@tabarrayarray\textsuperscript

% latex.ltx, line 6017:
\DeclareRobustCommand*\textsuperscript[1]{%
  \@textsuperscript{\selectfont#1}}
\def\@textsuperscript#1{%
  {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}

需要注意的一点是,当 TeX 排版数学公式时,它将使用扫描到\mathsurround结尾时的当前值。$

通常的做法是

\def\something#1{$\m@th<do something with #1>$}

#1尽管这为某些宏设置为另一个值的可能性打开了大门\mathsurround。然而,这肯定是不好的做法:参数应该由类或在前言中一次性设置。请注意,这$...$会形成一个组,因此\m@th在公式内部执行不会影响该组外部参数的值。在这种情况下,\textsuperscript有一个额外的括号级别就是为此目的。

\m@th必要使用吗?好吧,每次需要使用的时候我都没有使用它,因为我相信没人知道\mathsurround或者将它设置为非零值(在我看来,这会导致糟糕的排版)。

答案2

@包含代替 的宏a经常出现在LaTeX内核中,因此你需要的文档是来源2e。您还可以使用\show查询宏;因此

\makeatletter
\show\m@th

返回

> \m@th=macro:
->\mathsurround \z@ .

\z@是 的内核缩写0pt

相关内容