[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