混合字体书写中的字体缩放

混合字体书写中的字体缩放

如何放大/缩小字体大小,以便它与同一行上的其他字体混合时看起来一致?

作为一个具体的例子,如何将以下代码片段中的第一个“a”缩小到第二个和第三个的大小?

不同大小的字符

\documentclass[12pt]{article}
\pagestyle{empty}

\newcommand\pagmsl{\usefont{\encodingdefault}{pag}{m}{sl}}
\newcommand\pbklit{\usefont{\encodingdefault}{pbk}{l}{it}}
\newcommand\bchmit{\usefont{\encodingdefault}{bch}{m}{it}}

\begin{document}

\pagmsl a
\pbklit a
\bchmit  a

\end{document}

答案1

强制字体选择方案,您可以定义一个命令\definesamplefont,该命令根据主字体 x 高度定义一个全新的字体系列。您可以使用新定义的字体开关排版段落。

\documentclass[12pt]{article}
\pagestyle{empty}

\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \compute \fp_eval:n
\ExplSyntaxOff

\makeatletter
\newcommand{\definesamplefont}[4]{%
  \sbox0{\normalfont a}%
  \sbox2{\normalfont\usefont{\encodingdefault}{#2}{#3}{#4}a%
         \xdef\@temp{\fontname\font\space}}%
  \begingroup\edef\x{\endgroup
    \noexpand\DeclareFontFamily{\encodingdefault}{#1}{}
    \noexpand\DeclareFontShape{\encodingdefault}{#1}{X}{X}
     { <-> [\compute{\strip@pt\ht0/\strip@pt\ht2}] \expandafter\xget@name\@temp\@nil }{}
  }\x
 \@namedef{#1}{\usefont{\encodingdefault}{#1}{X}{X}}
}
\def\xget@name#1 #2\@nil{#1}
\makeatother
\definesamplefont{pagmsl}{pag}{m}{sl}
\definesamplefont{pbklit}{pbk}{l}{it}
\definesamplefont{bchmit}{bch}{m}{it}

\begin{document}

\pagmsl a
\pbklit a
\bchmit a

\end{document}

在此处输入图片描述

获取所需比例的另一种方法是使用包fp。以下是此案例的完整示例:

\documentclass[12pt]{article}
\pagestyle{empty}

\usepackage{fp}

\makeatletter
\newcommand{\definesamplefont}[4]{%
  \sbox0{\normalfont a}%
  \sbox2{\normalfont\usefont{\encodingdefault}{#2}{#3}{#4}a%
         \xdef\@temp{\fontname\font\space}}%
  \FPdiv\computed@ratio{\number\ht0}{\number\ht2}%
  \begingroup\edef\x{\endgroup
    \noexpand\DeclareFontFamily{\encodingdefault}{#1}{}
    \noexpand\DeclareFontShape{\encodingdefault}{#1}{X}{X}
     { <-> [\computed@ratio] \expandafter\xget@name\@temp\@nil }{}
  }\x
 \@namedef{#1}{\usefont{\encodingdefault}{#1}{X}{X}}
}
\def\xget@name#1 #2\@nil{#1}
\makeatother
\definesamplefont{pagmsl}{pag}{m}{sl}
\definesamplefont{pbklit}{pbk}{l}{it}
\definesamplefont{bchmit}{bch}{m}{it}

\begin{document}
a
\pagmsl a
\pbklit a
\bchmit a

\end{document}

同一代码的完整 expl3 实现。

\documentclass[12pt]{article}
\pagestyle{empty}

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definesamplefont}{mmmm}
 {
  \calaf_define_sample_font:nnnn { #1 } { #2 } { #3 } { #4 }
 }

\box_new:N \l__calaf_normal_ht_box
\hbox_set:Nn \l__calaf_normal_ht_box {\normalfont a}
\box_new:N \l__calaf_new_ht_box
\tl_new:N \g__calaf_fontname_tl
\seq_new:N \l__calaf_fontname_seq
\fp_new:N \l__calaf_ratio_fp

\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }

\cs_new_protected:Npn \calaf_define_sample_font:nnnn #1 #2 #3 #4
 {
  \hbox_set:Nn \l__calaf_new_ht_box
   {
    \normalfont\usefont{\encodingdefault}{#2}{#3}{#4} a
    \seq_set_split:Nnx \l__calaf_fontname_seq { ~ } { \fontname\font \c_space_tl }
    \seq_pop_left:NN \l__calaf_fontname_seq \l_tmpa_tl
    \tl_gset_eq:NN \g__calaf_fontname_tl \l_tmpa_tl
   }
  \fp_set:Nn \l__calaf_ratio_fp
   {
    \dim_to_fp:n { \box_ht:N \l__calaf_normal_ht_box}
    /
    \dim_to_fp:n {\box_ht:N \l__calaf_new_ht_box }
   }
  \use:x
   {
    \exp_not:N \DeclareFontFamily {\encodingdefault} {#1} {}
    \exp_not:N \DeclareFontShape  {\encodingdefault} {#1} {X} {X}
     { <-> [ \fp_use:N \l__calaf_ratio_fp ] \g__calaf_fontname_tl } {}
   }
  \cs_new:cpn { #1 } {  \usefont{\encodingdefault}{#1}{X}{X} }
 }

\ExplSyntaxOff
\definesamplefont{pagmsl}{pag}{m}{sl}
\definesamplefont{pbklit}{pbk}{l}{it}
\definesamplefont{bchmit}{bch}{m}{it}

\begin{document}

\pagmsl a
\pbklit a
\bchmit a

\end{document}

答案2

就垂直高度而言,您可以在长度中存储一些固定高度,并将元素缩放到文档其他位置的该高度。

下面我习惯于\resizebox{!}{\fixedheight}{<stuff>}调整<stuff>高度\fixedheight(无论它是多少;a在我下面的例子中是 Computer Modern):

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{graphicx}% http://ctan.org/pkg/graphicx
\pagestyle{empty}

\newcommand\pagmsl{\usefont{\encodingdefault}{pag}{m}{sl}}
\newcommand\pbklit{\usefont{\encodingdefault}{pbk}{l}{it}}
\newcommand\bchmit{\usefont{\encodingdefault}{bch}{m}{it}}

\begin{document}

\newlength{\fixedheight}\settoheight{\fixedheight}{a}

\fbox{%
  a
  {\pagmsl a}
  {\pbklit a}
  {\bchmit a}%
}

\fbox{%
  a
  \resizebox{!}{\fixedheight}{\pagmsl a}
  \resizebox{!}{\fixedheight}{\pbklit a}
  \resizebox{!}{\fixedheight}{\bchmit a}%
}
\end{document}

当然,这里的警告是,您不会喜欢这种方法的换行。但是,您的示例仅列出了字符。此外,缩放后您会丢失某些尺寸。

scalerel提供类似的功能。

相关内容