diff options
Diffstat (limited to 'obsolete/macros/latex/contrib/fixocgx/fixocgx.sty')
-rw-r--r-- | obsolete/macros/latex/contrib/fixocgx/fixocgx.sty | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/obsolete/macros/latex/contrib/fixocgx/fixocgx.sty b/obsolete/macros/latex/contrib/fixocgx/fixocgx.sty new file mode 100644 index 0000000000..b40059ee68 --- /dev/null +++ b/obsolete/macros/latex/contrib/fixocgx/fixocgx.sty @@ -0,0 +1,281 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% fixocgx.sty +% +% Copyright 2015--\today, Alexander Grahn +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This package extends the usability of `ocgx' to all known engines including +% latex+dvips+ps2pdf, xelatex and latex+dvipdfmx. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://mirrors.ctan.org/help/Catalogue/licenses.lppl.html +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is A. Grahn. + +\RequirePackage{xparse} +\RequirePackage{atenddvi} +\RequirePackage{ifpdf} + +%prevent ocg-p from inserting PS specials in dvipdfmx mode +\ifpdf\else + \DeclareOption{dvipdfmx}{\@ocgp@ifpsfalse} + \ProcessOptions\relax +\fi + +\@ifpackageloaded{ocgx}{}{ + \PackageError{fixocgx}{% + Package `fixocgx' must be loaded /after/ one of\MessageBreak + \space\space\string\usepackage{ocgx}\MessageBreak + or\MessageBreak + \space\space\string\usetikzlibrary{ocgx} + }{}% +} + +\AtBeginDocument{ + \@ifpackageloaded{media9}{}{\RequirePackage{media9}} + \@ifpackagelater{media9}{2015/01/21}{}{ + \PackageError{fixocgx}{% + 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{fixocgx}{2015/06/15}{0.5} +{ports `ocgx' functionality to dvips+ps2pdf, xelatex and dvipdfmx} + +%re-implement ocg-p's `ocg' environment +\DeclareDocumentEnvironment{ocg}{O{}mmm}{ + \bool_if:NT\g_fxocg_nestedB_bool{\tl_gput_right:Nx\@ocgbase@ocgorder{~[}} + \bool_gset_true:N\g_fxocg_nestedB_bool + \bool_gset_false:N\g_fxocg_nestedE_bool + \group_begin: + \tl_if_exist:cTF{fxocg@#3}{ %re-open existing layer + \tl_set:Nx\l_tempa_tl{[ocgp]{ocg}{\use:c{fxocg@#3.opts},#1}} + \exp_after:wN\setkeys\l_tempa_tl + \int_compare:nT{\@ocgp@listno=\c_zero}{ + \tl_gput_right:Nx\@ocgbase@ocgorder{~\use:c{fxocg@#3}} + } + }{ + \tl_gset:cn{fxocg@#3.opts}{#1} + \setkeys[ocgp]{ocg}{#1} + \mix_pdfobj:nnn{}{dict}{ + /Type/OCG/Name~(#2)/Usage<<\l_fxocg_view_tl\@ocgp@print\@ocgp@export>> + } + \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{fxocg@#3}{\g_mix_pdflastobj_tl} + \int_compare:nF{\@ocgp@listno=\c_one}{ + \tl_gput_right:Nx\@ocgbase@ocgorder{~\g_mix_pdflastobj_tl} + } + \iow_now:Nx\@auxout{ + \token_to_str:N\expandafter\xdef\token_to_str:N\csname + \space OCGpdfobj#3\endcsname{\g_mix_pdflastobj_tl} + } + } + \bool_if:nT{ + !\cs_if_exist_p:c{OCGpdfobj#3} || + !\str_if_eq_x_p:nn{\use:c{OCGpdfobj#3}}{\use:c{fxocg@#3}} + }{ + \cs_if_exist:NF\g_fxocg_rerunwarned_tl{ + \tl_new:N\g_fxocg_rerunwarned_tl + \AtEndDocument{\msg_warning:nn{fixocgx}{rerun}} + } + } + \tl_gset:cx{OCGpdfobj#3}{\use:c{fxocg@#3}} + \seq_gput_left:Nx\g_fixocg_ocgstack_seq{\use:c{fxocg@#3}} + \group_end: + \mix_pdfbdc:nn{/OC}{\use:c{fxocg@#3}} + \ignorespaces +}{ + \unskip + \mix_pdfemc: + \seq_gpop_left:NN\g_fixocg_ocgstack_seq\l_tempa_tl + \bool_if:NT\g_fxocg_nestedE_bool{\tl_gput_right:Nx\@ocgbase@ocgorder{~]}} + \bool_gset_true:N\g_fxocg_nestedE_bool + \bool_gset_false:N\g_fxocg_nestedB_bool +} +\bool_new:N\g_fxocg_nestedB_bool % nested OCG begin +\bool_new:N\g_fxocg_nestedE_bool % nested OCG end + +%stack of PDF obj references of currently open OCGs +\seq_new:N\g_fixocg_ocgstack_seq +%macro that inserts /OC <<OCMD with currently open OCGs>> entry; +%for use within annotation dicts +\tl_set:Nn\fxocg@insert@OC{ + \seq_if_empty:NF\g_fixocg_ocgstack_seq{ + /OC~<</Type/OCMD/OCGs~[\seq_use:Nn\g_fixocg_ocgstack_seq{~}]/P/AllOn>> + } +} + +%workaround for ocg buttons (from tikzlibraryocgx.code.tex) +%with dvipdfmx and xelatex +\cs_set:Nn\fxocg_pdflink:nn{ + \bool_if:nTF{ + \g_mix_dvipdfmx_bool && \cs_if_exist_p:N\pgfpictureid + }{ + \hbox_set:Nn\l_tmpa_box{#2} + \mix_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} + } +} + +%re-implement commands from ocgx.sty (all engines including ps2pdf [gs>=9.15]) +\DeclareDocumentCommand\switchocg{mm}{ + \tl_set:Nn\l_fxocg_ocglist_tl{} + \tl_set:Nx\l_ocglistarg_tl{#1}\tl_trim_spaces:N\l_ocglistarg_tl + \seq_set_split:NnV\l_fxocg_ocglistarg_seq{~}\l_ocglistarg_tl + \seq_map_variable:NNn\l_fxocg_ocglistarg_seq\l_tempa_tl{ + \fxocg_process_ocgref:NN\l_fxocg_ocglist_tl\l_tempa_tl + } + \leavevmode + \fxocg_pdflink:nn{ + /Subtype/Link\fxocg@insert@OC + /A <</S/SetOCGState/State [ + \str_if_eq:VnF{\l_fxocg_ocglist_tl}{}{/Toggle~\l_fxocg_ocglist_tl}]>> + /Border [0~0~0] + }{#2} +} + +\DeclareDocumentCommand\showocg{mm}{ + \tl_set:Nn\l_fxocg_ocglist_tl{} + \tl_set:Nx\l_ocglistarg_tl{#1}\tl_trim_spaces:N\l_ocglistarg_tl + \seq_set_split:NnV\l_fxocg_ocglistarg_seq{~}\l_ocglistarg_tl + \seq_map_variable:NNn\l_fxocg_ocglistarg_seq\l_tempa_tl{ + \fxocg_process_ocgref:NN\l_fxocg_ocglist_tl\l_tempa_tl + } + \leavevmode + \fxocg_pdflink:nn{ + /Subtype/Link\fxocg@insert@OC + /A <</S/SetOCGState/State [ + \str_if_eq:VnF{\l_fxocg_ocglist_tl}{}{/ON~\l_fxocg_ocglist_tl}]>> + /Border [0~0~0] + }{#2} +} + +\DeclareDocumentCommand\hideocg{mm}{ + \tl_set:Nn\l_fxocg_ocglist_tl{} + \tl_set:Nx\l_ocglistarg_tl{#1}\tl_trim_spaces:N\l_ocglistarg_tl + \seq_set_split:NnV\l_fxocg_ocglistarg_seq{~}\l_ocglistarg_tl + \seq_map_variable:NNn\l_fxocg_ocglistarg_seq\l_tempa_tl{ + \fxocg_process_ocgref:NN\l_fxocg_ocglist_tl\l_tempa_tl + } + \leavevmode + \fxocg_pdflink:nn{ + /Subtype/Link\fxocg@insert@OC + /A <</S/SetOCGState/State [ + \str_if_eq:VnF{\l_fxocg_ocglist_tl}{}{/OFF~\l_fxocg_ocglist_tl}]>> + /Border [0~0~0] + }{#2} +} + +\DeclareDocumentCommand\actionsocg{mmmm}{ + \tl_set:Nx\l_ocglistarg_tl{#1}\tl_trim_spaces:N\l_ocglistarg_tl + \tl_set:Nn\l_fxocg_toswitch_tl{} + \seq_set_split:NnV\l_fxocg_ocglistarg_seq{~}\l_ocglistarg_tl + \seq_map_variable:NNn\l_fxocg_ocglistarg_seq\l_tempa_tl{ + \fxocg_process_ocgref:NN\l_fxocg_toswitch_tl\l_tempa_tl + } + \tl_set:Nx\l_ocglistarg_tl{#2}\tl_trim_spaces:N\l_ocglistarg_tl + \tl_set:Nn\l_fxocg_toshow_tl{} + \seq_set_split:NnV\l_fxocg_ocglistarg_seq{~}\l_ocglistarg_tl + \seq_map_variable:NNn\l_fxocg_ocglistarg_seq\l_tempa_tl{ + \fxocg_process_ocgref:NN\l_fxocg_toshow_tl\l_tempa_tl + } + \tl_set:Nx\l_ocglistarg_tl{#3}\tl_trim_spaces:N\l_ocglistarg_tl + \tl_set:Nn\l_fxocg_tohide_tl{} + \seq_set_split:NnV\l_fxocg_ocglistarg_seq{~}\l_ocglistarg_tl + \seq_map_variable:NNn\l_fxocg_ocglistarg_seq\l_tempa_tl{ + \fxocg_process_ocgref:NN\l_fxocg_tohide_tl\l_tempa_tl + } + \leavevmode + \fxocg_pdflink:nn{ + /Subtype/Link\fxocg@insert@OC + /A <</S/SetOCGState + /State [ + \str_if_eq:VnF{\l_fxocg_toswitch_tl}{}{/Toggle~\l_fxocg_toswitch_tl}~ + \str_if_eq:VnF{\l_fxocg_toshow_tl}{}{/ON~\l_fxocg_toshow_tl}~ + \str_if_eq:VnF{\l_fxocg_tohide_tl}{}{/OFF~\l_fxocg_tohide_tl} + ] + >> + /Border [0~0~0] + }{#4} +} + +\cs_new:Nn\fxocg_process_ocgref:NN{ + \str_if_eq_x:nnF{#2}{}{ + \tl_if_exist:cTF{OCGpdfobj#2}{\tl_put_right:Nx#1{~\use:c{OCGpdfobj#2}}}{ + \msg_warning:nnx{fixocgx}{undefined~OCG}{#2} + \cs_if_exist:NF\g_fxocg_refundefwarned_tl{ + \tl_new:N\g_fxocg_refundefwarned_tl + \AtEndDocument{\msg_warning:nn{fixocgx}{undefined~OCGs}} + } + } + } +} + +\define@choicekey*[ocgp]{ocg}{viewocg}[\l_fxocg_viewbin_tl\l_fxocg_viewno_tl]{always,never,ifvisible}[ifvisible]{% + \if_case:w\l_fxocg_viewno_tl + \def\l_fxocg_view_tl{/View<</ViewState/ON>>} + \or:% + \def\l_fxocg_view_tl{/View<</ViewState/OFF>>} + \or: + \def\l_fxocg_view_tl{} + \fi: +} +\presetkeys[ocgp]{ocg}{viewocg=ifvisible,printocg=ifvisible,exportocg=ifvisible,listintoolbar=iffirstuse}{} + +\group_begin: +\char_set_catcode_active:N\+\let+\space +\tl_gset:Nx\g_fxocg_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+`fixocgx'+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_fxocg_gsoldwarning_tl}} + } + \fi +} + +\msg_set:nnn{fixocgx}{rerun}{Rerun~to~get~OCG~references~right!} +\msg_set:nnn{fixocgx}{undefined~OCG}{ + Line~\msg_line_number: :~OCG~`#1'~is~not~defined. +} +\msg_set:nnn{fixocgx}{undefined~OCGs}{There~were~undefined~OCGs!} + |