这是我的代码:
\documentclass{article}
\makeatletter
\def\Printdimen#1#2{\strip@pt \dimexpr #2 *65526 /\number\dimexpr 1#1}
\makeatother
\begin{document}
\Printdimen{mm}{\hsize} mm
\end{document}
答案1
宏\strip@pt
需要在其后附加一个维度寄存器;它将pt
在提取的值后删除最后一个。
在 e-TeX 中,\dimexpr
充当“未命名”维度寄存器,因此它位于 之后\strip@pt
。根据 的语法规则\dimexpr
,其中的维度(隐式或显式)后面可以跟*
或/
来表示乘法或(四舍五入)除法。但是乘数/除数必须为整数。
所以\dimexpr 3pt/2
是有效的,但\dimexpr3pt/1.5
事实并非如此。
当 TeX 期望一个整数时,维度寄存器就会被强制使用缩放点数的值;65536 个缩放点为 1pt,这就是乘数为 65536 的原因。
因此,\number
实际上没有必要,
\makeatletter
\def\Printdimen#1#2{\strip@pt\dimexpr (#2) * 65536 / \dimexpr 1#1\relax\relax}
\makeatother
也很好。最好添加表达式\relax
结尾的两个\dimexpr
。