我有一个sty
包含命令的文件
\newcommand{\foo}[1]{\noindent\kern#1}
但我其实想要的是
\newcommand{\foo}[1]{\noindent\kern{#1 *0.5}}
意思是我希望将用户输入的命令的一半距离传递\foo
给\kern
。这显然行不通。
你对于如何做到这一点有什么建议吗?
(您可能会问“你到底为什么要这么做?”。公平地说。我正在使用其他人的生成 tex 文件的程序,我无法控制命令中出现的值\foo
。我只知道我想要该程序选择的一半。)
答案1
使用 eTeX 原语\dimexpr
来允许像维度寄存器之前的因子:
\newcommand{\foo}[1]{\noindent\kern .5\dimexpr#1\relax}
请注意,\dimexpr
吞噬了\relax
并且还允许在内部进行一些算术运算。请参阅etex_manual 了解更多详情。
答案2
TeX 内置了维度乘法功能。因此你可以这样做:
\makeatletter
\newcommand{\foo}[1]{%
\dimen@ #1
\kern 0.5\dimen@%
}
\makeatother
\begin{document}
a\foo{72pt}b
a\kern 72pt b
\end{document}
\dimen@
是按惯例临时使用的尺寸寄存器。宏\foo
将保存#1
在此寄存器中,然后将字距调整一半。
答案3
除了其他答案中描述的低级支持外,您可能会发现calc 包有用,具体取决于您到底想做什么。