确定字体的“大小”

确定字体的“大小”

在 Plain TeX 中(实际上作为 TeX 基元),\font\myfont=cmr8 at 10pt\font\myfont\cmr10都创建“大小”为 10pt 的字体。我希望能够使用此值在重新定义的宏中生成特定的垂直间距(例如,始终为双倍、单倍、1.1、1.2 倍间距)\font(它将使用\afterassignmentwith\font来保留正常语义,尤其是放置 a) 空、b) 或 c) 缩放的可变性)。\fontdimen似乎没有提供这个维度。虽然有点老套,但是否有一个代表性字符,我可以用它创建一个框并测量它的高度,或者是否有更自然的方式来获取这个值?

我可以使用宏\def\font#1=#2@#3{...},但这会破坏旧的语义。注意:这是一个普通的 TeX 问题,所以我想避免依赖更高级别的字体框架。

答案1

如果您想要获取实际尺寸而不是括号中尺寸之类的近似值,则可以使用\fontname\fontname始终包含尺寸,除非字体以设计尺寸加载。但如果字体以设计尺寸加载,则可以以缩放尺寸再次加载它并从中提取设计尺寸。

实际的代码看起来有点复杂,因为我们必须扫描,at并且cmr10 at 12ptat奇怪的 catcodes:

\begingroup
  \edef\specialAt{{ \string a\string t }}%
  \def\x#1{%
    \def\getfontsize##1=##2{% The user level macro
      \expandafter\getfontsizE\fontname##2#1\relax{##1}%
    }%
    \def\getfontsizE##1#1##2\relax##3{%
      \ifx*##2*% Loaded at designsize
        \begingroup
          \font\tmpfont"##1" scaled 2000
          \getfontsize\dimen0=\tmpfont
          \divide\dimen0 by 2
          \expandafter
        \endgroup
        \expandafter\getfontsiZe\the\dimen0\relax{##3}%
      \else% Otherwise #2 holds the size. But is is followed by " at ", so we have to strip that
        \getfontsiZE{##3}##2%
      \fi
    }%
    \def\getfontsiZE##1##2#1{##1=##2}% Strip " at "
    \def\getfontsiZe##1\relax##2{##2=##1}
  }
  \expandafter\expandafter\expandafter
\endgroup
\expandafter\x\specialAt

% Let's try using it: What is the size of \tenrm?
\getfontsize\dimen0=\tenrm
{\tt\string\tenrm} has size \the\dimen0.

\font\cmrXVII=cmr17\relax
\getfontsize\dimen0=\cmrXVII
cmr17 has size \the\dimen0.
\bye

当然,您可以将其与 egreg 的答案结合起来,自动将每个加载字体的大小分配给某个宏。

在此处输入图片描述

答案2

您可以使用\xfont与相同的语法进行定义\font,但这样\xfont\foo=cmr10也将\foosize使用替换文本定义字体中括号的高度和深度(如 Ulrike Fischer 所建议的)。

\def\xfont#1{%
  % #1 = font selection control sequence
  \begingroup\escapechar=-1
  \edef\x{\endgroup\def\noexpand\fontnametmp{\string#1}}\x
  \afterassignment\setfontsize\font#1%
}
\def\setfontsize{%
  \setbox0=\hbox{\csname\fontnametmp\endcsname(}%
  \dimen0=\ht0 \advance\dimen0 \dp0
  \expandafter\edef\csname\fontnametmp size\endcsname{\the\dimen0}%
}

\xfont\fontA=cmr8 at 10pt
\immediate\write20{\fontA = \meaning\fontA\space --- \fontAsize}

\xfont\fontB=cmr5 scaled 2000
\immediate\write20{\fontB = \meaning\fontB\space --- \fontBsize}

\xfont\fontC=cmr17
\immediate\write20{\fontC = \meaning\fontC\space --- \fontCsize}

\xfont\fontD=cmbx10
\immediate\write20{\fontD = \meaning\fontD\space --- \fontDsize}

\bye

这将在终端上产生,

\fontA = select font cmr8 at 10.0pt --- 10.0pt
\fontB = select font cmr5 at 10.0pt --- 10.0pt
\fontC = select font cmr17 --- 17.24997pt
\fontD = select font cmbx10 --- 10.0pt

相关内容