[tex-k] dvips: 'fun' with translation combined with scaling/rotation

Joseph Wright joseph.wright at morningstar2.co.uk
Sun Mar 4 16:39:28 CET 2018


On 04/03/2018 15:25, Joseph Wright wrote:
> Hello all,
> 
> I've run into an oddity with dvips: this might well be 'user error' but 
> I'd appreciate any insight.
> 
> What I'm trying to do is set up box transformations inside a 'drawing' 
> environment. The aim is to avoid using a completely raw special (ps:: 
> <matrix> concat) as that is opaque to the driver and means it looses 
> hyperlinks and the like. I can get it all working *provided* I don't 
> have any translation applied.
> 
> In the following example, you only get the result I was expecting if you 
> set \shiftmatrixtrue and \rotateandscalefalse, i.e. do everything in one 
> matrix operation. If you split the shift of the box out then an 'extra' 
> displacement pops up. It seems that the transformation (either 
> rotation/scaling or matrix-based) is applied to the kern which is 
> *before* the operations. You see the same effect if you add a y-shift 
> (moving the box up/down), and with a pure scaling (so no rotation at all).
> 
> The same general approach works as-expected with (x)dvipdfmx, where 
> again we have scaling/rotation but no driver-tracked transformation (cf. 
> pdfTeX), so I don't think I have the kern in the obviously-wrong place.
> 
> I suspect I'm missing a save/restore or similar: any ideas?
> 
> Joseph
> 
>      \newif\ifshiftmatrix
>      \shiftmatrixtrue
>      \newif\ifrotateandscale
>      \rotateandscalefalse
> 
>      \setbox0=\hbox{%
>        \special{ps::[begin]}% Line up with TeX current point
>        \special{ps::/ox currentpoint /oy exch def def}% Save the origin
>        \special{ps::@beginspecial}% Get scale and axis 'into line'
>        \special{ps::0 0 moveto}%              (0cm,0cm)
>        \special{ps::85.04045 0 lineto}%       (3cm,0cm)
>        \special{ps::28.3468 0 moveto}%        (1cm,0cm}
>        \special{ps::28.3468 56.69363 lineto}% (1cm,2cm)
>        \special{ps::stroke}%
>        \special{ps::newpath}%
>        \hbox to 0pt{%
>          \ifshiftmatrix\else\kern 1cm \fi
>          \special{ps::save}%
>          \ifrotateandscale
>            % Singular value decomposition of [1 2 1 1]
>            \special{ps::58.28253 rotate}%
>            \special{ps::2.61803 -0.38197 scale}%
>            \special{ps::-31.71747 rotate}%
>          \else
>            \ifshiftmatrix
>              \special{ps::[1 2 1 1 28.3468 0] concat}%
>            \else
>              \special{ps::[1 2 1 1 0 0] concat}%
>            \fi
>          \fi
>        % The next three lines get us 'back' to the TeX origin
>          \special{ps::72 Resolution div 72 VResolution div neg scale}%
>          \special{ps::magscale {1 DVImag div dup scale} if}%
>          \special{ps::ox neg oy neg translate}%
>          \special{ps::[end]}%
>          \hbox to 0pt{Hello\hss}%
>          \special{ps::[begin]}%
>          \special{ps::restore}%
>          \hss
>        }%
>        \special{ps::@endspecial}% Tidy up
>        \special{ps::[end]}%
>      }%
>      \wd0=3cm %
>      \ht0=2cm %
>      \box0 %
> 
>      world
> 
>      \bye

Oh, I should add that the "world" at the end deals with a second oddity: 
depending on the exact set up of scaling/rotation, something goes odd 
and the entire page is landscape.

Joseph


More information about the tex-k mailing list