我想在我的页面上放置一些元素,需要计算它们的大小。
举个例子,假设这三个元素\linewidth
并排放置时应该正好占据一个位置,中间没有空格。
最简单的方法可能是只给它们的宽度赋值为0.3\linewidth
-- 但这可能有点太小,导致某个地方出现间隙。不过也可以只使用0.3333333333333\linewidth
-- 但对于一个看似简单的分数来说,写起来太麻烦了 [而且它让我很纠结,因为它不是确切地三分之一]。
如果我想要获得三分之一的精确值,我可以使用
\newlength\onethirdlinewidth
\onethirdlinewidth=\linewidth
\divide\onethirdlinewidth by 3
如果我多次使用这个长度,这可能是最好的方法,但对于一次性使用来说,输入的内容可能有点多。
我的问题是:是否有简单的可能性来获得给定长度的三分之一(或八分之七)的长度?
答案1
我描述了 TeX 如何输入尺寸和处理单位https://tex.stackexchange.com/a/231281和为何pdf文件无法复制?也可能位于其他地方,其中包括一些不总是被阅读的评论。
我正在使用 Plain TeX,但它在 LaTeX 中的工作原理完全相同。
\newdimen\fixed
\fixed 1pt
\newdimen\testA
\newdimen\testB
\testA 0.33333587646484374\fixed
\testB 0.33333587646484375\fixed
\ifdim\testA = \testB
The two dimensions are equal
\else
The two dimensions are not equal
\fi
\bye
输出:
需要 17 位小数才能确保维度稳定(当然,在 5 位小数之后,可能只有 1sp 的差异,因为1/10^5 < 1/65536
,在此示例中,我们将 乘以1pt
)。有些事情是违反直觉的,例如0.33333
足够但0.22222
不够,尽管它看起来0.222222
比 更0.33333
接近0.333333
。
毋庸置疑,Knuth 已对其进行了精确编程,以便获取 17 位小数,而不是多一位,因为定理是它在此之后永远不会改变。
作为另一个随机示例考虑这个
\number\dimexpr 0.824440000pt\relax
\number\dimexpr 0.824440003pt\relax
\bye
产生
表明0.824440003
给出了与 不同的结果0.82444
。
我们也可以通过以下角色来证实这一点<factor>
:
\documentclass[a4paper]{article}
\usepackage{geometry}
\newlength{\mylength}
\begin{document}
\setlength{\mylength}{0.82444\linewidth}
\verb|0.82444\linewidth| gives \the\mylength.
\setlength{\mylength}{0.824440003\linewidth}
\verb|0.824440003\linewidth| gives \the\mylength.
These two things differ!
I hope this will dispel some misunderstandings\\
about ``five fractional digits suffice''. Wrong.
\end{document}
请注意,事实确实\linewidth
如此418.25368pt
0.000000003\linewidth
0.00000125476104pt
远低于 TeX“错误”。
差异被放大了一个大于5000!
根据实际问题,以下是我的评论
the most precise way to multiply by a fraction is \dimexpr\numexpr A*<dimen>/B sp\relax (where <dimen> is like \linewidth but not 10pt then use \dimexpr10pt\relax in place of <dimen>)