加法和宏参数的问题

加法和宏参数的问题

我需要使用这样的公式:

y = 1.8pt * x + 1.5pt

在宏中,其中x是标量宏参数。我的想法是:

\kern \advance #1\dimexpr1.8pt\relax by \dimexpr1.5pt\relax

这实际上不起作用,\advance命令的格式似乎错误。

答案1

\kern要求<dimen>在其后跟一个 ;它也可以是,通过删除和部分<skip>将其强制转换为。<dimen>plusminus

<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}

相关内容