计算浮点值来缩放长度

计算浮点值来缩放长度

作为背景,我试图编写一个宏,该宏仅给出十进制比例因子,即可将页面划分为列。例如,给定输入 .7,它应该创建宽度为 .7*\textwidth 和 .3*\textwidth 的列。基本上,我想计算(1-#1)*\textwidth

似乎无法将浮点值与 \numexpr 和 \dimexpr 一起使用,例如\dimexpr\textwidth*(1-#1)\dimexpr\numexpr(1-#1)\textwidth。在这种情况下,有一种解决方法,即\dimexpr\textwidth-#1\textwidth。但很容易看出,这对于更复杂的计算不起作用。

有没有办法只使用 (e)(La)TeX 功能来实现这一点?如果没有,最佳替代方案是什么?LaTeX 中的浮点计算?提供了一些用于浮点计算的包,但不处理长度。

答案1

这只是导入几个 expl3 内核命令的问题。

\documentclass{article}

\ExplSyntaxOn
\ProvideExpandableDocumentCommand{\fpeval}{m}{\fp_eval:n{#1}}
\ProvideExpandableDocumentCommand{\dimeval}{m}{\dim_eval:n{#1}}
\ExplSyntaxOff

\newlength{\testlena} % for testing
\newlength{\testlenb} % for testing

\newcommand{\process}[1]{%
  \setlength{\testlena}{\fpeval{#1}\textwidth}%
  \setlength{\testlenb}{\fpeval{1-#1}\textwidth}%
}

\begin{document}

\process{0.7}
\the\testlena\ --- \the\testlenb

\process{0.5}
\the\testlena\ --- \the\testlenb

\process{2^(-3)}
\the\testlena\ --- \the\testlenb

\setlength{\testlena}{\dimeval{(\textwidth+\textheight)/2}}
\the\testlena

\end{document}

对于您的应用程序,您只需要\fpeval,但我还展示了一个示例\dimeval

在此处输入图片描述

答案2

当我写这个问题时,我发现至少一个使用该包的可能解决方案xintexpr

\xinttheexpr(1-#1)\relax\textwidth

\relax需要终止,\xinttheexpr即使在这种情况下不需要\numexpr。我不明白为什么\xinttheexpr必须使用而不是更简单的\xintexpr

相关内容