这个答案展示如何使用 获取当前字体大小\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
。