调整特定对的字距,例如“(j”

调整特定对的字距,例如“(j”

在我的数学文档中,我经常使用(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-mathlualatex和传统字体);问题是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}

相关内容