(为了自己,我最后写了一段相当冗长的背景,所以你可以直接跳到问题以下。)
背景
TeX 或 LaTeX(我不知道哪个具体起什么作用)在数学模式下有三类用于自动间距的符号:
- 一元运算符如余弦或者在(
\mathop
),后面跟着一个细跳过(\mskip\thinmuskip
或\,
); - 二元运算符+或者×(
\mathbin
)周围是中型箕斗(\mskip\medmuskip
或\:
); - 二元关系如=或者≤(
\mathrel
)周围是厚厚的横线(\mskip\thickmuskip
或\;
)。
它没有专门的逻辑连接词类,例如∧或者∨。这些显然被视为二元运算符。这有时是有道理的,尤其是在编写关于逻辑本身,并定义它的语法,或者你正在考虑抽象公式,如磷∧问。但是,我觉得它不适合工作和逻辑(至少对我来说,逻辑更为常见),以及连接具体的大公式。例如,考虑排版公式 0 ≤ 我 ∧ 我 < n:
\documentclass{minimal}
\usepackage{amsmath}
\begin{document}
\[ 0 \leq i \land i < n \] % spacing of an operator (default)
\[ 0 \leq i \mathrel{\land} i < n \] % spacing of a relation
\[ 0 \leq i \;\;\;{\land}\;\;\; i < n \] % thrice the spacing of a relation
\end{document}
我发现前两个渲染图很难读懂(在默认设置下,它们之间的区别对我来说太微妙了)。此外,第一个(当然)和第二个(可以说)也是概念上错了,因为它们破坏了层次结构:
- 运算符(构建更大的表达式),
- 关系(构建关于表达式的原子公式),
- 连词(构建更大的公式)。
例如第一个应该读作 0 ≤ (我∧我)< n我发现,为了让公式在我眼中足够易读,它需要的间距至少是关系的三倍。
我尝试过
为了解决这个问题,我想到最好的办法是:
% creates a length akin to \thinmuskip, \medmuskip, \thickmuskip, for logical connectives:
\newmuskip \verythickmuskip
\verythickmuskip = 3\thickmuskip % default value (for instance)
% provide a command akin to \mathop, \mathbin, \mathrel, for logical connectives:
\newcommand \verythickspace {\mskip\verythickmuskip}
\newcommand \mathlop[1] {\verythickspace#1\verythickspace}
% define large-spacing logical connectives, using capitalized names
% (we rather not override the existing names as it breaks many things):
\newcommand \ANDop {\mathord{\land}}
\newcommand \AND {\mathlop{\ANDop}}
\newcommand \ORop {\mathord{\lor}}
\newcommand \OR {\mathlop{\ORop}}
% etc.
问题在于,它\mathlop{…}
只能拙劣地模仿内置符号类。它粗暴地在符号周围添加空格,而不考虑上下文,因此无法像内置类那样处理空格。这些都无法按预期工作:({\AND}
禁用空格)、 (强制空格)等。无法通过应用等{}\AND{}
再次更改类;特别是,无法只恢复符号而不保留空格。\mathbin
\mathord
问题
有没有更好的方法可以做到这一点?可以\mathlop
更好地实现吗?一些包是否已经为具有大间距的逻辑连接词提供了宏?
我看到包 amsmath 简单地定义\implies
为\;\Longrightarrow\;
,所以也许确实没有更好的解决方案……