除以两个长度

除以两个长度

如何除以两个长度并得出一个长度?

\documentclass{article}
\newlength\A
\newlength\B
\newlength\C
\setlength\A{10pt}
\setlength\B{5pt}
\setlength\C{\dimexpr\A/\B\relax}
\begin{document}
\the\C
\end{document}

结果是0.00003pt,而我希望结果是 10/5=2 分

答案1

您不能用一个维度除以另一个维度,然后得到一个维度:单位会取消。您需要将两者的比率乘以分子。例如

\documentclass{article}
\usepackage{calc}
\newlength\A
\newlength\B
\newlength\C
\setlength\A{10pt}
\setlength\B{5pt}
\setlength\C{\A*\ratio{\A}{\B}}
\begin{document}
\the\C
\end{document}

取比率并乘以\A,而

\documentclass{article}
\usepackage{calc}
\newlength\A
\newlength\B
\newlength\C
\setlength\A{10pt}
\setlength\B{5pt}
\setlength\C{1pt * \ratio{\A}{\B} }
\begin{document}
\the\C
\end{document}

给出“长度比率”(不太确定是否有意义,但这是问题所要求的!)。

答案2

您不需要calc包:

\documentclass{article}
\newlength\A
\newlength\B
\newlength\C
\setlength\A{10pt}
\setlength\B{5pt}
\setlength\C{\dimexpr \numexpr \A * \A / \B \relax sp\relax}
\begin{document}
\the\C
\end{document}

生产20.0pt

为了清晰起见,我添加了\relax,它们终止表达式并被吞没。根据\setlength编码方式(未检查),第二个可能是多余的。第一个是多余的,因为字母s终止了\numexpr而没有错误。

解释:

  • 维度内的\numexpr数值被转换为整数,以“缩放点数”表示其值(1sp = 1/65536pt)。这实际上是 TeX 内部的长度表示(或者说是\dimen长度的一部分,丢弃粘合成分;LaTeX 长度实际上是跳过)。

  • 在里面,\numexpr你可以用临时的双精度执行所谓的“缩放”操作,即(u times v) divided by w。第一个操作不会引起溢出,即使中间乘积超出了2^31-1TeX 对数字的限制。

  • 最后我们使用明确的单位转换回尺寸sp

相关说明:

  • 图形包内部有一些宏来划分维度,

  • 在我的另一个答案中,我将尝试找到一个 TeX 宏(不可扩展),它不使用 e-TeX 进行这种除法,并且精度高于图形版本。

有关的:

https://tex.stackexchange.com/a/328894/4686,特别\divdef是来自 D 部分的宏,用于非 eTeX 宏可靠地划分长度并产生结果作为具有 4 或 5 位小数(小数点后)的定点数。

这没有使用任何额外的包。

相关内容