在我的数学文档中,我经常使用(j
,并且在我当前的数学字体中, 会(
与 发生冲突j
。我其他地方的字距调整实际上没有问题。我可以用 替换(j
,(\mkern2mu j
但有没有办法全局执行此操作?
(我认为这并不重要,但我正在使用 XeLaTeX 进行编译。)
答案1
因为 XeTeX 字符类在数学模式下不起作用(?),所以解决这个问题的唯一方法是定义左括号数学活动并检查下一个标记是否j
在插入字距之前。
优点是以下解决方案与引擎无关。
\documentclass{article}
\makeatletter
\mathchardef\lparen=\mathcode`\(
\begingroup
\lccode`\~=`\(
\lowercase{\endgroup
\def~{\lparen\@ifnextchar{j}{\mkern2mu}{}}%
}%
\mathcode`(="8000
\makeatother
\begin{document}
$\lparen j$
$(j$
\end{document}
上面是原始的,下面是经过调整的字距。
上述解决方案与amsmath
包不兼容。要使用 ,amsmath
需要采用不同的解决方案,这可能不太理想。我们定义\lparen
来排版左括号并向前看。出于对称j
原因,我们还定义了。\rparen
)
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\def\lparen{(\@ifnextchar{j}{\mkern2mu}{}}
\def\rparen{)}
\makeatother
\begin{document}
$(j)$
$\lparen j \rparen$
$\left( j \dfrac{a}{b} \right)$
$\left\lparen j \dfrac{a}{b} \right\rparen$
\end{document}
修复amsmath
(也适用于unicode-math
和lualatex
和传统字体);问题是amsmath
使用(
其\resetMathstrut@
宏,因此我们需要用它替换它\lparen
。
\documentclass{article}
\usepackage{amsmath,etoolbox}
%\usepackage{unicode-math} % try with xelatex or lualatex also uncommenting it
\makeatletter
\AtBeginDocument{%
\ifx\Umathcharnumdef\@undefined
\mathchardef\lparen=\mathcode`\(
\patchcmd\resetMathstrut@{\mathcode`\(}{\lparen}{}{}%
\else
\Umathcharnumdef\lparen\Umathcodenum`\(
\patchcmd\resetMathstrut@{\Umathcodenum`\(}{\lparen}{}{}%
\fi
\begingroup
\lccode`\~=`\(
\lowercase{\endgroup
\def~{\lparen\@ifnextchar j{\mkern2mu }{}}%
}%
\mathcode`(="8000
}
\makeatother
\begin{document}
$\lparen j$
$(j$
$\left(\dfrac{a}{b}\right)$
\end{document}