summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3backend
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-11-27 03:01:12 +0000
committerNorbert Preining <norbert@preining.info>2019-11-27 03:01:12 +0000
commit5142daa13e19b32afa064863e039da3afaf06e83 (patch)
treed8299dbf426b9b0e6cafacc4cbe5a6a762bf28a9 /macros/latex/contrib/l3backend
parentbd1c54bb99e58d8c140acb0b0a536037f96349b4 (diff)
CTAN sync 201911270301
Diffstat (limited to 'macros/latex/contrib/l3backend')
-rw-r--r--macros/latex/contrib/l3backend/CHANGELOG.md14
-rw-r--r--macros/latex/contrib/l3backend/README.md2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-basics.dtx26
-rw-r--r--macros/latex/contrib/l3backend/l3backend-box.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-code.pdfbin740224 -> 742409 bytes
-rw-r--r--macros/latex/contrib/l3backend/l3backend-code.tex3
-rw-r--r--macros/latex/contrib/l3backend/l3backend-color.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-draw.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-graphics.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-header.dtx574
-rw-r--r--macros/latex/contrib/l3backend/l3backend-pdf.dtx531
-rw-r--r--macros/latex/contrib/l3backend/l3backend.ins4
12 files changed, 601 insertions, 561 deletions
diff --git a/macros/latex/contrib/l3backend/CHANGELOG.md b/macros/latex/contrib/l3backend/CHANGELOG.md
index 36f2fe987e..a009da31d9 100644
--- a/macros/latex/contrib/l3backend/CHANGELOG.md
+++ b/macros/latex/contrib/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/macros/latex/contrib/l3backend/README.md b/macros/latex/contrib/l3backend/README.md
index fb3c01febd..5b0a2c3921 100644
--- a/macros/latex/contrib/l3backend/README.md
+++ b/macros/latex/contrib/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/macros/latex/contrib/l3backend/l3backend-basics.dtx b/macros/latex/contrib/l3backend/l3backend-basics.dtx
index 3bb240f1e6..2ac78b51da 100644
--- a/macros/latex/contrib/l3backend/l3backend-basics.dtx
+++ b/macros/latex/contrib/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 } }
-%</initex>
-%<*package>
- {
- \cs_if_exist:NTF \AtBeginDvi
- { \exp_not:N \AtBeginDvi }
- { \use:n }
- { \__kernel_backend_literal:n { ! #1 } }
- }
-%</package>
+\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/macros/latex/contrib/l3backend/l3backend-box.dtx b/macros/latex/contrib/l3backend/l3backend-box.dtx
index 651537398d..0b37cbb157 100644
--- a/macros/latex/contrib/l3backend/l3backend-box.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-10-11}
+% \date{Released 2019-11-25}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-code.pdf b/macros/latex/contrib/l3backend/l3backend-code.pdf
index 218d64d794..e767cdc4e2 100644
--- a/macros/latex/contrib/l3backend/l3backend-code.pdf
+++ b/macros/latex/contrib/l3backend/l3backend-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3backend/l3backend-code.tex b/macros/latex/contrib/l3backend/l3backend-code.tex
index 62a6bf5e2a..55dce66e1f 100644
--- a/macros/latex/contrib/l3backend/l3backend-code.tex
+++ b/macros/latex/contrib/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/macros/latex/contrib/l3backend/l3backend-color.dtx b/macros/latex/contrib/l3backend/l3backend-color.dtx
index 4bf4b1a0d9..efc778a3bc 100644
--- a/macros/latex/contrib/l3backend/l3backend-color.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-10-11}
+% \date{Released 2019-11-25}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-draw.dtx b/macros/latex/contrib/l3backend/l3backend-draw.dtx
index fcbf889d5f..dafdf6a43b 100644
--- a/macros/latex/contrib/l3backend/l3backend-draw.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-draw.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-10-11}
+% \date{Released 2019-11-25}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-graphics.dtx b/macros/latex/contrib/l3backend/l3backend-graphics.dtx
index 5ed22d54fa..9b0943d478 100644
--- a/macros/latex/contrib/l3backend/l3backend-graphics.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-graphics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2019-10-11}
+% \date{Released 2019-11-25}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-header.dtx b/macros/latex/contrib/l3backend/l3backend-header.dtx
new file mode 100644
index 0000000000..b1f2495c79
--- /dev/null
+++ b/macros/latex/contrib/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}
+%</driver>
+% \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}
+%</dvips&header>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
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}
diff --git a/macros/latex/contrib/l3backend/l3backend.ins b/macros/latex/contrib/l3backend/l3backend.ins
index 149f08b9ee..1a92aade18 100644
--- a/macros/latex/contrib/l3backend/l3backend.ins
+++ b/macros/latex/contrib/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
{