내 코드는 다음과 같습니다.
\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
.