LuaLaTeX:改变“1”周围的字距以模拟比例数字

LuaLaTeX:改变“1”周围的字距以模拟比例数字

我遇到的问题是,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

相关内容