<div><div dir="auto">I don’t think dvips supports what you are trying to do.  </div><div dir="auto"><br></div><div dir="auto">I’m also not sure what you are trying to accomplish.  Can you clarify?</div><div dir="auto"><br></div><div dir="auto">-tom</div><br><div class="gmail_quote"><div>On Sun, Mar 4, 2018 at 11:14 PM Joseph Wright <<a href="mailto:joseph.wright@morningstar2.co.uk">joseph.wright@morningstar2.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 04/03/2018 15:39, Joseph Wright wrote:<br>
> On 04/03/2018 15:25, Joseph Wright wrote:<br>
>> Hello all,<br>
>><br>
>> I've run into an oddity with dvips: this might well be 'user error'<br>
>> but I'd appreciate any insight.<br>
>><br>
>> What I'm trying to do is set up box transformations inside a 'drawing'<br>
>> environment. The aim is to avoid using a completely raw special (ps::<br>
>> <matrix> concat) as that is opaque to the driver and means it looses<br>
>> hyperlinks and the like. I can get it all working *provided* I don't<br>
>> have any translation applied.<br>
>><br>
>> In the following example, you only get the result I was expecting if<br>
>> you set \shiftmatrixtrue and \rotateandscalefalse, i.e. do everything<br>
>> in one matrix operation. If you split the shift of the box out then an<br>
>> 'extra' displacement pops up. It seems that the transformation (either<br>
>> rotation/scaling or matrix-based) is applied to the kern which is<br>
>> *before* the operations. You see the same effect if you add a y-shift<br>
>> (moving the box up/down), and with a pure scaling (so no rotation at<br>
>> all).<br>
>><br>
>> The same general approach works as-expected with (x)dvipdfmx, where<br>
>> again we have scaling/rotation but no driver-tracked transformation<br>
>> (cf. pdfTeX), so I don't think I have the kern in the obviously-wrong<br>
>> place.<br>
>><br>
>> I suspect I'm missing a save/restore or similar: any ideas?<br>
>><br>
>> Joseph<br>
>><br>
>>      \newif\ifshiftmatrix<br>
>>      \shiftmatrixtrue<br>
>>      \newif\ifrotateandscale<br>
>>      \rotateandscalefalse<br>
>><br>
>>      \setbox0=\hbox{%<br>
>>        \special{ps::[begin]}% Line up with TeX current point<br>
>>        \special{ps::/ox currentpoint /oy exch def def}% Save the origin<br>
>>        \special{ps::@beginspecial}% Get scale and axis 'into line'<br>
>>        \special{ps::0 0 moveto}%              (0cm,0cm)<br>
>>        \special{ps::85.04045 0 lineto}%       (3cm,0cm)<br>
>>        \special{ps::28.3468 0 moveto}%        (1cm,0cm}<br>
>>        \special{ps::28.3468 56.69363 lineto}% (1cm,2cm)<br>
>>        \special{ps::stroke}%<br>
>>        \special{ps::newpath}%<br>
>>        \hbox to 0pt{%<br>
>>          \ifshiftmatrix\else\kern 1cm \fi<br>
>>          \special{ps::save}%<br>
>>          \ifrotateandscale<br>
>>            % Singular value decomposition of [1 2 1 1]<br>
>>            \special{ps::58.28253 rotate}%<br>
>>            \special{ps::2.61803 -0.38197 scale}%<br>
>>            \special{ps::-31.71747 rotate}%<br>
>>          \else<br>
>>            \ifshiftmatrix<br>
>>              \special{ps::[1 2 1 1 28.3468 0] concat}%<br>
>>            \else<br>
>>              \special{ps::[1 2 1 1 0 0] concat}%<br>
>>            \fi<br>
>>          \fi<br>
>>        % The next three lines get us 'back' to the TeX origin<br>
>>          \special{ps::72 Resolution div 72 VResolution div neg scale}%<br>
>>          \special{ps::magscale {1 DVImag div dup scale} if}%<br>
>>          \special{ps::ox neg oy neg translate}%<br>
>>          \special{ps::[end]}%<br>
>>          \hbox to 0pt{Hello\hss}%<br>
>>          \special{ps::[begin]}%<br>
>>          \special{ps::restore}%<br>
>>          \hss<br>
>>        }%<br>
>>        \special{ps::@endspecial}% Tidy up<br>
>>        \special{ps::[end]}%<br>
>>      }%<br>
>>      \wd0=3cm %<br>
>>      \ht0=2cm %<br>
>>      \box0 %<br>
>><br>
>>      world<br>
>><br>
>>      \bye<br>
><br>
> Oh, I should add that the "world" at the end deals with a second oddity:<br>
> depending on the exact set up of scaling/rotation, something goes odd<br>
> and the entire page is landscape.<br>
><br>
> Joseph<br>
<br>
It occurs to me that the dvipdfmx comparison is likely misleading: in<br>
the latter, rotation and scaling is covered by driver-specific specials,<br>
but for dvips only 'raw' PostScipt is available.<br>
<br>
However, the core question remains: what is it that leads the<br>
transformation to apply to kerns/box shifts *before* it is inserted?<br>
(And indeed, what exactly determines the scope of the transformation.)<br>
If the answer is 'it just is', I can adjust by working out the requested<br>
shifts allowing for the subsequent transformation. But I'd like to be<br>
sure it's entirely predictable, at least.<br>
<br>
Joseph<br>
</blockquote></div></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>--  <a href="http://cube20.org/" target="_blank">http://cube20.org/</a>  --  <a href="http://golly.sf.net/" target="_blank">http://golly.sf.net/</a>  --</div></div></div></div></div>