From 254466162ae9104e0cfcf532852bb6738cc88ca2 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 23 Mar 2017 21:29:19 +0000 Subject: ocgx2 (23mar17) git-svn-id: svn://tug.org/texlive/trunk@43587 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/ocgx2/ocgbase.sty | 5 +- Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty | 213 +++++++++++++++++++------- 2 files changed, 156 insertions(+), 62 deletions(-) (limited to 'Master/texmf-dist/tex/latex/ocgx2') diff --git a/Master/texmf-dist/tex/latex/ocgx2/ocgbase.sty b/Master/texmf-dist/tex/latex/ocgx2/ocgbase.sty index 0b43c9e0e9b..5b1872cd213 100644 --- a/Master/texmf-dist/tex/latex/ocgx2/ocgbase.sty +++ b/Master/texmf-dist/tex/latex/ocgx2/ocgbase.sty @@ -94,7 +94,6 @@ % The Current Maintainer of this work is A. Grahn. \RequirePackage{expl3} -\RequirePackage{atenddvi} \RequirePackage{pdfbase} \def\g@ocgbase@date@tl{2017/03/16} @@ -107,7 +106,7 @@ \seq_new:N\g_ocgbase_ocgorder_seq \seq_new:N\g_ocgbase_offocgs_seq -\AtEndDvi{ +\pbs_at_end_dvi:n{ \tl_if_empty:NF\g_ocgbase_ocgs_tl{ %global OCG array \pbs_pdfobj:nnn{}{array}{\g_ocgbase_ocgs_tl} @@ -295,7 +294,7 @@ \cs_new_nopar:Nn\ocgbase_ocgstack_pop:N{\seq_gpop:NN\g_ocgbase_ocgstack_seq#1} %get top OCG on stack, without removing it \cs_new_nopar:Nn\ocgbase_ocgstack_top:{ - \seq_item:Nn\g_ocgbase_ocgstack_seq{c_one}} + \seq_item:Nn\g_ocgbase_ocgstack_seq{\c_one}} %command that inserts /OC <> entry; %for use within annotation/xobject dicts diff --git a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty index 76c57f22d2b..2654ce7309c 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/16} -\def\g@ocgxii@version@tl{0.20} +\def\g@ocgxii@date@tl{2017/03/23} +\def\g@ocgxii@version@tl{0.21} \ProvidesExplPackage{ocgx2}{\g@ocgxii@date@tl}{\g@ocgxii@version@tl} {ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} @@ -46,6 +46,22 @@ %creating global definitions \cs_new:Npn\ocgxii@newkey#1#2{\tl_gset:cx{#1}{#2}} +\AtBeginDocument{ + \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]{} + } +} + +\msg_set:nnn{ocgx2}{missing~package}{ + Package~`#1'~must~be~loaded~before~ocgx2.\\\\ + Put\\\\ + \space\space\string\usepackage#2{#1}\\ + \space\space\string\usepackage[ocgcolorlinks]{ocgx2}\\\\ + to~the~preamble~of~your~document. +} + %package opts %unknown package option error message \msg_set:nnnn{ocgx2}{unknown~package~option}{Unknown~package~option~`#1'.}{ @@ -124,7 +140,7 @@ Get~an~up~to~date~version~of~`#1'.\\ Aborting. } -\@ifpackagelater{pdfbase}{2016/03/11}{}{ +\@ifpackagelater{pdfbase}{2017/03/23}{}{ \msg_error:nnn{xsavebox}{support~outdated}{pdfbase.sty} \tex_endinput:D } @@ -248,8 +264,8 @@ } \ocgxii@stack@on@page{0}{} %initialize -%end-of-page action in output routine -\cs_new_nopar:Nn\ocgxii_at_end_page:{ +%end-of-page action +\pbs_eop_action:n{ %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}{ @@ -276,19 +292,27 @@ \seq_map_variable:cNn{ g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq }\l_ocgxii_arg_tl{ - \ocgbase_oc_emc: + \str_if_eq_x:nnTF{\l_ocgxii_arg_tl}{(ocglink)}{ + \ocgxii_colorlink_end: + }{ + \ocgbase_oc_emc: + } } } -%begin-of-page action in output routine -\cs_new_nopar:Nn\ocgxii_at_begin_page:{ +%begin-of-page action (to output box background) +\pbs_bop_action:n{ % re-open pending ocgs \seq_set_eq:Nc\l_ocgxii_temp_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{ - \ocgbase_oc_bdc:n{\l_ocgxii_arg_tl} + \str_if_eq_x:nnTF{\l_ocgxii_arg_tl}{(ocglink)}{ + \ocgxii_colorlink_begin: + }{ + \ocgbase_oc_bdc:n{\l_ocgxii_arg_tl} + } } \int_gincr:N\g_ocgxii_page_int % copy pending ocg stack from previous page, if it has not been initialized @@ -303,17 +327,6 @@ } \int_new:N\g_ocgxii_page_int %abs. page counter -%modify output routine to manage ocgs spanning multiple pages -\cs_set_eq:NN\ocgxii_outputpage_orig:\@outputpage -\cs_set_nopar:Npn\@outputpage{ - \vbox_set:Nn\@outputbox{ - \ocgxii_at_begin_page: - \box_use_clear:N\@outputbox - \ocgxii_at_end_page: - } - \ocgxii_outputpage_orig: -} - \cs_new_nopar:Nn\ocgxii_ocglist_reset:{ \tl_clear_new:N\l_ocgxii_u_list_tl \tl_clear_new:N\l_ocgxii_d_list_tl @@ -511,7 +524,7 @@ \cs_new:Npn\showocgs{\showocg*} \cs_new:Npn\hideocgs{\hideocg*} \cs_new:Npn\setocgs{\actionsocg*} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_new:Nn\ocgxii_process_ocgref:NN{ \str_if_eq_x:nnF{#2}{}{ @@ -587,55 +600,125 @@ Line~\msg_line_number: :~unknown~option~`#1'. } -\cs_gset_eq:NN\ocgxii_atenddvi_checkimpl_orig:\AtEndDvi@CheckImpl% -\def\AtEndDvi@CheckImpl{ - \ocgxii_atenddvi_checkimpl_orig: - \cs_if_exist:NTF\AtEndDvi@LastPage{ - \int_compare:nF{\AtEndDvi@LastPage=\value{abspage}}{ - \cs_if_exist:NF\g_ocgxii_rerunwarned_tl{ - \tl_new:N\g_ocgxii_rerunwarned_tl - \msg_warning:nn{ocgx2}{rerun} - } - } - }{ - \cs_if_exist:NF\g_ocgxii_rerunwarned_tl{ - \tl_new:N\g_ocgxii_rerunwarned_tl - \msg_warning:nn{ocgx2}{rerun} - } - } -} - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % patch hyperref to ensure compatibility with our `ocgcolorlinks' option -% similar to http://tex.stackexchange.com/a/104227; -% add `ocgcolorlinks' support to all drivers +% +% Plus: +% +% * add `ocgcolorlinks' support to all drivers +% +% * allows for `ocgcolorlinks' extending over +% +% line-breaks AND page-breaks +% +% with pdftex, luatex, xetex, dvipdfmx drivers +% +% based on Ben Lerner's solution +% http://tex.stackexchange.com/a/104227; +% with some improvements %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\cs_new_nopar:Nn\ocgxii_enable_ocglinks:{ - \def\Hy@colorlink##1{ - \begingroup - \def\Hy@ocgcolor{##1} - \setbox0=\hbox\bgroup\color@begingroup\let\color@setgroup\begingroup +\sys_if_output_pdf:TF{ + \cs_new:Nn\ocgxii_literal_page:n{\pdfliteral~page~{#1}} +}{ + \bool_if:NT\g_ocgxii_dvipdfmx_bool{ %dvipdfmx/XeTeX + \cs_new:Nn\ocgxii_literal_page:n{\special{pdf:code~#1}} } - \def\Hy@endcolorlink{ - \color@endgroup\egroup - \mbox{ - \ocgbase@oc@bdc{\OBJ@OCG@print} - \rlap{\copy0} - \ocgbase@oc@emc\ocgbase@oc@bdc{\OBJ@OCG@view} +} + +\bool_if:nTF{\sys_if_output_dvi_p: && !\g_ocgxii_dvipdfmx_bool}{ + % non-breakable links in dvips + \cs_new_nopar:Nn\ocgxii_enable_ocglinks:{ + \def\Hy@colorlink##1{ \begingroup - \expandafter\HyColor@UseColor\Hy@ocgcolor - \box0 + \def\Hy@ocgcolor{##1} + \setbox0=\hbox\bgroup\color@begingroup\let\color@setgroup\begingroup + } + \def\Hy@endcolorlink{ + \color@endgroup\egroup + \mbox{ + \ocgbase@oc@bdc{\OBJ@OCG@print} + \rlap{\copy0} + \ocgbase@oc@emc\ocgbase@oc@bdc{\OBJ@OCG@view} + \begingroup + \expandafter\HyColor@UseColor\Hy@ocgcolor + \box0 + \endgroup + \ocgbase@oc@emc + } \endgroup + } + } +}{ + % pdftex,luatex,xetex,dvipdfmx: + % ocgcolorlinks that extend over line and page breaks + \cs_new_nopar:Nn\ocgxii_enable_ocglinks:{ + \def\Hy@colorlink##1{ + \ifx\Hy@setbreaklinks\@gobble + \ifHy@breaklinks\Hy@breaklinkstrue\fi + \else + \Hy@breaklinkstrue + \fi + \ifHy@breaklinks + \seq_if_in:NnT\g_ocgbase_ocgstack_seq{(ocglink)}{ + \msg_error:nn{ocgx2}{nested~breakable~ocgcolorlinks} + } + \ocgbase_ocgstack_push:n{(ocglink)} + \ocgxii_ocgstack_shipout:N\g_ocgbase_ocgstack_seq + \begingroup + \gdef\ocgxii@ocgcolor{##1} + \ocgxii_colorlink_begin: + \else + \begingroup + \def\ocgxii@ocgcolor{##1} + \setbox0=\hbox\bgroup\color@begingroup\let\color@setgroup\begingroup + \fi + } + \def\Hy@endcolorlink{ + \ifHy@breaklinks + \ocgxii_colorlink_end: + \ocgbase_ocgstack_pop:N\l_trash_tl + \ocgxii_ocgstack_shipout:N\g_ocgbase_ocgstack_seq + \endgroup + \else + \color@endgroup\egroup + \mbox{ + \ocgbase@oc@bdc{\OBJ@OCG@print} + \rlap{\copy0} + \ocgbase@oc@emc\ocgbase@oc@bdc{\OBJ@OCG@view} + \begingroup + \expandafter\HyColor@UseColor\ocgxii@ocgcolor + \box0 + \endgroup + \ocgbase@oc@emc + } + \endgroup + \fi + } + \cs_new_nopar:Nn\ocgxii_colorlink_begin:{ + \ocgxii_literal_page:n{q~7~Tr} + \vbox_to_zero:n{ + \vss + \hbox_to_zero:n{\skip_horizontal:n{2\paperwidth}.\hss} + \skip_vertical:n{2\paperheight} + } + } + \cs_new_nopar:Nn\ocgxii_colorlink_end:{ + \ocgbase@oc@bdc{\OBJ@OCG@print} + \ocgxii_literal_page:n{-88888~-88888~99999~99999~re~f} + \ocgbase@oc@emc + \ocgbase@oc@bdc{\OBJ@OCG@view} + \begingroup + \expandafter\HyColor@UseColor\ocgxii@ocgcolor + \ocgxii_literal_page:n{-88888~-88888~99999~99999~re~f} + \endgroup \ocgbase@oc@emc + \ocgxii_literal_page:n{0~Tr~Q} } - \endgroup } } -\RequirePackage{scrlfile} -\bool_if:NT\l_ocgxii_ocgcolorlinks_bool{ - \PassOptionsToPackage{colorlinks}{hyperref} - \AfterPackage*{hyperref}{ +\bool_if:nT\l_ocgxii_ocgcolorlinks_bool{ + \@ifpackageloaded{hyperref}{ \Hy@colorlinkstrue \Hy@AtBeginDocument{ \ocgbase_new_ocg:nnn{OCView}{/Print<>}{on} @@ -644,8 +727,20 @@ \tl_gset:Nx\OBJ@OCG@print{\ocgbase_last_ocg:} \ocgxii_enable_ocglinks: } + }{ + \msg_error:nnn{ocgx2}{missing~package}{hyperref} } } + +\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