有没有办法使用尊重维度的显式函数执行编译时算术?以下是算术函数的稻草人示例:
\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}