我经常需要排版方程式,因为它们本身就很复杂,所以很难阅读。为了解决这个问题,我养成了用水平间距强调运算符优先级的习惯。
举一个简单的例子,因为在数学中\times
结合力比强+
,并且+
结合力比强=
,所以我会这样做:
\[ a \times b \; + \; c \times d \;\; = \;\; (e + f) \times g \]
我发现这可以让我们一眼就更容易理解一个等式。
从那时起我就想出了一个办法小的比这更好的是,使用包定义一系列自定义的“数学连字符” semantic
:
\[ a `*` b ``+`` c `*` d ```=``` (e + f) `*` g \]
增加反引号的数量会成倍增加额外的空间,我通过实验得出了最令人赏心悦目的长度。实现归结为以下内容(尽管我省略了一些极端情况和特性,例如编码\times
为`*`
):
\RequirePackage [ligature] {semantic}
\mathlig{`````}{\mspace{38mu}}
\mathlig{````}{\mspace{23mu}}
\mathlig{```}{\mspace{12mu}}
\mathlig{``}{\mspace{5mu}}
其他人是否已经尝试过类似的事情?有没有更好/更轻松/更自动化的方法?
从哲学角度来说(我希望这不会违背 stackexchange 的精神;版主,如果我应该删除这个,请告诉我),我不知何故认为这是一种有争议的方法。毕竟,许多顽固的 TeX 用户竭尽全力保留 TeX 生成的漂亮间距。我真的很想听听你的意见。你如何解决公式可读性问题?
答案1
如果您的范围仅限于主要的算术,即加、减、乘和等于,那么您可以执行相同的操作而无需任何标记。
只需定义字符+
、-
和*
即可=
数学活跃。
这是一个纯 TeX 文档,LaTeX 也一样(如果您加载amsmath
声明\mathcode`+="8000
,类似的声明应该在参数中\AtBeginDocument
)。
\mathchardef\plus=\mathcode`+
\mathchardef\minus=\mathcode`-
\mathchardef\equals=\mathcode`=
\begingroup\lccode`~=`+
\lowercase{\endgroup\def~}{\mkern12mu\plus\mkern12mu}
\begingroup\lccode`~=`-
\lowercase{\endgroup\def~}{\mkern12mu\minus\mkern12mu}
\begingroup\lccode`~=`*
\lowercase{\endgroup\def~}{\mkern5mu\times\mkern5mu}
\begingroup\lccode`~=`=
\lowercase{\endgroup\def~}{\mkern23mu\equals\mkern23mu}
\mathcode`+="8000
\mathcode`-="8000
\mathcode`*="8000
\mathcode`=="8000
$$
a * b + c * d = (e * f) - g
$$
\bye
当然在 LaTeX 中应该使用\[...\]
而不是$$...$$
。
您还可以“按需”激活此功能:
\mathchardef\plus=\mathcode`+
\mathchardef\minus=\mathcode`-
\mathchardef\equals=\mathcode`=
\def\spacedmath{%
\begingroup\lccode`~=`+
\lowercase{\endgroup\def~}{\mkern12mu\plus\mkern12mu}
\begingroup\lccode`~=`-
\lowercase{\endgroup\def~}{\mkern12mu\minus\mkern12mu}
\begingroup\lccode`~=`*
\lowercase{\endgroup\def~}{\mkern5mu\times\mkern5mu}
\begingroup\lccode`~=`=
\lowercase{\endgroup\def~}{\mkern23mu\equals\mkern23mu}
\mathcode`+="8000
\mathcode`-="8000
\mathcode`*="8000
\mathcode`=="8000
}
$$\spacedmath
a * b + c * d = (e * f) - g
$$
$$
a * b + c * d = (e * f) - g
$$
\bye
从教学角度来看,此举的实用性值得怀疑。