diff options
author | Karl Berry <karl@freefriends.org> | 2015-11-01 22:14:33 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2015-11-01 22:14:33 +0000 |
commit | 9cda77f78d171518f0db92ba633ce5c3ab8124c6 (patch) | |
tree | 22a8a5f37359fc4bb6aa5cd636fef82a8f73b6d7 /Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty | |
parent | ecb1680ccb53b3b96460fda99cecfb770843d96f (diff) |
ocgx2 (1nov15)
git-svn-id: svn://tug.org/texlive/trunk@38760 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty | 220 |
1 files changed, 110 insertions, 110 deletions
diff --git a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty index e0da040c319..62b9c905b72 100644 --- a/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty +++ b/Master/texmf-dist/tex/latex/ocgx2/ocgx2.sty @@ -7,11 +7,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The intent of this package is to be a drop-in replacement for the already -% existing CTAN package `ocgx' by Paul Gaborit. +% existing CTAN package `ocgx' by Paul Gaborit, and also for `ocg-p' and `ocg'. % % It re-implements the functionality of the ocg, ocgx and ocg-p packages % and adds support for all known engines and backends including -% latex+dvips+ps2pdf, xelatex, latex+dvipdfm, lualatex. +% latex+dvips+ps2pdf, xelatex, latex+dvipdfmx, lualatex. % % Adds some minor improvements, such as package options, remembering option % settings of reopened ocgs, correct behaviour of ocg switching links that were @@ -33,58 +33,116 @@ % The Current Maintainer of this work is A. Grahn. \RequirePackage{xparse} -\RequirePackage{atenddvi} -\RequirePackage{ifpdf} \RequirePackage{l3keys2e} -\AtBeginDocument{ - \@ifpackageloaded{media9}{}{\RequirePackage{media9}} - \@ifpackagelater{media9}{2015/01/21}{}{ - \PackageError{ocgx2}{% - Requires package `media9' v0.49 [2015/01/21] or\MessageBreak - newer, but only v\g@mix@version@tl\space[\g@mix@date@tl] is available - }{}% +\ProvidesExplPackage{ocgx2}{2015/10/28}{0.9} +{ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} + +%package opts +%unknown package option error message +\msg_set:nnnn{ocgx2}{unknown~package~option}{Unknown~package~option~`#1'.}{ + Package option~'#1'~is~unknown;\\ + perhaps~it~is~spelled~incorrectly. +} + +\bool_new:N\g_ocgxii_dvipdfmx_bool +\bool_new:N\l_ocgxii_tikz_bool + +\keys_define:nn{ocgx2}{ + xetex .code:n = { + \PassOptionsToPackage{xetex}{ocgbase} + }, + + dvipdfmx .code:n = { + \PassOptionsToPackage{dvipdfmx}{ocgbase} + \bool_gset_true:N\g_ocgxii_dvipdfmx_bool + }, + + viewocg .choice:, + viewocg / always .code:n={ + \tl_gset:Nn\g_ocgxii_view_tl{/View<</ViewState/ON>>}}, + viewocg / never .code:n={ + \tl_gset:Nn\g_ocgxii_view_tl{/View<</ViewState/OFF>>}}, + viewocg / ifvisible .code:n={\tl_gclear_new:N\g_ocgxii_view_tl}, + viewocg .default:n={ifvisible}, + + printocg .choice:, + printocg / always .code:n={ + \tl_gset:Nn\g_ocgxii_print_tl{/Print<</PrintState/ON>>}}, + printocg / never .code:n={ + \tl_gset:Nn\g_ocgxii_print_tl{/Print<</PrintState/OFF>>}}, + printocg / ifvisible .code:n={\tl_gclear_new:N\g_ocgxii_print_tl}, + printocg .default:n={ifvisible}, + + exportocg .choice:, + exportocg / always .code:n={ + \tl_gset:Nn\g_ocgxii_export_tl{/Export<</ExportState/ON>>}}, + exportocg / never .code:n={ + \tl_gset:Nn\g_ocgxii_export_tl{/Export<</ExportState/OFF>>}}, + exportocg / ifvisible .code:n={\tl_gclear_new:N\g_ocgxii_export_tl}, + exportocg .default:n={ifvisible}, + + listintoolbar .choices:nn = {always,never,iffirstuse}{ + \tl_gset:Nx\g_ocgxii_listno_tl{\int_eval:n{\l_keys_choice_int-\c_one}} + }, + listintoolbar .default:n={iffirstuse}, + + showingui .meta:n = {listintoolbar=#1}, + showingui .default:n={iffirstuse}, + + tikz .bool_set:N = \l_ocgxii_tikz_bool, + tikz .default:n = true, + + unknown .code:n = { + \msg_error:nnx{ocgx2}{unknown~package~option}{\l_keys_key_tl} } } -\ProvidesExplPackage{ocgx2}{2015/09/11}{0.8} -{ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} +%package options preset +\keys_set:nn{ocgx2}{viewocg,printocg,exportocg,showingui,tikz=false} + +%process package options +\ProcessKeysOptions{ocgx2} +\sys_if_engine_xetex:T{\bool_gset_true:N\g_ocgxii_dvipdfmx_bool} + +\RequirePackage{ocgbase} %re-implement ocg-p's `ocg' environment \DeclareDocumentEnvironment{ocg}{O{}mmm}{ - \bool_if:NT\g_ocgxii_nestedB_bool{\tl_gput_right:Nx\@ocgbase@ocgorder{~[}} + \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} - \keys_set:nV{ocgxii/user}\l_tempa_tl + \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}{ - \tl_gput_right:Nx\@ocgbase@ocgorder{~\tl_use:c{ocgxii@#3}} + \ocgbase_add_to_order_list:n{\tl_use:c{ocgxii@#3}} } }{ \tl_gset:cn{ocgxii@#3.opts}{#1} - \keys_set:nn{ocgxii/user}{#1} - \mix_pdfobj:nnn{}{dict}{ - /Type/OCG/Name~(#2)/Usage<< - \l_ocgxii_view_tl\l_ocgxii_print_tl\l_ocgxii_export_tl>> - } - \tl_gput_right:Nx\@ocgbase@ocgs{\space\g_mix_pdflastobj_tl} - \int_compare:nT{#4==\c_zero}{ - \tl_gput_right:Nx\@ocgbase@offocgs{\space\g_mix_pdflastobj_tl} - } - \tl_gset:cx{ocgxii@#3}{\g_mix_pdflastobj_tl} + \keys_set:nn{ocgx2/user}{#1} + \ocgbase_new_ocg:xxx{#2}{ + \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_gput_right:Nx\@ocgbase@ocgorder{~\g_mix_pdflastobj_tl} + \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{\g_mix_pdflastobj_tl} + \space OCGpdfobj#3\endcsname{\ocgbase_last_ocg:} + } + } + \seq_map_inline:Nn\l_ocgxii_rbgrps_seq{% process list of radio btn groups + \ocgbase_add_ocg_to_radiobtn_grp:xxx{##1}{\tl_use:c{ocgxii@#3}}{ + \int_compare:nTF{\l_ocgxii_listno_tl=\c_one}{false}{true} } } \bool_if:nT{ -% !\cs_if_exist_p:c{OCGpdfobj#3} || %lazy evaluation may cease to work +% !\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}} @@ -98,15 +156,15 @@ } } \tl_gset:cx{OCGpdfobj#3}{\tl_use:c{ocgxii@#3}} - \seq_gput_left:Nx\g_fixocg_ocgstack_seq{\tl_use:c{ocgxii@#3}} + \seq_gput_left:Nx\g_ocgxii_ocgstack_seq{\tl_use:c{ocgxii@#3}} \group_end: - \mix_pdfbdc:nn{/OC}{\tl_use:c{ocgxii@#3}} + \pbs_pdfbdc:nn{/OC}{\tl_use:c{ocgxii@#3}} \ignorespaces }{ \unskip - \mix_pdfemc: - \seq_gpop_left:NN\g_fixocg_ocgstack_seq\l_tempa_tl - \bool_if:NT\g_ocgxii_nestedE_bool{\tl_gput_right:Nx\@ocgbase@ocgorder{~]}} + \pbs_pdfemc: + \seq_gpop_left:NN\g_ocgxii_ocgstack_seq\l_tempa_tl + \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 } @@ -114,13 +172,13 @@ \bool_new:N\g_ocgxii_nestedE_bool % nested OCG end %stack of PDF obj references of currently open OCGs -\seq_new:N\g_fixocg_ocgstack_seq +\seq_new:N\g_ocgxii_ocgstack_seq %macro that inserts /OC <<OCMD with currently open OCGs>> entry; %for use within annotation dicts \tl_set:Nn\ocgxii@insert@OC{ - \seq_if_empty:NF\g_fixocg_ocgstack_seq{ - /OC~<</Type/OCMD/OCGs~[\seq_use:Nn\g_fixocg_ocgstack_seq{~}]/P/AllOn>> + \seq_if_empty:NF\g_ocgxii_ocgstack_seq{ + /OC~<</Type/OCMD/OCGs~[\seq_use:Nn\g_ocgxii_ocgstack_seq{~}]/P/AllOn>> } } @@ -404,47 +462,8 @@ } } -%package opts -\keys_define:nn{ocgxii}{ - viewocg .choice:, - viewocg / always .code:n={ - \tl_gset:Nn\g_ocgxii_view_tl{/View<</ViewState/ON>>}}, - viewocg / never .code:n={ - \tl_gset:Nn\g_ocgxii_view_tl{/View<</ViewState/OFF>>}}, - viewocg / ifvisible .code:n={\tl_gclear_new:N\g_ocgxii_view_tl}, - viewocg .default:n={ifvisible}, - - printocg .choice:, - printocg / always .code:n={ - \tl_gset:Nn\g_ocgxii_print_tl{/Print<</PrintState/ON>>}}, - printocg / never .code:n={ - \tl_gset:Nn\g_ocgxii_print_tl{/Print<</PrintState/OFF>>}}, - printocg / ifvisible .code:n={\tl_gclear_new:N\g_ocgxii_print_tl}, - printocg .default:n={ifvisible}, - - exportocg .choice:, - exportocg / always .code:n={ - \tl_gset:Nn\g_ocgxii_export_tl{/Export<</ExportState/ON>>}}, - exportocg / never .code:n={ - \tl_gset:Nn\g_ocgxii_export_tl{/Export<</ExportState/OFF>>}}, - exportocg / ifvisible .code:n={\tl_gclear_new:N\g_ocgxii_export_tl}, - exportocg .default:n={ifvisible}, - - listintoolbar .choices:nn = {always,never,iffirstuse}{ - \tl_gset:Nx\g_ocgxii_listno_tl{\int_eval:n{\l_keys_choice_int-\c_one}} - }, - listintoolbar .default:n={iffirstuse}, - - tikz .bool_set:N = \l_ocgxii_tikz_bool, - tikz .default:n = true -} - -%package options preset -\keys_set:nn{ocgxii}{viewocg,printocg,exportocg,listintoolbar,tikz=false} -\ProcessKeysOptions{ocgxii} %process package options - %command opts -\keys_define:nn{ocgxii/user}{ +\keys_define:nn{ocgx2/user}{ viewocg .choice:, viewocg / always .code:n={ \tl_set:Nn\l_ocgxii_view_tl{/View<</ViewState/ON>>}}, @@ -474,7 +493,15 @@ listintoolbar .choices:nn = {always,never,iffirstuse}{ \tl_set:Nx\l_ocgxii_listno_tl{\int_eval:n{\l_keys_choice_int-\c_one}} }, - listintoolbar .default:n={iffirstuse} + listintoolbar .default:n={iffirstuse}, + + showingui .meta:n = {listintoolbar=#1}, + showingui .default:n={iffirstuse}, + + radiobtngrp .code:n = { + \seq_put_right:Nx\l_ocgxii_rbgrps_seq{#1} + }, + radiobtngrp .value_required:n = {true} } \cs_new:Nn\ocgxii_reset_cmd_opts:{ @@ -482,35 +509,8 @@ \tl_set_eq:NN\l_ocgxii_print_tl\g_ocgxii_print_tl \tl_set_eq:NN\l_ocgxii_export_tl\g_ocgxii_export_tl \tl_set_eq:NN\l_ocgxii_listno_tl\g_ocgxii_listno_tl -} - -\group_begin: -\char_set_catcode_active:N\+\let+\space -\tl_gset:Nx\g_ocgxii_gsoldwarning_tl{ - {product~(Ghostscript)~search~{pop~pop~pop~true}{pop~false}ifelse~ - revision~915~lt~and~{ - (\token_to_str:N\n - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\token_to_str:N\n - @@++++++++++++Warning:+Ghostscript+too+old!++++++++++++++@@\token_to_str:N\n - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\token_to_str:N\n - @@+++++++++++++++++++++++++++++++++++++++++++++++++++++++@@\token_to_str:N\n - @@+Package+`ocgx2'+requires+Ghostscript+version+>=+9.15.+@@\token_to_str:N\n - @@+Otherwise,+PDF+layers+will+not+work.++++++++++++++++++@@\token_to_str:N\n - @@+++++++++++++++++++++++++++++++++++++++++++++++++++++++@@\token_to_str:N\n - @@+Get+current+version+from++++++++++++++++++++++++++++++@@\token_to_str:N\n - @@+http://www.ghostscript.com/download+++++++++++++++++++@@\token_to_str:N\n - @@+++++++++++++++++++++++++++++++++++++++++++++++++++++++@@\token_to_str:N\n - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\token_to_str:N\n) - print}~if}~?pdfmark -} -\group_end: - -\AtBeginDocument{ - \ifpdf\else - \bool_if:NF\g_mix_dvipdfmx_bool{ - \AtEndDvi{\special{ps::[nobreak]\g_ocgxii_gsoldwarning_tl}} - } - \fi + %stack of radio button group names the current ocg belongs to + \seq_clear_new:N\l_ocgxii_rbgrps_seq } \msg_set:nnn{ocgx2}{rerun}{Rerun~to~get~OCG~references~right!} @@ -525,17 +525,17 @@ % dvipdfmx and xelatex workaround for ocg buttons within `tikzpicture' context \cs_set:Nn\ocgxii_pdflink:nn{ \bool_if:nTF{ - \g_mix_dvipdfmx_bool && \cs_if_exist_p:N\pgfpictureid + \g_ocgxii_dvipdfmx_bool && \cs_if_exist_p:N\pgfpictureid }{ \hbox_set:Nn\l_tmpa_box{#2} - \mix_pdfannot:nnnn{ + \pbs_pdfannot:nnnn{ \dim_use:N\box_wd:N\l_tmpa_box}{ \dim_use:N\box_ht:N\l_tmpa_box}{ \dim_use:N\box_dp:N\l_tmpa_box }{#1} \box_use_clear:N\l_tmpa_box }{ - \mix_pdflink:nn{#1}{#2} + \pbs_pdflink:nn{#1}{#2} } } |