From 4a122e841f3364247bde8965fe0a2830f20c696b Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sun, 26 Mar 2017 21:47:25 +0000
Subject: ocgx2 (26mar17)

git-svn-id: svn://tug.org/texlive/trunk@43608 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty | 132 +++++++++++++++++-----------
 1 file changed, 81 insertions(+), 51 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty')

diff --git a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty
index 2654ce7309c..5654fc279fe 100644
--- a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty
+++ b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty
@@ -37,8 +37,8 @@
 \RequirePackage{xparse}
 \RequirePackage{l3keys2e}
 
-\def\g@ocgxii@date@tl{2017/03/23}
-\def\g@ocgxii@version@tl{0.21}
+\def\g@ocgxii@date@tl{2017/03/26}
+\def\g@ocgxii@version@tl{0.22}
 
 \ProvidesExplPackage{ocgx2}{\g@ocgxii@date@tl}{\g@ocgxii@version@tl}
 {ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx}
@@ -50,7 +50,7 @@
   \iow_now:Nx\@mainaux{
     \token_to_str:N\providecommand\token_to_str:N\ocgxii@newkey[2]{}
     \token_to_str:N\providecommand
-      \token_to_str:N\ocgxii@stack@on@page[2]{}
+      \token_to_str:N\ocgxii@ocg@stack@on@page[2]{}
   }
 }
 
@@ -134,16 +134,6 @@
 \sys_if_engine_xetex:T{\bool_gset_true:N\g_ocgxii_dvipdfmx_bool}
 
 \RequirePackage{ocgbase} %also loads pdfbase.sty
