例子:
\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/65536
pt
d
bp
(1644544/25)*d
sp
10
10
sp
10bp
floor((1644544/25)*10)
因此1bp
是floor(1644544/25)
,即是65781
sp
单位。则10*1bp
是657810
sp
单位。
但是10bp
是floor(16445440/25)=657817
sp
单位。
并且100bp
是floor(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