测量最后一个文本字符的高度,计算斜体校正

测量最后一个文本字符的高度,计算斜体校正

这适用于运行中的文本,而不是数学或图表。我在 Linux 上使用 TeXlive 2023,使用lualatex.UTF-8、从左到右的文本、基于拉丁字母以及常见的印刷支持进行编译(我预计这也适用于希腊文和西里尔文)。

如果我理解斜体校正的\/工作原理,它可以追溯到 lualatex 之前的时代,并且假设每种字体(可能是 Type 1)都带有tfm支持。校正值是从tfm(它是一个二进制文件)中读取的。当代 OpenType 字体,尤其是那些不属于 LaTeX 字体分发的字体,没有这个功能。

在 SE 上搜索,我发现关于他的主题的唯一内容是很多年前的内容,当时lualatex是新的。而且,那些问题涉及数学。

我设想,通过读取文本字符串的最后一个字符,并在框中测量其高度,可以即时确定每个字符的斜体校正。这不需要 Lua 代码。根据框高度,将在斜体字符串后添加额外的空间。因此,X 高度的字母将获得与 X 高度的字母(包括带有升部字母)不同的校正。这也可以补偿变音符号。

添加的空间量可以是通用的,也可以由用户为每个字体指定,或者可能(在 Lua 支持下)通过测量正确的方位来指定。但最后一种方法可能会延长编译时间太多?

如果最后一个字符是句号或逗号,那么也可能需要查看倒数第二个字符。

MWE 以常规字体显示测量值。将\foobar仅包含文本,但其中一些文本可能是可解析为文本的可扩展宏。

\documentclass{article}
\usepackage{fontspec} % If compiling with lualatex
\usepackage{xstring}
\newsavebox\mybox
\begin{document}
\def\foobar{foo bar} % case 1
\StrRight{\foobar}{1}[\barfoo]
\barfoo\savebox\mybox{\barfoo}\the\ht\mybox\typeout{completed case 1}
\def\foobar{f\'o\'o bar\'o} % case 2, correctly gets the final odieresis.
\StrRight{\foobar}{1}[\barfoo]
\barfoo\savebox\mybox{\barfoo}\the\ht\mybox\typeout{completed case 2}
\def\foobar{fo\kern-.5pto bar} % case 3, using kern does not hurt.
\StrRight{\foobar}{1}[\barfoo]
\barfoo\savebox\mybox{\barfoo}\the\ht\mybox\typeout{completed case 3}
\def\foobar{foo\\bar} % case 4, with double-backslash linebreak.
\StrRight{\foobar}{1}[\barfoo]
\barfoo\savebox\mybox{\barfoo}\the\ht\mybox\typeout{completed case 4}
\long\def\foobar{foo\par bar} % case 5, with manual paragraph ending.
\StrRight{\foobar}{1}[\barfoo]
\barfoo\savebox\mybox{\barfoo}\the\ht\mybox\typeout{completed case 5}
\long\def\foobar{foo

bar} % case 6, with double-linespace paragraph.
\StrRight{\foobar}{1}[\barfoo]
\barfoo\savebox\mybox{\barfoo}\the\ht\mybox\typeout{completed case 6}
%\def\foobar{foo\linebreak bar} % Does not work. Not really a problem.
\end{document}

我的问题是:我的方法正确吗?还是还有其他我不知道的方法?或者,这种东西已经存在了吗lualatex

顺便说一句,我使用它是xstring因为我已经将该包用于许多其他用途。

答案1

Luatex 或 xetex 从 OpenType 字体指标中获取斜体校正,并以与 etex 对 tfm 指标相同的方式显示它们。

luatex 展会

> 0.0pt.
l.7 \showthe\fontcharic\font`X
                            
? 
> 0.0pt.
l.9 \showthe\fontcharic\font`L
                            
? 
> 1.02pt.
l.13 \showthe\fontcharic\font`X
                             
? 
> 0.17pt.
l.15 \showthe\fontcharic\font`L
                             
? 

为了

\documentclass{article}
\usepackage{fontspec} % If compiling with lualatex

\newsavebox\mybox
\begin{document}

\showthe\fontcharic\font`X

\showthe\fontcharic\font`L

\itshape

\showthe\fontcharic\font`X

\showthe\fontcharic\font`L

\end{document}

显示斜体校正在直立字体中为 0,在斜体字体中为正值(但与字符高度无密切关系)

如果您在宏中拥有字符串并想要最终的斜体校正,您可以使用\/并查看它增加了多少。

\def\foo{abcdef}
\sbox0{\upshape \foo\/\showthe\lastkern}
\sbox0{\itshape \foo\/\showthe\lastkern}

生产

> 0.0pt.
<argument> \upshape \foo \/\showthe \lastkern 
                                   
l.18 \sbox0{\upshape \foo\/\showthe\lastkern}
                                           
? 
> 1.65pt.
<argument> \itshape \foo \/\showthe \lastkern 
                                   
l.19 \sbox0{\itshape \foo\/\showthe\lastkern}
                                           
? 

相关内容