[latex3-commits] [git/LaTeX3-latex3-latex3] master: Support for PDF destinations (c2bc113)

Joseph Wright joseph.wright at morningstar2.co.uk
Fri Apr 26 09:15:16 CEST 2019


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/c2bc113ca2927465ce51e5d5759afe7e78f8f2bf

>---------------------------------------------------------------

commit c2bc113ca2927465ce51e5d5759afe7e78f8f2bf
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Fri Apr 26 08:10:06 2019 +0100

    Support for PDF destinations


>---------------------------------------------------------------

c2bc113ca2927465ce51e5d5759afe7e78f8f2bf
 l3kernel/l3drivers-pdf.dtx              |  122 ++++++++++++++++++++++++++++++-
 l3kernel/l3drivers.dtx                  |   20 +++++
 l3kernel/testfiles/m3expl001.luatex.tlg |    1 +
 l3kernel/testfiles/m3expl001.ptex.tlg   |    1 +
 l3kernel/testfiles/m3expl001.tlg        |    1 +
 l3kernel/testfiles/m3expl001.uptex.tlg  |    1 +
 l3kernel/testfiles/m3expl001.xetex.tlg  |    1 +
 l3kernel/testfiles/m3expl003.ptex.tlg   |    1 +
 l3kernel/testfiles/m3expl003.tlg        |    1 +
 l3kernel/testfiles/m3expl003.uptex.tlg  |    1 +
 l3kernel/testfiles/m3expl003.xetex.tlg  |    1 +
 11 files changed, 149 insertions(+), 2 deletions(-)

diff --git a/l3kernel/l3drivers-pdf.dtx b/l3kernel/l3drivers-pdf.dtx
index f5340ff..6ff59a5 100644
--- a/l3kernel/l3drivers-pdf.dtx
+++ b/l3kernel/l3drivers-pdf.dtx
@@ -216,8 +216,9 @@
 % \begin{macro}
 %   {
 %     driver.cvs     ,
-%     driver.rect.ht ,
-%     driver.pt.dvi
+%     driver.dvi.pt  ,
+%     driver.pt.dvi  ,
+%     driver.rect.ht
 %   }
 %   Small utilities for PostScript manipulations. Conversion to DVI dimensions
 %   is done here to allow for |Resolution|. The total height of a rectangle
@@ -226,6 +227,7 @@
 \@@_postscript_header:n
   {
     /driver.cvs { 65534 ~ string ~ cvs } def
+    /driver.dvi.pt { 72.27 ~ mul ~ Resolution ~ div } def
     /driver.pt.dvi { 72.27 ~ div ~ Resolution ~ mul } def
     /driver.rect.ht { dup ~ 1 ~ get ~ neg ~ exch ~ 3 ~ get ~ add } def
   }
