From ecb1680ccb53b3b96460fda99cecfb770843d96f Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 1 Nov 2015 22:14:21 +0000 Subject: media9 (1nov15) git-svn-id: svn://tug.org/texlive/trunk@38759 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/media9/media9.sty | 785 ++++++------------------- Master/texmf-dist/tex/latex/media9/pdfbase.sty | 635 ++++++++++++++++++++ 2 files changed, 799 insertions(+), 621 deletions(-) create mode 100644 Master/texmf-dist/tex/latex/media9/pdfbase.sty (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/latex/media9/media9.sty b/Master/texmf-dist/tex/latex/media9/media9.sty index cf51703e513..c690316b564 100644 --- a/Master/texmf-dist/tex/latex/media9/media9.sty +++ b/Master/texmf-dist/tex/latex/media9/media9.sty @@ -38,16 +38,14 @@ \RequirePackage{l3regex} \RequirePackage{l3keys2e} \RequirePackage{xparse} -\RequirePackage{ifpdf} \RequirePackage{atbegshi} \RequirePackage{atenddvi} -\RequirePackage{tikz} -\def\g@mix@date@tl{2015/08/18} -\def\g@mix@version@tl{0.58} +\def\g@mix@date@tl{2015/10/28} +\def\g@mix@version@tl{0.59} -\def\g@mix@liiikerneldate{2015/07/14} -\def\g@mix@liiipkgdate{2015/07/14} +\def\g@mix@liiikerneldate{2015/09/27} +\def\g@mix@liiipkgdate{2015/09/27} \ProvidesExplPackage{media9}{\g@mix@date@tl}{\g@mix@version@tl} {acrobat-9/X compatible media} @@ -82,18 +80,6 @@ \tex_endinput:D } -%testing for PDF output -\bool_new:N\g_mix_pdfoutput_bool -\bool_gset_false:N\g_mix_pdfoutput_bool -\ifpdf \bool_gset_true:N\g_mix_pdfoutput_bool \fi - -%pdfTeX version check -\pdftex_if_engine:T{ - \int_compare:nT{\pdftexversion<130}{ - \msg_interrupt:nnn{media9~error}{pdfTeX,~version~>=~1.30~required.}{} - } -} - %package options %unknown package option error message @@ -102,7 +88,6 @@ perhaps~it~is~spelled~incorrectly. } -\bool_new:N\g_mix_pkgbigfiles_bool \bool_new:N\g_mix_pkgattach_bool \bool_new:N\g_mix_dvipdfmx_bool \bool_new:N\g_mix_pkgdraft_bool @@ -133,17 +118,16 @@ %floating window settings \group_begin: -\char_set_lccode:nn{`\+}{`\@} -\tl_to_lowercase:n{ - \group_end: - \cs_new:Npn\mix_parse_windowedarg:w#1+#2+#3\q_stop{ - \tl_if_blank:nF{#1}{\tl_gset:Nn\g_mix_winsize_tl{#1}} - \tl_if_blank:nF{#2}{\tl_gset:Nn\g_mix_winpos_tl{#2}} - } - \cs_new:Nn\mix_parse_windowedarg:N{ - \exp_after:wN\mix_parse_windowedarg:w#1++\q_stop - } +\char_set_catcode_other:n{`\@} +\cs_new_protected:Npn\mix_parse_windowedarg:w#1@#2@#3\q_stop{ + \tl_if_blank:nF{#1}{\tl_gset:Nn\g_mix_winsize_tl{#1}} + \tl_if_blank:nF{#2}{\tl_gset:Nn\g_mix_winpos_tl{#2}} +} +\cs_new_protected:Nn\mix_parse_windowedarg:N{ + \exp_after:wN\mix_parse_windowedarg:w#1@@\q_stop } +\group_end: + \cs_new:Npn\mix_parse_winsizearg:w#1x#2\q_stop{ \str_if_eq:nnTF{#1}{default}{ \tl_gset:Nx\tl_mix_fltwd{ @@ -157,12 +141,20 @@ } \keys_define:nn{media9}{ - dvipdfmx .bool_gset:N = \g_mix_dvipdfmx_bool, - xetex .bool_gset:N = \g_mix_dvipdfmx_bool, + xetex .code:n = { + \PassOptionsToPackage{xetex}{pdfbase} + \PassOptionsToPackage{xetex}{ocgbase} + }, + + dvipdfmx .code:n = { + \PassOptionsToPackage{dvipdfmx}{pdfbase} + \PassOptionsToPackage{dvipdfmx}{ocgbase} + \bool_gset_true:N\g_mix_dvipdfmx_bool + }, bigfiles .choice:, - bigfiles / true .code:n = {\bool_gset_true:N\g_mix_pkgbigfiles_bool}, - bigfiles / false .code:n = {\bool_gset_false:N\g_mix_pkgbigfiles_bool}, + bigfiles / true .code:n = {\PassOptionsToPackage{bigfiles}{pdfbase}}, + bigfiles / false .code:n = {}, bigfiles .default:n = {true}, draft .choice:, @@ -323,7 +315,26 @@ } } \ProcessKeysOptions{media9} -\xetex_if_engine:T{\bool_gset_true:N\g_mix_dvipdfmx_bool} +\sys_if_engine_xetex:T{\bool_gset_true:N\g_mix_dvipdfmx_bool} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\RequirePackage{pdfbase} +%aliases for commands from pdfbase.sty +\cs_new_eq:NN\mix_pdfobj:nnn \pbs_pdfobj:nnn +\cs_new_eq:NN\mix_pdfannot:nnnn\pbs_pdfannot:nnnn +\cs_new_eq:NN\mix_pdflink:nn \pbs_pdflink:nn +\cs_new_eq:NN\mix_pdfxform:n \pbs_pdfxform:n +\cs_new_eq:NN\mix_pdfximage:n \pbs_pdfximage:n +\cs_new_eq:NN\mix_pdfcatalog:n \pbs_pdfcatalog:n +\cs_new_eq:NN\mix_pdfbdc:nn \pbs_pdfbdc:nn +\cs_new_eq:NN\mix_pdfemc: \pbs_pdfemc: + +\cs_set_eq:NN\mix_pdflastobj: \pbs_pdflastobj: +\cs_set_eq:NN\mix_pdflastann: \pbs_pdflastann: +\cs_set_eq:NN\mix_pdflastxform: \pbs_pdflastxform: +\cs_set_eq:NN\mix_pdflastximage:\pbs_pdflastximage: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\RequirePackage{ocgbase} %OCG generating and configuration macros \box_new:N\l_mix_poster_box \dim_new:N\g_mix_wd_dim @@ -358,18 +369,14 @@ Line~\msg_line_number: :~ File~`#1'~not~found.}{Make~sure~file~`#1'~exists~and~is~readable!} -\pdftex_if_engine:TF{ +\sys_if_engine_pdftex:TF{ %\pdfmdfivesum is used for hashing object references of embedded files \cs_new:Nn\mix_filemdfivesum:n{\pdfmdfivesum~file~{#1}} - \cs_new:Nn\mix_filesize:n{\pdffilesize{#1}} - \cs_new:Nn\mix_filedump:nnn{\pdffiledump~offset~#1~length~#2~{#3}} \cs_new:Nn\mix_unescapehex:n{(\pdfunescapehex{#1})} }{ - \luatex_if_engine:TF{ + \sys_if_engine_luatex:TF{ \RequirePackage{pdftexcmds} \cs_new:Nn\mix_filemdfivesum:n{\pdf@filemdfivesum{#1}} - \cs_new:Nn\mix_filesize:n{\pdf@filesize{#1}} - \cs_new:Nn\mix_filedump:nnn{\pdf@filedump{#1}{#2}{#3}} \cs_new:Nn\mix_unescapehex:n{<#1>} }{ \cs_new:Nn\mix_filemdfivesum:n{#1} @@ -380,7 +387,7 @@ \cs_new:Npn\mix@newkey#1#2{\tl_gset:cx{#1}{#2}} %macros for writing global defs to \jobname.aux -\msg_set:nnn{media9}{rerun}{Rerun~to~get~media~labels~right!} +\msg_set:nnn{media9}{rerun}{Rerun~to~get~internal~references~right!} \msg_set:nnn{media9}{undefined~reference}{ Line~\msg_line_number: :~Media~reference~`#1'~not~defined. } @@ -392,7 +399,7 @@ \msg_set:nnn{media9}{multiple~labels}{There~were~multiply-defined~labels!} \cs_gset:Nn\mix_keytoaux_now:nn{ - \iow_now:Nx\@auxout{\token_to_str:N\mix@newkey{#1}{#2}} + \iow_now:Nx\@mainaux{\token_to_str:N\mix@newkey{#1}{#2}} \bool_if:nT{ % !\cs_if_exist_p:c{#1} || !\str_if_eq_x_p:nn{\tl_use:c{#1}}{#2} !\cs_if_exist:cTF{#1}{ @@ -408,7 +415,7 @@ } } \cs_gset:Nn\mix_keytoaux_shipout:nn{ - \iow_shipout_x:Nx\@auxout{\token_to_str:N\mix@newkey{#1}{#2}} + \iow_shipout_x:Nx\@mainaux{\token_to_str:N\mix@newkey{#1}{#2}} \cs_if_exist:cF{#1}{ \cs_if_exist:NF\g_mix_rerunwarned_tl{ \tl_new:N\g_mix_rerunwarned_tl @@ -514,7 +521,7 @@ %excessive DVI resolution message \group_begin: \char_set_catcode_active:N\+\let+\space -\tl_gset:Nx\g_mix_dpiwarning_tl{ +\cs_new:Nx\mix_dpiwarning:{ {Resolution~1200~gt~VResolution~1200~gt~or~product~(Ghostscript)~ search~{pop~pop~pop~true}{pop~false}ifelse~and~{ (\token_to_str:N\n @@ -538,525 +545,40 @@ } \group_end: -%macros for adding AcroForm and OCProperties dicts to PDF Catalog -\tl_if_exist:cF{@anim@fields}{\tl_gset:cn{@anim@fields}{}}%takes Field object refs +%adding AcroForm dict to PDF Catalog +\tl_if_exist:cF{@anim@fields}{\tl_new:c{@anim@fields}}%takes Field object refs \tl_if_exist:cF{Acro@Form@added}{ %AcroForm dict \AtEndDvi{ \tl_if_empty:NF\@anim@fields{ \mix_pdfobj:nnn{}{array}{\@anim@fields} \mix_pdfcatalog:n{ - /AcroForm~<>} + /AcroForm~<>} } } \tl_gset:cn{Acro@Form@added}{} } -\tl_if_exist:cF{@ocgbase@ocgs}{\tl_gset:cn{@ocgbase@ocgs}{}} %takes ocg object refs -\tl_if_exist:cF{@ocgbase@offocgs}{\tl_gset:cn{@ocgbase@offocgs}{}} -\tl_if_exist:cF{@ocgbase@ocgorder}{\tl_gset:cn{@ocgbase@ocgorder}{}} -\tl_if_exist:cF{oc@props@added}{ - \AtEndDvi{ - \tl_if_empty:NF\@ocgbase@ocgs{ - \mix_pdfobj:nnn{}{array}{\@ocgbase@ocgs} - \tl_gset:Nx\g_mix_ocgarray_tl{\g_mix_pdflastobj_tl} - \tl_if_empty:NTF\@ocgbase@offocgs{ - \tl_gset:Nn\g_mix_offocgentry_tl{} - }{ - \mix_pdfobj:nnn{}{array}{\@ocgbase@offocgs} - \tl_gset:Nx\g_mix_offocgentry_tl{/OFF~\g_mix_pdflastobj_tl} - } - \tl_if_empty:NTF\@ocgbase@ocgorder{ - \tl_gset:Nn\g_mix_ocgorderentry_tl{} - }{ - \mix_pdfobj:nnn{}{array}{\@ocgbase@ocgorder} - \tl_gset:Nx\g_mix_ocgorderentry_tl{/Order~\g_mix_pdflastobj_tl} - } - \mix_pdfcatalog:n{ - /OCProperties~<< - /OCGs~\g_mix_ocgarray_tl - /D~<< - /AS~[ - <> - <> - <> - ] - /BaseState/ON~\g_mix_offocgentry_tl - \g_mix_ocgorderentry_tl~/ListMode/VisiblePages - >> - >> - } - } - } - \tl_gset:cn{oc@props@added}{} -} \cs_new:Nn\mix_insert_btnocg:{%OCG for play button overlay - \mix_pdfobj:nnn{}{dict}{ - /Type/OCG/Name~(MediaPlayButton\int_use:N\g_mix_rmcnt_int) - /Usage<< - /Print<> - /Export<> - >> - } - \tl_gput_right:Nx\@ocgbase@ocgs{\space\g_mix_pdflastobj_tl} - \tl_gput_right:Nx\@ocgbase@offocgs{\space\g_mix_pdflastobj_tl} - \tl_gset:Nx\g_mix_btnocg_tl{\g_mix_pdflastobj_tl} + \ocgbase_new_ocg:xxx{MediaPlayButton\int_use:N\g_mix_rmcnt_int}{ + /Print<>/Export<> + }{off} + \tl_gset:Nx\g_mix_btnocg_tl{\ocgbase_last_ocg:} } -%commands for creating PDF objects, annots etc. -\bool_if:NTF\g_mix_pdfoutput_bool{ - %helper func to remove `0 R' part from pdf obj reference - \cs_new:Npn\mix_reftonum:w #1~0~R {#1} - \cs_new:Nn\mix_pdfobj:nnn{ - % #1: predefined obj ref to be used with the current obj; may be empty - % #2: type of object (dict|array|stream|fstream) - % #3: content (key-value, file, string); if #3 && #1 are both empty, an - % object reference will be reserved for later use - \tl_clear:N\l_mix_usenum_tl - \tl_if_blank:oF{#1}{ - \tl_set:Nx\l_mix_usenum_tl{useobjnum~\exp_after:wN \mix_reftonum:w #1} - } - \bool_if:nTF{\tl_if_blank_p:o{#1}&&\tl_if_blank_p:o{#3}}{ - \pdfobj~reserveobjnum - }{ - \str_case:nn{#2}{ - {dict}{\immediate\pdfobj~\l_mix_usenum_tl~{<<#3>>}} - {array}{\immediate\pdfobj~\l_mix_usenum_tl~{[#3]}} - {stream}{\immediate\pdfobj~\l_mix_usenum_tl~stream~{#3}} - {fstream}{\immediate\pdfobj~\l_mix_usenum_tl~stream~file~{#3}} - } - } - \tl_gset:Nx\g_mix_pdflastobj_tl{\the\pdflastobj\space 0~R} - } - - \cs_new:Nn\mix_pdfannot:nnnn{ - % #1:width, #2:height, #3:depth, #4:content (key-value) - \immediate\pdfannot~width~#1~height~#2~depth~#3 {#4} - \tl_gset:Nx\g_mix_pdflastann_tl{\int_use:c{pdflastannot}~0~R} - } - - \cs_new:Nn\mix_pdflink:nn{% #1:dict, #2:text - \immediate\pdfstartlink~user~{#1}#2\pdfendlink - } - - \cs_new:Nn\mix_pdfxform:n{%#1:savebox number - \immediate\pdfxform~resources~{\the\pdfpageresources}~#1 - \tl_gset:Nx\g_mix_pdflastxform_tl{\int_use:c{pdflastxform}~0~R} - } - - \cs_new:Nn\mix_pdfximage:n{%#1:bitmap file name - \bool_if:nTF{ - \str_if_eq_p:Vn\l_mix_ext_tl{png} - ||\str_if_eq_p:Vn\l_mix_ext_tl{jpg} - ||\str_if_eq_p:Vn\l_mix_ext_tl{jpeg} - ||\str_if_eq_p:Vn\l_mix_ext_tl{jbig2} - ||\str_if_eq_p:Vn\l_mix_ext_tl{jb2} - }{ - \immediate\pdfximage{#1} - \tl_gset:Nx\g_mix_pdflastximage_tl{\int_use:c{pdflastximage}~0~R} - }{ - \msg_error:nnnnn{media9}{wrong~image~resource}{#1}{pdftex}{ - png,~jpeg~and~jbig2 - } - } - } - +%output mode dependent command definitions +\sys_if_output_pdf:TF{ \cs_new:Nn\mix_ndname:n{%#1:HEX encoded string %converted to binary UTF16BE using \pdfunescapehex (pdfTeX only) \tl_set:Nn\l_mix_ndname_tl{\mix_unescapehex:n{#1}} } - - \cs_new:Nn\mix_pdfcatalog:n{\pdfcatalog{#1}} - - %marked content BDC/EMC operators - \int_new:N\g_mix_oc_int % object ID - \cs_new:Nn\mix_pdfbdc:nn{ % #1: tag, #2: prop. dict obj ID - \pdfliteral~direct~{#1/rm@oc\int_use:N\g_mix_oc_int\space BDC} - \tl_if_empty:NTF\@anim@ocmap{ - \tl_gset:cx{@anim@ocmap}{/rm@oc\int_use:N\g_mix_oc_int\space#2} - }{ - \tl_gput_right:cx{@anim@ocmap}{~/rm@oc\int_use:N\g_mix_oc_int\space#2} - } - \group_begin: - \tl_set:Nx\l_mix_temp_tl{\group_end: - \global\pdfpageresources{\the\pdfpageresources - /Properties<<\@anim@ocmap>> - } - }\l_mix_temp_tl - \int_gincr:N\g_mix_oc_int - } - \tl_if_exist:cF{@anim@ocmap}{ - \tl_gset:cn{@anim@ocmap}{} - \AtBeginShipout{\tl_gset:cn{@anim@ocmap}{}} - } - \cs_new:Nn\mix_pdfemc:{\pdfliteral~direct~{EMC}} }{ - %pgf + transparency related settings - \bool_new:N\g_mix_pgfloaded_bool - \bool_gset_false:N\g_mix_pgfloaded_bool - \AtBeginDocument{ - \@ifpackageloaded{pgf}{\bool_gset_true:N\g_mix_pgfloaded_bool}{} - } - \int_new:N\g_mix_obj_int % object ID \bool_if:NTF\g_mix_dvipdfmx_bool{ %dvipdfmx/XeTeX - \cs_new:Nn\mix_pdfobj:nnn{ - % #1: predefined obj ref to be used with the current obj; may be empty - % #2: type of object (dict|array|stream|fstream) - % #3: content (key-value, file, string); if #3 && #1 are both empty, an - % object reference will be reserved for later use - \tl_if_blank:oTF{#1}{ - \tl_set:Nx\l_mix_usenum_tl{@mix@obj\int_use:N\g_mix_obj_int} - \int_gincr:N\g_mix_obj_int - }{ - \tl_set:Nx\l_mix_usenum_tl{#1} - } - \tl_if_blank:oF{#3}{ - \str_case:nn{#2}{ - {dict}{\special{pdf:obj~\l_mix_usenum_tl\space<<#3>>}} - {array}{\special{pdf:obj~\l_mix_usenum_tl\space[#3]}} - {stream}{\special{pdf:stream~\l_mix_usenum_tl\space(#3)}} - {fstream}{ - \message{<#3>} - \special{pdf:fstream~\l_mix_usenum_tl\space(#3)} - } - } - } - \tl_gset_eq:NN\g_mix_pdflastobj_tl\l_mix_usenum_tl - } - - \cs_new:Nn\mix_pdfannot:nnnn{ - % #1:width, #2:height, #3:depth, #4:content (key-value) - \special{pdf:ann~@mix@obj\int_use:N\g_mix_obj_int\space - width~#1\space - height~#2\space - depth~#3~<<#4>> - } - \tl_gset:Nx\g_mix_pdflastann_tl{@mix@obj\int_use:N\g_mix_obj_int} - \int_gincr:N\g_mix_obj_int - } - - \cs_new:Nn\mix_pdflink:nn{% #1:dict, #2:text - \special{pdf:bann~<<#1>>}#2\special{pdf:eann} - } - - \cs_new:Nn\mix_pdfxform:n{%#1:savebox number - \special{pdf:bxobj~@mix@obj\int_use:N\g_mix_obj_int\space - width\space \dim_use:N\box_wd:N#1\space - height\space\dim_use:N\box_ht:N#1\space - depth\space \dim_use:N\box_dp:N#1 - } - \begin{picture}(0,0)\put(0,0){\box_use:N #1}\end{picture} - \bool_if:NT\g_mix_pgfloaded_bool{ % transparency et al. for PGF - \tl_set:Nn\l_mix_temp_tl{} - \ifpgf@sys@pdf@extgs@exists - \tl_set:Nn\l_mix_temp_tl{/ExtGState~@pgfextgs} - \fi - \ifpgf@sys@pdf@patterns@exists - \tl_put_right:Nn\l_mix_temp_tl{/Pattern~@pgfpatterns} - \fi - \ifpgf@sys@pdf@colorspaces@exists - \tl_put_right:Nn\l_mix_temp_tl{/ColorSpace~@pgfcolorspaces} - \fi - \tl_if_blank:VF\l_mix_temp_tl{ - \special{pdf:put~@resources~<<\l_mix_temp_tl>>} - } - } - \special{pdf:exobj} - \tl_gset:Nx\g_mix_pdflastxform_tl{@mix@obj\int_use:N\g_mix_obj_int} - \int_gincr:N\g_mix_obj_int - } - - \cs_new:Nn\mix_pdfximage:n{%#1:bitmap file name - \bool_if:nTF{ - \str_if_eq_p:Vn\l_mix_ext_tl{png} - ||\str_if_eq_p:Vn\l_mix_ext_tl{jpg} - ||\str_if_eq_p:Vn\l_mix_ext_tl{jpeg} - }{ - \special{pdf:image~@mix@obj\int_use:N\g_mix_obj_int\space - %move initial display off the page - matrix~0.000001~0~0~0.000001~-1000000~-1000000~(#1)} - \tl_gset:Nx\g_mix_pdflastximage_tl{@mix@obj\int_use:N\g_mix_obj_int} - \int_gincr:N\g_mix_obj_int - }{ - \msg_error:nnnnn{media9}{wrong~image~resource}{#1}{dvipdfmx/xetex}{ - png~and~jpeg - } - } - } - \cs_new:Nn\mix_ndname:n{%#1:HEX encoded UTF16BE string \tl_set:Nn\l_mix_ndname_tl{<#1>} } - - \cs_new:Nn\mix_pdfcatalog:n{\special{pdf:put~@catalog~<<#1>>}} - - %marked content BDC/EMC operators - \int_new:N\g_mix_oc_int % object ID - \cs_new:Nn\mix_pdfbdc:nn{ - \special{pdf:code~#1/rm@oc\int_use:N\g_mix_oc_int\space BDC} - \special{pdf:put~@resources~<< - /Properties~<>>>} - \int_gincr:N\g_mix_oc_int - } - \cs_new:Nn\mix_pdfemc:{\special{pdf:~code~EMC}} }{ - % dvips - \bool_new:N\g_mix_powerdot_bool %to cope with some powerdot oddity - \@ifclassloaded{powerdot}{\bool_gset_true:N\g_mix_powerdot_bool}{} - - \@ifpackageloaded{hyperref}{}{ - %define `?pdfmark' operator as in file hdvips.def from package `hyperref' - \special{!~ - systemdict~/pdfmark~known - { - userdict~/?pdfmark~systemdict~/exec~get~put - }{ - userdict~/?pdfmark~systemdict~/pop~get~put~ - userdict~/pdfmark~systemdict~/cleartomark~get~put - } - ifelse~ - } - } - - \bool_if:NT\g_mix_pkgbigfiles_bool{ - \special{psfile=\jobname.m9} - %open auxiliary file \jobname.m9 for writing hex encoded streams of the - %files to be embedded. This file is inserted into PS during dvips run - \iow_new:N\g_mix_mstreams_stream - \iow_open:Nn\g_mix_mstreams_stream{\jobname.m9} - \iow_now:Nn\g_mix_mstreams_stream{ - /M9D~1~dict~def~M9D~begin - /o{mark/_objdef}bind~def/O{/type/stream/OBJ~pdfmark}bind~def - /m~systemdict/mark~get~def - /P{/ASCIIHexDecode~filter/PUT~pdfmark}bind~def - /C{/CLOSE~pdfmark}bind~def~end - } - } - %determine DVI resolution and output warning message if too big - %\AtBeginDocument{\special{ps:\g_mix_dpiwarning_tl}} - \AtEndDvi{\special{ps:\g_mix_dpiwarning_tl}} - - \cs_new:Nn\mix_pdfobj:nnn{ - % #1: predefined obj ref to be used with the current obj; may be empty - % #2: type of object (dict|array|stream|fstream) - % #3: content (key-value, file, string); if #3 && #1 are both empty, an - % object reference will be reserved for later use - \tl_clear:N\l_mix_usenum_tl - \tl_if_blank:oTF{#1}{ - \tl_set:Nx\l_mix_usenum_tl{{mix@obj\int_use:N\g_mix_obj_int}} - \int_gincr:N\g_mix_obj_int - }{ - \tl_set:Nx\l_mix_usenum_tl{#1} - } - \tl_if_blank:oF{#3}{ - \bool_if:nTF{ - \g_mix_pkgbigfiles_bool && - \str_if_eq_p:nn{#2}{fstream} - }{ - \iow_now:Nx\g_mix_mstreams_stream{ - M9D~begin~o\l_mix_usenum_tl O - } - }{ - \special{ps:~mark~/_objdef~\l_mix_usenum_tl\space/type - \str_case:nn{#2}{ - {dict}{/dict} - {array}{/array} - {stream}{/stream} - {fstream}{/stream} - }~ - /OBJ~pdfmark~ - } - } - \str_case:nn{#2}{ - {dict}{\special{ps:~mark~\l_mix_usenum_tl~<<#3>>/PUT~pdfmark~}} - {array}{ - \special{ps:~mark~\l_mix_usenum_tl~0~[#3]/PUTINTERVAL~pdfmark~} - } - {stream}{\special{ps::[nobreak]~mark~\l_mix_usenum_tl~(#3)/PUT~pdfmark~}} - {fstream}{ - \tl_set:Nn\l_mix_offset_tl{0} - \tl_set:Nx\l_mix_fsize_tl{\mix_filesize:n{#3}} - \message{<#3} - %embed file in chunks of 32768 Bytes into PS as chunks of - %65536 Bytes of HEX code - \bool_while_do:nn{ - \int_compare_p:n{\l_mix_offset_tl<\l_mix_fsize_tl} - }{ - \bool_if:NTF\g_mix_pkgbigfiles_bool{ - \iow_now:Nx\g_mix_mstreams_stream{ - m\l_mix_usenum_tl - (\mix_filedump:nnn{\l_mix_offset_tl}{32767}{#3})P - } - }{ - \special{ps:~ - mark~ - \l_mix_usenum_tl~ - (\mix_filedump:nnn{\l_mix_offset_tl}{32767}{#3})~ - /ASCIIHexDecode~filter~/PUT~ - pdfmark~ - } - } - \tl_set:Nx\l_mix_offset_tl{\int_eval:n{\l_mix_offset_tl+32767}} - \message{.} - } - \message{>} - \bool_if:NTF\g_mix_pkgbigfiles_bool{ - \iow_now:Nx\g_mix_mstreams_stream{ - m\l_mix_usenum_tl~C~end - } - }{ - \special{ps:~ - mark~\l_mix_usenum_tl~/CLOSE~pdfmark~ - } - } - } - } - } - \tl_gset_eq:NN\g_mix_pdflastobj_tl\l_mix_usenum_tl - } - - \cs_new:Nn\mix_pdfannot:nnnn{ - \hbox_set:Nn\l_tmpa_box{ - \box_move_down:nn{#3}{ - \hbox_to_zero:n{ - \special{ps:~currentpoint~/mix@lly~exch~def~/mix@llx~exch~def} - } - } - \skip_horizontal:n{#1} - \box_move_up:nn{#2}{ - \hbox_to_zero:n{ - \special{ps:~currentpoint~/mix@ury~exch~def~/mix@urx~exch~def} - } - } - } - \box_set_wd:Nn\l_tmpa_box{\c_zero_dim} - \box_set_ht:Nn\l_tmpa_box{\c_zero_dim} - \box_set_dp:Nn\l_tmpa_box{\c_zero_dim} - \box_use_clear:N\l_tmpa_box - \special{ps:~ - mark~ - /_objdef~{mix@obj\int_use:N\g_mix_obj_int} - /Rect~[mix@llx~mix@lly~mix@urx~mix@ury] - #4 - /ANN~pdfmark~ - } - \tl_gset:Nx\g_mix_pdflastann_tl{{mix@obj\int_use:N\g_mix_obj_int}} - \int_gincr:N\g_mix_obj_int - } - - \cs_new:Nn\mix_pdflink:nn{% #1:dict, #2:text - \cs_if_exist:NTF\pdfmark{ - \pdfmark[#2]{pdfmark=/ANN,Raw={#1}} - }{ - \hbox_set:Nn\l_tmpb_box{#2} - \mix_pdfannot:nnnn{ - \dim_use:N\box_wd:N\l_tmpb_box}{ - \dim_use:N\box_ht:N\l_tmpb_box}{ - \dim_use:N\box_dp:N\l_tmpb_box - }{#1} - \box_use_clear:N\l_tmpb_box - } - } - - \cs_new:Nn\mix_pdfxform:n{%#1:savebox number - %mark bbox of box#1 - \hbox_set:Nn\l_tmpa_box{ - \box_move_down:nn{\box_dp:N #1}{ - \hbox_to_zero:n{ - \special{ps:~currentpoint~/mix@lly~exch~def~/mix@llx~exch~def} - } - } - \skip_horizontal:n{\box_wd:N #1} - \box_move_up:nn{\box_ht:N #1}{ - \hbox_to_zero:n{ - \special{ps:~currentpoint~/mix@ury~exch~def~/mix@urx~exch~def} - } - } - } - \box_set_wd:Nn\l_tmpa_box{\c_zero_dim} - \box_set_ht:Nn\l_tmpa_box{\c_zero_dim} - \box_set_dp:Nn\l_tmpa_box{\c_zero_dim} - \box_use_clear:N\l_tmpa_box - %define some length values in current PS coordinate units - \hbox_set:Nn\l_tmpa_box{ - \special{ps:~currentpoint~/origin@y~exch~def~/origin@x~exch~def} - \skip_horizontal:n{72.27pt} - \box_move_up:nn{72.27pt}{ - \hbox_to_zero:n{ - \special{ps:~ - currentpoint~origin@y~exch~sub~/one@inch@y~exch~def~ - origin@x~sub~/one@inch@x~exch~def - } - } - } - } - \box_set_wd:Nn\l_tmpa_box{\c_zero_dim} - \box_set_ht:Nn\l_tmpa_box{\c_zero_dim} - \box_use_clear:N\l_tmpa_box - \special{ps:~ - gsave~ - %translate graphics to upper left page corner - \bool_if:NF\g_mix_powerdot_bool{ - { - mix@llx~neg~mix@ury~neg~translate~ - one@inch@x~DVImag~div~neg~one@inch@y~DVImag~div~neg~translate - }?pdfmark~ - } - %distill graphics into XObject - mark~ - /_objdef~{mix@obj\int_use:N\g_mix_obj_int} - /BBox~[mix@llx~mix@lly~mix@urx~mix@ury] - /BP~pdfmark~ - { - isls{%landscape mode (powerdot, geometry /w landscape option) - /mix@dxdy~{ - mix@urx~mix@llx~sub~abs~ - mix@ury~mix@lly~sub~abs~div - }~bind~def - /mix@dydx~{1~mix@dxdy~div}~bind~def - /mix@cx~{mix@urx~mix@llx~add~2~div}~bind~def - /mix@cy~{mix@ury~mix@lly~add~2~div}~bind~def - % graphics needs to be rescaled for some reason ... - [mix@dxdy~0~0~mix@dydx~1~mix@dxdy~sub~mix@cx~mul~ - 1~mix@dydx~sub~mix@cy~mul]~concat - %... rotated by 270 degrees ... - [0~-1~1~0~mix@cx~mix@cy~sub~mix@cx~mix@cy~add]~concat - %... and flipped around vertical axis - [-1~0~0~1~mix@llx~mix@urx~add~0]~concat - }{% flip around horizontal axis in portrait mode - [1~0~0~-1~0~mix@lly~mix@ury~add]~concat - }ifelse - }?pdfmark~ - } - \begin{picture}(0,0)\put(0,0){\box_use:N #1}\end{picture} - \special{ps:~mark~/EP~pdfmark~grestore} - \tl_gset:Nx\g_mix_pdflastxform_tl{{mix@obj\int_use:N\g_mix_obj_int}} - \int_gincr:N\g_mix_obj_int - } - - %Image XObject - \cs_new:Nn\mix_pdfximage:n{%#1:bitmap file name - \bool_if:nTF{ - \str_if_eq_p:Vn\l_mix_ext_tl{ps} - ||\str_if_eq_p:Vn\l_mix_ext_tl{eps} - }{ - \special{ps:~ - mark~/_objdef~{mix@obj\int_use:N\g_mix_obj_int}~/NI~pdfmark~ - } - \special{psfile=#1~hsize=0~vsize=0} - \special{ps:~ - { - 0~0~1~[1~0~0~1~0~0]~{}~image~%empty dummy, in case #1 is not - }?pdfmark~ %a valid raster image file - } - \tl_gset:Nx\g_mix_pdflastximage_tl{{mix@obj\int_use:N\g_mix_obj_int}} - \int_gincr:N\g_mix_obj_int - }{ - \msg_error:nnxxx{media9}{wrong~image~resource}{#1}{dvips}{ - Postscript~(ps/eps)~with~bitmapped~content - } - } - } + \AtEndDvi{\special{ps:\mix_dpiwarning:}} %3DNode name \cs_new:Nn\mix_ndname:n{%#1:HEX encoded unicode string @@ -1068,15 +590,6 @@ %converted to binary UTF16BE by ps2pdf \tl_set:Nn\l_mix_ndname_tl{mix@unicode} } - - \cs_new:Nn\mix_pdfcatalog:n{ - \special{ps:~mark~{Catalog}~<<#1>>~/PUT~pdfmark} - } - - %marked content BDC/EMC operators for playbutton ocg; - %require Ghostscript v. >= 9.15 - \cs_new:Nn\mix_pdfbdc:nn{\special{ps:~mark~#1~#2~/BDC~pdfmark}} - \cs_new:Nn\mix_pdfemc:{\special{ps:~mark~/EMC~pdfmark}} } } @@ -1092,7 +605,7 @@ \bool_if:NTF\l_mix_url_bool{ \cs_if_exist:cF{url_#1}{ \mix_pdfobj:nnn{}{dict}{/FS/URL/F(#1)} - \tl_gset:cx{url_#1}{\g_mix_pdflastobj_tl} + \tl_gset:cx{url_#1}{\mix_pdflastobj:} } %every new url should be added to assets tree of the current annot \cs_if_exist:cF{url_\int_use:c{g_mix_rmcnt_int}_#1}{ @@ -1123,7 +636,7 @@ \cs_if_exist:cF{imgXobj_\mix_filemdfivesum:n{\l_mix_file_tl}}{ \mix_pdfximage:n{\l_mix_file_tl} \tl_gset:cx{imgXobj_\mix_filemdfivesum:n{\l_mix_file_tl}}{ - \g_mix_pdflastximage_tl + \mix_pdflastximage: } } %create fake FileSpec for current file name if not yet existent @@ -1144,7 +657,7 @@ \cs_if_exist:cF{fileEmb_\mix_filemdfivesum:n{\l_mix_file_tl}}{ \mix_pdfobj:nnn{}{fstream}{\l_mix_file_tl} \tl_gset:cx{fileEmb_\mix_filemdfivesum:n{\l_mix_file_tl}}{ - \g_mix_pdflastobj_tl + \mix_pdflastobj: } } %create FileSpec for current file name if not yet existent @@ -1153,13 +666,13 @@ /Type/Filespec/F~(#1)%/UF~(#1) /EF~<> } - \tl_gset:cx{fileSpec_#1}{\g_mix_pdflastobj_tl} + \tl_gset:cx{fileSpec_#1}{\mix_pdflastobj:} \bool_if:NT\g_mix_usrattach_bool{ \mix_pdfannot:nnnn{0pt}{0pt}{0pt}{ /Contents~(media~resource) /F~2\cs_if_exist_use:N /Subtype/FileAttachment - /FS~\g_mix_pdflastobj_tl + /FS~\mix_pdflastobj: } } } @@ -1331,32 +844,62 @@ \ExplSyntaxOff \newdimen\mix@btn@dim \def\g@mix@pbtn@fancy@tl#1#2{% width, total height - \mix@btn@dim=\dimexpr\baselineskip*3\relax% - \ifdim#1<\mix@btn@dim\mix@btn@dim=#1\fi% - \ifdim#2<\mix@btn@dim\mix@btn@dim=#2\fi% - \tikz[x=\mix@btn@dim,y=\mix@btn@dim,transparency group]{% - \shade [opacity=\ifdim#2>\dimexpr\baselineskip*6\relax0.6\else0\fi, - shading angle=-180,even odd rule] - (-\dimexpr#1/2\relax,-0.5) rectangle (\dimexpr#1/2\relax,0.5) - (0,0) circle (0.4); - \shade [ball color=gray,opacity=0.6] (0,0) circle (0.4); - \fill [color=white,opacity=0.6] %triangle - (-0.152,0.224)--(-0.152,-0.224)--+(30:0.4844)--cycle; - }% + \ifdefined\tikz% + \mix@btn@dim=\dimexpr\baselineskip*3\relax% + \ifdim#1<\mix@btn@dim\mix@btn@dim=#1\fi% + \ifdim#2<\mix@btn@dim\mix@btn@dim=#2\fi% + \tikz[x=\mix@btn@dim,y=\mix@btn@dim,transparency group]{% + \shade [opacity=\ifdim#2>\dimexpr\baselineskip*6\relax0.6\else0\fi, + shading angle=-180,even odd rule] + (-\dimexpr#1/2\relax,-0.5) rectangle (\dimexpr#1/2\relax,0.5) + (0,0) circle (0.4); + \shade [ball color=gray,opacity=0.6] (0,0) circle (0.4); + \fill [color=white,opacity=0.6] %triangle + (-0.152,0.224)--(-0.152,-0.224)--+(30:0.4844)--cycle; + }% + \else% + \ifcsname g_mix_rerunwarned_tl\endcsname\else% + \expandafter\gdef\csname g_mix_rerunwarned_tl\endcsname{}% + \AtEndDocument{\csname msg_warning:nn\endcsname{media9}{rerun}}% + \fi% + \fi% + \ifdefined\mix@AtEnd@Doc\else% + \@bsphack\protected@write\@mainaux{}{% + \string\ifdefined\string\mix@AtEnd@Doc\string\else% + \string\AtBeginDocument{\string\RequirePackage{tikz}}% + \string\fi% + }\@esphack% + \gdef\mix@AtEnd@Doc{}% + \fi% } \def\g@mix@pbtn@plain@tl#1#2{% width, total height - \mix@btn@dim=\dimexpr\baselineskip*3\relax% - \ifdim#1<\mix@btn@dim\mix@btn@dim=#1\fi% - \ifdim#2<\mix@btn@dim\mix@btn@dim=#2\fi% - \tikz[x=\mix@btn@dim,y=\mix@btn@dim,transparency group]{% - \fill [opacity=\ifdim#2>\dimexpr\baselineskip*6\relax0.5\else0\fi, - color=gray,even odd rule] - (-\dimexpr#1/2\relax,-0.5) rectangle (\dimexpr#1/2\relax,0.5); - (0,0) circle (0.4); - \fill [color=black,opacity=0.5] (0,0) circle (0.4); - \fill [color=white,opacity=0.8] - (-0.152,0.224)--(-0.152,-0.224)--+(30:0.4844)--cycle; - }% + \ifdefined\tikz% + \mix@btn@dim=\dimexpr\baselineskip*3\relax% + \ifdim#1<\mix@btn@dim\mix@btn@dim=#1\fi% + \ifdim#2<\mix@btn@dim\mix@btn@dim=#2\fi% + \tikz[x=\mix@btn@dim,y=\mix@btn@dim,transparency group]{% + \fill [opacity=\ifdim#2>\dimexpr\baselineskip*6\relax0.5\else0\fi, + color=gray,even odd rule] + (-\dimexpr#1/2\relax,-0.5) rectangle (\dimexpr#1/2\relax,0.5); + (0,0) circle (0.4); + \fill [color=black,opacity=0.5] (0,0) circle (0.4); + \fill [color=white,opacity=0.8] + (-0.152,0.224)--(-0.152,-0.224)--+(30:0.4844)--cycle; + }% + \else% + \ifcsname g_mix_rerunwarned_tl\endcsname\else% + \expandafter\gdef\csname g_mix_rerunwarned_tl\endcsname{}% + \AtEndDocument{\csname msg_warning:nn\endcsname{media9}{rerun}}% + \fi% + \fi% + \ifdefined\mix@AtEnd@Doc\else% + \@bsphack\protected@write\@mainaux{}{% + \string\ifdefined\string\mix@AtEnd@Doc\string\else% + \string\AtBeginDocument{\string\RequirePackage{tikz}}% + \string\fi% + }\@esphack% + \gdef\mix@AtEnd@Doc{}% + \fi% } \ExplSyntaxOn @@ -1369,7 +912,7 @@ \cs_if_exist:NF\g_mix_appearance_tl{ \hbox_set:Nn\l_mix_poster_box{\phantom{\rule{1pt}{1pt}}} \mix_pdfxform:n{\l_mix_poster_box} - \tl_gset:Nx\g_mix_appearance_tl{\g_mix_pdflastxform_tl} + \tl_gset:Nx\g_mix_appearance_tl{\mix_pdflastxform:} } \mix_reset: \mix_uribegin: %treat URI characters correctly @@ -1418,12 +961,12 @@ } } \mix_pdfobj:nnn{}{dict}{ - /Type/Filespec/EF~<>/F~(btnoff)%/UF~(btnoff) + /Type/Filespec/EF~<>/F~(btnoff)%/UF~(btnoff) } - \tl_gset:Nx\g_mix_assets_tl{(btnoff)~\g_mix_pdflastobj_tl} - \tl_set:Nx\l_mix_scripts_tl{~\g_mix_pdflastobj_tl~} + \tl_gset:Nx\g_mix_assets_tl{(btnoff)~\mix_pdflastobj:} + \tl_set:Nx\l_mix_scripts_tl{~\mix_pdflastobj:~} %enforce plain playbutton overlay for XeTeX - \xetex_if_engine:T{\tl_gset:Nn\g_mix_usrpbtn_tl{plain}} + \sys_if_engine_xetex:T{\tl_gset:Nn\g_mix_usrpbtn_tl{plain}} } %embed main asset \mix_uribegin: @@ -1499,7 +1042,7 @@ \tl_set_eq:NN\l_mix_nr_tl\g_mix_nrdflt_tl \mix_view:n{Default} - \tl_set:Nx\l_mix_dfltview_tl{\g_mix_pdflastobj_tl} + \tl_set:Nx\l_mix_dfltview_tl{\mix_pdflastobj:} } \mix_pdfobj:nnn{}{dict}{ @@ -1520,24 +1063,24 @@ } } \tl_if_empty:NF\g_mix_usrlabel_tl{ - \mix_keytoaux_now:nn{main@\g_mix_usrlabel_tl}{\g_mix_pdflastobj_tl} + \mix_keytoaux_now:nn{main@\g_mix_usrlabel_tl}{\mix_pdflastobj:} } \mix_pdfobj:nnn{}{dict}{ /Type/RichMediaConfiguration /Subtype/\g_mix_mainassetsub_tl - /Instances~[\g_mix_pdflastobj_tl] + /Instances~[\mix_pdflastobj:] } \mix_pdfobj:nnn{}{dict}{ /Type/RichMediaContent /Assets~<> - /Configurations~[\g_mix_pdflastobj_tl] + /Configurations~[\mix_pdflastobj:] \bool_if:nT{ \g_mix_iiid_bool && !(\tl_if_empty_p:V\l_mix_iiidviewarray_tl) }{ /Views~[\l_mix_iiidviewarray_tl] } } - \tl_set:Nx\l_mix_content_tl{\g_mix_pdflastobj_tl} + \tl_set:Nx\l_mix_content_tl{\mix_pdflastobj:} \bool_if:nT{ \g_mix_iiid_bool && \str_if_eq_p:Vn\g_mix_playtpe_tl{Oscillating} }{ @@ -1600,14 +1143,14 @@ >> /Deactivation~<> } - \tl_set:Nx\l_mix_settings_tl{\g_mix_pdflastobj_tl} + \tl_set:Nx\l_mix_settings_tl{\mix_pdflastobj:} \tl_if_empty:NF\g_mix_usrlabel_tl{ \tl_gset_eq:NN\g_mix_label_tl\g_mix_usrlabel_tl } % #1:width, #2:height, #3:depth, #4:content (key-value) \mix_pdfannot:nnnn{\g_mix_wd_tl}{\g_mix_ht_tl}{\g_mix_dp_tl}{ /Subtype/RichMedia - /F~4\cs_if_exist_use:N\fxocg@insert@OC + /F~4\cs_if_exist_use:N\ocgxii@insert@OC /BS~<> /Contents~(media~embedded~by~media9~[\g_mix_version_tl~(\g_mix_date_tl)]) /NM~(\g_mix_label_tl) @@ -1616,7 +1159,7 @@ /RichMediaContent~\l_mix_content_tl } \tl_if_empty:NF\g_mix_usrlabel_tl{ - \mix_keytoaux_now:nn{ann@\g_mix_usrlabel_tl}{\g_mix_pdflastann_tl} + \mix_keytoaux_now:nn{ann@\g_mix_usrlabel_tl}{\mix_pdflastann:} \mix_keytoaux_shipout:nn{page@\g_mix_usrlabel_tl}{ \noexpand\the\g@mix@page@int} } @@ -1656,9 +1199,9 @@ /FT/Btn/Ff~65537/F~2 /BS~<> /T~(fd@\g_mix_label_tl) - /AA~<> + /AA~<> } - \tl_gput_right:Nx\@anim@fields{\space\g_mix_pdflastann_tl\space} + \tl_gput_right:Nx\@anim@fields{\space\mix_pdflastann:\space} \hbox_overlap_right:n{\box_use:N\l_mix_poster_box} \str_if_eq_x:nnTF{\g_mix_usrpbtn_tl}{none}{ \hbox_to_wd:nn{\g_mix_wd_tl}{ @@ -1689,21 +1232,17 @@ %environment \mix_uribegin: ... \mix_uriend: to sanitize possibly %active chars in URLs (RFC 2396), path specifications and JavaScript \group_begin: -\char_set_catcode_active:N\~ -\cs_new:Npn\mix_uribegin:{ +\char_set_catcode_other:n{`\~} +\cs_new_protected_nopar:Npn\mix_uribegin:{ \group_begin: - %code contributed by E. Gregorio - \tl_map_inline:nn{.:;?!/"'*+,->=<$@][)(^_`|~}{ - \group_begin: - \char_set_lccode:nn{`\~}{`##1} - \tl_to_lowercase:n{\group_end:\cs_set:Npn~}{\token_to_str:N##1} + %code contributed by J. Wright + \tl_map_inline:nn{.:;?!/"'*+,->=<$@([])^_`|~}{ + \cs_set_nopar:Npx\__mix_tmp:w{\token_to_str:N##1} + \char_set_active_eq:NN##1\__mix_tmp:w + } + \tl_map_inline:nn{\#\&\%\\\{\}}{ + \cs_set_nopar:Npx##1{\token_to_str:N##1} } - \cs_set:Npn\#{\token_to_str:N\#} - \cs_set:Npn\&{\token_to_str:N\&} - \cs_set:Npn\%{\token_to_str:N\%} - \cs_set:Npn\\{\token_to_str:N\\} - \cs_set:Npn\{{\token_to_str:N\{} - \cs_set:Npn\}{\token_to_str:N\}} } \group_end: \cs_set_eq:NN\mix_uriend:\group_end: @@ -2581,7 +2120,7 @@ \tl_set:Nx\l_mix_xname_tl{View~\int_use:N\l_mix_viewcnt_int} } \mix_view:n{\l_mix_xname_tl} - \tl_put_right:Nx\l_mix_iiidviewarray_tl{~\g_mix_pdflastobj_tl} + \tl_put_right:Nx\l_mix_iiidviewarray_tl{~\mix_pdflastobj:} \tl_set:Nn\l_mix_level_tl{\c_minus_one} } @@ -2599,7 +2138,7 @@ } } - \tl_put_right:Nx\l_mix_naarray_tl{~\g_mix_pdflastobj_tl} + \tl_put_right:Nx\l_mix_naarray_tl{~\mix_pdflastobj:} \tl_set:Nn\l_mix_level_tl{\c_zero} } {2}{ %CROSSSECT @@ -2611,7 +2150,7 @@ \l_mix_csop_tl\l_mix_cspv_tl\l_mix_cspc_tl \l_mix_csic_tl\l_mix_csiv_tl } - \tl_put_right:Nx\l_mix_saarray_tl{~\g_mix_pdflastobj_tl} + \tl_put_right:Nx\l_mix_saarray_tl{~\mix_pdflastobj:} \tl_set:Nn\l_mix_cscount_tl{\c_one} } \tl_set:Nn\l_mix_level_tl{\c_zero} @@ -2658,14 +2197,14 @@ overface .code:n = { \hbox_set:Nn\l_mix_poster_box{#1} \mix_pdfxform:n{\l_mix_poster_box} - \tl_gset:Nx\g_mix_overbtn_tl{\g_mix_pdflastxform_tl} + \tl_gset:Nx\g_mix_overbtn_tl{\mix_pdflastxform:} }, overface .value_required:n = {true}, downface .code:n = { \hbox_set:Nn\l_mix_poster_box{#1} \mix_pdfxform:n{\l_mix_poster_box} - \tl_gset:Nx\g_mix_downbtn_tl{\g_mix_pdflastxform_tl} + \tl_gset:Nx\g_mix_downbtn_tl{\mix_pdflastxform:} }, downface .value_required:n = {true}, @@ -2708,7 +2247,7 @@ >> } } - \tl_gput_right:Nx\g_mix_btnactions_tl{~\g_mix_pdflastobj_tl} + \tl_gput_right:Nx\g_mix_btnactions_tl{~\mix_pdflastobj:} } }{ \msg_warning:nnx{media9}{undefined~reference}{\l_tmpa_tl} @@ -2759,7 +2298,7 @@ >> } } - \tl_gput_right:Nx\g_mix_btnactions_tl{~\g_mix_pdflastobj_tl} + \tl_gput_right:Nx\g_mix_btnactions_tl{~\mix_pdflastobj:} } }{ \msg_warning:nnx{media9}{undefined~reference}{\l_tmpa_tl} @@ -2807,7 +2346,7 @@ } annotRM['\l_tmpa_tl'].activated=true; ) - \tl_if_blank:VF\l_tmpb_tl{/Next~\g_mix_pdflastobj_tl} + \tl_if_blank:VF\l_tmpb_tl{/Next~\mix_pdflastobj:} } } \bool_if:nT{ @@ -2815,7 +2354,7 @@ !\str_if_eq_x_p:nn{\tl_use:c{ann@\l_tmpa_tl}}{draft}|| !\tl_if_blank_p:V\l_tmpb_tl }{ - \tl_gput_right:Nx\g_mix_btnactions_tl{~\g_mix_pdflastobj_tl} + \tl_gput_right:Nx\g_mix_btnactions_tl{~\mix_pdflastobj:} } }, jsaction .value_required:n = {true}, @@ -2849,11 +2388,11 @@ \tl_set:Nx\depth {\dim_use:N\box_dp:N\l_mix_poster_box} \bool_if:NTF\g_mix_btndraft_bool{\box_use:N\l_mix_poster_box}{ \mix_pdfxform:n{\l_mix_poster_box} - \tl_set:Nx\g_mix_normalbtn_tl{\g_mix_pdflastxform_tl} - \bool_if:nT{ %dummy Widget for fixocgx, AR seems to need it -% \cs_if_exist_p:N\fxocg@insert@OC && !\tl_if_blank_p:V\fxocg@insert@OC - !\cs_if_exist:NTF\fxocg@insert@OC{ - \tl_if_blank_p:V\fxocg@insert@OC + \tl_set:Nx\g_mix_normalbtn_tl{\mix_pdflastxform:} + \bool_if:nT{ %dummy Widget for ocgx2, AR seems to need it +% \cs_if_exist_p:N\ocgxii@insert@OC && !\tl_if_blank_p:V\ocgxii@insert@OC + !\cs_if_exist:NTF\ocgxii@insert@OC{ + \tl_if_blank_p:V\ocgxii@insert@OC }{ \c_true_bool } @@ -2863,7 +2402,7 @@ /Subtype/Widget /T~(mbtn@\int_use:N\g_mix_mbtncnt_int) \tl_if_empty:NF\g_mix_tooltip_tl{/TU~(\g_mix_tooltip_tl)} - /FT/Btn/Ff~65536\cs_if_exist_use:N\fxocg@insert@OC + /FT/Btn/Ff~65536\cs_if_exist_use:N\ocgxii@insert@OC \tl_if_empty:NTF\g_mix_downbtn_tl{/H/I}{/H/P} /AP~<< /N~\g_mix_normalbtn_tl @@ -2882,11 +2421,15 @@ \tl_if_empty:NF\g_mix_btnactions_tl{/Next~[\g_mix_btnactions_tl]} >> } - \tl_gput_right:Nx\@anim@fields{\g_mix_pdflastann_tl\space} + \tl_gput_right:Nx\@anim@fields{\mix_pdflastann:\space} \hbox_to_wd:nn{\width}{ \vrule~width~\c_zero_dim~height~\height~depth~\depth\hss } \int_gincr:N\g_mix_mbtncnt_int + \cs_if_exist:NF\g_mix_dpiwarned_tl{ + \tl_new:N\g_mix_dpiwarned_tl + \AtEndDvi{\special{ps::[nobreak]\mix_dpiwarning:}} + } } \group_end: } diff --git a/Master/texmf-dist/tex/latex/media9/pdfbase.sty b/Master/texmf-dist/tex/latex/media9/pdfbase.sty new file mode 100644 index 00000000000..b736a571417 --- /dev/null +++ b/Master/texmf-dist/tex/latex/media9/pdfbase.sty @@ -0,0 +1,635 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% pdfbase.sty +% +% driver independent access to low-level pdf features +% +% Copyright 2015--\today, Alexander Grahn +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Support package for media9 and ocgx2. +% +% This package implements commands for the creation of PDF Objects, +% Form XObjects, Image XObjects, annotations, links, marked content (BDC/EMC) +% and for manipulating the PDF catalog. +% +% Supported workflows: +% +% pdflatex, lualatex +% latex-->dvips-->ps2pdf or Distiller +% latex-->dvipdfmx +% xelatex +% +% +% Package options: +% +% xetex, +% dvipdfmx, +% bigfiles (for embedding large files as stream objects; only relevant for +% dvips mode, ignored otherwise) +% +% Commands defined: +% +% \pbs_pdfobj:nnn +% #1: predefined PDF object ID to be used for the current obj; may be empty +% #2: type of object (dict|array|stream|fstream) +% #3: content (dict [key-value], string, file); if #3 && #1 are both empty, +% an object reference will be reserved for later use as #1 +% +% \pbs_pdflastobj: +% inserts ID of PDF object created/processed during most recent call of +% \pbs_pdfobj:nnn +% +% -------- +% +% \pbs_pdfannot:nnnn +% #1: width, #2: height, #3: depth, #4: dict (key-value) +% +% \pbs_pdflastann: +% inserts ID of PDF object created during most recent call of +% \pbs_pdfannot:nnnn +% +% -------- +% +% \pbs_pdflink:nn +% #1: dict (key-value), #2: text +% +% -------- +% +% \pbs_pdfxform:n +% #1: savebox number +% +% \pbs_pdflastxform: +% inserts ID of PDF object created during most recent call of +% \pbs_pdfxform:n +% +% -------- +% +% \pbs_pdfximage:n +% #1: bitmap file name +% +% \pbs_pdflastximage: +% inserts ID of PDF object created during most recent call of +% \pbs_pdfximage:n +% +% -------- +% +% \pbs_pdfcatalog:n +% #1: dict (key-value) +% +% -------- +% +% marked content BDC/EMC operators +% \pbs_pdfbdc:nn ... \pbs_pdfemc: +% #1: tag, #2: properties dict obj ID +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% 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{expl3} +\RequirePackage{l3keys2e} +\RequirePackage{atbegshi} + +\def\g@pbs@date@tl{2015/10/28} +\def\g@pbs@version@tl{0.1} + +\ProvidesExplPackage{pdfbase}{\g@pbs@date@tl}{\g@pbs@version@tl} +{driver independent access to low-level PDF features} + +%wrong image file type for Image XObject generation +\msg_set:nnn{pdfbase}{wrong~image~resource}{ + Image~resource~file\\~~'#1'\\has~wrong~type.\\\\ + Driver~#2~only~accepts~files~of~type\\#3\\ + as~image~resources. +} + +%pdfTeX version check +\sys_if_engine_pdftex:T{ + \int_compare:nT{\pdftexversion<130}{ + \msg_interrupt:nnn{pdfbase~error}{pdfTeX,~version~>=~1.30~required.}{} + } +} + +%package options + +%unknown package option error message +\msg_set:nnnn{pdfbase}{unknown~package~option}{Unknown~package~option~`#1'.}{ + Package option~'#1'~is~unknown;\\ + perhaps~it~is~spelled~incorrectly. +} + +\bool_new:N\g_pbs_pkgbigfiles_bool +\bool_new:N\g_pbs_dvipdfmx_bool + +\keys_define:nn{pdfbase}{ + xetex .bool_gset:N = \g_pbs_dvipdfmx_bool, + dvipdfmx .bool_gset:N = \g_pbs_dvipdfmx_bool, + + bigfiles .choice:, + bigfiles / true .code:n = {\bool_gset_true:N\g_pbs_pkgbigfiles_bool}, + bigfiles / false .code:n = {\bool_gset_false:N\g_pbs_pkgbigfiles_bool}, + bigfiles .default:n = {true}, + + unknown .code:n = { + \msg_error:nnx{pdfbase}{unknown~package~option}{\l_keys_key_tl} + } +} +\ProcessKeysOptions{pdfbase} +\sys_if_engine_xetex:T{\bool_gset_true:N\g_pbs_dvipdfmx_bool} + +%commands for creating PDF objects, annots etc. +\sys_if_output_pdf:TF{ + %helper func to remove `0 R' part from pdf obj reference + \cs_new:Npn\pbs_reftonum:w #1~0~R {#1} + \cs_new:Nn\pbs_pdfobj:nnn{ + \tl_clear:N\l_pbs_usenum_tl + \tl_if_blank:oF{#1}{ + \tl_set:Nx\l_pbs_usenum_tl{useobjnum~\exp_after:wN \pbs_reftonum:w #1} + } + \bool_if:nTF{\tl_if_blank_p:o{#1}&&\tl_if_blank_p:o{#3}}{ + \pdfobj~reserveobjnum + }{ + \str_case:nn{#2}{ + {dict}{\immediate\pdfobj~\l_pbs_usenum_tl~{<<#3>>}} + {array}{\immediate\pdfobj~\l_pbs_usenum_tl~{[#3]}} + {stream}{\immediate\pdfobj~\l_pbs_usenum_tl~stream~{#3}} + {fstream}{\immediate\pdfobj~\l_pbs_usenum_tl~stream~file~{#3}} + } + } + \tl_gset:Nx\g_pbs_pdflastobj_tl{\the\pdflastobj\space 0~R} + } + + \cs_new:Nn\pbs_pdfannot:nnnn{ + \immediate\pdfannot~width~#1~height~#2~depth~#3 {#4} + \tl_gset:Nx\g_pbs_pdflastann_tl{\int_use:c{pdflastannot}~0~R} + } + + \cs_new:Nn\pbs_pdflink:nn{ + \immediate\pdfstartlink~user~{#1}#2\pdfendlink + } + + \cs_new:Nn\pbs_pdfxform:n{ + \immediate\pdfxform~resources~{\the\pdfpageresources}~#1 + \tl_gset:Nx\g_pbs_pdflastxform_tl{\int_use:c{pdflastxform}~0~R} + } + + \cs_new:Nn\pbs_pdfximage:n{ + \filename@parse{#1} + \tl_set:Nx\l_pbs_ext_tl{\tl_lower_case:n{\filename@ext}} + \bool_if:nTF{ + \str_if_eq_p:Vn\l_pbs_ext_tl{png} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{jpg} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{jpeg} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{jbig2} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{jb2} + }{ + \immediate\pdfximage{#1} + \tl_gset:Nx\g_pbs_pdflastximage_tl{\int_use:c{pdflastximage}~0~R} + }{ + \msg_error:nnnnn{pdfbase}{wrong~image~resource}{#1}{pdftex}{ + png,~jpeg~and~jbig2 + } + } + } + + \cs_new:Nn\pbs_pdfcatalog:n{\pdfcatalog{#1}} + + \int_new:N\g_pbs_oc_int % object ID + \cs_new:Nn\pbs_pdfbdc:nn{ + \pdfliteral~direct~{#1/rm@oc\int_use:N\g_pbs_oc_int\space BDC} + \tl_if_empty:NTF\@anim@ocmap{ + \tl_gset:cx{@anim@ocmap}{/rm@oc\int_use:N\g_pbs_oc_int\space#2} + }{ + \tl_gput_right:cx{@anim@ocmap}{~/rm@oc\int_use:N\g_pbs_oc_int\space#2} + } + \group_begin: + \tl_set:Nx\l_pbs_temp_tl{\group_end: + \global\pdfpageresources{\the\pdfpageresources + /Properties<<\@anim@ocmap>> + } + }\l_pbs_temp_tl + \int_gincr:N\g_pbs_oc_int + } + \tl_if_exist:cF{@anim@ocmap}{ + \tl_gset:cn{@anim@ocmap}{} + \AtBeginShipout{\tl_gset:cn{@anim@ocmap}{}} + } + \cs_new:Nn\pbs_pdfemc:{\pdfliteral~direct~{EMC}} +}{ + %pgf + transparency related settings + \bool_new:N\g_pbs_pgfloaded_bool + \bool_gset_false:N\g_pbs_pgfloaded_bool + \AtBeginDocument{ + \@ifpackageloaded{pgf}{\bool_gset_true:N\g_pbs_pgfloaded_bool}{} + } + \int_new:N\g_pbs_obj_int % object ID + \bool_if:NTF\g_pbs_dvipdfmx_bool{ %dvipdfmx/XeTeX + \cs_new:Nn\pbs_pdfobj:nnn{ + \tl_if_blank:oTF{#1}{ + \tl_set:Nx\l_pbs_usenum_tl{@pbs@obj\int_use:N\g_pbs_obj_int} + \int_gincr:N\g_pbs_obj_int + }{ + \tl_set:Nx\l_pbs_usenum_tl{#1} + } + \tl_if_blank:oF{#3}{ + \str_case:nn{#2}{ + {dict}{\special{pdf:obj~\l_pbs_usenum_tl\space<<#3>>}} + {array}{\special{pdf:obj~\l_pbs_usenum_tl\space[#3]}} + {stream}{\special{pdf:stream~\l_pbs_usenum_tl\space(#3)}} + {fstream}{ + \message{<#3>} + \special{pdf:fstream~\l_pbs_usenum_tl\space(#3)} + } + } + } + \tl_gset_eq:NN\g_pbs_pdflastobj_tl\l_pbs_usenum_tl + } + + \cs_new:Nn\pbs_pdfannot:nnnn{ + \special{pdf:ann~@pbs@obj\int_use:N\g_pbs_obj_int\space + width~#1\space + height~#2\space + depth~#3~<<#4>> + } + \tl_gset:Nx\g_pbs_pdflastann_tl{@pbs@obj\int_use:N\g_pbs_obj_int} + \int_gincr:N\g_pbs_obj_int + } + + \cs_new:Nn\pbs_pdflink:nn{ + \special{pdf:bann~<<#1>>}#2\special{pdf:eann} + } + + \cs_new:Nn\pbs_pdfxform:n{ + \special{pdf:bxobj~@pbs@obj\int_use:N\g_pbs_obj_int\space + width\space \dim_use:N\box_wd:N#1\space + height\space\dim_use:N\box_ht:N#1\space + depth\space \dim_use:N\box_dp:N#1 + } + \begin{picture}(0,0)\put(0,0){\box_use:N #1}\end{picture} + \bool_if:NT\g_pbs_pgfloaded_bool{ % transparency et al. for PGF + \tl_set:Nn\l_pbs_temp_tl{} + \ifpgf@sys@pdf@extgs@exists + \tl_set:Nn\l_pbs_temp_tl{/ExtGState~@pgfextgs} + \fi + \ifpgf@sys@pdf@patterns@exists + \tl_put_right:Nn\l_pbs_temp_tl{/Pattern~@pgfpatterns} + \fi + \ifpgf@sys@pdf@colorspaces@exists + \tl_put_right:Nn\l_pbs_temp_tl{/ColorSpace~@pgfcolorspaces} + \fi + \tl_if_blank:VF\l_pbs_temp_tl{ + \special{pdf:put~@resources~<<\l_pbs_temp_tl>>} + } + } + \special{pdf:exobj} + \tl_gset:Nx\g_pbs_pdflastxform_tl{@pbs@obj\int_use:N\g_pbs_obj_int} + \int_gincr:N\g_pbs_obj_int + } + + \cs_new:Nn\pbs_pdfximage:n{ + \filename@parse{#1} + \tl_set:Nx\l_pbs_ext_tl{\tl_lower_case:n{\filename@ext}} + \bool_if:nTF{ + \str_if_eq_p:Vn\l_pbs_ext_tl{png} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{jpg} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{jpeg} + }{ + \special{pdf:image~@pbs@obj\int_use:N\g_pbs_obj_int\space + %move initial display off the page + matrix~0.000001~0~0~0.000001~-1000000~-1000000~(#1)} + \tl_gset:Nx\g_pbs_pdflastximage_tl{@pbs@obj\int_use:N\g_pbs_obj_int} + \int_gincr:N\g_pbs_obj_int + }{ + \msg_error:nnnnn{pdfbase}{wrong~image~resource}{#1}{dvipdfmx/xetex}{ + png~and~jpeg + } + } + } + + \cs_new:Nn\pbs_pdfcatalog:n{\special{pdf:put~@catalog~<<#1>>}} + + \int_new:N\g_pbs_oc_int % object ID + \cs_new:Nn\pbs_pdfbdc:nn{ + \special{pdf:code~#1/rm@oc\int_use:N\g_pbs_oc_int\space BDC} + \special{pdf:put~@resources~<< + /Properties~<>>>} + \int_gincr:N\g_pbs_oc_int + } + \cs_new:Nn\pbs_pdfemc:{\special{pdf:~code~EMC}} + }{ + % dvips + \bool_new:N\g_pbs_powerdot_bool %to cope with some powerdot oddity + \@ifclassloaded{powerdot}{\bool_gset_true:N\g_pbs_powerdot_bool}{} + + \sys_if_engine_pdftex:TF{ + \cs_new:Nn\pbs_filesize:n{\pdffilesize{#1}} + \cs_new:Nn\pbs_filedump:nnn{\pdffiledump~offset~#1~length~#2~{#3}} + }{ + \sys_if_engine_luatex:T{ + \RequirePackage{pdftexcmds} + \cs_new:Nn\pbs_filesize:n{\pdf@filesize{#1}} + \cs_new:Nn\pbs_filedump:nnn{\pdf@filedump{#1}{#2}{#3}} + } + } + + \@ifpackageloaded{hyperref}{}{ + %define `?pdfmark' operator as in file hdvips.def from package `hyperref' + \special{!~ + systemdict~/pdfmark~known + { + userdict~/?pdfmark~systemdict~/exec~get~put + }{ + userdict~/?pdfmark~systemdict~/pop~get~put~ + userdict~/pdfmark~systemdict~/cleartomark~get~put + } + ifelse~ + } + } + + \bool_if:NT\g_pbs_pkgbigfiles_bool{ + \special{psfile=\jobname.pbsdat} + %open auxiliary file \jobname.pbsdat for writing hex encoded streams of the + %files to be embedded. This file is inserted into PS during dvips run + \iow_new:N\g_pbs_mstreams_stream + \iow_open:Nn\g_pbs_mstreams_stream{\jobname.pbsdat} + \iow_now:Nn\g_pbs_mstreams_stream{ + /M9D~1~dict~def~M9D~begin + /o{mark/_objdef}bind~def/O{/type/stream/OBJ~pdfmark}bind~def + /m~systemdict/mark~get~def + /P{/ASCIIHexDecode~filter/PUT~pdfmark}bind~def + /C{/CLOSE~pdfmark}bind~def~end + } + } + + \cs_new:Nn\pbs_pdfobj:nnn{ + \tl_clear:N\l_pbs_usenum_tl + \tl_if_blank:oTF{#1}{ + \tl_set:Nx\l_pbs_usenum_tl{{pbs@obj\int_use:N\g_pbs_obj_int}} + \int_gincr:N\g_pbs_obj_int + }{ + \tl_set:Nx\l_pbs_usenum_tl{#1} + } + \tl_if_blank:oF{#3}{ + \bool_if:nTF{ + \g_pbs_pkgbigfiles_bool && + \str_if_eq_p:nn{#2}{fstream} + }{ + \iow_now:Nx\g_pbs_mstreams_stream{ + M9D~begin~o\l_pbs_usenum_tl O + } + }{ + \special{ps:~mark~/_objdef~\l_pbs_usenum_tl\space/type + \str_case:nn{#2}{ + {dict}{/dict} + {array}{/array} + {stream}{/stream} + {fstream}{/stream} + }~ + /OBJ~pdfmark~ + } + } + \str_case:nn{#2}{ + {dict}{\special{ps:~mark~\l_pbs_usenum_tl~<<#3>>/PUT~pdfmark~}} + {array}{ + \special{ps:~mark~\l_pbs_usenum_tl~0~[#3]/PUTINTERVAL~pdfmark~} + } + {stream}{\special{ps::[nobreak]~mark~\l_pbs_usenum_tl~(#3)/PUT~pdfmark~}} + {fstream}{ + \tl_set:Nn\l_pbs_offset_tl{0} + \tl_set:Nx\l_pbs_fsize_tl{\pbs_filesize:n{#3}} + \message{<#3} + %embed file in chunks of 32768 Bytes into PS as chunks of + %65536 Bytes of HEX code + \bool_while_do:nn{ + \int_compare_p:n{\l_pbs_offset_tl<\l_pbs_fsize_tl} + }{ + \bool_if:NTF\g_pbs_pkgbigfiles_bool{ + \iow_now:Nx\g_pbs_mstreams_stream{ + m\l_pbs_usenum_tl + (\pbs_filedump:nnn{\l_pbs_offset_tl}{32767}{#3})P + } + }{ + \special{ps:~ + mark~ + \l_pbs_usenum_tl~ + (\pbs_filedump:nnn{\l_pbs_offset_tl}{32767}{#3})~ + /ASCIIHexDecode~filter~/PUT~ + pdfmark~ + } + } + \tl_set:Nx\l_pbs_offset_tl{\int_eval:n{\l_pbs_offset_tl+32767}} + \message{.} + } + \message{>} + \bool_if:NTF\g_pbs_pkgbigfiles_bool{ + \iow_now:Nx\g_pbs_mstreams_stream{ + m\l_pbs_usenum_tl~C~end + } + }{ + \special{ps:~ + mark~\l_pbs_usenum_tl~/CLOSE~pdfmark~ + } + } + } + } + } + \tl_gset_eq:NN\g_pbs_pdflastobj_tl\l_pbs_usenum_tl + } + + \cs_new:Nn\pbs_pdfannot:nnnn{ + \hbox_set:Nn\l_tmpa_box{ + \box_move_down:nn{#3}{ + \hbox_to_zero:n{ + \special{ps:~currentpoint~/pbs@lly~exch~def~/pbs@llx~exch~def} + } + } + \skip_horizontal:n{#1} + \box_move_up:nn{#2}{ + \hbox_to_zero:n{ + \special{ps:~currentpoint~/pbs@ury~exch~def~/pbs@urx~exch~def} + } + } + } + \box_set_wd:Nn\l_tmpa_box{\c_zero_dim} + \box_set_ht:Nn\l_tmpa_box{\c_zero_dim} + \box_set_dp:Nn\l_tmpa_box{\c_zero_dim} + \box_use_clear:N\l_tmpa_box + \special{ps:~ + mark~ + /_objdef~{pbs@obj\int_use:N\g_pbs_obj_int} + /Rect~[pbs@llx~pbs@lly~pbs@urx~pbs@ury] + #4 + /ANN~pdfmark~ + } + \tl_gset:Nx\g_pbs_pdflastann_tl{{pbs@obj\int_use:N\g_pbs_obj_int}} + \int_gincr:N\g_pbs_obj_int + } + + \cs_new:Nn\pbs_pdflink:nn{ + \cs_if_exist:NTF\pdfmark{ + \pdfmark[#2]{pdfmark=/ANN,Raw={#1}} + }{ + \hbox_set:Nn\l_tmpb_box{#2} + \pbs_pdfannot:nnnn{ + \dim_use:N\box_wd:N\l_tmpb_box}{ + \dim_use:N\box_ht:N\l_tmpb_box}{ + \dim_use:N\box_dp:N\l_tmpb_box + }{#1} + \box_use_clear:N\l_tmpb_box + } + } + + \cs_new:Nn\pbs_pdfxform:n{ + %mark bbox of box#1 + \hbox_set:Nn\l_tmpa_box{ + \box_move_down:nn{\box_dp:N #1}{ + \hbox_to_zero:n{ + \special{ps:~currentpoint~/pbs@lly~exch~def~/pbs@llx~exch~def} + } + } + \skip_horizontal:n{\box_wd:N #1} + \box_move_up:nn{\box_ht:N #1}{ + \hbox_to_zero:n{ + \special{ps:~currentpoint~/pbs@ury~exch~def~/pbs@urx~exch~def} + } + } + } + \box_set_wd:Nn\l_tmpa_box{\c_zero_dim} + \box_set_ht:Nn\l_tmpa_box{\c_zero_dim} + \box_set_dp:Nn\l_tmpa_box{\c_zero_dim} + \box_use_clear:N\l_tmpa_box + %define some length values in current PS coordinate units + \hbox_set:Nn\l_tmpa_box{ + \special{ps:~currentpoint~/origin@y~exch~def~/origin@x~exch~def} + \skip_horizontal:n{72.27pt} + \box_move_up:nn{72.27pt}{ + \hbox_to_zero:n{ + \special{ps:~ + currentpoint~origin@y~exch~sub~/one@inch@y~exch~def~ + origin@x~sub~/one@inch@x~exch~def + } + } + } + } + \box_set_wd:Nn\l_tmpa_box{\c_zero_dim} + \box_set_ht:Nn\l_tmpa_box{\c_zero_dim} + \box_use_clear:N\l_tmpa_box + \special{ps:~ + gsave~ + %translate graphics to upper left page corner + \bool_if:NF\g_pbs_powerdot_bool{ + { + pbs@llx~neg~pbs@ury~neg~translate~ + one@inch@x~DVImag~div~neg~one@inch@y~DVImag~div~neg~translate + }?pdfmark~ + } + %distill graphics into XObject + mark~ + /_objdef~{pbs@obj\int_use:N\g_pbs_obj_int} + /BBox~[pbs@llx~pbs@lly~pbs@urx~pbs@ury] + /BP~pdfmark~ + { + isls{%landscape mode (powerdot, geometry /w landscape option) + /pbs@dxdy~{ + pbs@urx~pbs@llx~sub~abs~ + pbs@ury~pbs@lly~sub~abs~div + }~bind~def + /pbs@dydx~{1~pbs@dxdy~div}~bind~def + /pbs@cx~{pbs@urx~pbs@llx~add~2~div}~bind~def + /pbs@cy~{pbs@ury~pbs@lly~add~2~div}~bind~def + % graphics needs to be rescaled for some reason ... + [pbs@dxdy~0~0~pbs@dydx~1~pbs@dxdy~sub~pbs@cx~mul~ + 1~pbs@dydx~sub~pbs@cy~mul]~concat + %... rotated by 270 degrees ... + [0~-1~1~0~pbs@cx~pbs@cy~sub~pbs@cx~pbs@cy~add]~concat + %... and flipped around vertical axis + [-1~0~0~1~pbs@llx~pbs@urx~add~0]~concat + }{% flip around horizontal axis in portrait mode + [1~0~0~-1~0~pbs@lly~pbs@ury~add]~concat + }ifelse + }?pdfmark~ + } + \begin{picture}(0,0)\put(0,0){\box_use:N #1}\end{picture} + \special{ps:~mark~/EP~pdfmark~grestore} + \tl_gset:Nx\g_pbs_pdflastxform_tl{{pbs@obj\int_use:N\g_pbs_obj_int}} + \int_gincr:N\g_pbs_obj_int + } + + \cs_new:Nn\pbs_pdfximage:n{ + \filename@parse{#1} + \tl_set:Nx\l_pbs_ext_tl{\tl_lower_case:n{\filename@ext}} + \bool_if:nTF{ + \str_if_eq_p:Vn\l_pbs_ext_tl{ps} + ||\str_if_eq_p:Vn\l_pbs_ext_tl{eps} + }{ + \special{ps:~ + mark~/_objdef~{pbs@obj\int_use:N\g_pbs_obj_int}~/NI~pdfmark~ + } + \special{psfile=#1~hsize=0~vsize=0} + \special{ps:~ + { + 0~0~1~[1~0~0~1~0~0]~{}~image~%empty dummy, in case #1 is not + }?pdfmark~ %a valid raster image file + } + \tl_gset:Nx\g_pbs_pdflastximage_tl{{pbs@obj\int_use:N\g_pbs_obj_int}} + \int_gincr:N\g_pbs_obj_int + }{ + \msg_error:nnxxx{pdfbase}{wrong~image~resource}{#1}{dvips}{ + Postscript~(ps/eps)~with~bitmapped~content + } + } + } + + \cs_new:Nn\pbs_pdfcatalog:n{ + \special{ps:~mark~{Catalog}~<<#1>>~/PUT~pdfmark} + } + + %marked content BDC/EMC operators + %require Ghostscript v. >= 9.15 + \cs_new:Nn\pbs_pdfbdc:nn{ + \cs_if_exist:NF\g_pbs_gsoldwarned_tl{ + \tl_new:N\g_pbs_gsoldwarned_tl + \AtEndDvi{\special{ps::[nobreak]\pbs_gsoldwarning:}} + } + \special{ps:~mark~#1~#2~/BDC~pdfmark} + } + \cs_new:Nn\pbs_pdfemc:{\special{ps:~mark~/EMC~pdfmark}} + } +} +\cs_new:Nn\pbs_pdflastobj:{\g_pbs_pdflastobj_tl} +\cs_new:Nn\pbs_pdflastann:{\g_pbs_pdflastann_tl} +\cs_new:Nn\pbs_pdflastxform:{\g_pbs_pdflastxform_tl} +\cs_new:Nn\pbs_pdflastximage:{\g_pbs_pdflastximage_tl} + +\group_begin: +\char_set_catcode_active:N\+\let+\space +\cs_new:Nx\pbs_gsoldwarning:{ + {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 + @@+Ghostscript+version+>=+9.15.+required!+++++++++++@@\token_to_str:N\n + @@+PDF+features+such+as+Layers+(OCGs)+may+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: -- cgit v1.2.3