如何除以两个长度并得出一个长度?
\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-1
TeX 对数字的限制。最后我们使用明确的单位转换回尺寸
sp
。
相关说明:
图形包内部有一些宏来划分维度,
在我的另一个答案中,我将尝试找到一个 TeX 宏(不可扩展),它不使用 e-TeX 进行这种除法,并且精度高于图形版本。
有关的:
看https://tex.stackexchange.com/a/328894/4686,特别\divdef
是来自 D 部分的宏,用于非 eTeX 宏可靠地划分长度并产生结果作为具有 4 或 5 位小数(小数点后)的定点数。
这没有使用任何额外的包。