显式算术函数作为计算的替代

显式算术函数作为计算的替代

有没有办法使用尊重维度的显式函数执行编译时算术?以下是算术函数的稻草人示例:

\mul{4}{7}            % expands to 28
\mul{4}{6pt}          % expands to 24pt
\mul{0.3}{\linewidth} % expand into some kind of anonymous length-like value
                      %   storing 0.3 * the current value of \linewidth.
\add{0.3pt}{0.2pt}    % expands to 0.5pt

例如,以下文档使用带宽度的标量乘法:

% !TEX TS-program = lualatex

% \usepackage{lipsum}

\documentclass{article}

\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{TimesNewRoman}
\setsansfont[Ligatures=TeX]{Arial}

\begin{document}

\hspace*{0.5 \linewidth}

\begin{minipage}{0.4 \linewidth}
The quick brown fox jumped
over the lazy dog
\end{minipage}


\end{document}

这种表示法0.4 \linewidth方便易读,但不可组合。例如,使用\begin{minipage}{0.4 {0.8 \linewidth}}会产生错误:

! Illegal unit of measure (pt inserted).
<to be read again> 
{
l.15 \begin{minipage}{0.4 {0.8 \linewidth}}

使用也不\usepackage{calc}会使0.4 {0.8 \linewidth}构造有效。

有没有办法明确地执行算术运算?

注意:这个问题不同于这个因为它要求最多明确的执行算术的方式,而不是最方便的

答案1

您可以用它xfp来进行浮点运算。

\documentclass{article}
\usepackage{xfp}

\begin{document}

\noindent
X\hspace*{0.5 \linewidth}X

\noindent
X\hspace*{\fpeval{0.3*0.5}\linewidth}X

\noindent
X\hspace*{\fpeval{(sin(3))^2+(cos(3))^2}\linewidth}X

\noindent
\begin{minipage}[t]{\fpeval{0.4*0.8}\linewidth}
The quick brown fox jumped
over the lazy dog
\end{minipage}

\noindent\rule{0.32\linewidth}{0.4pt}

\noindent\rule{\fpeval{0.4*0.8}\linewidth}{0.4pt}

\end{document}

在此处输入图片描述

您可以使用相当复杂的表达式(上面的那个当然是 1)。

您甚至可以将calc语法与此混合使用,只要它是可以接受的\usepackage{calc}

\setlength{\foo}{\fpeval{sqrt(2)}\linewidth-45pt}

\foo如果是长度参数则有效。

答案2

TeX 中没有“编译时间”,因为它不是编译器,没有独立于执行的编译阶段,但是假设你使用 etex,你就有可用的内联算术表达式

  \begin{minipage}{0.4 \dimexpr 0.8 \linewidth\relax}

或者

   \setcounter{section}{\numexpr 4 * 7\relax}

相关内容