我喜欢为我的二元关系定义宏,比如:\newcommand{\pref}{\mathrel{R}}
。我将其用作:a \pref b
。但有时我也想将我的二元关系视为一个函数,因此,例如,写为\pref(A)
或\pref = \pref'
,或将其视为一组对并写为\foreach (a, b) \in \pref: …
。
间距应该根据当前的情况而变化,而且似乎可以自动检测正确的情况,至少在大多数情况下是这样。我可以手动修复其余的情况,但对于常见情况,自动解决方案会更好。例如,当后面跟着一个左括号时,\pref
它应该不再是 a\mathrel
而变成(我想) a \mathord
。
与此相关的是,我想知道如何在需要时手动更改类别pref
,同时仍使用我的宏(假设它不能自动完成)?我知道我可以定义没有限定符的宏:\newcommand{\pref}{R}
然后在必要时通过系统地限定它来使用它(\mathrel{\pref}
例如),但如果可能的话,我宁愿将\mathrel
其作为默认值并在必要时覆盖它。
答案1
恐怕您的问题无法解决(至少在传统的 TeX 实现中,也许 LuaTeX 可以做些什么)。
关系符号(定义为\mathchardef
并给定类 3)、简单字符(通过其 给定类 3 \mathcode
)、不同类中但前面是\mathrel
或最后是 范围内的子公式的符号\mathrel
(即\mathrel{<subformula>}
),在正在构建的数学列表中被标记为关系节点。
当公式结束时,数学列表从左到右遍历,TeX 从节点构建框,并在需要时插入空格和惩罚。
例如它将插入没有空间,没有惩罚连续的关系节点之间,但根据表格,不同类节点和关系节点之间有一个粗空格
(看https://tex.stackexchange.com/a/81777/4427了解详情)。
因此,如果你这样做,和x\in\pref(A)
之间将没有空格,和之间也没有空格。但是,因为没有“回头看”。第 3 行和第 3 列中只有一个“不可能”的情况,即 Rel-Bin 或 Bin-Rel,在这种情况下,Bin 节点将变成 Ord 节点。Rel 节点\in
\pref
\pref
(
绝不改变他们的班级。
表中的“不可能情况”是指二元运算节点(第 2 类)在某些情况下变成 Ord 节点(即一元运算符)的原因。
人们可能倾向于使用 Bin 节点并更改其大小\medmuskip
以匹配\thickmuskip
类似
\newmuskip\savemedmuskip
\newcommand{\pref}{%
\savemedmuskip=\medmuskip
\medmuskip=\thickmuskip
\mathbin R
\medmuskip=\savemedmuskip
}
这是 Steven B. Segletes 提出的(修订)提案,不是有效,因为 TeX 对 使用单个值\medmuskip
,恰好是公式结束时的值。
史蒂文的诡计似乎在一个示例中起作用,但只是因为他的宏恰好这样做\medmuskip=\medmuskip
而不是恢复已保存的值。
咱们试试吧
\documentclass{article}
\usepackage{amsmath}
\newmuskip\savemedmuskip
\newcommand{\pref}{%
\savemedmuskip=\medmuskip
\medmuskip=\thickmuskip
\mathbin R
\medmuskip=\savemedmuskip
}
\begin{document}
$a \mathrel R b$
$a \mathbin R b$
$a \pref b$
\end{document}
如你所见,第二个和第三个公式完全相同。
如果要将 Rel 对象更改为 Ord 对象,唯一的方法就是对其进行支撑。
您可以通过定义 *-variant 来避免使用括号:
\makeatletter
\newcommand{\pref}{\@ifstar{R}{\mathrel R}}
\makeatother
例子:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\pref}{\@ifstar{R}{\mathrel R}}
\makeatother
\begin{document}
$a \pref b$
$a \in \pref*(A)$
\end{document}