答案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 进行比较:
Bonumf
有一些斜体修正,否则上标的位置不会很好(蓝色数字表示斜体修正):
然而, Bonumf
还有另一个问题:它从其边界框的左端伸出,这可能会与括号等发生冲突:
让我来描述一下 ConTeXt 是如何处理的。也许一些 LaTeX 入门者可以实现类似的东西,或者至少得到一些启发。
f
让我们从 Bonum 开始(这适用于所有字体)。我们不需要让 Bonum 突出其框,而是
- 在左侧增加宽度,使其不突出,并且
- 对宽度添加斜体校正,并引入同样大的负右下角字距。
以下用括号修正该示例:
带有下标和上标的示例也正确显示(红色数字表示右下角的字距):
和
由于 Dejavu Math 的开发人员没有为斜体添加斜体校正f
,因此我们不能依赖相同的解决方案(但我们也没有(f)
或的问题f^0
)。我们仍然可以在右下角添加负角距,而且已经完成了。这是在 ConTeXt 的一个 goodie 文件(带有设置/调整的 lua 文件)中完成的,如果查看 Dejavu 的文件,会发现一个调整:
{
tweak = "kerns",
list = {
[0x1D453] = { bottomright = -.2 },
}
},
这个数量-.2
是通过反复试验得出的,结果是
让我评论一下,因为可能有细心的读者:在调整后的版本中,零的位置也稍微高了一点。这是由于字体参数中的一些变化SubscriptShiftDown
,从字体中的 277 变为 177(通过反复试验)。如果使用小写字母作为下标,我们认为它们太低了:
随着参数的改变,我们得到
与一些“正常”尺寸进行更好的比较:
不变:
修复内容:
在这两种情况下,这都被输入为
Let $f_0(x) = \sin x$ and define
所以对用户来说什么都没有改变。我希望这对你来说不是完全没用,尽管它并没有真正回答你的问题。