直到今天我才注意到使用\(...\)
and$...$
与xeCJK
(或ctex
)会产生不同的结果,看代码:
\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{SimSun}
\begin{document}
甲\(e^{i\pi}+1=0\)甲
乙$e^{i\pi}+1=0$乙
\end{document}
给出
注意第一个等式前面缺少空格。虽然可以手动修复,但我尝试添加
\renewcommand{\CJKecglue}{\ }
但这个命令似乎只影响$...$
环境。我想知道这是不是故意的;如果不是,如何修复它?更根本的是,为什么被\(...\)
区别对待$...$
?
答案1
\(
和之间的唯一区别$
(当前者没有引发任何错误时)是\(
问题\relax
:
%% latex.ltx, line 4226
\def\({\relax\ifmmode\@badmath\else$\fi}
如果我尝试\relax
在之前手动添加$
,我会得到与相同的结果\(
:
\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{STFangsong}
%\setCJKmainfont{SimSun}
\begin{document}
乙\(e^{i\pi}+1=0\)乙
乙\relax$e^{i\pi}+1=0$乙
乙$e^{i\pi}+1=0$乙
\end{document}
我真的不知道是什么导致了这种行为,但罪魁祸首肯定是\relax
不应该从中移除的\(
。一种解决方法似乎是
\makeatletter
\protected\def\({\ifmmode\@badmath\else$\fi}
\makeatother
不需要,\relax
因为它不会在表格单元格中不合时宜地展开。在添加序言中的三行后,上述文档的输出为
这似乎就是您要寻找的:只有明确的\relax
给出了错误的间距。
为了完整性,还添加
\protected\def\){\ifmmode\ifinner$\else\@badmath\fi\else\@badmath\fi}
前\makeatother
。