@@ -300,6 +302,35 @@
 %
 % \begin{macro}
 %   {
+%     driver.dest.anchor ,
+%     driver.dest.x      ,
+%     driver.dest.y      ,
+%     driver.dest.point
+%   }
+%   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.
+%    \begin{macrocode}
+\@@_postscript_header:n
+  {
+    /driver.dest.anchor
+      {
+        currentpoint ~ exch ~
+        driver.dvi.pt ~ 72 ~ add ~
+        /driver.dest.x ~ exch ~ def ~
+        driver.dvi.pt ~
+        vsize ~ 72 ~ sub ~ sub ~
+        /driver.dest.y ~ exch ~ def ~
+      }
+        def
+    /driver.dest.point
+      { driver.dest.x ~ driver.dest.y } def
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+%   {
 %     driver.bordertracking          ,
 %     driver.bordertracking.begin    ,
 %     driver.bordertracking.end      ,
@@ -1015,6 +1046,38 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\driver_pdf_destination:nn}
+%   Here, we need to turn the zoom into a scale. We also need to know where
+%   the current anchor point actually is: worked out in PostScript.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_destination:nn #1#2
+  {
+    \@@_postscript:n { driver.dest.anchor }
+    \@@_pdfmark:x
+      {
+        /View
+        [
+          \str_case:nnF {#2}
+            {
+              { xyz }   { /XYZ ~ driver.dest.point ~ null }
+              { fit }   { /Fit }
+              { fitb }  { /FitB }
+              { fitbh } { /FitBH }
+              { fitbv } { /FitBV ~ driver.dest.x }
+              { fith }  { /FitH ~ driver.dest.y }
+              { fitv }  { /FitV ~ driver.dest.x }
+            }
+            {
+              /XYZ ~ driver.dest.point ~ \fp_eval:n { (#2) / 100 }
+            }
+        ]
+        /Dest ( \exp_not:n {#1} ) cvn
+        /DEST
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Structure}
 %
 % \begin{macro}{\driver_pdf_compresslevel:n}
@@ -1159,6 +1222,33 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\driver_pdf_destination:nn}
+%   A simple task: pass the data to the primitive. The |\scan_stop:| deals
+%   with the danger of an unterminated keyword. The zoom given here is a
+%   percentage, but we need to pass it as \emph{per mille}.
+%    \begin{macrocode}
+\cs_new_protected:Npx \driver_pdf_destination:nn #1#2
+  {
+    \cs_if_exist:NTF \tex_pdfextension:D
+      { \exp_not:N \tex_pdfextension:D dest ~ }
+      { \exp_not:N \tex_pdfdest:D }
+        name {#1}
+        \exp_not:N \str_case:nnF {#2}
+          {
+            { xyz }   { xyz }
+            { fit }   { fit }
+            { fitb }  { fitb }
+            { fitbh } { fitbh }
+            { fitbv } { fitbv }
+            { fith }  { fith }
+            { fitv }  { fitv }
+          }
+          { xyz ~ zoom \exp_not:N \fp_eval:n { #2 * 10 } }
+        \scan_stop:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Catalogue entries}
 %
 % \begin{macro}{\driver_pdf_catalog_gput:nn}
@@ -1579,6 +1669,34 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\driver_pdf_destination:nn}
+%   Here, we need to turn the zoom into a scale.
+%   A little translation
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_destination:nn #1#2
+  {
+    \@@_pdf:x
+      {
+        dest ~ ( \exp_not:n {#1} )
+        [
+          @thispage
+          \str_case:nnF {#2}
+            {
+              { xyz }   { /XYZ ~ @xpos ~ @ypos ~ null }
+              { fit }   { /Fit }
+              { fitb }  { /FitB }
+              { fitbh } { /FitBH }
+              { fitbv } { /FitBV ~ @xpos }
+              { fith }  { /FitH ~ @ypos }
+              { fitv }  { /FitV ~ @xpos }
+            }
+            { /XYZ ~ @xpos ~ @ypos ~ \fp_eval:n { (#2) / 100 } }
+        ]
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Structure}
 %
 % \begin{macro}{\driver_pdf_compresslevel:n}
diff --git a/l3kernel/l3drivers.dtx b/l3kernel/l3drivers.dtx
index 1e7ebc9..56f2d0c 100644
--- a/l3kernel/l3drivers.dtx
+++ b/l3kernel/l3drivers.dtx
@@ -518,6 +518,26 @@
 %   \texttt{dvips} the scope is managed at the PostScript level.
 % \end{function}
 %
+% \begin{function}[added = 2019-04-26]{\driver_pdf_destination:nn}
+%   \begin{syntax}
+%     \cs{\driver_pdf_destination:nn} \Arg{name} \Arg{action}
+%   \end{syntax}
+%   Creates a destination (anchor) called \meta{name} and which will carry
+%   out one of the \meta{actions}
+%   \begin{itemize}
+%     \item \texttt{xyz} Move to the current anchor point
+%     \item \texttt{\meta{scale}} As for \texttt{xyz}, but also sets the
+%       view \meta{scale}
+%     \item \texttt{fit} Fit the page in the window
+%     \item \texttt{fitb} Fit the bounding box of the page
+%     \item \texttt{fitbh} Fit the height of the bounding box of the page
+%     \item \texttt{fitbv} Fit the width of the bounding box of the page
+%     \item \texttt{fith} Fit the height of the page
+%     \item \texttt{fitv} Fit the width of the page
+%   \end{itemize}
+%   A \meta{scale} of zero is equivalent to \texttt{xyz}.
+% \end{function}
+%
 % \subsection{PDF Catalogue entries}
 %
 % \begin{function}[added = 2019-04-25]{\driver_pdf_catalogue_gput:nn}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index 7431817..b3908ec 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -6472,6 +6472,7 @@ Defining \__driver_pdf_link_begin:nnnw on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_catalog_gput:nn on line ...
 Defining \g__driver_pdf_object_prop on line ...
 Defining \driver_pdf_object_new:nn on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 03d8f45..63869c8 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -6532,6 +6532,7 @@ Defining \__driver_pdf_link_begin:n on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_objects_enable: on line ...
 Defining \driver_pdf_objects_disable: on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index adf3170..01165d9 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -6813,6 +6813,7 @@ Defining \__driver_pdf_link_begin:nnnw on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_catalog_gput:nn on line ...
 Defining \g__driver_pdf_object_prop on line ...
 Defining \driver_pdf_object_new:nn on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index f1c2a44..ff7d0c7 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -6829,6 +6829,7 @@ Defining \__driver_pdf_link_begin:n on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_objects_enable: on line ...
 Defining \driver_pdf_objects_disable: on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index dfed322..1f1a10b 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -6508,6 +6508,7 @@ Defining \__driver_pdf_link_begin:n on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_objects_enable: on line ...
 Defining \driver_pdf_objects_disable: on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 03d8f45..63869c8 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -6532,6 +6532,7 @@ Defining \__driver_pdf_link_begin:n on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_objects_enable: on line ...
 Defining \driver_pdf_objects_disable: on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index adf3170..01165d9 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -6813,6 +6813,7 @@ Defining \__driver_pdf_link_begin:nnnw on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_catalog_gput:nn on line ...
 Defining \g__driver_pdf_object_prop on line ...
 Defining \driver_pdf_object_new:nn on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index f1c2a44..ff7d0c7 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -6829,6 +6829,7 @@ Defining \__driver_pdf_link_begin:n on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_objects_enable: on line ...
 Defining \driver_pdf_objects_disable: on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index dfed322..1f1a10b 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -6508,6 +6508,7 @@ Defining \__driver_pdf_link_begin:n on line ...
 Defining \driver_pdf_link_end: on line ...
 Defining \driver_pdf_link_last: on line ...
 Defining \driver_pdf_link_margin:n on line ...
+Defining \driver_pdf_destination:nn on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_objects_enable: on line ...
 Defining \driver_pdf_objects_disable: on line ...





More information about the latex3-commits mailing list