这是一个无答案但评论起来太长了。

这是一个无答案但评论起来太长了。

网络上有各种来源(例如,http://www.prepressure.com/library/paper-size)指定 A4 纸张尺寸为 210 mm × 297 mm 或 595 pt × 842 pt。使用 1 pt = 25.4 mm / 72,宽度 210 mm ≈ 595.275590551 pt 在绝对误差和相对误差方面都更接近 595 mm 而不是 596 mm。

与理想比率 ⎷2 的相对误差分别为 |297/210 - ⎷2|/⎷2 ≈ 0,000051019 = 0,0051019 % 和 |842/595 - ⎷2|/⎷2 ≈ 0,000645226 = 0,0645226 %。

现在运行,latex然后dvips

\documentclass[a4paper]{article}%% either use the option a4paper or:
%\setlength\paperheight{297mm}%
%\setlength\paperwidth{210mm}
\begin{document}
Test
\end{document}

在生成的 Postscript 文件中,我们看到

%%BoundingBox: 0 0 596 842
%%DocumentPaperSizes: a4
{ pop << /PageSize [595 842] >> setpagedevice }

边界框的宽度与 Web 资源通常指定的宽度不同。另请注意,与理想比率的相对误差为 |842/596 - ⎷2|/⎷2 ≈ 0,001033708 = 0,1033708 %,这更糟糕。

那么为什么是 596 而不是 595?有什么理由吗?这是否仍然在 TeX 的(粗略)精度范围内,还是存在错误?有没有机会改进这一点?

使用 Knuth 点,即 1/72.27 英寸 = 25,4 毫米 / 72.27 ≈ 0.351459804 毫米,我们得出的纸张尺寸为 ≈ 597.507874016 pt × 845.046850394 pt,因此我假设它不是 Postscipt 文件中所指的 Knuth 点。

附言topoints(integer i):David 在https://tug.org/svn/texlive/trunk/Build/source/texk/dvipsk/output.c?revision=61701&view=markup,我们发现那里的代码i += 65780L; return (i / 6578176L)*100 + (i % 6578176) * 100 / 6578176;与注释不符。也就是说,代码并不总是执行⌈i/65781.76⌉,正如 i=1 所见:代码得出 (65781/6578176)·100 + (65781%6578176)·100/6578176 = 0·100 + 65781·100/6578176 = 0 + 6578100/6578176 = 0,而它应该得出⌈1/65781.76⌉ = 1。溢出从 i=2147417868 开始。如果我们希望(无论出于何种原因)对除法结果进行四舍五入,我们必须注意这一点:


答案1

这是一个无答案但评论起来太长了。

假设你的网站默认设置为 A4,则测试文档会生成

pdflatex:页面尺寸:595.276 x 841.89 pts (A4)

latex/dvipdfmx:页面尺寸:595.28 x 841.89 pts(A4)

latex/dvips/ps2pdf:页面尺寸:595 x 842 pts (A4)

所以您看,问题出在 dvips 而不是 latex 上。

由于 latex 没有指定页面大小,因此您将获得站点默认值,该默认值来自安装的文件,相当于

/usr/local/texlive/2023/texmf-dist/dvips/config/config.ps

意思是

@ a4 210mm 297mm
@+ ! %%DocumentPaperSizes: a4
@+ %%BeginPaperSize: a4
@+ /setpagedevice where
@+  { pop << /PageSize [595 842] >> setpagedevice }
@+  { /a4 where { pop a4 } if }
@+ ifelse
@+ %%EndPaperSize

因此 595 被断言,您会在 ps 文件的末尾看到它(并且它被 ps2pdf 使用,这就是为什么上面显示 595 准确的原因)

但问题仍然没有解决:边界框中的 596 来自哪里......

啊,dvips.c 源代码中的注释(output.c)说

/*
 *   Convert scaled points to PostScript points.  This is the same
 *   as return (i * 72 / (65536 * 72.27)), which is the same as
 *   dividing by 65781.76, but we want to round up.
 */

而 596 四舍五入后就是 595.273...

理论上你可以用

\special{papersize=592.48pt, 841.89pt}

但我无法让它给出 595pt,它会在 591 和 596 之间跳转....

相关内容