![\def、数学和运算顺序,扩展?](https://linux22.com/image/478913/%5Cdef%E3%80%81%E6%95%B0%E5%AD%A6%E5%92%8C%E8%BF%90%E7%AE%97%E9%A1%BA%E5%BA%8F%EF%BC%8C%E6%89%A9%E5%B1%95%EF%BC%9F.png)
我有一个看似简单的任务但我似乎无法让它发挥作用。
采取以下措施:
\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.21in
TeX 会进行扩展,这不是你想要的。它很接近,但只是偶然。
如果你尝试
\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\varlength
0.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