我使用的是 Plain TeX(以及eplain
,如果这很重要的话)。我希望能够通用地缩放当前字体,无论当前字体是如何设置的。例如,我想编写一个宏
\def\VandV{V\hskip-3pt{\abitsmallerthanthecurrentfont\&\hskip-3ptV}
我想让\abitsmallerthanthecurrentfont
& 符号变小一点。
我记得,在 LaTeX 中,如果没有软件包,可以使用\Large
和\tiny
之类的东西来影响当前字体的大小。但我没有使用 LaTeX。
是否可以以简单的方式完成此操作而无需对 Plain TeX 进行大量修改?
答案1
我会使用一种完全不同的方法:
\input eplain
\beginpackages
\usepackage{graphicx}
\endpackages
\def\smallampersand{\scalebox{.8}{\&}}
\def\VandV{V\kern-.4ex\smallampersand\kern-.4ex V}
\font\my="Linux Libertine O" at 36pt
\my\VandV
请注意,应使用徽标\kern
或在\hbox
构造周围使用,因为\hskip
引入了断点。
答案2
我的方法与@morbusg 类似:检查\fontname
。以下代码检索当前字体名称及其大小/缩放因子,然后修改后者并声明具有新大小的临时字体。字体在两个方向上缩放 1.2。因此,可以递归使用该宏来获得相对较大/较小的尺寸。字体操作是在组中完成的,以免累积计算错误。
\newcount\fontscale
\newdimen\fontsize
\def\discard#1\relax{}
\def\processfont#1 #2#3 #4 {%
\def\fname{#1}%
% Can't normally compare to 'at' here, because \fontname returns
% characters of catcode 12
\if a#2%
\fontsize=#4
\else
\fontscale=#4
\fi
\discard}
\def\scalefont#1#2#3{%
\begingroup
\edef\x{\fontname\font\space scaled 1000 \relax}%
\fontscale=0
\expandafter\processfont\x
\ifnum\fontscale=0
% We have the "at" syntax
\multiply\fontsize by #1
\divide\fontsize by #2
\font\tmpfont=\fname\space at \the\fontsize
\else
% We have the "scaled" syntax
\multiply\fontscale by #1
\divide\fontscale by #2
\font\tmpfont=\fname\space scaled \the\fontscale
\fi
\tmpfont #3%
\endgroup}
\def\smaller#1{\scalefont{5}{6}{#1}}
\def\bigger#1{\scalefont{6}{5}{#1}}
test \bigger{test \bigger{test \bigger{test}}}
test \smaller{test \smaller{test \smaller{test}}}
\bye
但是,这种方法无法使用不同的光学字体大小,而这正是实现最佳排版的关键。考虑光学尺寸需要基础设施,该基础设施需要知道所用特定字体的不同可用光学尺寸,就像 LaTeX 已经做到的那样。因此,您可能会使用 LaTeX 获得更好的结果,例如,relsize
包裹。
答案3
我有一个非常聪明的想法:使用的结果作为加载较小字体\fontname\font
的宏的输入。但不幸的是它有问题(我使用了普通的 XeTeX):\dimexpr
\font\test="Myriad Pro" at 16pt
\test
\def\smaller{%
\def\loadnewfont"##1" ##2 ##3\relax{%
\font\test="##1" at \the\dimexpr##3-1pt\relax\test}
\expandafter\loadnewfont\fontname\font\relax\&}
\fontname\font
\smaller \fontname\font \smaller \fontname\font
\smaller \fontname\font \smaller \fontname\font
\smaller \fontname\font % the size has vanished with the last call!?
\bye