根据上下文将数学符号视为关系或普通符号的宏

根据上下文将数学符号视为关系或普通符号的宏

我喜欢为我的二元关系定义宏,比如:\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}

在此处输入图片描述

相关内容