![LuaLaTeX:改变“1”周围的字距以模拟比例数字](https://linux22.com/image/355155/LuaLaTeX%EF%BC%9A%E6%94%B9%E5%8F%98%E2%80%9C1%E2%80%9D%E5%91%A8%E5%9B%B4%E7%9A%84%E5%AD%97%E8%B7%9D%E4%BB%A5%E6%A8%A1%E6%8B%9F%E6%AF%94%E4%BE%8B%E6%95%B0%E5%AD%97.png)
我遇到的问题是,Linotype 的原始 Helvetica 和 Neue Helevetica 字体系列在其 OpenType 版本中似乎都没有比例数字,只有表格数字,其中每个数字都是等宽的。我尝试切换到比例数字,fontspec
但外观没有任何变化。
我需要段落文本的比例数字,但表格数字看起来很奇怪。我发现这种情况非常令人困惑,因为它似乎是一种专业且知名的字体。表格数字最明显的是“1”,它周围的空间太大了。
我在 LuaLaTeX 中找到了可能的解决方案,答案如下:https://tex.stackexchange.com/a/323718/75284 但根据 David Carlisle 的评论,这种方法会破坏其他 LaTeX 命令中的数字用法。他提到了虚拟字体,如何定义新的虚拟字体并应用所需的字距对?
最好的解决方案是可以定义通用字距调整(左和右)并定义字距调整对以进行微调。
如果您的系统中没有 Helvetica 字体,请使用其他字体替换它。
% -*- program: lualatex -*-
\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{HelveticaNeueLTStd-Roman}
\begin{document}
\obeylines
11111
88888
10 11 12 13 14 15 16 17 18 19 1.
01 11 21 31 41 51 61 71 81 91 .1
Desired output: 1\kern-.15em{1}
\end{document}
编辑:关于在 LuaLaTeX 中设置字符两侧的字距调整的后续问题:LuaLaTeX:fonts.handlers.otf.addfeature 字距调整对出现意外行为
答案1
下面的代码使用 Arial 而不是 Helvetica 产生上述效果。
OP 确认代码可以与原始问题中的 Helvetica 变体一起使用,如果
if(string.find(name,'HelveticaNeueLTStd'),
用来代替
if(string.find(name,'arial')
如果您切换\iffalse
到\iftrue
使用修改后的字体加载器,那么您将获得下面的输出,其中的排版1
已经以一种微妙的几乎难以察觉的方式发生了变化。
\documentclass{article}
\usepackage{fontspec}
\iffalse
\directlua{
%
orig_define_font=luatexbase.remove_from_callback('define_font','luaotfload.define_font')
%
function x_define_font(name,size,id)
local thisfont=orig_define_font(name,size,id)
if(string.find(name,'arial') and type(thisfont)=='table') then
thisfont.characters[49].width=thisfont.characters[49].width-200000
thisfont.characters[49].commands = {
{'right',-100000},
{'special','pdf: 1 0 0 rg'},
{'char',49},
{'special','pdf: 0 g'},
{'right',-100000},
}
end
return thisfont
end
%
%
luatexbase.add_to_callback('define_font',x_define_font,'my_define_font')
%
}
\fi
\setmainfont{arial}
\begin{document}
abc 111 111 111 X
abc 123 111 222 X
abc 222 444 111 X
\end{document}
答案2
由于您似乎只想在涉及更多数字时调整间距,因此您可以更改两个数字之间的字距:
\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\directlua
{
fonts.handlers.otf.addfeature
{
name = "ktest",
type = "kern",
data =
{
["1"] = {
["1"] = -200 ,
["2"] = -200
},
},
}
}
\setmainfont{Arial}[RawFeature=+ktest]
\setsansfont{Arial} %to show the difference
\begin{document}
1111121212
\sffamily
1111121212
\end{document}
答案3
这不是通过调整字距来实现的,但如果您想要的是 Helvetica 样式的比例数字,那么另一种方法是替换具有这些数字的字体,例如 TeX Gyre Heros,并设置 OpenType 选项以使用它们。
\documentclass[varwidth]{standalone}
\usepackage{fontspec}
\setsansfont{Arial}
\setmainfont{Arial}
\newfontfamily\pronums{TeX Gyre Heros}[Numbers={Lining,Proportional}, Scale=MatchUppercase]
\begin{document}
\fontsize{48}{48}
{\sffamily 111 222 333}
{\pronums 111 222 333}
\end{document}
如果您也希望它们处于数学模式,您可以仅在中加载数字字体unicode-math
。