如果括号后跟某些字符,则在数学模式下自动在括号后添加空格

如果括号后跟某些字符,则在数学模式下自动在括号后添加空格

我在引擎中使用纯 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}

\eaOpTeX 的缩写在哪里\expandafter?是\isinlistOpTeX 宏(如果需要,您可以查找它)。我不知道为什么这不起作用。

答案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

相关内容