调整下标数学符号的斜体校正

调整下标数学符号的斜体校正

我正在使用 DejaVu 数学字体,并注意到零点f_0距离F

% !TeX program = lualatex
\documentclass{article}

\usepackage{unicode-math}
\setmathfont{texgyredejavu-math.otf}

\begin{document}

\[
  f_0
\]

\end{document}

MWE 输出

我的理解是,字体作者设置了一个斜体校正值(相当于),当符号后跟下标时,该值将在数学模式下应用。我可以为我的文档更改此值吗?f_{\!0}(甚至f_{\!\!0})看起来更好,但我不想每次都输入它。

答案1

由于您使用的是 LuaLaTeX,因此您可以(a)定义一个执行下标字距校正的 Lua 函数,然后(b)将其分配给 LuaTeX 的process_input_buffer回调,以便它可以充当输入流的预处理器,TeX 进行其常规处理。

在此处输入图片描述

% !TeX program = lualatex
\documentclass{article}

\usepackage{unicode-math}
\setmathfont{texgyredejavu-math.otf}

\usepackage{luacode}
\begin{luacode}
function subscriptcorr ( s )
-- Two lines per letter (here: "f" "g" "x"), for both single-char
-- subscripts and subscripts contained in pairs of curly braces
  s = s:gsub ( "f%s-_%s-(%b{})" , "f_{\\mkern-6mu %1}" )
  s = s:gsub ( "f%s-_%s-(%w)"   , "f_{\\mkern-6mu %1}" )
  s = s:gsub ( "g%s-_%s-(%b{})" , "g_{\\mkern-2mu %1}" )
  s = s:gsub ( "g%s-_%s-(%w)"   , "g_{\\mkern-2mu %1}" )
  s = s:gsub ( "x%s-_%s-(%b{})" , "x_{\\mkern-2mu %1}" )  
  s = s:gsub ( "x%s-_%s-(%w)"   , "x_{\\mkern-2mu %1}" )  
  return s
end
\end{luacode}

%% 2 utility LaTeX macros
\newcommand\SubscriptCorrOn{%
  \directlua{luatexbase.add_to_callback (
  "process_input_buffer" , subscriptcorr , "subscriptcorr" )}}
\newcommand\SubscriptCorrOff{%
  \directlua{luatexbase.remove_from_callback (
  "process_input_buffer" , "subscriptcorr" )}}

\begin{document}

$f_0 f_1 f_m \ x_ i x _ j x _k \ g _{mn} g _ {uv}$

\SubscriptCorrOn  % activate the Lua function
$f_0 f_1 f_m \ x_ i x _ j x _k \ g _{mn} g _ {uv}$

\SubscriptCorrOff % de-activate the Lua function
$f_0 f_1 f_m \ x_ i x _ j x _k \ g _{mn} g _ {uv}$

\end{document}

答案2

这不是一个答案,但对于评论来说太长了。您看到的问题如下(如前所述,但显示了方框):

似曾相识

Dejavu Math 字体中的f有相当宽的侧边距。零也有一些侧边距。它们加在一起确实看起来不太理想。让我们更深入地探讨相关问题。

我们来将其与走向另一个极端的 TeXGyre Bonum 进行比较:

f_0Bonum

Bonumf有一些斜体修正,否则上标的位置不会很好(蓝色数字表示斜体修正):

富^0

然而, Bonumf还有另一个问题:它从其边界框的左端伸出,这可能会与括号等发生冲突:

(f)善意

让我来描述一下 ConTeXt 是如何处理的。也许一些 LaTeX 入门者可以实现类似的东西,或者至少得到一些启发。

f让我们从 Bonum 开始(这适用于所有字体)。我们不需要让 Bonum 突出其框,而是

  • 在左侧增加宽度,使其不突出,并且
  • 对宽度添加斜体校正,并引入同样大的负右下角字距。

以下用括号修正该示例:

(f) 赔偿责任

带有下标和上标的示例也正确显示(红色数字表示右下角的字距):

f_0Bonum-修复

f^0Bonum-fix

由于 Dejavu Math 的开发人员没有为斜体添加斜体校正f,因此我们不能依赖相同的解决方案(但我们也没有(f)或的问题f^0)。我们仍然可以在右下角添加负角距,而且已经完成了。这是在 ConTeXt 的一个 goodie 文件(带有设置/调整的 lua 文件)中完成的,如果查看 Dejavu 的文件,会发现一个调整:

{
    tweak = "kerns",
    list  = {
        [0x1D453] = { bottomright = -.2 },
    }
},

这个数量-.2是通过反复试验得出的,结果是

f_0Dejavu-已修复

让我评论一下,因为可能有细心的读者:在调整后的版本中,零的位置也稍微高了一点。这是由于字体参数中的一些变化SubscriptShiftDown,从字体中的 277 变为 177(通过反复试验)。如果使用小写字母作为下标,我们认为它们太低了:

A_xDejavu

随着参数的改变,我们得到

A_xDejavu-修复

与一些“正常”尺寸进行更好的比较:

不变:

示例-Dejavu

修复内容:

示例-Dejavu-fix

在这两种情况下,这都被输入为

Let $f_0(x) = \sin x$ and define 

所以对用户来说什么都没有改变。我希望这对你来说不是完全没用,尽管它并没有真正回答你的问题。

相关内容