From 0209e5442903faee5ca69343e8ad8d35a2ac4cd4 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 26 Nov 2019 21:35:55 +0000 Subject: l3backend (26nov19) git-svn-id: svn://tug.org/texlive/trunk@52928 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md | 14 +- Master/texmf-dist/doc/latex/l3backend/README.md | 2 +- .../doc/latex/l3backend/l3backend-code.pdf | Bin 740224 -> 742409 bytes .../doc/latex/l3backend/l3backend-code.tex | 3 +- .../texmf-dist/dvips/l3backend/l3backend-dvips.pro | 402 +++++++++++++++ .../source/latex/l3backend/l3backend-basics.dtx | 26 +- .../source/latex/l3backend/l3backend-box.dtx | 2 +- .../source/latex/l3backend/l3backend-color.dtx | 2 +- .../source/latex/l3backend/l3backend-draw.dtx | 2 +- .../source/latex/l3backend/l3backend-graphics.dtx | 2 +- .../source/latex/l3backend/l3backend-header.dtx | 574 +++++++++++++++++++++ .../source/latex/l3backend/l3backend-pdf.dtx | 531 +------------------ .../source/latex/l3backend/l3backend.ins | 4 + .../tex/latex/l3backend/l3backend-dvips.def | 412 +-------------- 14 files changed, 1007 insertions(+), 969 deletions(-) create mode 100644 Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro create mode 100644 Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx (limited to 'Master') diff --git a/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md b/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md index 36f2fe987e9..a009da31d9c 100644 --- a/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md +++ b/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md @@ -6,42 +6,42 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] -## [2019-10-11] +## [2019-11-25] ### Changed +- Move dvips header material to `.pro` file + +## [2019-10-11] +### Changed - Improved functionality in generic mode ## [2019-09-05] ### Added - - Support for EPS and PDF files with `dvisvgm` backend ### Fixed - - Some primitive use in the `dvips` backend ## [2019-08-25] ### Fixed - - Setting for PDF version in `dvipdfmx` route - Support for PDF objects with XeTeX ## [2019-07-01] ### Added - - Driver support for anonymous objects ### Changed - - Moved backend code to separate release module `l3backend` - Include `l3backend` in file names - Moved backend code to internal for each 'parent' module -[Unreleased]: https://github.com/latex3/latex3/compare/2019-10-11...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2019-11-25...HEAD +[2019-11-25]: https://github.com/latex3/latex3/compare/2019-10-11...2019-11-25 [2019-10-11]: https://github.com/latex3/latex3/compare/2019-09-05...2019-10-11 [2019-09-05]: https://github.com/latex3/latex3/compare/2019-08-25...2019-09-05 [2019-08-25]: https://github.com/latex3/latex3/compare/2019-07-01...2019-08-25 diff --git a/Master/texmf-dist/doc/latex/l3backend/README.md b/Master/texmf-dist/doc/latex/l3backend/README.md index fb3c01febda..5b0a2c39213 100644 --- a/Master/texmf-dist/doc/latex/l3backend/README.md +++ b/Master/texmf-dist/doc/latex/l3backend/README.md @@ -1,7 +1,7 @@ LaTeX3 Backend Drivers ====================== -Release 2019-10-11 +Release 2019-11-25 This package forms parts of `expl3`, and contains the code used to interface with backends (drivers) across the `expl3` codebase. The functions here are diff --git a/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf b/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf index 218d64d794a..e767cdc4e20 100644 Binary files a/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf and b/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf differ diff --git a/Master/texmf-dist/doc/latex/l3backend/l3backend-code.tex b/Master/texmf-dist/doc/latex/l3backend/l3backend-code.tex index 62a6bf5e2a0..55dce66e1fc 100644 --- a/Master/texmf-dist/doc/latex/l3backend/l3backend-code.tex +++ b/Master/texmf-dist/doc/latex/l3backend/l3backend-code.tex @@ -43,7 +43,8 @@ for those people who are interested. l3backend-color.dtx , l3backend-draw.dtx , l3backend-graphics.dtx , - l3backend-pdf.dtx + l3backend-pdf.dtx , + l3backend-header.dtx } \ExplSyntaxOff diff --git a/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro b/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro new file mode 100644 index 00000000000..2c38fbf536f --- /dev/null +++ b/Master/texmf-dist/dvips/l3backend/l3backend-dvips.pro @@ -0,0 +1,402 @@ +%% +%% This is file `l3backend-dvips.pro', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% l3backend-header.dtx (with options: `header,dvips') +%% +%% Copyright (C) 1990-2019 The LaTeX3 Project +%% +%% It may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License (LPPL), either version 1.3c of +%% this license or (at your option) any later version. The latest +%% version of this license is in the file: +%% +%% https://www.latex-project.org/lppl.txt +%% +%% This file is part of the "l3backend bundle" (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% File: l3backend-header.dtx +true setglobal +/pdf.globaldict 4 dict def +false setglobal + +/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 +/pdf.linkmargin { 1 pdf.pt.dvi } def +/pdf.linkdp.pad { 0 } def +/pdf.linkht.pad { 0 } def +/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 +/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 +/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 +/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 +/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 of file `l3backend-dvips.pro'. diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx index 3bb240f1e6d..2ac78b51da7 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2019-11-25} % % \maketitle % @@ -151,25 +151,15 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\__kernel_backend_postscript_header:n} -% PostScript for the header: a small saving but makes the code clearer. -% This is held until the start of shipout such that a document with no -% actual output does not write anything. +% PostScript for the header: a small saving but makes the code clearer. +% This is held until the start of shipout such that a document with no +% actual output does not write anything. % \begin{macrocode} -\cs_new_protected:Npx \__kernel_backend_postscript_header:n #1 -%<*initex> - { \__kernel_backend_literal:n { ! #1 } } -% -%<*package> - { - \cs_if_exist:NTF \AtBeginDvi - { \exp_not:N \AtBeginDvi } - { \use:n } - { \__kernel_backend_literal:n { ! #1 } } - } -% +\cs_if_exist:NTF \AtBeginDvi + { \exp_not:N \AtBeginDvi } + { \use:n } + { \__kernel_backend_literal:n { header = l3backend-dvips.pro } } % \end{macrocode} -% \end{macro} % % \begin{macro} % { diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx index 651537398dd..0b37cbb157e 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2019-11-25} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx index 4bf4b1a0d94..efc778a3bc4 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2019-11-25} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx index fcbf889d5f6..dafdf6a43be 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2019-11-25} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx index 5ed22d54fa0..9b0943d478a 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-10-11} +% \date{Released 2019-11-25} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx new file mode 100644 index 00000000000..b1f2495c792 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx @@ -0,0 +1,574 @@ +% \iffalse meta-comment +% +%% File: l3backend-header.dtx +% +% Copyright (C) 2019 The LaTeX3 Project +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% https://www.latex-project.org/lppl.txt +% +% This file is part of the "l3backend bundle" (The Work in LPPL) +% and all files in that bundle must be distributed together. +% +% ----------------------------------------------------------------------- +% +% The development version of the bundle can be found at +% +% https://github.com/latex3/latex3 +% +% for those people who are interested. +% +%<*driver> +\documentclass[full,kernel]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +% +% \fi +% +% \title{^^A +% The \textsf{l3backend-header} package\\ Backend graphics support^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2019-11-25} +% +% \maketitle +% +% \begin{documentation} +% +% \end{documentation} +% +% \begin{implementation} +% +% \section{\pkg{l3backend-header} Implementation} +% +% \begin{macrocode} +%<*dvips&header> +% \end{macrocode} +% +% \begin{macro}{pdf.globaldict} +% A small global dictionary for backend use. +% \begin{macrocode} +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} + +/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} +/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} +/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} +/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} +/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} +/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} +/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{macrocode} +% +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx index 832b835c107..ad4d3028ac7 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx +++ b/Master/texmf-dist/source/latex/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} diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend.ins b/Master/texmf-dist/source/latex/l3backend/l3backend.ins index 149f08b9ee8..1a92aade188 100644 --- a/Master/texmf-dist/source/latex/l3backend/l3backend.ins +++ b/Master/texmf-dist/source/latex/l3backend/l3backend.ins @@ -77,6 +77,10 @@ and all files in that bundle must be distributed together. \from{l3backend-graphics.dtx}{package,dvips} \from{l3backend-pdf.dtx} {package,dvips} } + \file{l3backend-dvips.pro} + { + \from{l3backend-header.dtx} {header,dvips} + } } \generate { diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def index 1fa2e583b95..e4690c5f2b0 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def @@ -37,13 +37,10 @@ \cs_new_protected:Npn \__kernel_backend_postscript:n #1 { \__kernel_backend_literal:n { ps: SDict ~ begin ~ #1 ~ end } } \cs_generate_variant:Nn \__kernel_backend_postscript:n { x } -\cs_new_protected:Npx \__kernel_backend_postscript_header:n #1 - { - \cs_if_exist:NTF \AtBeginDvi - { \exp_not:N \AtBeginDvi } - { \use:n } - { \__kernel_backend_literal:n { ! #1 } } - } +\cs_if_exist:NTF \AtBeginDvi + { \exp_not:N \AtBeginDvi } + { \use:n } + { \__kernel_backend_literal:n { header = l3backend-dvips.pro } } \cs_new_protected:Npn \__kernel_backend_align_begin: { \__kernel_backend_literal:n { ps::[begin] } @@ -514,407 +511,6 @@ \cs_generate_variant:Nn \__pdf_backend_object_now:nn { nx } \cs_new:Npn \__pdf_backend_object_last: { { pdf.obj \int_use:N \g__pdf_backend_object_int } } -\__kernel_backend_postscript_header:n - { - true ~ setglobal ~ - /pdf.globaldict ~ 4 ~ dict ~ def ~ - false ~ setglobal - } -\__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 - } -\__kernel_backend_postscript_header:n - { - /pdf.linkmargin { 1 ~ pdf.pt.dvi } def - /pdf.linkdp.pad { 0 } def - /pdf.linkht.pad { 0 } def - } -\__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 - } -\__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 - } -\__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 - } -\__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 - } -\__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 - } \box_new:N \l__pdf_backend_content_box \box_new:N \l__pdf_backend_model_box \int_new:N \g__pdf_backend_annotation_int -- cgit v1.2.3