如何检测当前字体大小的最高字母和最深字母的长度?

如何检测当前字体大小的最高字母和最深字母的长度?

我的想法是重新定义它,\strut让它尽可能的短。

这意味着支柱的长度是最高字母长度与最深字母长度的总和。

答案1

一个问题是字体度量不包括适当的尺寸。下面的代码提供了一个简短的宏来显示字体尺寸。

\documentclass[10pt]{article}

\usepackage{graphicx, booktabs, tabularx, scalefnt, xcolor} 


\begin{document}
\def\displayfontmetrics#1{\medskip
\noindent 
\begin{table}[htbp]
\begin{tabular}{lcl}
\toprule
  Parameter  & Description & Value\\
\midrule
  fontdimen1 & slant &  \the\fontdimen1\font\\
  fontdimen2 &interword space  &  \the\fontdimen2\font\\
  fontdimen3 &interword stretch &  \the\fontdimen3\font\\
  fontdimen4 & interword shrink &  \the\fontdimen4\font\\
  fontdimen5 & x-height &  \the\fontdimen5\font\\
  fontdimen6 & quad width &  \the\fontdimen6\font\\
  fontdimen7 & extra space &  \the\fontdimen7\font\\
\bottomrule
\end{tabular}
\caption{Font metrics for font #1}
\end{table}
\medskip}


\scalebox{2}{ H\'AMB\"URG\'E\c F\'ON\c ST\'IV}

\scalebox{2}{ \lowercase{H\'AMB\"URG\'E\'ty\c F\'ON\c ST\'IV}}

\end{document}

一个解决方案是使用vphantom可以用作支柱的东西。

\def\Z{\vphantom{y\vphantom{\'l}}}

\colorbox{yellow}{\Z abcdy}

答案2

\baselineskip支撑箱的高度被精确地定义为包括行间距的最小值。但是,每次更改字体大小时,您都必须重新定义 strutbux。这就是为什么拥有自己的 strut 值毫无意义的原因。请使用宏\vphantom

\def\mystrut{\vphantom{Äg}}

答案3

Luatex 手册,第 4.4.5.1.2 节,字形项目,记录了每个字体存在的字形数组,它提供了有关每个渲染字符的边界元素的信息:

关于边界框:TrueType 字体和基于 TrueType 的 otf 字体的边界框信息直接从字体文件中读取。基于 PostScript 的字体没有此信息,因此传统 PostScript 字体的边界框是通过解释实际的贝塞尔曲线来找到准确的边界框来生成的。这可能是一个缓慢的过程,因此从 LuaTEX 0.45 开始,基于 Post-Script 的 otf 字体(和原始 cff 字体)的边界框仅使用基于实际字形点的字形形状近似值来计算,而不是考虑整个曲线。这意味着在极值处缺少点的字形将具有太紧的边界框,但处理速度要快得多,因此我们认为这种权衡是值得的。

这听起来就像是您想要得到的最接近的结果。如果您了解 Lua,那么迭代字体中的字形并计算每个字形的最大高度和深度应该相当容易。

相关内容