-\msg_set:nnnn{ocgx2}{support~outdated}{
-  Support~package~`#1'~too~old.
-}{
-  Get~an~up~to~date~version~of~`#1'.\\
-  Aborting.
-}
-\@ifpackagelater{pdfbase}{2017/03/23}{}{
-  \msg_error:nnn{xsavebox}{support~outdated}{pdfbase.sty}
-  \tex_endinput:D
-}
 
 %re-implement ocg-p's `ocg' environment
 \DeclareDocumentEnvironment{ocg}{O{}mmm}{
@@ -215,7 +205,7 @@
     }
     \tl_gset:cx{ocgx2.ocg.#3}{\tl_use:c{ocgxii@#3}}
     \ocgbase_ocgstack_push:n{\tl_use:c{ocgxii@#3}}
-    \ocgxii_ocgstack_shipout:N\g_ocgbase_ocgstack_seq
+    \ocgxii_stack_shipout:NN\ocgxii@ocg@stack@on@page\g_ocgbase_ocgstack_seq
   \group_end:
   \ocgbase_oc_bdc:n{\tl_use:c{ocgxii@#3}}
   \ignorespaces
@@ -236,7 +226,7 @@
     \seq_gpop_left:NN\g_ocgxii_nested_seq\l_trash_tl
   }
   \ocgbase_ocgstack_pop:N\l_trash_tl
-  \ocgxii_ocgstack_shipout:N\g_ocgbase_ocgstack_seq
+  \ocgxii_stack_shipout:NN\ocgxii@ocg@stack@on@page\g_ocgbase_ocgstack_seq
   \bool_gset_false:N\g_ocgxii_nestedB_bool
   \bool_gset_true:N\g_ocgxii_nestedE_bool
 }
@@ -245,14 +235,15 @@
 \bool_new:N\g_ocgxii_nestedE_bool % nested OCG end
 \seq_new:N\g_ocgxii_nested_seq % for keeping track of parent OCGs
 
-\cs_new_nopar:Nn\ocgxii_ocgstack_shipout:N{
+\cs_new_nopar:Nn\ocgxii_stack_shipout:NN{
   \iow_shipout_x:Nx\@mainaux{
-    \token_to_str:N\ocgxii@stack@on@page{
+    \token_to_str:N#1{
       \exp_not:N\int_use:N\g_ocgxii_page_int
-    }{\seq_use:Nn#1{,}}
+    }{\seq_use:Nn#2{,}}
   }
 }
-\cs_new_nopar:Npn\ocgxii@stack@on@page#1#2{
+
+\cs_new_nopar:Npn\ocgxii@ocg@stack@on@page#1#2{
   \seq_gset_from_clist:cn{g_pending_ocgs_on_#1_seq}{#2}
   %re-add braces around items for dvips
   \bool_if:nT{\sys_if_output_dvi_p: && !\g_ocgxii_dvipdfmx_bool}{
@@ -262,10 +253,44 @@
     }
   }
 }
-\ocgxii@stack@on@page{0}{} %initialize
+\ocgxii@ocg@stack@on@page{0}{} %initialize
+
+\cs_new_nopar:Npn\ocgxii@lnkcol@stack@on@page#1#2{
+  \seq_gset_from_clist:cn{g_pending_lnkcols_on_#1_seq}{#2}
+}
+\ocgxii@lnkcol@stack@on@page{0}{} %initialize
 
 %end-of-page action
 \pbs_eop_action:n{
+  \seq_if_exist:cT{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}{
+    %check whether end-of-page link colour stack has settled
+    \iow_shipout:Nx\@mainaux{
+      \token_to_str:N\ocgxii@newkey{ocgx2.oldlnkcol.\int_use:N\g_ocgxii_page_int}{
+        \seq_use:cn{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}{,}
+      }
+    }
+    \bool_if:nT{
+      !\cs_if_exist:cTF{ocgx2.oldlnkcol.\int_use:N\g_ocgxii_page_int}{
+        \str_if_eq_x_p:nn{
+          \tl_use:c{ocgx2.oldlnkcol.\int_use:N\g_ocgxii_page_int}
+        }{
+          \seq_use:cn{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}{,}
+        }
+      }{
+        \c_false_bool
+      }
+    }{
+      \tl_if_exist:NF\g_ocgxii_rerunwarned_tl{
+        \tl_new:N\g_ocgxii_rerunwarned_tl
+        \AtEndDocument{\msg_warning:nn{ocgx2}{rerun}}
+      }
+    }
+    % now close the colourlink opened last
+    \seq_get:cNT{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}\l_tmpa_tl{
+      \tl_gset:Nx\ocgxii@ocgcolor{{\l_tmpa_tl}}
+      \ocgxii_colorlink_end:
+    }
+  }
   %check whether end-of-page ocg stack has settled
   \iow_shipout:Nx\@mainaux{
     \token_to_str:N\ocgxii@newkey{ocgx2.oldstack.\int_use:N\g_ocgxii_page_int}{
@@ -291,27 +316,25 @@
   %now close pending ocgs
   \seq_map_variable:cNn{
     g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq
-  }\l_ocgxii_arg_tl{
-    \str_if_eq_x:nnTF{\l_ocgxii_arg_tl}{(ocglink)}{
-      \ocgxii_colorlink_end:
-    }{
-      \ocgbase_oc_emc:
-    }
-  }
+  }\l_tmpb_tl{\ocgbase_oc_emc:}
 }
 
 %begin-of-page action (to output box background)
 \pbs_bop_action:n{
-  % re-open pending ocgs
-  \seq_set_eq:Nc\l_ocgxii_temp_seq{
+  % re-open all pending ocgs in original order
+  \seq_set_eq:Nc\l_ocgxii_pending_ocgs_seq{
     g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq
   }
-  \seq_reverse:N\l_ocgxii_temp_seq
-  \seq_map_variable:NNn\l_ocgxii_temp_seq\l_ocgxii_arg_tl{
-    \str_if_eq_x:nnTF{\l_ocgxii_arg_tl}{(ocglink)}{
+  \seq_reverse:N\l_ocgxii_pending_ocgs_seq
+  \seq_map_variable:NNn\l_ocgxii_pending_ocgs_seq\l_tmpa_tl{
+    \ocgbase_oc_bdc:n{\l_tmpa_tl}
+  }
+  % re-open the colourlink opened last
+  \seq_if_exist:cT{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}{
+    \seq_gset_eq:Nc\g_ocgxii_lnk_color_seq{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}
+    \seq_get:NNT\g_ocgxii_lnk_color_seq\l_tmpa_tl{
+      \tl_gset:Nx\ocgxii@ocgcolor{{\l_tmpa_tl}}
       \ocgxii_colorlink_begin:
-    }{
-      \ocgbase_oc_bdc:n{\l_ocgxii_arg_tl}
     }
   }
   \int_gincr:N\g_ocgxii_page_int
@@ -324,6 +347,14 @@
       g_pending_ocgs_on_\int_eval:n{\g_ocgxii_page_int-\c_one}_seq
     }
   }
+  %the same for link colour stack
+  \seq_if_exist:cF{g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq}{
+    \seq_gset_eq:cc{
+      g_pending_lnkcols_on_\int_use:c{g_ocgxii_page_int}_seq
+    }{
+      g_pending_lnkcols_on_\int_eval:n{\g_ocgxii_page_int-\c_one}_seq
+    }
+  }
 }
 \int_new:N\g_ocgxii_page_int %abs. page counter
 
@@ -651,6 +682,9 @@
 }{
   % pdftex,luatex,xetex,dvipdfmx:
   % ocgcolorlinks that extend over line and page breaks
+
+  \seq_new:N\g_ocgxii_lnk_color_seq %stack of colours of currently open links
+
   \cs_new_nopar:Nn\ocgxii_enable_ocglinks:{
     \def\Hy@colorlink##1{
       \ifx\Hy@setbreaklinks\@gobble
@@ -659,14 +693,14 @@
         \Hy@breaklinkstrue
       \fi
       \ifHy@breaklinks
-        \seq_if_in:NnT\g_ocgbase_ocgstack_seq{(ocglink)}{
-          \msg_error:nn{ocgx2}{nested~breakable~ocgcolorlinks}
+        \seq_get_left:NNT\g_ocgxii_lnk_color_seq\l_tmpa_tl{
+          \tl_gset_eq:NN\ocgxii@ocgcolor\l_tmpa_tl
+          \ocgxii_colorlink_end:
         }
-        \ocgbase_ocgstack_push:n{(ocglink)}
-        \ocgxii_ocgstack_shipout:N\g_ocgbase_ocgstack_seq
         \begingroup
-        \gdef\ocgxii@ocgcolor{##1}
         \ocgxii_colorlink_begin:
+        \seq_gpush:Nx\g_ocgxii_lnk_color_seq{{##1}}
+        \ocgxii_stack_shipout:NN\ocgxii@lnkcol@stack@on@page\g_ocgxii_lnk_color_seq
       \else
         \begingroup
         \def\ocgxii@ocgcolor{##1}
@@ -675,10 +709,15 @@
     }
     \def\Hy@endcolorlink{
       \ifHy@breaklinks
+        \seq_gpop:NN\g_ocgxii_lnk_color_seq\l_tmpa_tl
+        \tl_gset_eq:NN\ocgxii@ocgcolor\l_tmpa_tl
+        \ocgxii_stack_shipout:NN\ocgxii@lnkcol@stack@on@page\g_ocgxii_lnk_color_seq
         \ocgxii_colorlink_end:
-        \ocgbase_ocgstack_pop:N\l_trash_tl
-        \ocgxii_ocgstack_shipout:N\g_ocgbase_ocgstack_seq
         \endgroup
+        \seq_get_left:NNT\g_ocgxii_lnk_color_seq\l_tmpa_tl{
+          \tl_gset_eq:NN\ocgxii@ocgcolor\l_tmpa_tl
+          \ocgxii_colorlink_begin:
+        }
       \else
         \color@endgroup\egroup
         \mbox{
@@ -717,7 +756,7 @@
   }
 }
 
-\bool_if:nT\l_ocgxii_ocgcolorlinks_bool{
+\bool_if:NT\l_ocgxii_ocgcolorlinks_bool{
   \@ifpackageloaded{hyperref}{
     \Hy@colorlinkstrue
     \Hy@AtBeginDocument{
@@ -732,15 +771,6 @@
   }
 }
 
-\msg_set:nnn{ocgx2}{nested~breakable~ocgcolorlinks}{
-  Breakable~OCG~color-links~cannot~be~nested.~Sorry.\\\\
-  Put\\\\
-  \space\space\string\hypersetup{breaklinks=false}...
-  \string\hypersetup{breaklinks=true}\\\\
-  around~the~outermost~of~a~group~of~nested~links.
-}
-\def\ocgxii@ocgcolor{{black}}
-
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 % tikz related code follows (to be enabled with package option `tikz')
-- 
cgit v1.2.3

