在 \dimexpr 中使用幂

在 \dimexpr 中使用幂

代码

\documentclass{memoir}

\begin{document}
\fontsize{\dimexpr 1.2^{3} 10pt}{\dimexpr 1.2^{3} 10pt}\selectfont Hello TeXworld.
\end{document}

不起作用。为什么?

编辑:我需要一个支持所有积分的解决方案(包括消极的) 指数。

答案1

e-TeX\dimexpr仅允许表达式中的项范围非常有限。特别是,您只能将维度乘以整数值

\dimexpr 10pt * 5\relax
\dimexpr 10pt * (5 * 5)\relax

请注意,这里的维度是第一位的。与 TeX 寄存器的情况一样,你可以将 a 乘以\dimexpr一个实数,只需将其放在表达式之前即可

1.2\dimexpr 10pt * 5 \relax

因此,对于您的情况,您将需要一系列表达式,每个表达式乘以 1.2,或者预先计算因子

\dimexpr1.2\dimexpr1.2\dimexpr1.2\dimexpr 10pt \relax\relax\relax\relax
\dimexpr 1.728\dimexpr 10pt\relax

另一种方法是使用expl3FPU 进行浮点运算,例如

\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \fpeval \fp_eval:n
\cs_new_eq:NN \fptodim \fp_to_dim:n 
\ExplSyntaxOff

然后是

\dimexpr\fpeval{1.2^(3)}\dimexpr 10pt\relax
\dimexpr\fptodim{1.2^(3) * 10}\relax

后者利用了浮点数到 dimen 的转换以点为单位的事实。请注意,此方法支持负指数:

\the\dimexpr\fpeval{1.2^(-3)}\dimexpr 10pt\relax % => 5.78703pt
\the\dimexpr\fptodim{1.2^(-3) * 10}\relax        % => 5.78703pt

答案2

您需要将权力编码为宏,但一个简单的递归循环就可以解决问题

+ 了

===: \dimexpr 1.2\dimexpr 1.2\dimexpr 1.2\dimexpr 10pt\relax \relax \relax \relax 
===: 17.27985pt

-ve

===: \dimexpr \dimexpr (\dimexpr (\dimexpr (10pt * 100)/120 \relax  * 100)/120 
\relax  * 100)/120 \relax \relax 
===: 5.78703pt

日志输出来自

\documentclass{memoir}

\def\powerfactor#1#2#3{%
\ifnum#2=0
\dimexpr#3\expandafter\relax
\else
\afterfi
\powerfactor{#1}{\numexpr#2-1\relax}{#1\dimexpr#3\relax}%
\fi}
\def\afterfi#1\fi{\fi#1}

\def\negpowerfactor#1#2#3{%
\ifnum#2=0
\dimexpr#3\expandafter\relax
\else
\afterfi
\negpowerfactor{#1}{\numexpr#2-1\relax}{\dimexpr(#3 * 100)/\twodp#100.{}{}! \relax}%
\fi}
\def\twodp#1.#2#3#4!{#1#2#3}

\typeout{===: \powerfactor{1.2}{3}{10pt}}
\typeout{===: \the\powerfactor{1.2}{3}{10pt}}
\typeout{===: \negpowerfactor{1.2}{3}{10pt}}
\typeout{===: \the\negpowerfactor{1.2}{3}{10pt}}

\begin{document}

{\fontsize{\powerfactor{1.2}{3}{10pt}}{\powerfactor{1.2}{3}{10pt}}\selectfont Hello TeXworld.\par}

{\fontsize{\negpowerfactor{1.2}{3}{10pt}}{\powerfactor{1.2}{3}{10pt}}\selectfont Hello TeXworld.\par}

\end{document}

相关内容