如何为字体大小创建新命令?

如何为字体大小创建新命令?

我正在尝试创建一个命令来用一个参数修改字体大小,但似乎参数没有正确扩展:

\newcommand{\mycfs}[1]{\fontsize{#1pt}{1.2*#1pt}}

答案1

如果使用因子,请省略 *。此外,引入一个可以相乘的长度宏。如果需要,请添加\selectfont以使其有效:

\newlength{\mysize}
\newcommand{\mycfs}[1]{\setlength{\mysize}{#1pt}%
  \fontsize{\mysize}{1.2\mysize}\selectfont}

答案2

这是可行的,使用 e-TeX 功能来动态计算基线跳过:

\newcommand{\mycfs}[1]{\fontsize{#1pt}{\dimexpr 1.2pt*#1pt\relax}}

或者这个解决方案,不使用 e-TeX,而是使用中间维度寄存器,因此稍微复杂一些:

\newdimen\mycfsdim
\newcommand{\mycfs}[1]{\mycfsdim=#1pt \mycfsdim=1.2\mycfsdim 
                       \fontsize{#1pt}{\the\mycfsdim}\selectfont}

答案3

首先:一般不建议随意调整字体大小。当然,你也需要一个可缩放的字体,否则将选择下一个合适的字体。

用法1.2*#1pt一般不起作用。您可以使用它1.2\somedimension来计算乘法。

\newlength{\mylength}
\makeatletter
\newcommand{\mycfs}[1]{%
  \setlength{\mylength}{#1pt}%
  \setlength{\mylength}{1.2\mylength}%
  \fontsize{#1}{\mylength}%
  \selectfont
}
\makeatother

但是,一些(但不是全部)字体大小宏(\normalsize\small\footnotesize)也会更改其他设置,例如\abovedisplayskip\belowdisplayskip和。为了获得一致的行为,最好在更改为您的字体大小之前切换到已知的字体大小,例如在宏代码的前面添加。如果您知道如何操作,您也可以自己调整上述参数;我的意思是正确地操作。\abovedisplayshortskip\belowdisplayshortskip\normalsize

所有字体大小宏也会将自身存储到 中\@currsize,例如\small包括\let\@currsize\small,但前提是\ifx \protect \@typeset@protect。这是通过调用 来完成的,\@setfontsize但这对于您的情况不可用。但是,可以手动添加:

\newlength{\mylength}
\makeatletter
\newcommand{\mycfs}[1]{%
  \normalsize
  \ifx\protect\@typeset@protect
     \def\@currsize{\mycfs{#1}}%
  \fi
  \setlength{\mylength}{#1pt}%
  \setlength{\mylength}{1.2\mylength}%
  \fontsize{#1}{\mylength}%
  \selectfont
}
\makeatother

您可以进一步改进这一点,通过使用 LaTeX 允许输入为 pt 或任何长度的数字\@defaultunits(因为它本身就是完成的\fontsize):

\newlength{\mylength}
\makeatletter
\newcommand{\mycfs}[1]{%
  \normalsize
  \@defaultunits\mylength=#1pt\relax\@nnil
  \edef\@tempa{{\strip@pt\mylength}}%
  \ifx\protect\@typeset@protect
     \edef\@currsize{\noexpand\mycfs\@tempa}% store calculated size
  \fi
  \mylength=1.2\mylength
  \edef\@tempa{\@tempa{\strip@pt\mylength}}%
  \@tempa
  \expandafter\fontsize\@tempa
  \selectfont
}
\makeatother

相关内容