长度的精确分数

长度的精确分数

我想在我的页面上放置一些元素,需要计算它们的大小。

举个例子,假设这三个元素\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.25368pt0.000000003\linewidth0.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>) 

相关内容