我使用 \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.98828
和253.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
会产生算术溢出。 实际上\maxdimen
是2^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
。