これが私のコードです:
\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
終わりの2つを追加した方が良いでしょう\dimexpr
。