我需要使用这样的公式:
y = 1.8pt * x + 1.5pt
在宏中,其中x
是标量宏参数。我的想法是:
\kern \advance #1\dimexpr1.8pt\relax by \dimexpr1.5pt\relax
这实际上不起作用,\advance
命令的格式似乎错误。
答案1
\kern
要求<dimen>
在其后跟一个 ;它也可以是,通过删除和部分<skip>
将其强制转换为。<dimen>
plus
minus
<dimen>
根据 TeXbook, 基本上是一个内部 dimen 寄存器(例如,\parindent
或\dimen2
用 定义的任何控制序列\newdimen
)或一个明确的规范<decimal number><unit of measure>
(我将略过更精细的细节)。
也是<factor><dimen register>
允许的。这\kern 0.5\parindent
也是合法的规范。
您不能\kern
按照指令来获取长度,因此诸如此类的赋值指令\advance
是非法的。
然而,e-TeX 引入了一种新的可能性:a<dimen>
也可以是用 计算的表达式\dimexpr
。语法得到扩展,因此\dimexpr<dimen expression>
可以替换上述规则中的内部维度。
因此\kern 0.3\dimexpr 1.7pt+\baselineskip\relax
(只是一个愚蠢的例子)在使用 e-TeX 时是合法的,在所有现代 TeX 发行版中运行 (pdf)LaTeX、XeLaTeX 或 LuaLaTeX 时都是这种情况。
\dimexpr
调用可以嵌套;\relax
末尾的 是可选的,标记表达式的结束,这样 TeX 在找到属于当前表达式的术语时就不会继续搜索\relax
(将会消失)。
因此你正在寻找
\kern \dimexpr 1.5pt + #1\dimexpr 1.8pt\relax\relax
另一种方法\dimexpr
是
\dimen0=1.8pt
\dimen0=#1\dimen0
\advance\dimen0 by 1.5pt
\kern\dimen0
使用临时寄存器\dimen0
,或者使用“官方” LaTeX 命令\setlength
和\addtolength
。对于这样的计算,不需要分配新的寄存器,但这也没什么坏处。
这两种方法有什么区别?方法\dimexpr
当然更灵活;但要记住,除法会截断\divide
,而\dimexpr(dimen expression)/<integer>\relax
四舍五入。这可能是某些计算中的一个因素(但这在 中更相关\numexpr
,因为维度实际上是缩放点的整数倍,因此四舍五入发生在缩放点级别)。事实上,e-TeX 提供了\numexpr
、\dimexpr
和\glueexpr
来\muexpr
对数字、维度、胶水和 muglue 进行操作。
顺便一提,\advance
必须后面跟着一个内部寄存器名称(\count
、\dimen
或类型),所以对于 e-TeX 来说也是非法的,\skip
因为它会拒绝\muskip
\advance\dimexpr...
! You can't use `\dimexpr' after \advance.
答案2
以下工作:
\kern \dimexpr 1.5pt + #1\dimexpr 1.8pt\relax\relax
答案3
老套:
\setlength(\y}{1.8pt}
\setlength{\y}{#1\y}
\addtolength{\y}{1.5pt}