作为背景,我试图编写一个宏,该宏仅给出十进制比例因子,即可将页面划分为列。例如,给定输入 .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
。