diff options
author | Hans Hagen <pragma@wxs.nl> | 2012-01-05 19:27:50 +0100 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2012-01-05 19:27:50 +0100 |
commit | e9c601bac72745359ce28a511bf54c3202e4ead6 (patch) | |
tree | 90ceba360ad36d78da048c4b44f955579f1669e1 /tex/context/base/grph-trf.mkiv | |
parent | 8d0f99447733416abc3331598edd923fb68226f4 (diff) | |
download | context-e9c601bac72745359ce28a511bf54c3202e4ead6.tar.gz |
beta 2011.12.22 14:43
Diffstat (limited to 'tex/context/base/grph-trf.mkiv')
-rw-r--r-- | tex/context/base/grph-trf.mkiv | 939 |
1 files changed, 502 insertions, 437 deletions
diff --git a/tex/context/base/grph-trf.mkiv b/tex/context/base/grph-trf.mkiv index 4801a2aa5..2e7e497e2 100644 --- a/tex/context/base/grph-trf.mkiv +++ b/tex/context/base/grph-trf.mkiv @@ -1,5 +1,5 @@ %D \module -%D [ file=grph-fig, +%D [ file=grph-trf, %D version=2006.08.26, % overhaul/split of 1997.03.31 core-fig %D title=\CONTEXT\ Graphic Macros, %D subtitle=Transformations, @@ -11,44 +11,55 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D It may be that some functionality got lost. If it concerns -%D defined features, let me know and it will be sorted out. - -%D We will move the calculations to \LUA\ and clean up this -%D lot anyway. - \writestatus{loading}{ConTeXt Graphic Macros / Transformations} \unprotect -%D Scaling: +%D We probably use too many dimens as the width calculations can +%D go away. Some of this is an inheritance of limited backends +%D (some supported fractions, some 1000's, some dimentions) so +%D we calculate all of them. Nowadays scaling is always available +%D so we could simplify the code. On the other hand, we now get +%D some extra values for free. +%D +%D We could move the calculations to \LUA\ and clean up this +%D lot anyway. On the other hand, there is some danger of messing +%D up so it has a real low priority. -\unexpanded\def\scale{\dodoubleempty\doscalenextbox[\??xy]} +% local: -% probably too many dimens / the width calculations can go -% since we may assume scaling is available (was not true -% long ago which is why we also calculate the width) +\newdimen\d_transforms_scale_x_size +\newdimen\d_transforms_scale_y_size +\newdimen\d_transforms_scale_x_offset +\newdimen\d_transforms_scale_y_offset -\newdimen\scaleboxwidth -\newdimen\scaleboxheight -\newdimen\scaleboxdepth +\newdimen\d_transforms_scale_h_size +\newdimen\d_transforms_scale_v_size -\newdimen\scaleboxsizex -\newdimen\scaleboxsizey -\newdimen\scaleboxoffsetx -\newdimen\scaleboxoffsety +\newconditional\c_transforms_scale_done +\newconditional\c_transforms_scale_scaling_done -\newdimen\scaleboxhsize -\newdimen\scaleboxvsize +\newdimen\d_transforms_scale_wd +\newdimen\d_transforms_scale_ht +\newdimen\d_transforms_scale_dp % global -\newdimen\scaleboxdimx \let\figwid \scaleboxdimx -\newdimen\scaleboxdimy \let\fighei \scaleboxdimy -\newcount\scaleboxscax \let\figxsca\scaleboxscax -\newcount\scaleboxscay \let\figysca\scaleboxscay +\newdimen\d_transforms_scale_used_x_size +\newdimen\d_transforms_scale_used_y_size + +\newcount\c_transforms_scale_used_x_scale +\newcount\c_transforms_scale_used_y_scale + +\newdimen\d_transforms_scale_outer_v_size % we cannot manipulate any global vsize ! -\newdimen\scaleboxoutervsize % we cannot manipulate any global vsize ! +% scratch: + +\let\m_transforms_scale_temp \empty +\let\m_transforms_scale_temp_x\empty +\let\m_transforms_scale_temp_y\empty + +% public: \let\finalscaleboxxscale \!!plusone \let\finalscaleboxyscale \!!plusone @@ -57,380 +68,417 @@ \let\finalscaleboxxfactor\!!hundred \let\finalscaleboxyfactor\!!hundred -\newconditional\scaleboxdone - -\def\doscalenextbox[#1][#2]% +% we can let sx/sy win (first check) + +\installcommandhandler \??xy {scale} \??xy % we can have instances + +\setupscale + [\c!sx=1, + \c!sy=1, + %\c!scale=, + %\c!xscale=, + %\c!yscale=, + %\c!width=, + %\c!height=, + %\c!lines=, + %\c!factor=, + %\c!hfactor=, + %\c!wfactor=, + %\c!grid=, + %\c!equalwidth=, + %\c!equalheight=, + \c!maxwidth=\scaleparameter\c!width, + \c!maxheight=\scaleparameter\c!height] + +\unexpanded\def\scale{\dodoubleempty\transforms_scale} + +% we could have: \freezeparameter\c!scale etc (less backtracking when used multiple) + +\def\transforms_scale[#1][#2]% {\bgroup - \getparameters - [#1] - [\c!scale=,\c!xscale=,\c!yscale=,\c!width=,\c!height=,\c!lines=, - \c!factor=,\c!hfactor=,\c!wfactor=,\c!grid=,\c!sx=1,\c!sy=1, - \c!equalwidth=,\c!equalheight=, - \c!maxwidth=\scaleparameter\c!width,\c!maxheight=\scaleparameter\c!height, - #2]% - \dowithnextbox{\dodoscalenextbox{#1}\egroup}\hbox} - -\def\doscalebox#1% - {\bgroup\dowithnextbox{\dodoscalenextbox{#1}\egroup}\hbox} - -\let\currentscaletag\??xy - -\def\scaleparameter#1% - {\csname\currentscaletag#1\endcsname} - -\def\setscaleparameter#1#2% - {\setvalue{\currentscaletag#1}{#2}} - -\def\dodoscalenextbox#1% - {\edef\currentscaletag{#1}% - \doif{\scaleparameter\c!depth}\v!no{\setbox\nextbox\hbox{\raise\nextboxdp\box\nextbox}}% new - \forgetall - \dontshowcomposition - \dontcomplain - \doscaleboxcalculations - \doscaleboxindeed - \doscaleboxposition - \flushnextbox} - -\def\doscaleboxindeed - {\ifconditional\scaleboxdone - \scaleboxwidth \finalscaleboxxscale\nextboxwd - \scaleboxheight\finalscaleboxyscale\nextboxht - \scaleboxdepth \finalscaleboxyscale\nextboxdp - \setbox\nextbox\hbox - {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale - \smashedbox\nextbox - \dostopscaling}% - \nextboxwd\scaleboxwidth - \nextboxht\scaleboxheight - \nextboxdp\scaleboxdepth - \fi} - -\def\doscaleboxcalculations - {\setfalse\scaleboxdone - % initial final value + % this is quite common so we might make this a helper + \ifsecondargument + \edef\currentscale{#1}% + \setupcurrentscale[#2]% + \else\iffirstargument + \doifassignmentelse{#1} + {\let\currentscale\empty + \setupcurrentscale[#1]} + {\edef\currentscale{#1}}% + \else + \let\currentscale\empty + \fi\fi + % + \dowithnextboxcs\transforms_scale_finish\hbox} + +\def\transforms_scale_finish + {% + \edef\p_scale {\scaleparameter\c!scale }% + \edef\p_xscale {\scaleparameter\c!xscale }% + \edef\p_yscale {\scaleparameter\c!yscale }% + \edef\p_width {\scaleparameter\c!width }% + \edef\p_height {\scaleparameter\c!height }% + \edef\p_depth {\scaleparameter\c!depth }% + \edef\p_lines {\scaleparameter\c!lines }% + \edef\p_factor {\scaleparameter\c!factor }% + \edef\p_hfactor {\scaleparameter\c!hfactor }% + \edef\p_wfactor {\scaleparameter\c!wfactor }% + % \edef\p_grid {\scaleparameter\c!grid }% used once + \edef\p_maxwidth {\scaleparameter\c!maxwidth }% + \edef\p_maxheight {\scaleparameter\c!maxheight }% + \edef\p_sx {\scaleparameter\c!sx }% + \edef\p_sy {\scaleparameter\c!sy }% + \edef\p_equalwidth {\scaleparameter\c!equalwidth }% + \edef\p_equalheight{\scaleparameter\c!equalheight}% + % + \d_transforms_scale_dp\dp\nextbox + \ifx\p_depth\v!no \ifzeropt\d_transforms_scale_dp \else + \setbox\nextbox\hbox{\raise\d_transforms_scale_dp\box\nextbox}% new + \d_transforms_scale_dp\dp\nextbox + \fi \fi + \d_transforms_scale_wd\wd\nextbox + \d_transforms_scale_ht\ht\nextbox + \d_transforms_scale_dp\dp\nextbox + % \global\let\finalscaleboxxscale \!!plusone \global\let\finalscaleboxyscale \!!plusone - \xdef \finalscaleboxwidth {\the\nextboxwd}% - \xdef \finalscaleboxheight{\the\nextboxht}% + \xdef \finalscaleboxwidth {\the\d_transforms_scale_wd}% + \xdef \finalscaleboxheight{\the\d_transforms_scale_ht}% \global\let\finalscaleboxxfactor\!!hundred \global\let\finalscaleboxyfactor\!!hundred - \ifdim\nextboxht>\zeropoint \ifdim\nextboxwd>\zeropoint - % hm, still useful? better in lua anyway - \edef\scaleboxstampa % slow way [can be combined] - {\scaleparameter\c!scale \scaleparameter\c!xscale \scaleparameter\c!yscale - \scaleparameter\c!factor\scaleparameter\c!wfactor\scaleparameter\c!hfactor - \scaleparameter\c!lines \scaleparameter\c!width \scaleparameter\c!height}% - \edef\scaleboxstampb % fast way [just sx/sy] - {\scaleparameter\c!sx - \scaleparameter\c!sy}% - \edef\scaleboxstampc - {11}% - \ifx\scaleboxstampa\empty - \ifx\scaleboxstampb\scaleboxstampc - % no scaling, but still check; new, gone again -% wrong: scaled proportionally as side effect -% \doifsomething{\scaleparameter\c!maxwidth }{\letvalue{\currentscaletag\c!factor}\v!fit}% -% \doifsomething{\scaleparameter\c!maxheight}{\letvalue{\currentscaletag\c!factor}\v!fit}% + % + \forgetall + \dontshowcomposition + \dontcomplain + % + \setfalse\c_transforms_scale_done + \transforms_scale_calculate + \ifconditional\c_transforms_scale_done + \transforms_scale_apply + \fi + \transforms_scale_position + % + \box\nextbox + \egroup} + +\def\transforms_scale_apply + {\d_transforms_scale_wd\finalscaleboxxscale\d_transforms_scale_wd + \d_transforms_scale_ht\finalscaleboxyscale\d_transforms_scale_ht + \d_transforms_scale_dp\finalscaleboxyscale\d_transforms_scale_dp + \setbox\nextbox\hbox + {\dostartscaling \finalscaleboxxscale \finalscaleboxyscale + \smashedbox\nextbox + \dostopscaling}% + \wd\nextbox\d_transforms_scale_wd + \ht\nextbox\d_transforms_scale_ht + \dp\nextbox\d_transforms_scale_dp} + +\def\m_transforms_scale_stamp_c{11} + +\def\transforms_scale_calculate + {\ifdim\d_transforms_scale_ht>\zeropoint \ifdim\d_transforms_scale_wd>\zeropoint + \edef\m_transforms_scale_stamp_a{\p_scale\p_xscale\p_yscale\p_factor\p_wfactor\p_hfactor\p_lines\p_width\p_height}% + \edef\m_transforms_scale_stamp_b{\p_sx\p_sy}% + \ifx\m_transforms_scale_stamp_a\empty + \ifx\m_transforms_scale_stamp_b\m_transforms_scale_stamp_c + % no scaling, don't change this (previous attempts failed anyway) \insidefloattrue % trick - \dodoscaleboxcalculations + \transforms_scale_calculations_yes \else - \dosetscalboxsxsy - \nodoscaleboxcalculations + \transforms_scale_check_sx_sy + \transforms_scale_calculations_nop \fi \else - \ifx\scaleboxstampb\empty + \ifx\m_transforms_scale_stamp_b\empty % no need to check further \else - \dosetscalboxsxsy + \transforms_scale_check_sx_sy \fi - \dodoscaleboxcalculations + \transforms_scale_calculations_yes \fi \fi \fi} -\def\dosetscalboxsxsy - {\ifdim\scaleparameter\c!sx\onepoint=\onepoint\else - \setevalue{\currentscaletag\c!width }{\the\dimexpr\scaleparameter\c!sx\wd\nextbox\relax}% - \fi - \ifdim\scaleparameter\c!sy\onepoint=\onepoint\else - \setevalue{\currentscaletag\c!height}{\the\dimexpr\scaleparameter\c!sy\ht\nextbox\relax}% - \fi} +\def\transforms_scale_check_sx_sy + {\ifdim\p_sx\onepoint=\onepoint\else\edef\p_width {\the\dimexpr\p_sx\d_transforms_scale_wd}\fi + \ifdim\p_sy\onepoint=\onepoint\else\edef\p_height{\the\dimexpr\p_sy\d_transforms_scale_ht}\fi} -\def\doscaleboxrounding#1.#2\relax{#1} +\def\transforms_scale_rounded#1% + {\expandafter\expandafter\expandafter\transforms_scale_rounded_indeed + \expandafter\WITHOUTPT\the\dimexpr#1\points*100+32768sp\relax.\relax} -\def\scaleboxrounding#1% - {\@EA\@EA\@EA\doscaleboxrounding\@EA\WITHOUTPT\the\dimexpr#1\points*100+32768sp\relax.\relax} +\def\transforms_scale_rounded_indeed#1.#2\relax{#1} -\def\nodoscaleboxcalculations - {\settrue\scaleboxdone - \xdef\finalscaleboxwidth {\the\dimexpr\scaleparameter\c!sx\wd\nextbox\relax}% - \xdef\finalscaleboxheight {\the\dimexpr\scaleparameter\c!sy\ht\nextbox\relax}% - \xdef\finalscaleboxxscale {\scaleparameter\c!sx}% - \xdef\finalscaleboxyscale {\scaleparameter\c!sy}% +\def\transforms_scale_calculations_nop + {\settrue\c_transforms_scale_done + \xdef\finalscaleboxwidth {\the\dimexpr\p_sx\d_transforms_scale_wd\relax}% + \xdef\finalscaleboxheight{\the\dimexpr\p_sy\d_transforms_scale_ht\relax}% + \glet\finalscaleboxxscale\p_sx + \glet\finalscaleboxyscale\p_sy \ifx\finalscaleboxxscale\empty\let\finalscaleboxxscale\!!plusone\fi \ifx\finalscaleboxyscale\empty\let\finalscaleboxyscale\!!plusone\fi - \xdef\finalscaleboxxfactor{\scaleboxrounding\finalscaleboxxscale}% - \xdef\finalscaleboxyfactor{\scaleboxrounding\finalscaleboxyscale}} + \xdef\finalscaleboxxfactor{\transforms_scale_rounded\finalscaleboxxscale}% + \xdef\finalscaleboxyfactor{\transforms_scale_rounded\finalscaleboxyscale}} -\def\dodoscaleboxcalculations - {\settrue\scaleboxdone +\def\transforms_scale_calculations_yes + {\settrue\c_transforms_scale_done % initial values - \scaleboxoffsetx\zeropoint - \scaleboxoffsety\zeropoint - \scaleboxsizex \nextboxwd - \scaleboxsizey \nextboxht % alleen ht wordt geschaald! + \d_transforms_scale_x_offset\zeropoint + \d_transforms_scale_y_offset\zeropoint + \d_transforms_scale_x_size \d_transforms_scale_wd + \d_transforms_scale_y_size \d_transforms_scale_ht % alleen ht wordt geschaald! % final values - \global\scaleboxdimx \zeropoint % see note * (core-fig) - \global\scaleboxdimy \zeropoint % see note * (core-fig) - \scaleboxscax \plusone % see note * (core-fig) - \scaleboxscay \plusone % see note * (core-fig) + \global\d_transforms_scale_used_x_size \zeropoint % see note * (core-fig) + \global\d_transforms_scale_used_y_size \zeropoint % see note * (core-fig) + \c_transforms_scale_used_x_scale \plusone % see note * (core-fig) + \c_transforms_scale_used_y_scale \plusone % see note * (core-fig) % preparations - \setfalse\scaleboxscalingdone - \checkscaleboxsettings + \setfalse\c_transforms_scale_scaling_done + \transforms_scale_check_parameters % calculators % beware, they operate in sequence, and calculate missing dimensions / messy %setscaleboxbynature % when? needed? - \ifconditional\scaleboxscalingdone\else\setscaleboxbyfactor \fi - \ifconditional\scaleboxscalingdone\else\setscaleboxbyscale \fi - \ifconditional\scaleboxscalingdone\else\setscaleboxbydimension\fi + \ifconditional\c_transforms_scale_scaling_done\else\transforms_scale_by_factor \fi + \ifconditional\c_transforms_scale_scaling_done\else\transforms_scale_by_scale \fi + \ifconditional\c_transforms_scale_scaling_done\else\transforms_scale_by_dimension\fi % finalizers / to be done (no longer needed this way, clean up) - \convertscaleboxinsertscale\scaleboxhsize\figx\scaleboxscax\scax - \convertscaleboxinsertscale\scaleboxvsize\figy\scaleboxscay\scay + \transforms_scale_convert_large_scale\d_transforms_scale_h_size\figx\c_transforms_scale_used_x_scale\m_transforms_scale_temp_x + \transforms_scale_convert_large_scale\d_transforms_scale_v_size\figy\c_transforms_scale_used_y_scale\m_transforms_scale_temp_y % used in actual scaling - \xdef\finalscaleboxwidth {\the\scaleboxdimx}% - \xdef\finalscaleboxheight {\the\scaleboxdimy}% - \xdef\finalscaleboxxfactor{\the\scaleboxscax}% - \xdef\finalscaleboxyfactor{\the\scaleboxscay}% - \xdef\finalscaleboxxscale {\withoutpt\the\dimexpr\scax\points/\plushundred\relax}% - \xdef\finalscaleboxyscale {\withoutpt\the\dimexpr\scay\points/\plushundred\relax}} - -\setvalue{\??xy:\c!grid:\v!yes }{\getnoflines \fighei\setevalue{\currentscaletag\c!height}{\the\noflines\lineheight}} -\setvalue{\??xy:\c!grid:\v!height }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight+\strutdepth\relax}} -\setvalue{\??xy:\c!grid:\v!depth }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight-\strutdepth\relax}} -\setvalue{\??xy:\c!grid:\v!halfline}{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\dimexpr\noflines\lineheight+.5\lineheight\relax}} -\setvalue{\??xy:\c!grid:\v!fit }{\getrawnoflines\fighei\setevalue{\currentscaletag\c!height}{\the\noflines\lineheight}} + \xdef\finalscaleboxwidth {\the\d_transforms_scale_used_x_size}% + \xdef\finalscaleboxheight {\the\d_transforms_scale_used_y_size}% + \xdef\finalscaleboxxfactor{\the\c_transforms_scale_used_x_scale}% + \xdef\finalscaleboxyfactor{\the\c_transforms_scale_used_y_scale}% + \xdef\finalscaleboxxscale {\withoutpt\the\dimexpr\m_transforms_scale_temp_x\points/\plushundred\relax}% + \xdef\finalscaleboxyscale {\withoutpt\the\dimexpr\m_transforms_scale_temp_y\points/\plushundred\relax}} + +\setvalue{\??xy:\c!grid:\v!yes }{\getnoflines \d_transforms_scale_used_y_size\edef\p_height{\the\noflines\lineheight}} +\setvalue{\??xy:\c!grid:\v!height }{\getrawnoflines\d_transforms_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight+\strutdepth}} +\setvalue{\??xy:\c!grid:\v!depth }{\getrawnoflines\d_transforms_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight-\strutdepth}} +\setvalue{\??xy:\c!grid:\v!halfline}{\getrawnoflines\d_transforms_scale_used_y_size\edef\p_height{\the\dimexpr\noflines\lineheight+.5\lineheight}} +\setvalue{\??xy:\c!grid:\v!fit }{\getrawnoflines\d_transforms_scale_used_y_size\edef\p_height{\the\noflines\lineheight}} \letvalue{\??xy:\c!grid:\empty }\donothing -\def\checkscaleboxsettings - {\doifsomething{\scaleparameter\c!maxwidth }% can be defined in itself - {\setevalue{\currentscaletag\c!maxwidth }{\the\dimexpr\scaleparameter\c!maxwidth \relax}}% - \doifsomething{\scaleparameter\c!maxheight}% can be defined in itself - {\setevalue{\currentscaletag\c!maxheight}{\the\dimexpr\scaleparameter\c!maxheight\relax}}% - \doifsomething{\scaleparameter\c!lines} - {\setevalue{\currentscaletag\c!height}{\the\dimexpr\scaleparameter\c!lines\lineheight\relax}}% +\def\transforms_scale_check_parameters % resolve self referencing loops + {\ifx\p_maxwidth \empty\else \edef\p_maxwidth {\the\dimexpr\p_maxwidth }\fi + \ifx\p_maxheight\empty\else \edef\p_maxheight{\the\dimexpr\p_maxheight }\fi + \ifx\p_lines \empty\else \edef\p_height {\the\dimexpr\p_lines\lineheight}\fi \getvalue{\??xy:\c!grid:\scaleparameter\c!grid}} -\def\setscaleboxbynature % where ! ! ! ! ! - {\doifsomething{\scaleparameter\c!width }{\global\scaleboxdimx\scaleparameter\c!width }% - \doifsomething{\scaleparameter\c!height}{\global\scaleboxdimy\scaleparameter\c!height}% - \doifsomething{\scaleparameter\c!scale } {\scaleboxscax\scaleparameter\c!scale - \scaleboxscay\scaleparameter\c!scale }% - \doifsomething{\scaleparameter\c!xscale} {\scaleboxscax\scaleparameter\c!xscale}% - \doifsomething{\scaleparameter\c!yscale} {\scaleboxscay\scaleparameter\c!yscale}} % oeps, was x +\def\transforms_scale_by_nature % where ! ! ! ! ! + {\ifx\p_width \empty\else \global\d_transforms_scale_used_x_size\p_width \fi + \ifx\p_height\empty\else \global\d_transforms_scale_used_y_size\p_height\fi + \ifx\p_scale \empty\else \c_transforms_scale_used_x_scale\p_scale + \c_transforms_scale_used_y_scale\p_scale \fi + \ifx\p_xscale\empty\else \c_transforms_scale_used_x_scale\p_xscale\fi + \ifx\p_yscale\empty\else \c_transforms_scale_used_y_scale\p_yscale\fi} % \defineexternalfigure[width-6][factor=auto,maxwidth=\textheight,maxheight=\textwidth] % \defineexternalfigure[width-7][factor=auto,maxwidth=\textwidth,maxheight=\textheight] % \placefigure{none}{\rotate[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-6]}} \page % \placefigure{none}{\framed[frame=on,offset=overlay]{\externalfigure[t:/sources/cow.pdf][width-7]}} -\def\setscaleboxbyfactor - {\doifinsetelse{\scaleparameter\c!factor}{\v!max,\v!fit,\v!broad,\v!auto} - {\doapplyscaleboxsize - \ifdim\scaleboxsizex>\scaleboxsizey - \docalculatescaleboxnorm \scaleboxdimx\c!factor\c!maxwidth\hsize\scaleboxhsize - \docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey - \else - \docalculatescaleboxnorm \scaleboxdimy\c!factor\c!maxheight\scaleboxoutervsize\scaleboxvsize - \docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex - \fi - \donetrue} - {\doifinsetelse{\scaleparameter\c!hfactor}{\v!max,\v!fit,\v!broad,\v!auto} - {\doapplyscaleboxsize - \docalculatescaleboxnorm \scaleboxdimy\c!hfactor\c!maxheight\scaleboxoutervsize\scaleboxvsize - \docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex - \donetrue} - {\doifinsetelse{\scaleparameter\c!wfactor}{\v!max,\v!fit,\v!broad,\v!auto} - {\doapplyscaleboxsize - \docalculatescaleboxnorm \scaleboxdimx\c!wfactor\c!maxwidth\hsize\scaleboxhsize - \docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey - \donetrue} - {\docalculatescaleboxnorm\scaleboxdimy\c!factor \c!height \textheight\scaleboxvsize - \docalculatescaleboxnorm\scaleboxdimy\c!hfactor\c!height \textheight\scaleboxvsize - \docalculatescaleboxnorm\scaleboxdimx\c!wfactor\c!width \hsize \hsize - \donefalse}}}% - \ifdone - \settrue\scaleboxscalingdone - \ifdim\scaleboxdimx>\scaleboxhsize - \global\scaleboxdimy\zeropoint \global\scaleboxdimx\scaleboxhsize - \else\ifdim\scaleboxdimy>\scaleboxvsize - \global\scaleboxdimx\zeropoint \global\scaleboxdimy\scaleboxvsize - \fi\fi - \setscaleboxbydimension +\def\m_transforms_scale_factor_set{\v!max,\v!fit,\v!broad,\v!auto} % can be an \edef + +\def\transforms_scale_by_factor + {\doifinsetelse\p_factor\m_transforms_scale_factor_set + \transforms_scale_by_factor_a + {\doifinsetelse\p_hfactor\m_transforms_scale_factor_set + \transforms_scale_by_factor_b + {\doifinsetelse\p_wfactor\m_transforms_scale_factor_set + \transforms_scale_by_factor_c + \transforms_scale_by_factor_d}}} + +\def\transforms_scale_by_factor_a + {\transforms_scale_apply_size + \ifdim\d_transforms_scale_x_size>\d_transforms_scale_y_size + \transforms_scale_calculate_norm \d_transforms_scale_used_x_size\p_factor\p_maxwidth\hsize\d_transforms_scale_h_size + \transforms_scale_calculate_scales\d_transforms_scale_used_x_size\d_transforms_scale_x_size\d_transforms_scale_used_y_size\d_transforms_scale_y_size + \else + \transforms_scale_calculate_norm \d_transforms_scale_used_y_size\p_factor\p_maxheight\d_transforms_scale_outer_v_size\d_transforms_scale_v_size + \transforms_scale_calculate_scales\d_transforms_scale_used_y_size\d_transforms_scale_y_size\d_transforms_scale_used_x_size\d_transforms_scale_x_size + \fi + \transforms_scale_by_factor_indeed} + +\def\transforms_scale_by_factor_b + {\transforms_scale_apply_size + \transforms_scale_calculate_norm \d_transforms_scale_used_y_size\p_hfactor\p_maxheight\d_transforms_scale_outer_v_size\d_transforms_scale_v_size + \transforms_scale_calculate_scales\d_transforms_scale_used_y_size\d_transforms_scale_y_size\d_transforms_scale_used_x_size\d_transforms_scale_x_size + \transforms_scale_by_factor_indeed} + +\def\transforms_scale_by_factor_c + {\transforms_scale_apply_size + \transforms_scale_calculate_norm \d_transforms_scale_used_x_size\p_wfactor\p_maxwidth\hsize\d_transforms_scale_h_size + \transforms_scale_calculate_scales\d_transforms_scale_used_x_size\d_transforms_scale_x_size\d_transforms_scale_used_y_size\d_transforms_scale_y_size + \transforms_scale_by_factor_indeed} + +\def\transforms_scale_by_factor_d + {\transforms_scale_calculate_norm\d_transforms_scale_used_y_size\p_factor \p_height \textheight\d_transforms_scale_v_size + \transforms_scale_calculate_norm\d_transforms_scale_used_y_size\p_hfactor\p_height \textheight\d_transforms_scale_v_size + \transforms_scale_calculate_norm\d_transforms_scale_used_x_size\p_wfactor\p_width \hsize \hsize} + +\def\transforms_scale_by_factor_indeed + {\settrue\c_transforms_scale_scaling_done + \ifdim\d_transforms_scale_used_x_size>\d_transforms_scale_h_size + \global\d_transforms_scale_used_y_size\zeropoint + \global\d_transforms_scale_used_x_size\d_transforms_scale_h_size + \else\ifdim\d_transforms_scale_used_y_size>\d_transforms_scale_v_size + \global\d_transforms_scale_used_x_size\zeropoint + \global\d_transforms_scale_used_y_size\d_transforms_scale_v_size + \fi\fi + \transforms_scale_by_dimension} + +\def\transforms_scale_by_scale + {\edef\m_transforms_scale_temp{\p_scale\p_xscale\p_yscale}% + \ifx\m_transforms_scale_temp\empty \else + \transforms_scale_apply_scale\d_transforms_scale_used_x_size\d_transforms_scale_x_size\c_transforms_scale_used_x_scale\p_xscale + \transforms_scale_apply_scale\d_transforms_scale_used_y_size\d_transforms_scale_y_size\c_transforms_scale_used_y_scale\p_yscale + \global\d_transforms_scale_used_x_size\zeropoint + \global\d_transforms_scale_used_y_size\zeropoint + \ifx\p_maxwidth\empty + \ifx\p_maxheight\empty + \else + \ifdim\d_transforms_scale_y_size>\p_maxheight\relax + \global\d_transforms_scale_used_y_size\p_maxheight + \fi + \fi + \else + \ifdim\d_transforms_scale_x_size>\p_maxwidth\relax + \global\d_transforms_scale_used_x_size\p_maxwidth + \fi + \fi \fi} -\def\setscaleboxbyscale - {\doifsomething{\scaleparameter\c!scale\scaleparameter\c!xscale\scaleparameter\c!yscale} - {\doapplyscaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax\c!xscale - \doapplyscaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay\c!yscale - \global\scaleboxdimx\zeropoint - \global\scaleboxdimy\zeropoint - \doifelsenothing{\scaleparameter\c!maxwidth} - {\doifsomething{\scaleparameter\c!maxheight} - {\ifdim\scaleboxsizey>\scaleparameter\c!maxheight\relax - \global\scaleboxdimy\scaleparameter\c!maxheight - \fi}} - {\ifdim\scaleboxsizex>\scaleparameter\c!maxwidth\relax - \global\scaleboxdimx\scaleparameter\c!maxwidth - \fi}}} - -\def\setscaleboxbydimension - {\ifdim\scaleboxdimx>\zeropoint - \ifdim\scaleboxdimy>\zeropoint - \setscaleboxbydimension_a +\def\transforms_scale_by_dimension + {\ifdim\d_transforms_scale_used_x_size>\zeropoint + \ifdim\d_transforms_scale_used_y_size>\zeropoint + \transforms_scale_by_dimension_a \else - \setscaleboxbydimension_b + \transforms_scale_by_dimension_b \fi \else - \ifdim\scaleboxdimy>\zeropoint - \setscaleboxbydimension_c + \ifdim\d_transforms_scale_used_y_size>\zeropoint + \transforms_scale_by_dimension_c \else - \setscaleboxbydimension_d + \transforms_scale_by_dimension_d \fi \fi} -\def\setscaleboxbydimension_a - {\dosetdimensionscaleboxsize - {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay - \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}% - {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay - \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}% - {\docalculatescaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay - \docalculatescaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax}} - -\def\setscaleboxbydimension_b - {\dosetdimensionscaleboxsize - {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}% - {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}% - {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}} - -\def\setscaleboxbydimension_c - {\dosetdimensionscaleboxsize - {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}% - {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}% - {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}} - -\def\setscaleboxbydimension_d - {\dosetdimensionscaleboxsize - {\doapplyscaleboxscale\scaleboxdimx\scaleboxsizex\scaleboxscax\c!xscale - \doapplyscaleboxscale\scaleboxdimy\scaleboxsizey\scaleboxscay\c!yscale}% - {\docalculatescaleboxscales\scaleboxdimx\scaleboxsizex\scaleboxdimy\scaleboxsizey}% - {\docalculatescaleboxscales\scaleboxdimy\scaleboxsizey\scaleboxdimx\scaleboxsizex}} - -\def\dosetdimensionscaleboxsize#1#2#3% +\def\transforms_scale_by_dimension_a + {\transforms_scale_by_dimension_indeed + {\transforms_scale_calculate_scale\d_transforms_scale_used_y_size\d_transforms_scale_y_size\c_transforms_scale_used_y_scale + \transforms_scale_calculate_scale\d_transforms_scale_used_x_size\d_transforms_scale_x_size\c_transforms_scale_used_x_scale}% + {\transforms_scale_calculate_scale\d_transforms_scale_used_y_size\d_transforms_scale_y_size\c_transforms_scale_used_y_scale + \transforms_scale_calculate_scale\d_transforms_scale_used_x_size\d_transforms_scale_x_size\c_transforms_scale_used_x_scale}% + {\transforms_scale_calculate_scale\d_transforms_scale_used_y_size\d_transforms_scale_y_size\c_transforms_scale_used_y_scale + \transforms_scale_calculate_scale\d_transforms_scale_used_x_size\d_transforms_scale_x_size\c_transforms_scale_used_x_scale}} + +\def\transforms_scale_by_dimension_b + {\transforms_scale_by_dimension_indeed + {\transforms_scale_calculate_scales\d_transforms_scale_used_x_size\d_transforms_scale_x_size\d_transforms_scale_used_y_size\d_transforms_scale_y_size}% + {\transforms_scale_calculate_scales\d_transforms_scale_used_x_size\d_transforms_scale_x_size\d_transforms_scale_used_y_size\d_transforms_scale_y_size}% + {\transforms_scale_calculate_scales\d_transforms_scale_used_x_size\d_transforms_scale_x_size\d_transforms_scale_used_y_size\d_transforms_scale_y_size}} + +\def\transforms_scale_by_dimension_c + {\transforms_scale_by_dimension_indeed + {\transforms_scale_calculate_scales\d_transforms_scale_used_y_size\d_transforms_scale_y_size\d_transforms_scale_used_x_size\d_transforms_scale_x_size}% + {\transforms_scale_calculate_scales\d_transforms_scale_used_y_size\d_transforms_scale_y_size\d_transforms_scale_used_x_size\d_transforms_scale_x_size}% + {\transforms_scale_calculate_scales\d_transforms_scale_used_y_size\d_transforms_scale_y_size\d_transforms_scale_used_x_size\d_transforms_scale_x_size}} + +\def\transforms_scale_by_dimension_d + {\transforms_scale_by_dimension_indeed + {\transforms_scale_apply_scale\d_transforms_scale_used_x_size\d_transforms_scale_x_size\c_transforms_scale_used_x_scale\p_xscale + \transforms_scale_apply_scale\d_transforms_scale_used_y_size\d_transforms_scale_y_size\c_transforms_scale_used_y_scale\p_yscale}% + {\transforms_scale_calculate_scales\d_transforms_scale_used_x_size\d_transforms_scale_x_size\d_transforms_scale_used_y_size\d_transforms_scale_y_size}% + {\transforms_scale_calculate_scales\d_transforms_scale_used_y_size\d_transforms_scale_y_size\d_transforms_scale_used_x_size\d_transforms_scale_x_size}} + +\def\transforms_scale_by_dimension_indeed#1#2#3% {#1\relax - \doifsomething{\scaleparameter\c!maxwidth} - {\ifdim\scaleboxdimx>\scaleparameter\c!maxwidth\relax - \global\scaleboxdimx\scaleparameter\c!maxwidth - #2\relax - \fi}% - \doifsomething{\scaleparameter\c!maxheight} - {\ifdim\scaleboxdimy>\scaleparameter\c!maxheight\relax - \global\scaleboxdimy\scaleparameter\c!maxheight - #3\relax - \fi}} - -% \def\docalculatescaleboxnorm#1#2#3#4#5% 2 3 parameters (dodo:speedup) -% {\processaction -% [\scaleparameter#2] -% [ \v!max=>\global#1\dimexpr#4\relax, -% \v!fit=>\global#1\dimexpr#5\relax, -% \v!broad=>\global#1\dimexpr#5-4\@@exbodyfont\relax, -% \v!auto=>\doifsomething{\scaleparameter#3}{\global#1\dimexpr\scaleparameter#3\relax}, -% \s!default=>\doifsomething{\scaleparameter#3}{\global#1\dimexpr\scaleparameter#3\relax}, -% \s!unknown=>\global#1\dimexpr\scaleparameter#2\dimexpr\@@exbodyfont/10\relax\relax]} - -\def\docalculatescaleboxnorm#1#2% todo: swap 1 and 2 and pass one less - {\edef\askedscaleboxnorm{\scaleparameter#2}% - \csname\??ef:n:\ifcsname\??ef:n:\askedscaleboxnorm\endcsname - \askedscaleboxnorm\else\s!unknown - \fi\endcsname{#1}} - -\setvalue{\??ef:n:\v!max}#1#2#3#4% - {\global#1#3} - -\setvalue{\??ef:n:\v!fit}#1#2#3#4% - {\global#1#4} - -\setvalue{\??ef:n:\v!broad}#1#2#3#4% - {\global#1\dimexpr#4-4\@@exbodyfont\relax} - -\setvalue{\??ef:n:\s!unknown}#1#2#3#4% - {\global#1\dimexpr\askedscaleboxnorm\dimexpr\@@exbodyfont/10\relax\relax} - -\def\docalculatescaleboxnormauto#1#2#3#4% - {\edef\askedscaleboxnorm{\scaleparameter#2}% - \ifx\askedscaleboxnorm\empty\else\global#1\askedscaleboxnorm\fi} - -\letvalue{\??ef:n:\v!auto }\docalculatescaleboxnormauto -\letvalue{\??ef:n:\empty }\docalculatescaleboxnormauto -\letvalue{\??ef:n:\s!default}\docalculatescaleboxnormauto - -\def\docalculatescaleboxscales#1#2#3#4% + \ifx\p_maxwidth\empty \else + \ifdim\d_transforms_scale_used_x_size>\p_maxwidth\relax + \global\d_transforms_scale_used_x_size\p_maxwidth + #2\relax + \fi + \fi + \ifx\p_maxheight\empty \else + \ifdim\d_transforms_scale_used_y_size>\p_maxheight\relax + \global\d_transforms_scale_used_y_size\p_maxheight + #3\relax + \fi + \fi} + +\def\transforms_scale_calculate_norm#1#2% todo: swap 1 and 2 and pass one less + {\csname\??ef:n:\ifcsname\??ef:n:#2\endcsname#2\else\s!unknown\fi\endcsname#1#2} + +\setvalue{\??ef:n:\v!max }#1#2#3#4#5{\global#1#4} +\setvalue{\??ef:n:\v!fit }#1#2#3#4#5{\global#1#5} +\setvalue{\??ef:n:\v!broad }#1#2#3#4#5{\global#1\dimexpr#5-4\@@exbodyfont\relax} +\setvalue{\??ef:n:\s!unknown}#1#2#3#4#5{\global#1\dimexpr#2\dimexpr\@@exbodyfont/10\relax\relax} % brr ex +\setvalue{\??ef:n:\v!auto }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} +\setvalue{\??ef:n:\empty }#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} +\setvalue{\??ef:n:\s!default}#1#2#3#4#5{\ifx#3\empty\else\global#1#3\fi} + +\def\transforms_scale_calculate_scales#1#2#3#4% {\scratchdimen\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax - \scaleboxscax\scratchdimen - \scaleboxscay\scratchdimen - #3\dimexpr\scaleboxscax\dimexpr#4/\plusthousand\relax\relax} + \c_transforms_scale_used_x_scale\scratchdimen + \c_transforms_scale_used_y_scale\scratchdimen + #3\dimexpr\c_transforms_scale_used_x_scale\dimexpr#4/\plusthousand\relax\relax} -\def\docalculatescaleboxscale#1#2#3% +\def\transforms_scale_calculate_scale#1#2#3% {#3\dimexpr#1/\dimexpr#2/\plusthousand\relax\relax} -\def\doapplyscaleboxscale#1#2#3#4% $4 = parameter / scale can be empty - {\ifcase0\scaleparameter#4\relax - \ifcase0\scaleparameter\c!scale\relax +\def\transforms_scale_apply_scale#1#2#3#4% #4 = parameter / scale can be empty + {\ifcase0#4\relax + \ifcase0\p_scale\relax #3=\plusthousand \else - #3=\scaleparameter\c!scale + #3=\p_scale \fi \else - #3=\scaleparameter#4% + #3=#4% \fi \relax % important ! still ? \global#1\ifnum#3=\plusthousand#2\else\dimexpr#3\dimexpr#2/\plusthousand\relax\relax\fi \relax} -\def\doapplyscaleboxsize - {\doifelsenothing{\scaleparameter\c!maxheight} - {\scaleboxoutervsize\textheight - \ifinner - \scaleboxoutervsize \vsize % \textheight =\vsize - \scratchdimen\vsize % \scratchdimen=\textheight - \else\ifinsidefloat - \scaleboxoutervsize \vsize % \textheight =\vsize - \scratchdimen\vsize % \scratchdimen=\textheight - \else\ifinpagebody - \scaleboxoutervsize \vsize % \textheight =\vsize - \scratchdimen\vsize % \scratchdimen=\textheight - \else % hm, there should be an option to force this - \ifdim\pagegoal<\maxdimen - \ifdim\pagetotal<\pagegoal - \scratchdimen\dimexpr\pagegoal-\pagetotal\relax - \else - \scratchdimen\scaleboxoutervsize % \textheight - \fi - \else - \scratchdimen\scaleboxoutervsize % \textheight - \fi - \fi\fi\fi} - {\scratchdimen\scaleparameter\c!maxheight - \scaleboxoutervsize\scratchdimen}% - \doifelsenothing{\scaleparameter\c!height} - {\scaleboxvsize\scratchdimen} - {\scaleboxvsize\scaleparameter\c!height}% - \doifelsenothing{\scaleparameter\c!width} - {\scaleboxhsize\hsize} - {\scaleboxhsize\scaleparameter\c!width}} - -\def\convertscaleboxinsertscale#1#2#3#4% +\def\transforms_scale_apply_size + {\ifx\p_maxheight\empty + \d_transforms_scale_outer_v_size\textheight + \ifinner + \d_transforms_scale_outer_v_size \vsize % \textheight =\vsize + \scratchdimen\vsize % \scratchdimen=\textheight + \else\ifinsidefloat + \d_transforms_scale_outer_v_size \vsize % \textheight =\vsize + \scratchdimen\vsize % \scratchdimen=\textheight + \else\ifinpagebody + \d_transforms_scale_outer_v_size \vsize % \textheight =\vsize + \scratchdimen\vsize % \scratchdimen=\textheight + \else % hm, there should be an option to force this + \ifdim\pagegoal<\maxdimen + \ifdim\pagetotal<\pagegoal + \scratchdimen\dimexpr\pagegoal-\pagetotal\relax + \else + \scratchdimen\d_transforms_scale_outer_v_size % \textheight + \fi + \else + \scratchdimen\d_transforms_scale_outer_v_size % \textheight + \fi + \fi\fi\fi + \else + \scratchdimen\p_maxheight + \d_transforms_scale_outer_v_size\scratchdimen + \fi + \ifx\p_height\empty + \d_transforms_scale_v_size\scratchdimen + \else + \d_transforms_scale_v_size\p_height + \fi + \ifx\p_width\empty + \d_transforms_scale_h_size\hsize + \else + \d_transforms_scale_h_size\p_width + \fi} + +\def\transforms_scale_convert_large_scale#1#2#3#4% {\scratchdimen#1\relax \ifnum#3=\plusthousand % == scale 1 @@ -443,9 +491,11 @@ \edef#2{\the\scratchdimen}% \scratchcounter#3\relax \ifnum\scratchcounter>\plustenthousand - \divide\scratchcounter\!!ten \scratchdimen\the\scratchcounter\points + \divide\scratchcounter\plusten + \scratchdimen\the\scratchcounter\points \else - \scratchdimen\the\scratchcounter\points \divide\scratchdimen\!!ten + \scratchdimen\the\scratchcounter\points + \divide\scratchdimen\plusten \fi \edef#4{\withoutpt\the\scratchdimen}} @@ -454,28 +504,39 @@ % {\externalfigure[mill.png][frame=on,height=3cm,equalwidth=6cm]} {} % \stopcombination -\def\doscaleboxposition - {\doifsomething{\scaleparameter\c!equalwidth} - {\scratchdimen\scaleparameter\c!equalwidth\relax - \ifdim\wd\nextbox<\scratchdimen - \setbox\nextbox\hbox to \scratchdimen{\hss\box\nextbox\hss}% - \fi}% - \doifsomething{\scaleparameter\c!equalheight} - {\scratchdimen\scaleparameter\c!equalheight\relax - \ifdim\ht\nextbox<\scratchdimen - \setbox\nextbox\vbox to \scratchdimen{\vss\box\nextbox\vss}% - \fi}} - -\def\fastscale#1% - {\begingroup - \ifnum#1=1000\relax - \setfalse\scaleboxdone - \else - \settrue\scaleboxdone - \edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1pt/1000\relax}% - \let\finalscaleboxyscale\finalscaleboxxscale +\def\transforms_scale_position + {\ifx\p_equalwidth\empty \else + \scratchdimen\p_equalwidth\relax + \ifdim\d_transforms_scale_wd<\scratchdimen + \setbox\nextbox\hbox to \scratchdimen{\hss\box\nextbox\hss}% + \fi \fi - \dowithnextbox{\doscaleboxindeed\flushnextbox\endgroup}\hbox} + \ifx\p_equalheight\empty \else + \scratchdimen\p_equalheight\relax + \ifdim\d_transforms_scale_ht<\scratchdimen + \setbox\nextbox\vbox to \scratchdimen{\vss\box\nextbox\vss}% + \fi + \fi} + +\unexpanded\def\fastscale#1% + {\ifnum#1=1000\relax + \expandafter\transforms_fast_scale_nop + \else + \expandafter\transforms_fast_scale_yes + \fi{#1}} + +\def\transforms_fast_scale_nop#1% + {\hbox} + +\def\transforms_fast_scale_yes#1% + {\edef\finalscaleboxxscale{\withoutpt\the\dimexpr#1pt/1000\relax}% + \let\finalscaleboxyscale\finalscaleboxxscale + \dowithnextboxcs\transforms_fast_scale_finish\hbox} + +\def\transforms_fast_scale_finish + {\transforms_scale_apply + \box\nextbox + \endgroup} %D \macros %D {clip, setupclipping} @@ -511,66 +572,75 @@ \unexpanded\def\setupclipping {\dodoubleargument\getparameters[\??cp]} -\def\clip - {\dosingleempty\doclip} +\unexpanded\def\clip + {\dosingleempty\transforms_clip} -\def\doclip[#1]% nb top->bottom left->right +\def\transforms_clip[#1]% nb top->bottom left->right {\bgroup - \getparameters[\??cp][#1]% - \doifelse\@@cpstate\v!start\dodoclip{\egroup\hbox}} - -\def\dodoclip - {\dowithnextbox - {\ifdim\@@cpwidth>\zeropoint - \!!dimena\@@cpwidth - \!!dimenc\@@cphoffset - \else - \!!dimena\nextboxwd - \divide\!!dimena \@@cpnx - \!!dimenc\@@cpx\!!dimena - \advance\!!dimenc -\!!dimena - \!!dimena\@@cpsx\!!dimena - \fi - \relax % sure - \ifdim\@@cpheight>\zeropoint - \!!dimenb\@@cpheight - \!!dimend\nextboxht - \advance\!!dimend -\@@cpvoffset - \advance\!!dimend -\!!dimenb - \else - \!!dimenb\nextboxht - \divide\!!dimenb \@@cpny - \!!dimend-\@@cpy\!!dimenb - \advance\!!dimend -\@@cpsy\!!dimenb - \advance\!!dimend \!!dimenb - \!!dimenb\@@cpsy\!!dimenb - \advance\!!dimend \nextboxht % dimend ! - \fi - \setbox\nextbox\hbox % old - {\advance\!!dimenc -\@@cpleftoffset % new ! - \advance\!!dimend -\@@cpbottomoffset % new ! % - added - \hskip-\!!dimenc\lower\!!dimend\flushnextbox}% old - \nextboxwd\zeropoint - \nextboxht\zeropoint - \nextboxdp\zeropoint - \setbox\nextbox\hbox - {\advance\!!dimena \@@cpleftoffset % new ! - \advance\!!dimena \@@cprightoffset % new ! - \advance\!!dimenb \@@cpbottomoffset % new ! - \advance\!!dimenb \@@cptopoffset % new ! - \dostartclipping\@@cpmp\!!dimena\!!dimenb % old - \flushnextbox - \dostopclipping}% - \setbox\nextbox\hbox % new ! - {\!!dimena-\@@cpleftoffset % new ! - \!!dimenb \@@cpbottomoffset % new ! % - removed - \hskip\!!dimena\lower\!!dimenb\flushnextbox}% new ! - \nextboxwd\!!dimena - \nextboxht\!!dimenb - \nextboxdp\zeropoint - \flushnextbox - \egroup}% - \hbox} + \iffirstargument + \getparameters[\??cp][#1]% + \fi + \dowithnextboxcs\transforms_clip_finish\hbox} + +\def\transforms_clip_finish + {\doifelse\@@cpstate\v!start + \transforms_clip_yes_finish + \transforms_clip_nop_finish} + +\def\transforms_clip_yes_finish + {\ifdim\@@cpwidth>\zeropoint + \!!dimena\@@cpwidth + \!!dimenc\@@cphoffset + \else + \!!dimena\wd\nextbox + \divide\!!dimena \@@cpnx + \!!dimenc\@@cpx\!!dimena + \advance\!!dimenc -\!!dimena + \!!dimena\@@cpsx\!!dimena + \fi + \relax % sure + \ifdim\@@cpheight>\zeropoint + \!!dimenb\@@cpheight + \!!dimend\ht\nextbox + \advance\!!dimend -\@@cpvoffset + \advance\!!dimend -\!!dimenb + \else + \!!dimenb\ht\nextbox + \divide\!!dimenb \@@cpny + \!!dimend-\@@cpy\!!dimenb + \advance\!!dimend -\@@cpsy\!!dimenb + \advance\!!dimend \!!dimenb + \!!dimenb\@@cpsy\!!dimenb + \advance\!!dimend \ht\nextbox % dimend ! + \fi + \setbox\nextbox\hbox % old + {\advance\!!dimenc -\@@cpleftoffset % new ! + \advance\!!dimend -\@@cpbottomoffset % new ! % - added + \hskip-\!!dimenc\lower\!!dimend\flushnextbox}% old + \wd\nextbox\zeropoint + \ht\nextbox\zeropoint + \dp\nextbox\zeropoint + \setbox\nextbox\hbox + {\advance\!!dimena \@@cpleftoffset % new ! + \advance\!!dimena \@@cprightoffset % new ! + \advance\!!dimenb \@@cpbottomoffset % new ! + \advance\!!dimenb \@@cptopoffset % new ! + \dostartclipping\@@cpmp\!!dimena\!!dimenb % old + \box\nextbox + \dostopclipping}% + \setbox\nextbox\hbox % new ! + {\!!dimena-\@@cpleftoffset % new ! + \!!dimenb \@@cpbottomoffset % new ! % - removed + \hskip\!!dimena\lower\!!dimenb\flushnextbox}% new ! + \wd\nextbox\!!dimena + \ht\nextbox\!!dimenb + \dp\nextbox\zeropoint + \box\nextbox + \egroup} + +\def\transforms_clip_nop_finish + {\box\nextbox + \egroup} \setupclipping [\c!state=\v!start, @@ -605,26 +675,21 @@ %D \stopbuffer %D %D \typebuffer \getbuffer - -%D Mirroring. -\def\domirrorbox % \hbox/\vbox/\vtop - {\bgroup - \dowithnextbox - {\dontshowcomposition - \scratchdimen\nextboxwd - % better use an hbox (if no \forgetall, leftskip etc may creep in) - %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}% - \setbox\nextbox\hbox{\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}% - \nextboxwd\scratchdimen - \flushnextbox - \egroup}} +%D Mirroring. \unexpanded\def\mirror - {\domirrorbox\hbox} - -% \setbox0=\hbox{gans} -% \ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}} -% \mirror{\ruledhbox{\copy0 \schaal{\box0}}} + {\bgroup + \dowithnextboxcs\transforms_mirror_finish\hbox} + +\def\transforms_mirror_finish + {\dontshowcomposition + \scratchdimen\wd\nextbox + % better use an hbox (if no \forgetall, leftskip etc may creep in) + %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\wd\nextbox\flushnextbox\dostopmirroring}% + \setbox\nextbox\hbox{\dostartmirroring\hskip-\wd\nextbox\flushnextbox\dostopmirroring}% + \wd\nextbox\scratchdimen + \box\nextbox + \egroup} \protect \endinput |