LuaTeX:如何倾斜、扩展或加粗字体的某些字符,而不是整个字体?

LuaTeX:如何倾斜、扩展或加粗字体的某些字符,而不是整个字体?

luaotfload我们可以通过编写类似 的内容来倾斜、扩展或加粗整个字体。但是\font\x="xxx.otf:+slant=a;+extend=b;+embolden=c" at d pt,当我只想将此类更改应用于一个字符或某个字符范围时,我该怎么办?

例如:让我们得到一个倾斜的( \sum),如以下链接所示:

如何获得倾斜的 \sum 符号?

梅威瑟:

\input luaotfload.sty

\font\mathfont="latinmodern-math.otf:mode=base;script=math;slant=.25" at 60 pt
\textfont1=\mathfont

\Umathcode`∑="1"1`∑     \let\sum=∑

$∑ab$% How to apply the slant only to the sum?

\bye

如上所述,这会使整个数学字体倾斜。要怎么做才能使倾斜仅应用于\sum

如果是,那么可以将其写为一个新的 OTF 功能,如这个问题所示吗?:

如何在 LuaTeX 中操作选定的字母?

编辑:我发现我可以添加 PDF 命令,tfmdata.characters[...].commands但它不能按预期工作。字形的宽度设置为 0(套印),并且以下段落的间距是错误的。这是怎么回事?

如何正确编写命令?请帮帮我。

最大能量损失 2:

\input luaotfload.sty

\directlua{
    local function slantedsum(tfmdata)
      tfmdata.characters[8721].commands = {
        {'pdf', 'origin', 'q 1.04 0 .2 1 0 0 cm'},
        {'char', 8721},
        {'pdf', 'origin', 'Q'},
      }
    end
    fonts.constructors.features.otf.register{
    name = 'ssum',
    description = 'Slant sum symbol',
    manipulators = {
        base = slantedsum,
    },
}
}

\font\mathfont="latinmodern-math.otf:mode=base;script=math;+ssum" at 10 pt
\textfont1=\mathfont

\font\1="lmroman10-regular.otf" at 10 pt
\1

\Umathcode`∑="1"1`∑     \let\sum=∑

abcd

$∑ab$% How to apply the slant only to the sum?

abcd

abcd

\bye

在此处输入图片描述

答案1

要了解发生了什么,我们应该先简短地介绍一下"origin"PDF 文字的模式:它允许您将 PDF 坐标系的原点视为您正在处理的当前点。这是通过应用坐标变换来实现的,该变换将当前坐标(从 TeX 的角度来看)移动到文字之前的 (0, 0),然后应用变换将 (0, 0) 移回当前 TeX 点。通常,这两个变换会相互抵消,因此除了文字之外,其他任何变换都不会受到它们的影响。如果您插入q一个'origin'文字和Q另一个文字,则它们之间的所有变换都会被丢弃,因此您有责任确保这种抵消仍然有效。这仅在两个文字(从 TeX 的角度来看)出现在相同位置时才有效。如果您使用\pdfextension save并且\pdfextension restoreLuaTeX 会在情况并非如此时发出警告,但对于直接文字,您需要自己处理。

这里不满足这个条件,因为命令char会将您向右移动字符的宽度。现在字符的宽度不是设置为零,但仍然具有正确的大小,但在字形之后,页面其余部分的坐标系统(或直到下一个Q)将向左移动字形的宽度。

您可以通过告诉 LuaTeX 将两个 PDF 文字放在相同的坐标来解决这个问题:

\input luaotfload.sty

\directlua{
    local function slantedsum(tfmdata)
      tfmdata.characters[8721].commands = {
        {'pdf', 'origin', 'q 1.04 0 .2 1 0 0 cm'},
        {'push'}, % Remember where we are
        {'char', 8721},
        {'pop'}, % Move back there
        {'pdf', 'origin', 'Q'},
      }
    end
    fonts.constructors.features.otf.register{
    name = 'ssum',
    description = 'Slant sum symbol',
    manipulators = {
        base = slantedsum,
    },
}
}

\font\mathfont="latinmodern-math.otf:mode=base;script=math;+ssum" at 10 pt
\textfont1=\mathfont

\font\1="lmroman10-regular.otf" at 10 pt
\1

\Umathcode`∑="1"1`∑     \let\sum=∑

abcd

$∑ab$% How to apply the slant only to the sum?

abcd

abcd

\bye

相关内容