在 Plain TeX 中(实际上作为 TeX 基元),\font\myfont=cmr8 at 10pt
和\font\myfont\cmr10
都创建“大小”为 10pt 的字体。我希望能够使用此值在重新定义的宏中生成特定的垂直间距(例如,始终为双倍、单倍、1.1、1.2 倍间距)\font
(它将使用\afterassignment
with\font
来保留正常语义,尤其是放置 a) 空、b) 或 c) 缩放的可变性)。\fontdimen
似乎没有提供这个维度。虽然有点老套,但是否有一个代表性字符,我可以用它创建一个框并测量它的高度,或者是否有更自然的方式来获取这个值?
我可以使用宏\def\font#1=#2@#3{...}
,但这会破坏旧的语义。注意:这是一个普通的 TeX 问题,所以我想避免依赖更高级别的字体框架。
答案1
如果您想要获取实际尺寸而不是括号中尺寸之类的近似值,则可以使用\fontname
:\fontname
始终包含尺寸,除非字体以设计尺寸加载。但如果字体以设计尺寸加载,则可以以缩放尺寸再次加载它并从中提取设计尺寸。
实际的代码看起来有点复杂,因为我们必须扫描,at
并且cmr10 at 12pt
有at
奇怪的 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