\def、数学和运算顺序,扩展?

\def、数学和运算顺序,扩展?

我有一个看似简单的任务但我似乎无法让它发挥作用。

采取以下措施:

\def\varlength{1in}%has units
\def\varscalar{0.2}%does not have units

\raisebox{\varscalar\varlength}[0pt][0pt]{hello}%

一切正常。但是这个不行。请注意以下变化\varscalar

\def\varlength{1in}%has units
\def\varscalar{{1-0.8}}%does not have units

\raisebox{\varscalar\varlength}[0pt][0pt]{hello}%

我不明白为什么在和相乘之前额外的{}不强制评估。1-0.8\varscalar\varlength

我需要确保1-0.8在乘法之前发生,或者更好的是,在扩展之前发生\varscalar。我认为第二个选项更高效、更好。


忘记了 MWE

\documentclass[12pt]{article}


\begin{document}


\def\varlength{1in}%has units
\def\varscalar{0.2}%does not have units

hi
\raisebox{\varscalar\varlength}[0pt][0pt]{hello}%


\end{document}

答案1

您需要以某种方式解析/评估传递给的表达式\varscalar。有很多可能的方法,例如

\documentclass{article}
\usepackage{xfp}
\newlength\varlength
\begin{document}
\varlength=1in%has units
\def\varscalar{\fpeval{1-0.8}}%does not have units

\raisebox{\the\dimexpr\varscalar\varlength+\varscalar\varlength}[0pt][0pt]{hello}%
\end{document}

\the\dimexpr这里不需要,但它可以让你添加线性组合,例如

\raisebox{\the\dimexpr\varscalar\varlength+\varscalar\varlength}[0pt][0pt]{hello}%

这个答案已更新,包括制作\varlength长度以下是 David Carlisle 的回答我对这个问题的看法是回答

我不明白为什么额外的 {} 不强制 1-0.8 进行评估

而不是宏不是一个维度的事实(我可能错误地认为这是显而易见的)。

答案2

使用你的代码,0.21inTeX 会进行扩展,这不是你想要的。它很接近,但只是偶然。

如果你尝试

\def\varlength{1in}
\def\varscalar{2}

提升的量将是 21 英寸。TeX 只是扩展了标记。

你可以这样做

\documentclass[12pt]{article}

\begin{document}

\def\varlength{1in}%has units
\def\varscalar{0.2}%does not have units

hi
\raisebox{\varscalar\dimexpr\varlength\relax}[0pt][0pt]{hello}

\the\dimexpr\varlength\relax

\the\dimexpr\varscalar\dimexpr\varlength\relax

\end{document}

因此\varlength被放入一个未命名的维度寄存器中,扩展将是

\raisebox{0.2\dimexpr1in\relax}

那就是你想要的。

对于浮点数运算,将其与已经建议的结合起来,即\fpeval

答案3

你说这很好

   \def\varlength{1in}%has units
   \def\varscalar{0.2}%does not have unit

   \raisebox{\varscalar\varlength}[0pt][0pt]{hello}%

但是从名称来看,我希望您想要 0.2in 作为有效长度,但宏只是扩展,没有发生乘法,所以您得到的0.21in长度恰好是合法的,但如果原始长度是这样的,0.5in那么\varscalar\varlength就会0.20.5in出现语法错误。

你应该拥有的是

\newlength\varlength
\setlength\varlength{1in}

那么 \varscalar\varlength就是。0.2\varlength0.2in

不清楚你对

\def\varscalar{{1-0.8}}

因为它无论你给出什么定义都行不通\varlength

如果\varlength是宏,则\varscalar\varlength扩展为{1-0.8}1in 不合法的长度,

如果\varlength是长度寄存器,则 \varscalar\varlength扩展为,{1-0.8}\varlength 这又是语法错误。

也许声明\varlength为寄存器然后使用\dimexpr\varlength - 0.8\varlength\relax

相关内容