blob: adf6e79165e820c61da32b4a63e86681d0e1e3eb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
\newdimen\zdim \newdimen\tempdim \newdimen\tempdima
% Conversion factors:
%
% According Scaled Rational Prime
% Unit to TeX Points Form Factorization
%-----------------------------------------------------------------
% 1 sp 0.00002 pt 1 1/65536 pt 1 / 2^16
% 1 mm 2.84526 pt 186467 7227/2540 pt 3*3*11*73 / 2*2*5*127
% 1 cm 28.45274 pt 1864679 7227/254 pt 3*3*11*73 / 2*127
% 1 pt 1.0 pt 65536 100/7227 in 2*2*5*5 / 3*3*11*73
% 1 pc 12.0 pt 786432 12/1 pt
% 1 dd 1.07 pt 70124 1238/1157 pt 2*619 / 13*89
% 1 cc 12.8401 pt 841489 14856/1157 pt 2*2*2*3*619 / 13*89
% 1 bp 1.00374 pt 65781 803/800 pt 11*73 / 2*2*2*2*2*5*5
% [1/72 in]
% 1 in 72.2699 pt 4736286 7227/100 pt 3*3*11*73 / 2*2*5*5
% [2.54 cm] [254/100 cm]
\def\points#1#2#3{\tempdim#2\relax
\edef#3{\csname cnvunits#1\expandafter\endcsname\the\tempdim}%
}
\def\inches#1#2#3{%
\tempdim=#2\relax
\tempdima=\ifdim\tempdim<\zdim -\fi\tempdim % absolute value
\roundup\tempdima{#1}{in}%
% In the interest of maximum accuracy we push \tempdima as near
% to \maxdimen as possible before dividing, using the prime
% factorization of the fraction 7227/100 which is the
% points/inches conversion factor.
\ifdim\tempdima<.01\maxdimen
\multiply\tempdima 100 \divide\tempdima 7227
\else
\ifdim\tempdima<.1\maxdimen
\multiply\tempdima 10 \divide\tempdima 11
\multiply\tempdima 10 \divide\tempdima 657
\else
\divide\tempdima 9 \multiply\tempdima 5
\divide\tempdima 803 \multiply\tempdima 20
\fi
\fi
\tempdim=\ifdim\tempdim<\zdim -\fi \tempdima
\edef#3{%
\csname cnvunits#1\expandafter\endcsname\the\tempdim}%
}
% Function \roundup for rounding upward. #1 must be a dimension
% register. If it holds a negative value it will be rounded
% `outward' away from zero rather than `upward' toward zero. #3
% is a TeX units string such as "pt" or "in". If #2 = 0 then
% this will round up to the nearest tenth; if #2 = 00, nearest
% hundredth; and so forth (up to 5 zeros). If #2 is empty then
% full accuracy up to TeX's limits will be used.
%
% The rounded result will be returned in the dimension register
% #1.
\def\roundup#1#2#3{%
\if .#2.\else
\begingroup
\ifdim#1>\zdim
\advance#1-\maxdimen \advance#1.#25#3\relax
\fi
\ifdim#1<\zdim
\endgroup
\advance#1.#25#3
\else
\endgroup
\fi
\fi
}
\begingroup
\catcode`\P=12 \catcode`\T=12
\lowercase{%
\expandafter\gdef\csname cnvunits\endcsname#1PT{#1}
\expandafter\gdef\csname cnvunits0\endcsname#1.#2PT{%
#1.\takeone#20\takeone}
\expandafter\gdef\csname cnvunits00\endcsname#1.#2PT{%
#1.\taketwo#200\taketwo}
\expandafter\gdef\csname cnvunits000\endcsname#1.#2PT{%
#1.\takethree#2000\takethree}
\expandafter\gdef\csname cnvunits0000\endcsname#1.#2PT{%
#1.\takefour#20000\takefour}
\expandafter\gdef\csname cnvunits00000\endcsname#1.#2PT{%
#1.\takefive#200000\takefive}
}%
\endgroup
\def\takeone#1#2\takeone{#1}
\def\taketwo#1#2#3\taketwo{#1#2}
\def\takethree#1#2#3#4\takethree{#1#2#3}
\def\takefour#1#2#3#4#5\takefour{#1#2#3#4}
\def\takefive#1#2#3#4#5#6\takefive{#1#2#3#4#5}
\def\showinches#1{\inches{00}{#1}\converted
\immediate\write16{%
#1 = (after conversion) \converted\space inches}}
\showinches{0in} \showinches{1in} \showinches{2.0in}
\showinches{2.2in} \showinches{8.5in} \showinches{1pc}
\showinches{6pc} \showinches{1cm} \showinches{1mm}
\showinches{1bp} \showinches{72bp} \showinches{1cc}
\showinches{1dd} \showinches{72dd} \showinches{5000pt}
\showinches{-5000pt} \showinches{\maxdimen}
\showinches{-\maxdimen} \showinches{.999\maxdimen}
\showinches{1pt} \showinches{.01pt}
\endinput
% From the TeX log:
0in = (after conversion) 0.00 inches
1in = (after conversion) 1.00 inches
2.0in = (after conversion) 2.00 inches
2.2in = (after conversion) 2.20 inches
8.5in = (after conversion) 8.50 inches
1pc = (after conversion) 0.17 inches
6pc = (after conversion) 1.00 inches
1cm = (after conversion) 0.39 inches
1mm = (after conversion) 0.04 inches
1bp = (after conversion) 0.01 inches
72bp = (after conversion) 1.00 inches
1cc = (after conversion) 0.18 inches
1dd = (after conversion) 0.01 inches
72dd = (after conversion) 1.07 inches
5000pt = (after conversion) 69.18 inches
-5000pt = (after conversion) -69.18 inches
\maxdimen = (after conversion) 226.70 inches
-\maxdimen = (after conversion) -226.70 inches
.999\maxdimen = (after conversion) 226.48 inches
1pt = (after conversion) 0.01 inches
.01pt = (after conversion) 0.00 inches
|