表示等价关系的符号通常以两种方式使用。它们要么是二元关系符号,表示两个元素是等价的,要么是等价关系集合商的标准符号中的普通符号。在后一种情况下,需要明确告知 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}