有没有办法让一个符号根据上下文表现为 mathord 或 mathrel?

有没有办法让一个符号根据上下文表现为 mathord 或 mathrel?

表示等价关系的符号通常以两种方式使用。它们要么是二元关系符号,表示两个元素是等价的,要么是等价关系集合商的标准符号中的普通符号。在后一种情况下,需要明确告知 LaTeX 我们要将等价符号视为普通符号。

代码

\documentclass{minimal}

\begin{document}

  Good spacing: $x \sim y$.

  Bad spacing: $X / \sim$.

  Good spacing: $X / \mathord\sim$.

\end{document}

生产

我想知道在这种情况下是否可以\sim自动转换为\mathord类。我认为这样做就足够了,\sim除非\mathrel它紧随其后,/在这种情况下应该是\mathord

答案1

不,关系符号在所有情况下都会如此表现,并且不存在“回头看看在我之前发生了什么”的情况。您可以向前看,看看/后面的内容是否是关系符号,在这种情况下,将其视为普通符号。但是这种方法有几个限制,因为它总是需要/(在数学模式下)后面跟着仍然属于数学模式的东西。

在处理等价关系时相当常见的具体问题可以用不同的方法解决:

\newcommand{\quotient}[2]{#1/{#2}}

这样调用

$\quotient{X}{\sim}$

会满足您的要求,还会提供良好的标记,以便改进排版(不同的斜线、一些间距等等)。诀窍是使用括号#2,这样它就会成为子公式并成为普通原子。

这里是“向前看”的一个可能实现,它假设后面/总是跟着一些应该被视为普通原子的东西:

\documentclass{article}
\usepackage{amsmath}

\newcommand{\qslash}[1]{\normalslash{#1}}
\mathchardef\normalslash=\mathcode`/
\begingroup\lccode`~=`/ \lowercase{\endgroup\let~}\qslash
\AtBeginDocument{\mathcode`/=\string"8000 }

\begin{document}

$X/\sim$

\end{document}

在此处输入图片描述

推荐它。

答案2

这是一个基于 LuaLaTeX 的解决方案,它设置了一个 Lua 函数,通过将其分配给process_input_buffer回调,该函数作为预处理器运行,即TeX 本身会进行任何处理。Lua 函数会扫描所有输入行,并“即时”将\sim所有前面带有/(可能还有一些空格)的实例括在花括号中。将数学原子括在花括号中会将其状态更改为“数学普通”,这会影响其相对于相邻数学原子的间距。

在此处输入图片描述

\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function slash_sim ( line )
  return ( string.gsub ( line , "/%s-\\sim", "/{\\sim}" ) )
end
luatexbase.add_to_callback ( "process_input_buffer", slash_sim, "slash_sim" )
\end{luacode}

\begin{document}
$x\sim y$ 

$U /\sim$   % no whitespace between "/" and "\sim"

$U / \sim$  % some whitespace between "/" and "\sim"

$U /{\sim}$ % status of "\sim" is set to math-ord manually 
\end{document}

相关内容