Aqui está o meu código:
\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}
Responder1
A macro \strip@pt
deseja depois um registro de dimensão; removerá o final pt
após o valor extraído.
No e-TeX, \dimexpr
ele se comporta como um registrador de dimensão “sem nome”, então é bom depois \strip@pt
. De acordo com as regras de sintaxe de \dimexpr
, uma dimensão (implícita ou explícita) dentro dela pode ser seguida por *
ou /
para denotar multiplicação ou divisão (arredondada). No entanto, o multiplicador/divisordeveseja um número inteiro.
Então \dimexpr 3pt/2
é válido, mas \dimexpr3pt/1.5
não é.
Um registro de dimensão que aparece em um contexto onde o TeX espera um número inteiro será forçado a ele usando o valor em pontos escalonados; 65.536 pontos na escala equivalem a 1 ponto, que é a razão do multiplicador 65.536.
Portanto, \number
não é realmente necessário e
\makeatletter
\def\Printdimen#1#2{\strip@pt\dimexpr (#2) * 65536 / \dimexpr 1#1\relax\relax}
\makeatother
é bom também. É melhor adicionar os dois \relax
que terminam a \dimexpr
expressão.