diff options
Diffstat (limited to 'macros/generic/texdimens/texdimens.tex')
-rw-r--r-- | macros/generic/texdimens/texdimens.tex | 340 |
1 files changed, 284 insertions, 56 deletions
diff --git a/macros/generic/texdimens/texdimens.tex b/macros/generic/texdimens/texdimens.tex index 471a07f807..7068d57db9 100644 --- a/macros/generic/texdimens/texdimens.tex +++ b/macros/generic/texdimens/texdimens.tex @@ -1,101 +1,329 @@ % This is file texdimens.tex, part of texdimens package, which % is distributed under the LPPL 1.3c. Copyright (c) 2021 Jean-François Burnol -% 2021/06/30 v0.9beta +% 2021/07/14 v0.9gamma \edef\texdimensendinput{\endlinechar\the\endlinechar\catcode`\noexpand _=\the\catcode`\_\relax\noexpand\endinput}% \endlinechar13\relax% \catcode`\_=11 % Is T sp attainable from unit "uu"?. Here we suppose T>0. % phi>1, psi=1/phi, psi<1 -% U(N,phi)=floor(N phi) is strictly increasing +% U(N,phi)=trunc(N phi) is strictly increasing % U(N)<= T < U(N+1) iff N = ceil((T+1)psi) - 1 % U(M)< T <= U(M+1) iff M = ceil(T psi) - 1 % Either: -% - M = N, i.e. T is not attainable, M=N < T psi < (T+1) psi <= N+1 -% - M = N - 1, i.e. T is attained, T psi <= N < (T+1) psi, T = floor(N phi) +% case1: M = N, i.e. T is not attainable, M=N < T psi < (T+1) psi <= N+1 +% case2: M = N - 1, i.e. T is attained, T psi <= N < (T+1) psi, T = floor(N phi) % -% In the latter case: -% - as psi<1, |N - (T+0.5) psi| < 0.5, hence N = R := round((T+0.5) psi). -% Also works for T=0 but T<0 would need -0.5. +% Let X = round(T psi). And let Y = trunc(X phi). % -% - if psi<1/2, then N = round(T psi) is simpler formula which works -% also for attainable T<0. +% case1: X can be N or N+1. It will be N+1 iff Y > T. +% case2: X can be N or N-1. It will be N iff trunc((X+1)phi)>T. % -% This R=round((T+0.5) psi) can always be computed via \numexpr because 2T+1 -% will not trigger arithmetic overflow. +% This is not convenient: if Y <= T it might still be that we are in case 2 +% and we must check then if trunc((X+1) phi) > T or not. +% +% If psi < 0.5 +% ------------ +% +% The situation then simplifies: +% +% case1: X can be N or N+1. It will be N+1 iff Y = trunc(X phi) > T. +% case2: X is necessarily N. % -% If Tsp>0 is not attainable, this R can produce either N or N+1 (=M+1). +% Thus: +% a) compute X = round(T psi) +% b) compute Y = trunc(X phi) and test if Y > T. If true, we +% were in case 1, replace X by X - 1, else we were either +% in case 1 or case 2, but we can leave X as is. +% We have thus found N. % -% If we try computing ceil(x) via round(x+0.5) (\numexpr rounds up) -% this means for N, we need round((T+1)psi + 0.5), for example with -% psi = 100/7227 for "in", this gives round((((T+1)200)+7227)/14454) -% feasible via \numexpr only for (circa) 100 T less than \maxdimen. +% The operation Y = trunc(X phi) can be achieved this way: +% i) use \the\dimexpr to convert X sp into D pt, +% ii) use \the\numexpr\dimexpr to convert "D uu" into sp. +% These steps give Y. % -% We could rather compute round(T psi) but we don't know if it gives -% N or N+1. We know it is N if round(T psi)< round((T+1) psi) -% but if the two are the same we don't know if they are both N or -% both N+1. +% This way we find the maximal dimension at most T sp exactly +% representable in "uu" unit. % -% It is slightly less costly to compute X = round(T psi) than R, -% but if we then realize that X uu < T sp we do not yet know -% if (X+1) uu = T sp or is > Tsp, except if psi<1/2, because -% if T sp is attainable then X = round(T psi) is then necessarily N -% so if X uu < T sp we now that T sp was not attainable. +% The computations of X and Y can be done independently of sign of T. +% But the final test has to be changed to Y < T if T < 0 and then +% one must replace X by X+1. So we must filter sign. % -% We decide with some hesitation to not split whether psi<1/2 or -% psi>1/2. Reverted! Currently following done only for psi>1/2, -% i.e. bp, nd, dd. +% If the goal is only to find a decimal D such that "D uu" is +% exactly T sp in the case this is possible, then things are simpler +% because from X = round(T psi) we get D such as X sp is same as D pt +% and "D uu" will work. +% We don't have to take sign into account for this computation. +% But if T sp was not atteignable we don't know if this X will give +% a D such that D uu < T sp or D uu > T sp. % -% 1. compute R = round((T+0.5) psi) in \numexpr. This forces -% to check for negative T because then we would want here (T-0.5)psi +% If psi > 0.5 +% ------------ % -% 2. check for the "up" and "down" variants whether R uu is <, =, or > T sp. -% But we have to choose here what "up" and "down" mean for T<0. -% Also, computation of R uu -% may trigger Dimension too large if T sp is not attainable, -% close to \maxdimen, and \maxdimen itself is not attainable. +% For example unit "bp" has phi=803/800. +% +% It is then not true that if T sp is atteignable, the X = round(T psi) +% will always work. +% +% But it is true that R = round((T + 0.5) psi) will always work. +% Here we must use -0.5 if T < 0, though. +% +% This R=round((T+0.5) psi) can always be computed via \numexpr because 2T+1 +% will not trigger arithmetic overflow. % -% For the envisioned "safe versions" we would tabulate first per unit -% what is Rmax such that Rmax uu <= \maxdimen. Then the "safe" versions -% would have an extra check of R. But for \texdimeninuuu it will -% then not be compliant to its definition for inputs close to -% non-attainable \maxdimen. +% So this gives an approach to find a D such that "D uu" is exactly +% T sp when this is possible. +% +% If Tsp (positive) is not attainable, this R however can produce +% either N or N+1. +% +% But we can decide what happened by computing Z = trunc(R phi). +% If and only if Z > T this means R was N+1. +% +% It is slightly less costly to compute X = round(T psi) than +% R = round((T + 0.5) psi), +% but if we then realize that trunc(X phi) < T we do not yet know +% if trunc((X+1) phi) = T or is > T. +% +% To recapitulate: we have our algorithm for all units to find out +% maximal dimension exactly atteignable in "uu" unit and at most equal +% to (positive) T sp. +% +% Unfortunately the check that Y (in case psi < 0.5) or Z (in case psi > +% 0.5) may trigger a Dimension too large error if T sp was near +% non-atteignable \maxdimen. +% +% For additional envisioned "safe versions" we would tabulate first per unit +% what is the integer Rmax such that trunc(Rmax phi) <= \maxdimen. Then +% the "safe" versions would have an extra check of X or R before +% proceeding further. But the "up macros" supposed to give the next +% dimension above Tsp and exactly atteignable in "uu" unit, if compliant +% to their description can not avoid "Dimension too large" for inputs +% close to non-attainable \maxdimen. % % After having written the macros we will tabulate what is for each unit % the maximal attainable dimension. % -% Hesitation about whether using simpler round(T psi) approach -% for units > 2pt and the \texdimin<uu> macros. +% About the macros such as \texdiminbp whose constraints are: +% - give a decimal D such that "Duu" = "T sp" for TeX if possible +% - else give nearest from below or above without knowing +% which one, % -% Testing shows that this would not change output for \maxdimen -% with "nc" and "in": still N+1 is returned... but it has great -% advantage to not have to check the sign. +% there was some hesitation about whether or not using the simpler +% round(T psi) approach for units > 2pt and the \texdimin<uu> macros. +% Testing showed that this did not change the output for \maxdimen +% with the units "nc" and "in": still N+1 is returned... +% +% As it has great +% advantage to not have to check the sign of the input, the +% "simpler" approach was chosen for those units to which it +% applies, i.e. the units uu > 2pt (phi>2, psi<1/2), i.e. +% all units except bp, nd and dd. +% +\def\texdimfirstofone#1{#1}% +% this #2 will be \fi +\def\texdiminuudown_e#1#2#3#4{#2\expandafter\texdiminpt_\the\dimexpr\numexpr(#1-1)sp\relax}% +\def\texdiminuuup_e#1#2#3#4{#2\expandafter\texdiminpt_\the\dimexpr\numexpr(#1+1)sp\relax}% +% this #1 will be \fi +\def\texdiminuuup_neg#1#2-{#1-#2}% +% +% pt % -% OK let's do this, -% especially as I don't know if I will ever implement "up" and "down". \def\texdiminpt#1{\expandafter\texdiminpt_\the\dimexpr#1\relax}% {\catcode`p 12\catcode`t 12\csname expandafter\endcsname\gdef\csname texdiminpt_\endcsname#1pt{#1}}% +% % bp 7227/7200 = 803/800 -% complications and annoying overhead caused by sign -% and we don't want to evaluate #1 twice in a \dimexpr; if #1 was -% restricted to be a dimen register, we would avoid "\the and re-grab" step. +% \def\texdiminbp#1{\expandafter\texdiminbp_\the\numexpr\dimexpr#1;}% \def\texdiminbp_#1#2;{\texdiminpt{\numexpr(2*#1#2+\if-#1-\fi1)*400/803sp}}% +% \texdiminbpdown: maximal dim exactly expressible in bp and at most equal to input +\def\texdiminbpdown#1{\expandafter\texdiminbpdown_a\the\numexpr\dimexpr#1;}% +\def\texdiminbpdown_a#1{\if-#1\texdiminbpdown_neg\fi\texdiminbpdown_b#1}% +\def\texdiminbpdown_b#1;{\expandafter\texdiminbpdown_c\the\numexpr(2*#1+1)*400/803;#1;}% +\def\texdiminbpdown_c#1;{\expandafter\texdiminbpdown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminbpdown_d#1PT};#2;#3;% + {\ifdim#1bp>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +% The problem here is that if close to 0sp, output can be 0.0, and we do not want +% -0.0 as output. So let's do this somewhat brutally. Anyhow, negative inputs are +% not our priority. #1 is \fi here: +\def\texdiminbpdown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminbpdown_b#3;pt\relax}% +% \texdiminbpup: minimal dim exactly expressible in bp and at least equal to input +\def\texdiminbpup#1{\expandafter\texdiminbpup_a\the\numexpr\dimexpr#1;}% +\def\texdiminbpup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminbpup_b#1}% +\def\texdiminbpup_b#1;{\expandafter\texdiminbpup_c\the\numexpr(2*#1+1)*400/803;#1;}% +\def\texdiminbpup_c#1;{\expandafter\texdiminbpup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminbpup_d#1PT};#2;#3;% + {\ifdim#1bp<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % nd 685/642 +% \def\texdiminnd#1{\expandafter\texdiminnd_\the\numexpr\dimexpr#1;}% \def\texdiminnd_#1#2;{\texdiminpt{\numexpr(2*#1#2+\if-#1-\fi1)*321/685sp}}% +% \texdiminnddown: maximal dim exactly expressible in nd and at most equal to input +\def\texdiminnddown#1{\expandafter\texdiminnddown_a\the\numexpr\dimexpr#1;}% +\def\texdiminnddown_a#1{\if-#1\texdiminnddown_neg\fi\texdiminnddown_b#1}% +\def\texdiminnddown_b#1;{\expandafter\texdiminnddown_c\the\numexpr(2*#1+1)*321/685;#1;}% +\def\texdiminnddown_c#1;{\expandafter\texdiminnddown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminnddown_d#1PT};#2;#3;% + {\ifdim#1nd>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdiminnddown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminnddown_b#3;pt\relax}% +% \texdiminndup: minimal dim exactly expressible in nd and at least equal to input +\def\texdiminndup#1{\expandafter\texdiminndup_a\the\numexpr\dimexpr#1;}% +\def\texdiminndup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminndup_b#1}% +\def\texdiminndup_b#1;{\expandafter\texdiminndup_c\the\numexpr(2*#1+1)*321/685;#1;}% +\def\texdiminndup_c#1;{\expandafter\texdiminndup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminndup_d#1PT};#2;#3;% + {\ifdim#1nd<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % dd 1238/1157 +% \def\texdimindd#1{\expandafter\texdimindd_\the\numexpr\dimexpr#1;}% \def\texdimindd_#1#2;{\texdiminpt{\numexpr(2*#1#2+\if-#1-\fi1)*1157/2476sp}}% +% \texdimindddown: maximal dim exactly expressible in dd and at most equal to input +\def\texdimindddown#1{\expandafter\texdimindddown_a\the\numexpr\dimexpr#1;}% +\def\texdimindddown_a#1{\if-#1\texdimindddown_neg\fi\texdimindddown_b#1}% +\def\texdimindddown_b#1;{\expandafter\texdimindddown_c\the\numexpr(2*#1+1)*1157/2476;#1;}% +\def\texdimindddown_c#1;{\expandafter\texdimindddown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdimindddown_d#1PT};#2;#3;% + {\ifdim#1dd>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdimindddown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdimindddown_b#3;pt\relax}% +% \texdiminddup: minimal dim exactly expressible in dd and at least equal to input +\def\texdiminddup#1{\expandafter\texdiminddup_a\the\numexpr\dimexpr#1;}% +\def\texdiminddup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminddup_b#1}% +\def\texdiminddup_b#1;{\expandafter\texdiminddup_c\the\numexpr(2*#1+1)*1157/2476;#1;}% +\def\texdiminddup_c#1;{\expandafter\texdiminddup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminddup_d#1PT};#2;#3;% + {\ifdim#1dd<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % mm 7227/2540 phi now >2, use from here on the simpler approach -\def\texdiminmm#1{\texdiminpt{(#1)*2540/7227}}% +% +\def\texdiminmm#1{\expandafter\texdiminpt_\the\dimexpr(#1)*2540/7227\relax}% +% \texdiminmmdown: maximal dim exactly expressible in mm and at most equal to input +\def\texdiminmmdown#1{\expandafter\texdiminmmdown_a\the\numexpr\dimexpr#1;}% +\def\texdiminmmdown_a#1{\if-#1\texdiminmmdown_neg\fi\texdiminmmdown_b#1}% +\def\texdiminmmdown_b#1;{\expandafter\texdiminmmdown_c\the\numexpr#1*2540/7227;#1;}% +\def\texdiminmmdown_c#1;{\expandafter\texdiminmmdown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminmmdown_d#1PT};#2;#3;% + {\ifdim#1mm>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdiminmmdown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminmmdown_b#3;pt\relax}% +% \texdiminmmup: minimal dim exactly expressible in mm and at least equal to input +\def\texdiminmmup#1{\expandafter\texdiminmmup_a\the\numexpr\dimexpr#1;}% +\def\texdiminmmup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminmmup_b#1}% +\def\texdiminmmup_b#1;{\expandafter\texdiminmmup_c\the\numexpr#1*2540/7227;#1;}% +\def\texdiminmmup_c#1;{\expandafter\texdiminmmup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminmmup_d#1PT};#2;#3;% + {\ifdim#1mm<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % pc 12/1 -\def\texdiminpc#1{\texdiminpt{(#1)/12}}% +% +\def\texdiminpc#1{\expandafter\texdiminpt_\the\dimexpr(#1)/12\relax}% +% \texdiminpcdown: maximal dim exactly expressible in pc and at most equal to input +\def\texdiminpcdown#1{\expandafter\texdiminpcdown_a\the\numexpr\dimexpr#1;}% +\def\texdiminpcdown_a#1{\if-#1\texdiminpcdown_neg\fi\texdiminpcdown_b#1}% +\def\texdiminpcdown_b#1;{\expandafter\texdiminpcdown_c\the\numexpr#1/12;#1;}% +\def\texdiminpcdown_c#1;{\expandafter\texdiminpcdown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminpcdown_d#1PT};#2;#3;% + {\ifdim#1pc>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdiminpcdown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminpcdown_b#3;pt\relax}% +% \texdiminpcup: minimal dim exactly expressible in pc and at least equal to input +\def\texdiminpcup#1{\expandafter\texdiminpcup_a\the\numexpr\dimexpr#1;}% +\def\texdiminpcup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminpcup_b#1}% +\def\texdiminpcup_b#1;{\expandafter\texdiminpcup_c\the\numexpr#1/12;#1;}% +\def\texdiminpcup_c#1;{\expandafter\texdiminpcup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminpcup_d#1PT};#2;#3;% + {\ifdim#1pc<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % nc 1370/107 -\def\texdiminnc#1{\texdiminpt{(#1)*107/1370}}% +% +\def\texdiminnc#1{\expandafter\texdiminpt_\the\dimexpr(#1)*107/1370\relax}% +% \texdiminncdown: maximal dim exactly expressible in nc and at most equal to input +\def\texdiminncdown#1{\expandafter\texdiminncdown_a\the\numexpr\dimexpr#1;}% +\def\texdiminncdown_a#1{\if-#1\texdiminncdown_neg\fi\texdiminncdown_b#1}% +\def\texdiminncdown_b#1;{\expandafter\texdiminncdown_c\the\numexpr#1*107/1370;#1;}% +\def\texdiminncdown_c#1;{\expandafter\texdiminncdown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminncdown_d#1PT};#2;#3;% + {\ifdim#1nc>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdiminncdown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminncdown_b#3;pt\relax}% +% \texdiminncup: minimal dim exactly expressible in nc and at least equal to input +\def\texdiminncup#1{\expandafter\texdiminncup_a\the\numexpr\dimexpr#1;}% +\def\texdiminncup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminncup_b#1}% +\def\texdiminncup_b#1;{\expandafter\texdiminncup_c\the\numexpr#1*107/1370;#1;}% +\def\texdiminncup_c#1;{\expandafter\texdiminncup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminncup_d#1PT};#2;#3;% + {\ifdim#1nc<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % cc 14856/1157 -\def\texdimincc#1{\texdiminpt{(#1)*1157/14856}}% +% +\def\texdimincc#1{\expandafter\texdiminpt_\the\dimexpr(#1)*1157/14856\relax}% +% \texdiminccdown: maximal dim exactly expressible in cc and at most equal to input +\def\texdiminccdown#1{\expandafter\texdiminccdown_a\the\numexpr\dimexpr#1;}% +\def\texdiminccdown_a#1{\if-#1\texdiminccdown_neg\fi\texdiminccdown_b#1}% +\def\texdiminccdown_b#1;{\expandafter\texdiminccdown_c\the\numexpr#1*1157/14856;#1;}% +\def\texdiminccdown_c#1;{\expandafter\texdiminccdown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminccdown_d#1PT};#2;#3;% + {\ifdim#1cc>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdiminccdown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminccdown_b#3;pt\relax}% +% \texdiminccup: minimal dim exactly expressible in cc and at least equal to input +\def\texdiminccup#1{\expandafter\texdiminccup_a\the\numexpr\dimexpr#1;}% +\def\texdiminccup_a#1{\if-#1\texdiminuuup_neg\fi\texdiminccup_b#1}% +\def\texdiminccup_b#1;{\expandafter\texdiminccup_c\the\numexpr#1*1157/14856;#1;}% +\def\texdiminccup_c#1;{\expandafter\texdiminccup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminccup_d#1PT};#2;#3;% + {\ifdim#1cc<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % cm 7227/254 -\def\texdimincm#1{\texdiminpt{(#1)*254/7227}}% +% +\def\texdimincm#1{\expandafter\texdiminpt_\the\dimexpr(#1)*254/7227\relax}% +% \texdimincmdown: maximal dim exactly expressible in cm and at most equal to input +\def\texdimincmdown#1{\expandafter\texdimincmdown_a\the\numexpr\dimexpr#1;}% +\def\texdimincmdown_a#1{\if-#1\texdimincmdown_neg\fi\texdimincmdown_b#1}% +\def\texdimincmdown_b#1;{\expandafter\texdimincmdown_c\the\numexpr#1*254/7227;#1;}% +\def\texdimincmdown_c#1;{\expandafter\texdimincmdown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdimincmdown_d#1PT};#2;#3;% + {\ifdim#1cm>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdimincmdown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdimincmdown_b#3;pt\relax}% +% \texdimincmup: minimal dim exactly expressible in cm and at least equal to input +\def\texdimincmup#1{\expandafter\texdimincmup_a\the\numexpr\dimexpr#1;}% +\def\texdimincmup_a#1{\if-#1\texdiminuuup_neg\fi\texdimincmup_b#1}% +\def\texdimincmup_b#1;{\expandafter\texdimincmup_c\the\numexpr#1*254/7227;#1;}% +\def\texdimincmup_c#1;{\expandafter\texdimincmup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdimincmup_d#1PT};#2;#3;% + {\ifdim#1cm<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% % in 7227/100 -\def\texdiminin#1{\texdiminpt{(#1)*100/7227}}% +% +\def\texdiminin#1{\expandafter\texdiminpt_\the\dimexpr(#1)*100/7227\relax}% +% \texdiminindown: maximal dim exactly expressible in in and at most equal to input +\def\texdiminindown#1{\expandafter\texdiminindown_a\the\numexpr\dimexpr#1;}% +\def\texdiminindown_a#1{\if-#1\texdiminindown_neg\fi\texdiminindown_b#1}% +\def\texdiminindown_b#1;{\expandafter\texdiminindown_c\the\numexpr#1*100/7227;#1;}% +\def\texdiminindown_c#1;{\expandafter\texdiminindown_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdiminindown_d#1PT};#2;#3;% + {\ifdim#1in>#3sp \texdiminuudown_e{#2}\fi\texdimfirstofone{#1}}% +}% +\def\texdiminindown_neg#1#2-#3;{#1\expandafter\texdiminpt_\the\dimexpr-\texdiminindown_b#3;pt\relax}% +% \texdimininup: minimal dim exactly expressible in in and at least equal to input +\def\texdimininup#1{\expandafter\texdimininup_a\the\numexpr\dimexpr#1;}% +\def\texdimininup_a#1{\if-#1\texdiminuuup_neg\fi\texdimininup_b#1}% +\def\texdimininup_b#1;{\expandafter\texdimininup_c\the\numexpr#1*100/7227;#1;}% +\def\texdimininup_c#1;{\expandafter\texdimininup_d\the\dimexpr#1sp;#1;}% +{\catcode`P 12\catcode`T 12\lowercase{\gdef\texdimininup_d#1PT};#2;#3;% + {\ifdim#1in<#3sp \texdiminuuup_e{#2}\fi\texdimfirstofone{#1}}% +}% +% \texdimensendinput |