我对舍入有疑问---我已经看到如何让 \pgfmathparse 创建四舍五入到小数点后一位的值?但我仍然无法获得我需要的结果。
请参阅此 MWE:
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pgf}
\usepackage{calc}
\usepackage{lmodern}
\usepackage{venturis}
\usepackage{librebaskerville}
\newlength\caph\newlength\xlen%
\newcommand*{\prlen}[1]{%
% round to 1 digit:
\pgfmathparse{round(10*#1)/10.0}%
\pgfkeys{/pgf/number format/precision=1}
\pgfmathresult
% \pgfmathprintnumber[fixed, precision=1]{\pgfmathresult}
}
%
\newcommand{\showlengths}{%
\setlength{\caph}{\heightof{A}}%
\setlength{\xlen}{1ex}%
{\ttfamily
Caph: \prlen{\caph} \the\caph \par
X-He: \prlen{\xlen} \the\xlen \par
\medskip
}
}
\begin{document}
\librebaskerville\fontsize{100pt}{120pt}\selectfont
\showlengths
\fontfamily{yvtj}\fontsize{100pt}{120pt}\selectfont
\showlengths
\fontfamily{yvtd}\fontsize{100pt}{120pt}\selectfont
\showlengths
\fontfamily{lmr}\fontsize{100pt}{120pt}\selectfont
\showlengths
\end{document}
结果是:
...有时你会发现十除法的精度损失让我很头疼。如果我将 的定义改为\prlen
使用\pgfmathprintnumber
,如下所示:
\newcommand*{\prlen}[1]{%
% round to 1 digit:
\pgfmathparse{round(10*#1)/10.0}%
%\pgfkeys{/pgf/number format/precision=1}
%\pgfmathresult
\pgfmathprintnumber[fixed, precision=1]{\pgfmathresult}
}
我有这个,它用数学字体打印东西:
有没有办法进行正确的舍入,但使用我在外面使用的正常字体,就像第一种情况一样?
答案1
宏\pgfmathprintnumber
为此使用数学模式。
我建议改变的定义\prlen
:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\prlen}{m}
{
\fp_eval:n { round(\dim_to_fp:n { #1 }, 1) }
}
\ExplSyntaxOff
如果你想要一位小数,即使是零,你也可以这样做
\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand{\prlen}{m}{%
\num[
detect-all,
round-integer-to-decimal,
round-mode=places,
round-precision=1,
]{\fp_eval:n { \dim_to_fp:n #1 }}
}
\ExplSyntaxOff