luaotfload
我们可以通过编写类似 的内容来倾斜、扩展或加粗整个字体。但是\font\x="xxx.otf:+slant=a;+extend=b;+embolden=c" at d pt
,当我只想将此类更改应用于一个字符或某个字符范围时,我该怎么办?
例如:让我们得到一个倾斜的∑
( \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 功能,如这个问题所示吗?:
编辑:我发现我可以添加 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 restore
LuaTeX 会在情况并非如此时发出警告,但对于直接文字,您需要自己处理。
这里不满足这个条件,因为命令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