在 LaTeX 源代码中使用距离值进行数学运算

在 LaTeX 源代码中使用距离值进行数学运算

我有一个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 包有用,具体取决于您到底想做什么。

相关内容