From 5142daa13e19b32afa064863e039da3afaf06e83 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 27 Nov 2019 03:01:12 +0000 Subject: CTAN sync 201911270301 --- macros/latex/contrib/l3backend/l3backend-pdf.dtx | 531 +---------------------- 1 file changed, 1 insertion(+), 530 deletions(-) (limited to 'macros/latex/contrib/l3backend/l3backend-pdf.dtx') diff --git a/macros/latex/contrib/l3backend/l3backend-pdf.dtx b/macros/latex/contrib/l3backend/l3backend-pdf.dtx index 832b835c10..ad4d3028ac 100644 --- a/macros/latex/contrib/l3backend/l3backend-pdf.dtx +++ b/macros/latex/contrib/l3backend/l3backend-pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2019-11-25} % % \maketitle % @@ -232,535 +232,6 @@ % In \texttt{dvips}, annotations have to be constructed manually. As such, % we need the object code above for some definitions. % -% \begin{macro}{pdf.globaldict} -% A small global dictionary for backend use. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - true ~ setglobal ~ - /pdf.globaldict ~ 4 ~ dict ~ def ~ - false ~ setglobal - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% pdf.cvs , -% pdf.dvi.pt , -% pdf.pt.dvi , -% pdf.rect.ht -% } -% Small utilities for PostScript manipulations. Conversion to DVI dimensions -% is done here to allow for |Resolution|. The total height of a rectangle -% (an array) needs a little maths, in contrast to simply extracting a value. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.cvs { 65534 ~ string ~ cvs } def - /pdf.dvi.pt { 72.27 ~ mul ~ Resolution ~ div } def - /pdf.pt.dvi { 72.27 ~ div ~ Resolution ~ mul } def - /pdf.rect.ht { dup ~ 1 ~ get ~ neg ~ exch ~ 3 ~ get ~ add } def - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{pdf.linkmargin, pdf.linkdp.pad, pdf.linkht.pad} -% Settings which are defined up-front in |SDict|. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.linkmargin { 1 ~ pdf.pt.dvi } def - /pdf.linkdp.pad { 0 } def - /pdf.linkht.pad { 0 } def - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% pdf.rect , -% pdf.save.ll , -% pdf.save.ur , -% pdf.save.linkll , -% pdf.save.linkur , -% pdf.llx , -% pdf.lly , -% pdf.urx , -% pdf.ury -% } -% Functions for marking the limits of an annotation/link, plus drawing the -% border. We separate links for generic annotations to support adding a -% margin and setting a minimal size. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.rect - { /Rect [ pdf.llx ~ pdf.lly ~ pdf.urx ~ pdf.ury ] } def - /pdf.save.ll - { - currentpoint - /pdf.lly ~ exch ~ def - /pdf.llx ~ exch ~ def - } - def - /pdf.save.ur - { - currentpoint - /pdf.ury ~ exch ~ def - /pdf.urx ~ exch ~ def - } - def - /pdf.save.linkll - { - currentpoint ~ - pdf.linkmargin ~ add ~ - pdf.linkdp.pad ~ add - /pdf.lly ~ exch ~ def ~ - pdf.linkmargin ~ sub - /pdf.llx ~ exch ~ def - } - def - /pdf.save.linkur - { - currentpoint ~ - pdf.linkmargin ~ sub ~ - pdf.linkht.pad ~ sub - /pdf.ury ~ exch ~ def ~ - pdf.linkmargin ~ add - /pdf.urx ~ exch ~ def - } - def - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% pdf.dest.anchor , -% pdf.dest.x , -% pdf.dest.y , -% pdf.dest.point , -% pdf.dest2device , -% pdf.dev.x , -% pdf.dev.y , -% pdf.tmpa , -% pdf.tmpb , -% pdf.tmpc , -% pdf.tmpd -% } -% For finding the anchor point of a destination link. We make the use case -% a separate function as it comes up a lot, and as this makes it easier to -% adjust if we need additional effects. We also need a more complex approach -% to convert a co-ordinate pair correctly when defining a rectangle: this -% can otherwise be out when using a landscape page. (Thanks to Alexander -% Grahn for the approach here.) -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.dest.anchor - { - currentpoint ~ exch ~ - pdf.dvi.pt ~ 72 ~ add ~ - /pdf.dest.x ~ exch ~ def ~ - pdf.dvi.pt ~ - vsize ~ 72 ~ sub ~ exch ~ sub ~ - /pdf.dest.y ~ exch ~ def - } - def - /pdf.dest.point - { pdf.dest.x ~ pdf.dest.y } def - /pdf.dest2device - { - /pdf.dest.y ~ exch ~ def - /pdf.dest.x ~ exch ~ def ~ - matrix ~ currentmatrix ~ - matrix ~ defaultmatrix ~ - matrix ~ invertmatrix ~ - matrix ~ concatmatrix ~ - cvx ~ exec - /pdf.dev.y ~ exch ~ def - /pdf.dev.x ~ exch ~ def - /pdf.tmpd ~ exch ~ def - /pdf.tmpc ~ exch ~ def - /pdf.tmpb ~ exch ~ def - /pdf.tmpa ~ exch ~ def ~ - pdf.dest.x ~ pdf.tmpa ~ mul ~ - pdf.dest.y ~ pdf.tmpc ~ mul ~ add ~ - pdf.dev.x ~ add ~ - pdf.dest.x ~ pdf.tmpb ~ mul ~ - pdf.dest.y ~ pdf.tmpd ~ mul ~ add ~ - pdf.dev.y ~ add - } - def - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% pdf.bordertracking , -% pdf.bordertracking.begin , -% pdf.bordertracking.end , -% pdf.leftboundary , -% pdf.rightboundary , -% pdf.brokenlink.rect , -% pdf.brokenlink.skip , -% pdf.brokenlink.dict , -% pdf.bordertracking.endpage , -% pdf.bordertracking.continue , -% pdf.originx , -% pdf.originy -% } -% To know where a breakable link can go, we need to track the boundary -% rectangle. That can be done by hooking into |a| and |x| operations: -% those names have to be retained. The boundary is stored at the end of -% the operation. Special effort is needed at the start and end of pages -% (or rather galleys), such that everything works properly. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.bordertracking ~ false ~ def - /pdf.bordertracking.begin - { - SDict ~ /pdf.bordertracking ~ true ~ put ~ - SDict ~ /pdf.leftboundary ~ undef ~ - SDict ~ /pdf.rightboundary ~ undef ~ - /a ~ where - { - /a - { - currentpoint ~ pop ~ - SDict /pdf.rightboundary ~ known ~ dup - { - SDict /pdf.rightboundary ~ get ~ 2 ~ index ~ lt - { not } - if - } - if - { pop } - { SDict ~ exch /pdf.rightboundary ~ exch ~ put } - ifelse ~ - moveto ~ - currentpoint ~ pop ~ - SDict /pdf.leftboundary ~ known ~ dup - { - SDict /pdf.leftboundary ~ get ~ 2 ~ index ~ gt - { not } - if - } - if - { pop } - { SDict ~ exch /pdf.leftboundary ~ exch ~ put } - ifelse - } - put - } - if - } - def - /pdf.bordertracking.end - { - /a ~ where { /a { moveto } put } if - /x ~ where { /x { 0 ~ exch ~ rmoveto } put } if ~ - SDict /pdf.leftboundary ~ known - { pdf.outerbox ~ 0 ~ pdf.leftboundary ~ put } - if ~ - SDict /pdf.rightboundary ~ known - { pdf.outerbox ~ 2 ~ pdf.rightboundary ~ put } - if ~ - SDict /pdf.bordertracking ~ false ~ put - } - def - /pdf.bordertracking.endpage - { - pdf.bordertracking - { - pdf.bordertracking.end ~ - true ~ setglobal ~ - pdf.globaldict - /pdf.brokenlink.rect [ pdf.outerbox ~ aload ~ pop ] put ~ - pdf.globaldict - /pdf.brokenlink.skip ~ pdf.baselineskip ~ put ~ - pdf.globaldict - /pdf.brokenlink.dict ~ - pdf.link.dict ~ pdf.cvs ~ put ~ - false ~ setglobal ~ - mark ~ pdf.link.dict ~ cvx ~ exec ~ /Rect - [ - pdf.llx ~ - pdf.lly ~ - pdf.outerbox ~ 2 ~ get ~ pdf.linkmargin ~ add ~ - currentpoint ~ exch ~ pop ~ - pdf.outerbox ~ pdf.rect.ht ~ sub ~ pdf.linkmargin ~ sub - ] - /ANN ~ pdf.pdfmark - } - if - } - def - /pdf.bordertracking.continue - { - /pdf.link.dict ~ pdf.globaldict - /pdf.brokenlink.dict ~ get ~ def - /pdf.outerbox ~ pdf.globaldict - /pdf.brokenlink.rect ~ get ~ def - /pdf.baselineskip ~ pdf.globaldict - /pdf.brokenlink.skip ~ get ~ def ~ - pdf.globaldict ~ dup ~ dup - /pdf.brokenlink.dict ~ undef - /pdf.brokenlink.skip ~ undef - /pdf.brokenlink.rect ~ undef ~ - currentpoint - /pdf.originy ~ exch ~ def - /pdf.originx ~ exch ~ def - /a ~ where - { - /a - { - moveto ~ - SDict ~ - begin ~ - currentpoint ~ pdf.originy ~ ne ~ exch ~ - pdf.originx ~ ne ~ or - { - pdf.save.linkll - /pdf.lly ~ - pdf.lly ~ pdf.outerbox ~ 1 ~ get ~ sub ~ def ~ - pdf.bordertracking.begin - } - if ~ - end - } - put - } - if - /x ~ where - { - /x - { - 0 ~ exch ~ rmoveto ~ - SDict~ - begin ~ - currentpoint ~ - pdf.originy ~ ne ~ exch ~ pdf.originx ~ ne ~ or - { - pdf.save.linkll - /pdf.lly ~ - pdf.lly ~ pdf.outerbox ~ 1 ~ get ~ sub ~ def ~ - pdf.bordertracking.begin - } - if ~ - end - } - put - } - if - } - def - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% pdf.breaklink , -% pdf.breaklink.write , -% pdf.count , -% pdf.currentrect -% } -% Dealing with link breaking itself has multiple stage. The first step is to -% find the |Rect| entry in the dictionary, looping over key--value pairs. -% The first line is handled first, adjusting the rectangle to stay inside the -% text area. The second phase is a loop over the height of the bulk of the -% link area, done on the basis of a number of baselines. Finally, the end of -% the link area is tidied up, again from the boundary of the text area. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.breaklink - { - pop ~ - counttomark ~ 2 ~ mod ~ 0 ~ eq - { - counttomark /pdf.count ~ exch ~ def - { - pdf.count ~ 0 ~ eq { exit } if ~ - counttomark ~ 2 ~ roll ~ - 1 ~ index ~ /Rect ~ eq - { - dup ~ 4 ~ array ~ copy ~ - dup ~ dup ~ - 1 ~ get ~ - pdf.outerbox ~ pdf.rect.ht ~ - pdf.linkmargin ~ 2 ~ mul ~ add ~ sub ~ - 3 ~ exch ~ put ~ - dup ~ - pdf.outerbox ~ 2 ~ get ~ - pdf.linkmargin ~ add ~ - 2 ~ exch ~ put ~ - dup ~ dup ~ - 3 ~ get ~ - pdf.outerbox ~ pdf.rect.ht ~ - pdf.linkmargin ~ 2 ~ mul ~ add ~ add ~ - 1 ~ exch ~ put - /pdf.currentrect ~ exch ~ def ~ - pdf.breaklink.write - { - pdf.currentrect ~ - dup ~ - pdf.outerbox ~ 0 ~ get ~ - pdf.linkmargin ~ sub ~ - 0 ~ exch ~ put ~ - dup ~ - pdf.outerbox ~ 2 ~ get ~ - pdf.linkmargin ~ add ~ - 2 ~ exch ~ put ~ - dup ~ dup ~ - 1 ~ get ~ - pdf.baselineskip ~ add ~ - 1 ~ exch ~ put ~ - dup ~ dup ~ - 3 ~ get ~ - pdf.baselineskip ~ add ~ - 3 ~ exch ~ put ~ - /pdf.currentrect ~ exch ~ def ~ - pdf.breaklink.write - } - 1 ~ index ~ 3 ~ get ~ - pdf.linkmargin ~ 2 ~ mul ~ add ~ - pdf.outerbox ~ pdf.rect.ht ~ add ~ - 2 ~ index ~ 1 ~ get ~ sub ~ - pdf.baselineskip ~ div ~ round ~ cvi ~ 1 ~ sub ~ - exch ~ - repeat ~ - pdf.currentrect ~ - dup ~ - pdf.outerbox ~ 0 ~ get ~ - pdf.linkmargin ~ sub ~ - 0 ~ exch ~ put ~ - dup ~ dup ~ - 1 ~ get ~ - pdf.baselineskip ~ add ~ - 1 ~ exch ~ put ~ - dup ~ dup ~ - 3 ~ get ~ - pdf.baselineskip ~ add ~ - 3 ~ exch ~ put ~ - dup ~ 2 ~ index ~ 2 ~ get ~ 2 ~ exch ~ put - /pdf.currentrect ~ exch ~ def ~ - pdf.breaklink.write ~ - SDict /pdf.pdfmark.good ~ false ~ put ~ - exit - } - { pdf.count ~ 2 ~ sub /pdf.count ~ exch ~ def } - ifelse - } - loop - } - if - /ANN - } - def - /pdf.breaklink.write - { - counttomark ~ 1 ~ sub ~ - index /_objdef ~ eq - { - counttomark ~ -2 ~ roll ~ - dup ~ wcheck ~ - { - readonly ~ - counttomark ~ 2 ~ roll - } - { pop ~ pop } - ifelse - } - if ~ - counttomark ~ 1 ~ add ~ copy ~ - pop ~ pdf.currentrect - /ANN ~ pdfmark - } - def - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% pdf.pdfmark , -% pdf.pdfmark.good , -% pdf.outerbox , -% pdf.baselineskip , -% pdf.pdfmark.dict -% } -% The business end of breaking links starts by hooking into |pdfmarks|. -% Unlike \pkg{hypdvips}, we avoid altering any links we have not created -% by using a copy of the core |pdfmarks| function. Only mark types which -% are known are altered. At present, this is purely |ANN| marks, which are -% measured relative to the size of the baseline skip. If they are -% more than one apparent line high, breaking is applied. -% \begin{macrocode} -\__kernel_backend_postscript_header:n - { - /pdf.pdfmark - { - SDict /pdf.pdfmark.good ~ true ~ put ~ - dup /ANN ~ eq - { - pdf.pdfmark.store ~ - pdf.pdfmark.dict ~ - begin ~ - Subtype /Link ~ eq ~ - currentdict /Rect ~ known ~ and ~ - SDict /pdf.outerbox ~ known ~ and ~ - SDict /pdf.baselineskip ~ known ~ and ~ - { - Rect ~ 3 ~ get ~ - pdf.linkmargin ~ 2 ~ mul ~ add ~ - pdf.outerbox ~ pdf.rect.ht ~ add ~ - Rect ~ 1 ~ get ~ sub ~ - pdf.baselineskip ~ div ~ round ~ cvi ~ 0 ~ gt - { pdf.breaklink } - if - } - if ~ - end ~ - SDict /pdf.outerbox ~ undef ~ - SDict /pdf.baselineskip ~ undef ~ - currentdict /pdf.pdfmark.dict ~ undef ~ - } - if ~ - pdf.pdfmark.good - { pdfmark } - { cleartomark } - ifelse - } - def - /pdf.pdfmark.store - { - /pdf.pdfmark.dict ~ 65534 ~ dict ~ def ~ - counttomark ~ 1 ~ add ~ copy ~ - pop - { - dup ~ mark ~ eq - { - pop ~ - exit - } - { - pdf.pdfmark.dict ~ - begin ~ def ~ end - } - ifelse - } - loop - } - def - } -% \end{macrocode} -% \end{macro} -% % \begin{variable}{\l_@@_backend_content_box} % The content of an annotation. % \begin{macrocode} -- cgit v1.2.3