根据当前字体大小更改部分中的字体大小

根据当前字体大小更改部分中的字体大小

这个答案展示如何使用 获取当前字体大小\makeatletter\f@size\makeatother

这个答案展示如何在打印之前解析和评估数学表达式,例如使用\pgfmathparse{sin(60)}\pgfmathresult

现在我想将两者结合起来,并将某个部分的字体大小设置为比当前字体大小小 1pt。这是我目前所做的:

\documentclass[11pt]{article}
\usepackage{pgf}

\begin{document}
Before
\makeatletter\fontsize{\pgfmathparse{\f@size - 1}\pgfmathresult pt}{10pt}\selectfont\makeatother
After
\end{document}

我尝试将\makeatletter和放置\makeatother在不同的位置(因为我真的不明白它们是如何工作的)但总是出现错误Missing number, treated as zero

欢迎任何帮助!

PS:我找到了包裹缩放,它可以满足我的要求,但我仍然想了解为什么我写的东西不起作用。

答案1

这是为了解释为什么你的方法不起作用,而不是提倡这是减小字体大小的最佳方法。它不起作用是因为\fontsize它需要一个数字,而且\pgfmathparse妨碍了“它的工作”。解决方案很简单,只需\pgfmathparse{...}向前移动即可。

\documentclass[11pt]{article}
\usepackage{pgf}

\begin{document}
Before
\makeatletter\pgfmathparse{\f@size - 1}\fontsize{\pgfmathresult pt}{10pt}\selectfont\makeatother
After
\end{document}

答案2

正如另一个答案所解释的那样,\pgfmathparse不能在的参数中\fontsize,它需要直接扩展为十进制数的东西(隐含点单位)。

这里有一个实现,它还允许通过添加另一个可选参数(在括号中)将基线跳过集的模型更改为字体大小的 1.2 倍。括号中的可选参数的默认值为 1(将从当前大小中减去)。

\documentclass{article}
\usepackage{ebgaramond} % fully scalable font
\usepackage{xparse}

\ExplSyntaxOn

% make an expl3 equivalent available
\cs_new_eq:NN \optical_fontsize:nn \fontsize
\cs_generate_variant:Nn \optical_fontsize:nn { ee }

\NewDocumentCommand{\changesize}{O{1}D(){1.2}}
 {
  \optical_fontsize:ee
   { \fp_eval:n { \use:c { f@size } - #1 } }
   { \fp_eval:n { ( \use:c { f@size } - #1 ) * ( #2 ) } }
  \selectfont
 }

\ExplSyntaxOff

% for testing
\makeatletter
\newcommand{\printsize}{\f@size/\f@baselineskip}
\makeatother

\begin{document}

Standard size \printsize

\changesize One point less \printsize

\changesize[3] Three point less \printsize

\changesize[-4] Standard size \printsize

\changesize[-10](1.1) Bigger size, but let's also check the baseline skip \printsize

\end{document}

需要采用将两个参数首先扩展为的间接方法\fontsize,因为当 LaTeX 评估第二个参数时,\fontsize它已经设置了\f@size

在此处输入图片描述

相关内容