diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty | 138 |
1 files changed, 121 insertions, 17 deletions
diff --git a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty index 6872f2e9322..946682d0332 100644 --- a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty +++ b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty @@ -13,6 +13,8 @@ % and adds support for all known engines and backends including % latex+dvips+ps2pdf, xelatex, latex+dvipdfmx, lualatex. % +% With ocgx2, PDF layers may extend across page breaks. +% % Adds some minor improvements, such as package options, remembering option % settings of reopened ocgs, correct behaviour of ocg switching links that were % themselves placed on layers, compatibility with the animate and media9 @@ -34,10 +36,14 @@ \RequirePackage{xparse} \RequirePackage{l3keys2e} +\RequirePackage{afterpage} -\ProvidesExplPackage{ocgx2}{2015/11/02}{0.10} +\ProvidesExplPackage{ocgx2}{2015/11/23}{0.11} {ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} +%creating global definitions +\cs_new:Npn\ocgxii@newkey#1#2{\tl_gset:cx{#1}{#2}} + %package opts %unknown package option error message \msg_set:nnnn{ocgx2}{unknown~package~option}{Unknown~package~option~`#1'.}{ @@ -109,17 +115,25 @@ %re-implement ocg-p's `ocg' environment \DeclareDocumentEnvironment{ocg}{O{}mmm}{ + \ocgxii_beginocg:nnnn{#1}{#2}{#3}{#4} +}{ + \ocgxii_endocg: +} + +\cs_new_nopar:Nn\ocgxii_beginocg:nnnn{ + \bool_gset_false:N\g_ocgxii_nestedE_bool \bool_if:NT\g_ocgxii_nestedB_bool{\ocgbase_add_to_order_list:n{[}} \bool_gset_true:N\g_ocgxii_nestedB_bool - \bool_gset_false:N\g_ocgxii_nestedE_bool \group_begin: \ocgxii_reset_cmd_opts: % ... to the user-set package options \tl_if_exist:cTF{ocgxii@#3}{ %re-open existing layer \tl_set:Nx\l_tempa_tl{\tl_use:c{ocgxii@#3.opts},#1} \tl_gset:cx{ocgxii@#3.opts}{\l_tempa_tl} %new options appended \keys_set:nV{ocgx2/user}\l_tempa_tl - \int_compare:nT{\l_ocgxii_listno_tl=\c_zero}{ + \int_compare:nTF{\l_ocgxii_listno_tl=\c_zero}{ \ocgbase_add_to_order_list:n{\tl_use:c{ocgxii@#3}} + }{ + \bool_gset_false:N\g_ocgxii_nestedB_bool } }{ \tl_gset:cn{ocgxii@#3.opts}{#1} @@ -128,12 +142,14 @@ \l_ocgxii_view_tl\l_ocgxii_print_tl\l_ocgxii_export_tl }{#4} \tl_gset:cx{ocgxii@#3}{\ocgbase_last_ocg:} - \int_compare:nF{\l_ocgxii_listno_tl=\c_one}{ + \tl_gset:cn{ocgxii_#3_is_listed}{0} + \int_compare:nTF{\l_ocgxii_listno_tl=\c_one}{ + \bool_gset_false:N\g_ocgxii_nestedB_bool + }{ \ocgbase_add_to_order_list:n{\ocgbase_last_ocg:} } - \iow_now:Nx\@auxout{ - \token_to_str:N\expandafter\xdef\token_to_str:N\csname - \space OCGpdfobj#3\endcsname{\ocgbase_last_ocg:} + \iow_now:Nx\@mainaux{ + \token_to_str:N\ocgxii@newkey{ocgx2.ocg.#3}{\ocgbase_last_ocg:} } } \seq_map_inline:Nn\l_ocgxii_rbgrps_seq{% process list of radio btn groups @@ -142,10 +158,8 @@ } } \bool_if:nT{ -% !\cs_if_exist_p:c{OCGpdfobj#3} || %lazy evaluation may cease to work -% !\str_if_eq_x_p:nn{\use:c{OCGpdfobj#3}}{\tl_use:c{ocgxii@#3}} - !\cs_if_exist:cTF{OCGpdfobj#3}{ - \str_if_eq_x_p:nn{\tl_use:c{OCGpdfobj#3}}{\tl_use:c{ocgxii@#3}} + !\cs_if_exist:cTF{ocgx2.ocg.#3}{ + \str_if_eq_x_p:nn{\tl_use:c{ocgx2.ocg.#3}}{\tl_use:c{ocgxii@#3}} }{ \c_false_bool } @@ -155,22 +169,112 @@ \AtEndDocument{\msg_warning:nn{ocgx2}{rerun}} } } - \tl_gset:cx{OCGpdfobj#3}{\tl_use:c{ocgxii@#3}} + \tl_gset:cx{ocgx2.ocg.#3}{\tl_use:c{ocgxii@#3}} \seq_gput_left:Nx\g_ocgxii_ocgstack_seq{\tl_use:c{ocgxii@#3}} + \ocgxii_ocgstack_shipout:N\g_ocgxii_ocgstack_seq \group_end: \ocgbase_oc_bdc:n{\tl_use:c{ocgxii@#3}} \ignorespaces -}{ +} + +\cs_new_nopar:Nn\ocgxii_endocg:{ \unskip \ocgbase_oc_emc: - \seq_gpop_left:NN\g_ocgxii_ocgstack_seq\l_tempa_tl + \seq_gpop_left:NN\g_ocgxii_ocgstack_seq\l_trash_tl + \ocgxii_ocgstack_shipout:N\g_ocgxii_ocgstack_seq + \bool_gset_false:N\g_ocgxii_nestedB_bool \bool_if:NT\g_ocgxii_nestedE_bool{\ocgbase_add_to_order_list:n{]}} \bool_gset_true:N\g_ocgxii_nestedE_bool - \bool_gset_false:N\g_ocgxii_nestedB_bool } + \bool_new:N\g_ocgxii_nestedB_bool % nested OCG begin \bool_new:N\g_ocgxii_nestedE_bool % nested OCG end +\cs_gset:Nn\ocgxii_ocgstack_shipout:N{ + \iow_shipout_x:Nx\@mainaux{ + \token_to_str:N\ocgxii@stack@on@page{ + \exp_not:N\int_use:N\g_ocgxii_page_int + }{\seq_use:Nn#1{,}} + } +} +\cs_new_nopar:Npn\ocgxii@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}{ + \seq_map_inline:cn{g_pending_ocgs_on_#1_seq}{ + \seq_gpop_left:cN{g_pending_ocgs_on_#1_seq}\l_trash_tl + \seq_gput_right:cn{g_pending_ocgs_on_#1_seq}{{##1}} + } + } +} +\ocgxii@stack@on@page{0}{} %initialize + +%end of page action in output routine +\cs_new_nopar:Nn\ocgxii_at_end_page:{ + %check whether end-of-page ocg stack has settled + \iow_now:Nx\@mainaux{ + \token_to_str:N\ocgxii@newkey{ocgx2.oldstack.\int_use:N\g_ocgxii_page_int}{ + \seq_use:cn{g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq}{,} + } + } + \bool_if:nT{ + !\cs_if_exist:cTF{ocgx2.oldstack.\int_use:N\g_ocgxii_page_int}{ + \str_if_eq_x_p:nn{ + \tl_use:c{ocgx2.oldstack.\int_use:N\g_ocgxii_page_int} + }{ + \seq_use:cn{g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq}{,} + } + }{ + \c_false_bool + } + }{ + \cs_if_exist:NF\g_ocgxii_rerunwarned_tl{ + \tl_new:N\g_ocgxii_rerunwarned_tl + \AtEndDocument{\msg_warning:nn{ocgx2}{rerun}} + } + } + %now close pending ocgs + \seq_map_variable:cNn{ + g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq + }\l_ocgxii_arg_tl{ + \ocgbase_oc_emc: + } +} + +%begin of page action in output routine +\cs_new_nopar:Nn\ocgxii_at_begin_page:{ + % 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} + } + % copy pending ocg stack to next page, if it has not been initialized yet + % from aux file + \int_gincr:N\g_ocgxii_page_int + \seq_if_exist:cF{g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq}{ + \seq_gset_eq:cc{ + g_pending_ocgs_on_\int_use:c{g_ocgxii_page_int}_seq + }{ + g_pending_ocgs_on_\int_eval:n{\g_ocgxii_page_int-\c_one}_seq + } + } +} +\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: +} + %stack of PDF obj references of currently open OCGs \seq_new:N\g_ocgxii_ocgstack_seq @@ -452,7 +556,7 @@ \cs_new:Nn\ocgxii_process_ocgref:NN{ \str_if_eq_x:nnF{#2}{}{ - \tl_if_exist:cTF{OCGpdfobj#2}{\tl_put_right:Nx#1{~\tl_use:c{OCGpdfobj#2}}}{ + \tl_if_exist:cTF{ocgx2.ocg.#2}{\tl_put_right:Nx#1{~\tl_use:c{ocgx2.ocg.#2}}}{ \msg_warning:nnx{ocgx2}{undefined~OCG}{#2} \cs_if_exist:NF\g_ocgxii_refundefwarned_tl{ \tl_new:N\g_ocgxii_refundefwarned_tl @@ -539,7 +643,7 @@ } } -% tikz related code follows (enabled with package option `tikz') +% tikz related code follows (to be enabled with package option `tikz') \bool_if:NF\l_ocgxii_tikz_bool{\endinput} \ExplSyntaxOff |