为什么10bp的图片环境不是10bp?

为什么10bp的图片环境不是10bp?

例子:

\documentclass{article}
\begin{document}

\newlength{\picwidth}

\setlength{\unitlength}{1bp}
\settowidth{\picwidth}{\begin{picture}(10,10)\end{picture}}
\typeout{width: \the\picwidth}

\settowidth{\picwidth}{\rule{10bp}{0pt}}
\typeout{width: \the\picwidth}

\end{document}

日志中输出:

width: 10.03738pt
width: 10.03749pt

我希望这两条线是相同的。

答案1

这是由于舍入误差造成的。如果将长度转换为整数,则可以清楚地看到这一点,这显示了 TeX 核心实际存储的内容:

\documentclass{article}
\begin{document}

\newlength\lena
\newlength\lenb
\newlength\lenc

\setlength{\lena}{1bp}     % 1bp
\setlength{\lenb}{10\lena} % 10*1bp
\setlength{\lenc}{10bp}    % 10bp

\typeout{a: \the\lena} % 1.00374pt
\typeout{b: \the\lenb} % 10.03738pt
\typeout{c: \the\lenc} % 10.03749pt

\typeout{a: \number\lena} % 65781
\typeout{b: \number\lenb} % 657810
\typeout{c: \number\lenc} % 657817

\end{document}

答案2

补充一点托切茨回答:就 TeX 操纵的最小维度单位而言,具有单位的sp维度具有精确的值单位。TeX 会将其截断为 sp 个单位的整数。当您乘以维度时,实际上是将其表示形式乘以整数单位。但是,当您直接表达维度时,例如则 进行评估。1/65536ptd bp(1644544/25)*d sp1010sp10bpfloor((1644544/25)*10)

因此1bpfloor(1644544/25),即是65781 sp单位。则10*1bp657810 sp单位。

但是10bpfloor(16445440/25)=657817 sp单位。

并且100bpfloor(164454400/25)=6578176 sp单位(因此精确表示)。唯一精确表示为整数bp单位的维度是那些倍数的维度25bp

答案3

差异的原因已在其他地方解释过。如果尺寸尽可能精确至关重要,则可以加载picture允许在环境中使用其度量单位表示尺寸的包picture

\documentclass{article}
\usepackage{picture}
\begin{document}

\newlength{\picwidth}

\settowidth{\picwidth}{\begin{picture}(10bp,10bp)\end{picture}}
\typeout{width: \the\picwidth}

\settowidth{\picwidth}{\rule{10bp}{0pt}}
\typeout{width: \the\picwidth}

\end{document}

终端上的输出是

width: 10.03749pt
width: 10.03749pt

相关内容