我从 Voss 的Math mode
v2.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
的宏也执行相同的操作,例如:\@tabarray
array
\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
。