我在引擎中使用纯 TeX luatex
(实际上它是 OpTeX,但您可以假设它是“纯”luatex)。对于我的文档,我使用 EBGaramond 字体。当我有像这样的公式时$(f+g)$
,字母 f 稍微与左括号重叠,我不喜欢这样。下面是我尝试修复它的方法,通过在两个字符之间添加一些空格。
\def \adef #1{\catcode`#1=13 \begingroup \lccode`\~=`#1\lowercase{\endgroup\def~}}
\edef\lp{(}
\adef({\futurelet\next\dolp}
\def\dolp{\lp\ifmmode\ifx\next f\mskip1.5mu\fi\fi}
Now there is some space between the parenthesis and the f, $(f+g)$.
\bye
我报告了 OpTeX 中的宏\adef
,它基本上相当于使字符处于活动状态(在本例中是括号),然后定义它。这有效,但我想知道:这是解决这个问题的“正确”方法吗?或者我应该通过添加一些字距来修复字体?如果是这样,怎么做?
关于我的解决方案,如果我想为其他字母添加空格怎么办?假设我有一个
\def\list{fgj}
字符列表(本例中是三个字符 f、g、j),我应该如何编写该\ifx
部分以使其对 中的任何字符都成立\list
?我尝试过但没有成功
\def\dolp{\lp\ifmmode\ea\isinlist\ea\list\next\iftrue\mskip1.5mu\fi\fi}
\ea
OpTeX 的缩写在哪里\expandafter
?是\isinlist
OpTeX 宏(如果需要,您可以查找它)。我不知道为什么这不起作用。
答案1
我的意思是,最好的方法是为 Garamond-Math 字体提供字距调整例外。这可以通过以下\directlua
代码实现:
\fontfam[garamond]
\directlua
{fonts.handlers.otf.addfeature
{
name = "kerncorr",
type = "kern",
data = {
["("] = { ["
答案2
另一个解决方案是使用活动字符(
。我尝试使用仅限数学的活动字符,即,\mathcode`(="8000
但此解决方案在这样的构造中不起作用\bigl(
。因此,全局活动(
似乎更好:
\fontfam[garamond]
\adef({\string(\futurelet\next\addmkern}
\def\addmkern{\ifmmode\cs{mu:\meaning\next}\fi}
\sdef{mu:\meaning f}{\mkern1.5mu}
\sdef{mu:\meaning g}{\mkern1mu}
Test: $(f+g), (x)$, in text: (f).
\bye