将尺寸转换为毫米的整数

将尺寸转换为毫米的整数

我使用 \zsavepos 记录页面上框的位置,然后将该位置写入框。它工作正常,但我得到的函数以毫米为单位给出的测量值精确到小数点后几位 - 我只需要精确到毫米的整数...

\newcommand\dimtomm[1]{%
    \strip@pt\dimexpr 0.352777778\dimexpr#1\relax\relax
}
\newcommand\getPOS[3]{%
    \dimtomm{\zposx{#1}sp},\dimtomm{\zposy{#1}sp},\dimtomm{#2},\dimtomm{#3}
}

\getPOS使用 ZPOS 引用的参数调用,参数 2 和 3 是框的宽度和高度。如何\dimtomm调整函数,使其以整数形式返回 mm 数,而不返回其他内容?我尝试了以下建议但无济于事……

答案1

最简单的无包装方法是使用以下宏。

\def\dimtomm #1{\the\numexpr \dimexpr #1\relax*635/118407168\relax }

但在进一步讨论之前,我应该指出,您的转换因子大约是25.4/72错误的,因为 TeX 通过\the(LaTeX 宏使用\strip@pt)TeX 点而不是 Postscript 点中的尺寸来表达。

使用问题中的转换因子,\dimtomm {100cm}可得到1003.76543\dimtomm {10in}产生254.9564。理论上准确的转换因子是25.4/72.27可以用近似值来近似0.35146,然后在替换后分别得到999.98828253.99702

然而,让我们回到宏来转换为毫米的(四舍五入)整数倍数。

\def\dimtomm #1{\the\numexpr \dimexpr #1\relax*635/118407168\relax }

\tt

1cm is \dimtomm {1cm}mm

100cm is \dimtomm {100cm}mm

1in is (approximately) \dimtomm {1in}mm

10in is \dimtomm {10in}mm

1pt is (approximately) \dimtomm {1pt}mm

100pt is (approximately) \dimtomm {100pt}mm

10000pt  is (approximately) \dimtomm {10000pt}mm

% added in post update
\the\maxdimen\ is (approximately) \dimtomm\maxdimen mm

\bye

\newcommand如果您使用 LaTeX,则使用而不是 来定义宏\def,仅此而已。如果您使用纯 TeX,请确保使用etex或进行编译pdftex,而不是使用tex可执行文件,因为必须启用 e-TeX 扩展。

暗淡

\maxdimen生产线生产:

16383.99998pt is (approximately) 5758mm

附加说明:如 etex 手册中所述,在 中立即执行乘法然后执行除法,\numexpr其中间值以双精度(两个字)计算,因此不会发生溢出,而\numexpr \maxdimen*635\relax会产生算术溢出。 实际上\maxdimen2^30-1 sp单位,并且(2^30-1)*635自然大于允许的最大整数2^31-1

答案2

最简单的方法是使用expl3

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\dimtomm}{m}
 {
  \fp_eval:n { round ( \dim_to_decimal_in_unit:nn { #1 } { 1mm }, 0 ) } ~ mm
 }
\ExplSyntaxOff

\begin{document}

\dimtomm{186467sp}

\end{document}

这将打印“1 mm”,因为 186467sp 正好是 1 毫米。这样\dimtomm{10in}您将得到“254 mm”。

这里的长度是四舍五入的,您可能想要trunc而不是round

相关内容