Вот мой код:
\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 масштабированных точек составляют 1 пункт, что является причиной множителя 65536.
Таким образом, это \number
не является действительно необходимым и
\makeatletter
\def\Printdimen#1#2{\strip@pt\dimexpr (#2) * 65536 / \dimexpr 1#1\relax\relax}
\makeatother
тоже хорошо. Лучше добавить два, \relax
которые заканчивают \dimexpr
выражение.