我使用的是 LuaLaTeX (>=2022)、OpenType 字体、microtype。平台是 Linux。我有权在与我的主要 *.tex 文档相同的目录(或子目录)中写入文件。我不能使用 --shell-escape,但我可以根据需要使用 Lua io.open、write、read、close。
虽然我使用的是自定义文档类,但这个问题应该适用于标准类。我浏览了 microtype 文档和 fontspec 文档,但没有找到我需要的内容。我确实找到了sidebearings.lua
Philipp Gesang @phi-gamma 编写的 Lua 脚本,它功能齐全,可能可以作为我需要的组件。
我不想读取microtype.cfg
文件(标准文件或我自己设计的文件),而是想 (a) 使用 加载字体fontspec
,(b) 获取我选择的几个字符的侧边距,(c) 创建一个custom-microtype.cfg
动态字体,无论是在内存中还是在书面上,(d) 在加载微字体时使用该配置。在这方面,我直到 才加载微字体\AtBeginDocument
。
我为什么要这样做:输出 PDF 将由机器人检查最小边距。如果字母(例如小写字母 j)侵入边距,则文件将被拒绝。protrusion=false
由于字体字距调整(这是必需的),设置没有帮助。如果文档始终使用一两种字体,我可以手动了解我需要什么。但文档可能使用任何 OpenType 字体,包括我无法访问的专业(非免费)字体,因为还有其他用户。
我建议使用它sidebearings.lua
来发现数字,然后使用自定义微类型配置中的负突起来消除负侧轴承。
我的问题:(1) 这已经可用了吗?我搜索过了,但没有找到。(2) 如果尚未可用,是否值得付出努力去做这件事,或者是否存在我不明白的“陷阱”?如果值得付出努力,我会自己做。
编辑:这是仅用于可视化的 MWE。通常不会有黑条,我还会补偿 O 的方位。
\documentclass{article} % Compile with lualatex.
\RequirePackage{fontspec}
\setmainfont{Libre Caslon Text} % Already installed.
\begin{document}
% The rules are for visualization.
\noindent\rule{2pt}{10pt}Old Nick was a\\
jolly elf.\par
\noindent\rule{2pt}{10pt}Old Nick was a\\
\strut\hspace{.143em}jolly elf.\par % The .143 is from fontforge.
\end{document}
结果如下。请注意,第一个 j 突出到参考条的左侧。第二个 j 没有。我尝试不使用这种hspace
技巧来做到这一点。
EDIT2:显然,我的请求是可行的,无需编写 *.cfg 文件。使用来自的 sidebearings 方法
我可以在文档编译时执行此操作。加载 microtype 后,该\SetProtrusion
命令在 Preamble 中起作用。它可用于重新设置 *cfg 文件中的内容。
答案1
对于此用例,最好在字体加载过程中直接在功能中设置突出部分,而不是通过微类型。在那里设置每个字符的突出部分,并且边界框(以及侧边距)可直接使用,因此无需编写任何文件:
\documentclass{article}
\directlua{
local function set_protrusion(tfmdata, _, value)
% The bounding box is available in a dlightly hidden descriptions table
local descriptions = tfmdata.shared.rawdata.descriptions
for i, char in next, tfmdata.characters do
local bbox = descriptions[i].boundingbox
% Determine the side bearings from the bounding box and width
local left_bearing = bbox[1]
local right_bearing = descriptions[i].width - bbox[3]
% For negative bearings set protrusion parameters:
if left_bearing < 0 then
char.left_protruding = left_bearing
end
if right_bearing < 0 then
char.right_protruding = right_bearing
end
end
end
% Setup this functionality to be controlled by the `bearing_prot` feature:
fonts.constructors.features.otf.register{
name = 'bearing_prot',
description = 'Use protrusion to drop negative side-bearings',
manipulators = {
node = set_protrusion,
},
}
}
% And then load a font with this feature.
\usepackage{fontspec}
\setmainfont[RawFeature=bearing_prot]{Libre Caslon Text}
\begin{document}
% We have to enable protrusion since we don't use microtype:
\protrudechars=2
\noindent Old nick was a\par
% Print a rule to see the boundary of the text block
\hrule depth0pt height1pt
\noindent jolly elf.
\end{document}