% Copyright 2004--2008 Alexander Grahn % % This material is subject to the LaTeX Project Public License. See % http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html % for the details of that license. % % This package allows inclusion of multimedia content into PDF files % following Adobe's PDF-1.5 and 1.6 specifications. % \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{movie15}[2009/07/07] \RequirePackage{keyval} \RequirePackage{ifthen} \RequirePackage{ifpdf} \RequirePackage{ifdraft} \newboolean{@MXV@iiiDfeat} % enable 3D features from PDF-1.6 spec? \setboolean{@MXV@iiiDfeat}{false}% \newboolean{@MXV@iiid} %set to true if a 3D file is being embedded \newboolean{@MXV@draft} %according to global setting \newboolean{@MXV@@draft} %per inclusion setting \ifdraft{%globally set by document class \setboolean{@MXV@draft}{true}% }{% \setboolean{@MXV@draft}{false}% }% %override global setting \DeclareOption{draft}{% \setboolean{@MXV@draft}{true}% } \DeclareOption{final}{% \setboolean{@MXV@draft}{false}% } \DeclareOption{3D}{% \setboolean{@MXV@iiiDfeat}{true}% } \DeclareOption*{% \PackageWarning{movie15}{Unknown option \CurrentOption} } \ProcessOptions*\relax %testing for correct TeX version, \ifpdf \ifnum\pdftexversion<120 \PackageError{movie15}{% pdfeTeX, version >= 1.20, required }{% Install a more recent version! }% \fi \fi \ifx\@undefined\pdfmdfivesum \def\pdfmdfivesum file #1{#1} \fi %for conditionals where \ifthenelse doesn't work \gdef\@MXV@if#1{\csname if#1\endcsname}% \newboolean{@MXV@beamer} %set to true if beamer class has been loaded %\newboolean{@MXV@powerdot} %the same for \newboolean{@MXV@presentation} %used with presentation making package? \newboolean{@MXV@hide} %contents hidden on the current slide? \@ifclassloaded{beamer}{% \setboolean{@MXV@beamer}{true}% \setboolean{@MXV@presentation}{true}% }{% \setboolean{@MXV@beamer}{false}% \setboolean{@MXV@presentation}{false}% } %\@ifclassloaded{powerdot}{% % \setboolean{@MXV@powerdot}{true}% % \setboolean{@MXV@presentation}{true}% %}{% % \setboolean{@MXV@powerdot}{false}% % \setboolean{@MXV@presentation}{false}% %} \AtBeginDocument{% \@ifpackageloaded{hyperref}{}{\@MXV@missing{hyperref}}% % \hypersetup{unicode} \ifHy@colorlinks% coloured (movieref-)link text instead of link border \gdef\@MXV@pdfborder{/Border [0 0 0]}% \else% \gdef\@MXV@pdfborder{}% \fi% } \RequirePackage{everyshi}% \newcount\@MXV@page% counter for absolute page number \EveryShipout{% \global\advance\@MXV@page by 1% } %define our own label making commands \def\@MXV@newlabel#1#2{{% \expandafter\xdef\csname#1\endcsname{#2}}}% \def\@MXV@getlabelvalue#1{% \expandafter\ifx\csname#1\endcsname\relax% undefined% \else% \csname#1\endcsname% \fi% }% %macro for writing labels to external *.aux file \def\@MXV@labeltoaux#1#2{% \@bsphack\protected@write\@auxout{}{% \string\@MXV@newlabel{#1}{#2}% \string\@MXV@newlabel{@#1@}{\@MXV@getlabelvalue{#1}}% }\@esphack% \ifthenelse{% \equal{\@MXV@getlabelvalue{#1}}{undefined}\OR% %double check that the value hasn't changed \NOT\equal{\@MXV@getlabelvalue{#1}}{\@MXV@getlabelvalue{@#1@}}% }{% \ifthenelse{\isundefined{\@MXV@warning}}{% issue warning only once, at end \gdef\@MXV@warning{}% of document \AtEndDocument{% \PackageWarningNoLine{movie15}{% @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak @@ Rerun to get object references right! @@\MessageBreak @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}% }% }{}% }{}% }% % \ifpdf% %for storing pdf object numbers (must be counters) \newcount\@MXV@adict% \newcount\@MXV@aadict% % %returns pdf page object number \def\@MXV@pdfpageref#1{% \expandafter\ifx\csname#1\endcsname\relax% 0% \else% \expandafter\pdfpageref\csname#1\endcsname\space% \fi% }% \fi %counter for absolute number of inclusions, %used for labelling each annotation \newcount\@MXV@includes %counter for absolute number of movie players \newcount\@MXV@players %counter for absolute number of movierefs \newcount\@MXV@links %measuring things %textbox \newdimen\@MXV@width \newdimen\@MXV@height \newdimen\@MXV@depth \newdimen\@MXV@totalheight \newdimen\@MXV@@boxdepth %for centring the textbox within display box \newdimen\@MXV@traiselen \newdimen\@MXV@braiselen %for compatibility options \newdimen\@MXV@start \newdimen\@MXV@end %stores textbox given as argument to text option \newsavebox{\@MXV@textbox} %some booleans we need \newboolean{@MXV@autoplay} \newboolean{@MXV@autostop} \newboolean{@MXV@autoresume} \newboolean{@MXV@autoclose} \newboolean{@MXV@autopause} \newboolean{@MXV@mouse}%mouse interaction \newboolean{@MXV@inline}%inline movie data \newboolean{@MXV@attachment}%make embedded file extractable? \newboolean{@MXV@externalviewer}%if true, screen annot will be removed \newboolean{@MXV@url} \newboolean{@MXV@boxopt}%true if text option is set \newboolean{@MXV@textoverposter} \newboolean{@MXV@runposter}% render poster from movie at runtime \newboolean{@MXV@linkplay}% for \movieref command \newboolean{@MXV@linkpause} \newboolean{@MXV@linkresume} \newboolean{@MXV@linkstop} \newboolean{@MXV@linkclose} \newboolean{@MXV@linkreset} \newboolean{@MXV@issound} %macro to reset all macros and booleans \def\@MXV@reset{% \setboolean{@MXV@autoplay}{false}% \setboolean{@MXV@autostop}{true}% \setboolean{@MXV@autoresume}{false}% \setboolean{@MXV@autopause}{false}% \setboolean{@MXV@autoclose}{false}% \setboolean{@MXV@mouse}{false}% \setboolean{@MXV@inline}{true}% \setboolean{@MXV@attachment}{true}% \setboolean{@MXV@externalviewer}{false}% \setboolean{@MXV@issound}{false}% \setboolean{@MXV@url}{false}% \setboolean{@MXV@boxopt}{false}% \setboolean{@MXV@textoverposter}{true}% \setboolean{@MXV@runposter}{false}% \setboolean{@MXV@linkplay}{true}% \setboolean{@MXV@linkpause}{false}% \setboolean{@MXV@linkresume}{false}% \setboolean{@MXV@linkstop}{false}% \setboolean{@MXV@linkclose}{false}% \setboolean{@MXV@linkreset}{false}% \setboolean{@MXV@requirereopen}{false}% \ifthenelse{\boolean{@MXV@draft}}{% \setboolean{@MXV@@draft}{true}% }{% \setboolean{@MXV@@draft}{false}% }% % \gdef\@MXV@label{}% for movieref \gdef\@MXV@@label{}% for movieref \gdef\@MXV@mime{@MXV@auto}% \gdef\@MXV@player{}% \gdef\@MXV@fsentry{}% \gdef\@MXV@repeat{}% \gdef\@MXV@@repeat{}% \gdef\@MXV@volume{100}% \gdef\@MXV@@volume{}% \gdef\@MXV@ctrls{}% \gdef\@MXV@@ctrls{}% \gdef\@MXV@palindrome{}% \gdef\@MXV@rate{}% \gdef\@MXV@startat{}% \gdef\@MXV@@startat{}% \gdef\@MXV@endat{}% \gdef\@MXV@poevent{}% \gdef\@MXV@pcevent{}% \gdef\@MXV@box##1##2##3{\raisebox{0pt}[##2][##3]{\makebox[##1]{}}}% \setlength{\@MXV@depth}{0pt}% \setlength{\@MXV@height}{0pt}% \setlength{\@MXV@width}{0pt}% \setlength{\@MXV@braiselen}{0pt}% \setlength{\@MXV@traiselen}{0pt}% \gdef\@MXV@boxdepth{}% \gdef\@MXV@boxheight{}% \gdef\@MXV@boxwidth{}% % \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \setboolean{@MXV@iiid}{false}% \gdef\@MXV@aac{30}% aperture angle of camera \gdef\@MXV@roll{0}% camera roll angle \gdef\@MXV@defaultbg{1 1 1}% \gdef\@MXV@background{/BG<>}% \gdef\@MXV@defaultlights{}% \gdef\@MXV@lights{}% \gdef\@MXV@defaultrender{Solid}% \gdef\@MXV@render{/RM <>}% \gdef\@MXV@naentry{}% %takes array of Node dicts \gdef\@MXV@saentry{}% %takes array of cross section dicts \gdef\@MXV@jscriptiiidfile{}% \gdef\@MXV@coo{0 0 0}% centre of orbit \gdef\@MXV@ctoc{0 -1 0}% centre of orbit to camera vector \gdef\@MXV@roo{0}% radius of orbit \gdef\@MXV@viewsfile{}% file containing views of the 3D object \gdef\@MXV@viewsfileii{}%file containing views of the 3D object (new format) \setboolean{@MXV@viewsprovided}{false}% \setboolean{@MXV@defaultviewprovided}{false}% \gdef\@MXV@iiidview{}% \gdef\@MXV@iiidtoolb{/TB false}% don't show toolbar by default \gdef\@MXV@iiidia{}% 3D interactive by default \gdef\@MXV@calc{}% camera aperture for coo and roo calculation \setboolean{@MXV@iiidgetview}{false}% \gdef\@MXV@iiidopt{}% option string to be passed to internal macro \setboolean{@MXV@resource}{false}% \gdef\@MXV@resourcetree{}% name tree of embedded 3D resources \xdef\@MXV@animstyle{}% \gdef\@MXV@iiidpalindrome{/Subtype/Linear}% forward \gdef\@MXV@iiidrate{}% animation speed \global\@MXV@iiidrepeat=-1% repeat count }{}% }% %missing package error message \def\@MXV@missing#1{% \PackageError{movie15}{% Package `#1' has not been loaded yet }{% Put the line `\protect\usepackage{#1}' somewhere after `\protect\usepackage{movie15}' to the preamble of your document! }% } %3D-need-be-enabled error message \def\@MXV@neediiiD{% \PackageError{movie15}{% If you wish to embed 3D objects, enable the\MessageBreak 3D feature first by passing option `3D' to movie15!\MessageBreak Make sure the `fp' package for fixed point calculus\MessageBreak is installed in your TeX system }{Package `fp' is available from CTAN.}% } %macro to guess the mime type of the media file \def\@MXV@guessmime#1#2{% \ifthenelse{\equal{#2}{aiff}\OR\equal{#2}{AIFF}\OR% \equal{#2}{aif}\OR\equal{#2}{AIF}\OR% \equal{#2}{aifc}\OR\equal{#2}{AIFC}}{% \gdef\@MXV@mime{audio/aiff}% }{% \ifthenelse{\equal{#2}{wav}\OR\equal{#2}{WAV}}{% \gdef\@MXV@mime{audio/wav}% }{% \ifthenelse{\equal{#2}{wma}\OR\equal{#2}{WMA}}{% \gdef\@MXV@mime{audio/x-ms-wma}% }{% \ifthenelse{\equal{#2}{wmv}\OR\equal{#2}{WMV}}{% \gdef\@MXV@mime{video/x-ms-wmv}% }{% \ifthenelse{\equal{#2}{au}\OR\equal{#2}{AU}\OR% \equal{#2}{snd}\OR\equal{#2}{SND}}{% \gdef\@MXV@mime{audio/basic}% }{% \ifthenelse{\equal{#2}{mid}\OR\equal{#2}{MID}\OR% \equal{#2}{rmi}\OR\equal{#2}{RMI}}{% \gdef\@MXV@mime{audio/midi}% }{% \ifthenelse{\equal{#2}{mov}\OR\equal{#2}{MOV}\OR% \equal{#2}{qt}\OR\equal{#2}{QT}}{% \gdef\@MXV@mime{video/quicktime}% }{% \ifthenelse{\equal{#2}{mp3}\OR\equal{#2}{MP3}\OR% \equal{#2}{m3u}\OR\equal{#2}{M3U}}{% \gdef\@MXV@mime{audio/x-mp3}% }{% \ifthenelse{\equal{#2}{mp4}\OR\equal{#2}{MP4}}{% \gdef\@MXV@mime{video/mp4}% }{% \ifthenelse{\equal{#2}{avi}\OR\equal{#2}{AVI}}{% \gdef\@MXV@mime{video/avi}% }{% \ifthenelse{\equal{#2}{gif}\OR\equal{#2}{GIF}}{% \gdef\@MXV@mime{image/gif}% }{% \ifthenelse{\equal{#2}{mpeg}\OR\equal{#2}{MPEG}\OR% \equal{#2}{mpg}\OR\equal{#2}{MPG}}{% \gdef\@MXV@mime{video/mpeg}% }{% \ifthenelse{\equal{#2}{smil}\OR\equal{#2}{SMIL}}{% \gdef\@MXV@mime{application/smil}% }{% \ifthenelse{\equal{#2}{swf}\OR\equal{#2}{SWF}}{% \gdef\@MXV@mime{application/x-shockwave-flash}% }{% \ifthenelse{\equal{#2}{prc}\OR\equal{#2}{PRC}}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \setboolean{@MXV@iiid}{true}% \gdef\@MXV@mime{model/prc}% (unofficial) \gdef\@MXV@iiidsubtype{PRC}% }{% \@MXV@neediiiD% }% }{% \ifthenelse{\equal{#2}{u3d}\OR\equal{#2}{U3D}}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \setboolean{@MXV@iiid}{true}% \gdef\@MXV@mime{model/u3d}% (unofficial) \gdef\@MXV@iiidsubtype{U3D}% }{% \@MXV@neediiiD% }% }{% \ifthenelse{\equal{#2}{ra}\OR\equal{#2}{RA}}{ \gdef\@MXV@mime{audio/vnd.rn-realaudio}% }{% \ifthenelse{% \equal{#2}{rv}\OR\equal{#2}{RV}\OR \equal{#2}{rm}\OR\equal{#2}{RM}% }{% \gdef\@MXV@mime{application/vnd.rn-realmedia}% }{% \PackageError{movie15}{% I couldn't determine MIME type of file:\MessageBreak`#1':\MessageBreak Unknown file name extension: `#2' }{% When using media files of unknown type or with a\MessageBreak non-standard file name extension, the MIME type must\MessageBreak explicitly be specified. Try option `mimetype='! }% }}}}}}}}}}}}}}}}}}% } %sets @MXV@issound boolean \def\@MXV@@issound#1/#2:{% argument: \@MXV@mime. \def\@MXV@firstarg{#1}% \def\@MXV@audio{audio}% \ifx\@MXV@firstarg\@MXV@audio% \setboolean{@MXV@issound}{true}% \fi% } %draft box \def\@MXV@draftbox#1#2#3#4{%width height depth filename \edef\@MXV@oldfboxsep{\the\fboxsep}% \setlength{\fboxsep}{-\fboxrule}% \framebox[#1][l]{% \vrule width 0pt height #2 depth #3% \edef\@tempa{#4}% \raisebox{\depth}[0pt][0pt]{ \ttfamily\expandafter\strip@prefix\meaning\@tempa}% }% \setlength{\fboxsep}{\@MXV@oldfboxsep}% } \ifthenelse{\boolean{@MXV@iiiDfeat}}{% 3D related definitions and macros \RequirePackage{fp}% needed for fixed point calculus \newread\@MXV@@viewsfile% file handle for views file \newboolean{@MXV@eof}% \newcount\@MXV@viewscount%counter for number of 3D views per inclusion \newboolean{@MXV@viewsprovided}%3d views file provided? \newboolean{@MXV@iiidgetview}% print current 3D settings? \newboolean{@MXV@defaultviewprovided}%default 3D view provided? \newboolean{@MXV@resource}%3d resource file provided? \ifpdf\else \newcount\@MXV@rescount% number of embedded resource files \newcount\@MXV@nodecount% number of node dicts \newcount\@MXV@cscount% number of cross section dicts \fi \newcount\@MXV@iiidrepeat% play count \newcount\@MXV@iiidoncurpage%index of 3D annot on current page \global\@MXV@iiidoncurpage=0% \gdef\@MXV@oldpage{0}% needed together with previous counter %macro for building the transformation matrix \def\@MXV@ciiwmatrix#1 #2 #3 #4 #5 #6 #7 #8 {% % #1,#2,#3 centre of orbit coordinates (coo) % #4,#5,#6 centre of orbit to camera direction vector (c2c) % #7 orbital radius (roo) % #8 camera roll (roll) %view vector (opposite to c2c) \FPupn\@MXV@viewx{#4 neg}% \FPupn\@MXV@viewy{#5 neg}% \FPupn\@MXV@viewz{#6 neg}% %normalize view vector \FPupn\@MXV@modulo{\@MXV@viewx{} copy mul % \@MXV@viewy{} copy mul + % \@MXV@viewz{} copy mul + 2 swap root% }% \FPupn\@MXV@viewx{\@MXV@viewx{} \@MXV@modulo{} div}% \FPupn\@MXV@viewy{\@MXV@viewy{} \@MXV@modulo{} div}% \FPupn\@MXV@viewz{\@MXV@viewz{} \@MXV@modulo{} div}% %camera roll \FPupn\@MXV@sinroll{#8 180.0 div \FPpi{} mul sin}% \FPupn\@MXV@cosroll{#8 180.0 div \FPpi{} mul cos}% % %top and bottom views \FPupn\@MXV@leftx{-1.0}% \FPupn\@MXV@lefty{0.0}% \FPupn\@MXV@leftz{0.0}% % \FPifneg\@MXV@viewz% top view %up-vector \FPupn\@MXV@upx{0.0}% \FPupn\@MXV@upy{1.0}% \FPupn\@MXV@upz{0.0}% \else% bottom view %up-vector \FPupn\@MXV@upx{0.0}% \FPupn\@MXV@upy{-1.0}% \FPupn\@MXV@upz{0.0}% \fi% \FPupn\@MXV@sumxy{\@MXV@viewx{} abs \@MXV@viewy{} abs add}% \FPifeq\@MXV@sumxy{0}\else% other views than top and bottom %up-vector = up_world - (up_world dot view) view \FPupn\@MXV@upx{\@MXV@viewz{} \@MXV@viewx{} mul neg}% \FPupn\@MXV@upy{\@MXV@viewz{} \@MXV@viewy{} mul neg}% \FPupn\@MXV@upz{\@MXV@viewz{} \@MXV@viewz{} mul neg 1.0 add}% %normalize up-vector \FPupn\@MXV@modulo{\@MXV@upx{} copy mul \@MXV@upy{} copy % mul + \@MXV@upz{} copy mul + 2 swap root}% \FPupn\@MXV@upx{\@MXV@upx{} \@MXV@modulo{} div}% \FPupn\@MXV@upy{\@MXV@upy{} \@MXV@modulo{} div}% \FPupn\@MXV@upz{\@MXV@upz{} \@MXV@modulo{} div}% %left vector = up x view \FPupn\@MXV@leftx{\@MXV@viewz{} \@MXV@upy{} mul % \@MXV@viewy{} \@MXV@upz{} mul sub}% \FPupn\@MXV@lefty{\@MXV@viewx{} \@MXV@upz{} mul % \@MXV@viewz{} \@MXV@upx{} mul sub}% \FPupn\@MXV@leftz{\@MXV@viewy{} \@MXV@upx{} mul % \@MXV@viewx{} \@MXV@upy{} mul sub}% %normalize left vector \FPupn\@MXV@modulo{\@MXV@leftx{} copy mul \@MXV@lefty{} % copy mul + \@MXV@leftz{} copy mul + 2 swap root}% \FPupn\@MXV@leftx{\@MXV@leftx{} \@MXV@modulo{} div}% \FPupn\@MXV@lefty{\@MXV@lefty{} \@MXV@modulo{} div}% \FPupn\@MXV@leftz{\@MXV@leftz{} \@MXV@modulo{} div}% \fi% %apply camera roll \FPupn\@MXV@leftxprime{\@MXV@leftx{} \@MXV@cosroll{} mul \@MXV@upx{} \@MXV@sinroll{} mul +}% \FPupn\@MXV@leftyprime{\@MXV@lefty{} \@MXV@cosroll{} mul \@MXV@upy{} \@MXV@sinroll{} mul +}% \FPupn\@MXV@leftzprime{\@MXV@leftz{} \@MXV@cosroll{} mul \@MXV@upz{} \@MXV@sinroll{} mul +}% \FPupn\@MXV@upxprime{\@MXV@upx{} \@MXV@cosroll{} mul \@MXV@leftx{} \@MXV@sinroll{} mul sub}% \FPupn\@MXV@upyprime{\@MXV@upy{} \@MXV@cosroll{} mul \@MXV@lefty{} \@MXV@sinroll{} mul sub}% \FPupn\@MXV@upzprime{\@MXV@upz{} \@MXV@cosroll{} mul \@MXV@leftz{} \@MXV@sinroll{} mul sub}% \FPupn\@MXV@leftx{\@MXV@leftxprime}% \FPupn\@MXV@lefty{\@MXV@leftyprime}% \FPupn\@MXV@leftz{\@MXV@leftzprime}% \FPupn\@MXV@upx{\@MXV@upxprime}% \FPupn\@MXV@upy{\@MXV@upyprime}% \FPupn\@MXV@upz{\@MXV@upzprime}% %translation vector \FPupn\@MXV@roo{#7 abs}% \FPifeq\@MXV@roo{0}\FPupn\@MXV@roo{0.0000001}\fi% \FPupn\@MXV@transx{#1 \@MXV@roo{} \@MXV@viewx{} mul sub}% \FPupn\@MXV@transy{#2 \@MXV@roo{} \@MXV@viewy{} mul sub}% \FPupn\@MXV@transz{#3 \@MXV@roo{} \@MXV@viewz{} mul sub}% %rotation matrix \xdef\@MXV@matrix{\@MXV@leftx\space\@MXV@lefty\space\@MXV@leftz\space% \@MXV@upx\space\@MXV@upy\space\@MXV@upz\space% \@MXV@viewx\space\@MXV@viewy\space\@MXV@viewz}% %transformation matrix \xdef\@MXV@matrix{% \@MXV@matrix\space\@MXV@transx\space\@MXV@transy\space\@MXV@transz% }% } %macro for parsing one line of 3D views file (old format) \newcommand{\@MXV@parseline}[6][]{% \pdfstringdef\@MXV@xname{#1}% name of the view (optional) \ifthenelse{\equal{#2}{}}{% \xdef\@MXV@coo{0 0 0}% }{% \xdef\@MXV@coo{#2}% }% \ifthenelse{\equal{#3}{}}{% \xdef\@MXV@ctoc{0 -1 0}% }{% \xdef\@MXV@ctoc{#3}% }% \ifthenelse{\equal{#4}{}}{% \xdef\@MXV@roo{0}% }{% \xdef\@MXV@roo{#4}% }% \ifthenelse{\equal{#5}{}}{% \xdef\@MXV@roll{0}% }{% \xdef\@MXV@roll{#5}% }% \ifthenelse{\equal{#6}{}}{% \xdef\@MXV@aac{30}% }{% \xdef\@MXV@aac{#6}% }% } %for parsing lines of views file (new format) \define@key{MXV@view}{VIEW}[]{% \ifnum\@MXV@cursection<\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % A VIEW section cannot be nested into another section% }{}% \fi% \def\@MXV@cursection{0}% \pdfstringdef\@MXV@xname{#1}% name of the view (optional) %default camera settings \gdef\@MXV@coo{0 0 0}% \gdef\@MXV@ctoc{0 -1 0}% \gdef\@MXV@roo{0}% \gdef\@MXV@roll{0}% \gdef\@MXV@aac{30}% %default background, lights, render mode \xdef\@MXV@background{/BG <>}% \xdef\@MXV@lights{/LS <>}% \gdef\@MXV@render{/RM <>}% %initialise array of node dicts \gdef\@MXV@naarray{}% \ifpdf\else\global\@MXV@nodecount=\z@\fi% %initialise array of crosssection dicts \gdef\@MXV@saarray{}% \ifpdf\else\global\@MXV@cscount=\z@\fi% } \define@key{MXV@view}{COO}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % COO entry not allowed here; must go into a VIEW section% }{}% \fi% \xdef\@MXV@coo{#1}% } \define@key{MXV@view}{C2C}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % C2C entry not allowed here; must go into a VIEW section% }{}% \fi% \xdef\@MXV@ctoc{#1}% } \define@key{MXV@view}{ROO}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % ROO entry not allowed here; must go into a VIEW section% }{}% \fi% \xdef\@MXV@roo{#1}% } \define@key{MXV@view}{AAC}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % AAC entry not allowed here; must go into a VIEW section% }{}% \fi% \xdef\@MXV@aac{#1}% } \define@key{MXV@view}{ROLL}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % ROLL entry not allowed here; must go into a VIEW section% }{}% \fi% \xdef\@MXV@roll{#1}% } \define@key{MXV@view}{BGCOLOR}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % BGCOLOR entry not allowed here; must go into a VIEW section% }{}% \fi% \def\@MXV@background{/BG<>}% } \define@key{MXV@view}{LIGHTS}{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % LIGHTS entry not allowed here; must go into a VIEW section% }{}% \fi% \def\@MXV@lights{/LS <>}% } \define@key{MXV@view}{RENDERMODE}{% \ifnum\@MXV@cursection=\z@ \def\@MXV@render{/RM <>}% \else% \ifnum\@MXV@cursection=\@ne \def\@MXV@nrender{/RM <>}% \else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % RENDERMODE entry not allowed here; must go into either a VIEW % or a PART section% }{}% \fi% \fi% } \define@key{MXV@view}{PART}[]{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % PART not allowed here; must be a sub-section of a VIEW section% }{}% \fi% \ifthenelse{\equal{#1}{}}{% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % You must provide a valid PART name (PART=), as shown % in the model tree of the 3D object (go to `View'->`Navigation % Panels'->`Model Tree' in Adobe Reader)% }{}% }{}% \def\@MXV@cursection{1}% \pdfstringdef\@MXV@partname{#1}% name of the part \gdef\@MXV@nopacity{}% \gdef\@MXV@nvisibility{}% \gdef\@MXV@nrender{}% \gdef\@MXV@ntransform{}% } \define@key{MXV@view}{CROSSSECT}[]{% \ifnum\@MXV@cursection=\z@\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % CROSSSECT not allowed here; must be a sub-section of a VIEW section% }{}% \fi% \ifthenelse{\equal{#1}{}}{}{% \PackageWarning{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % CROSSECT does not take a value% }% }% \def\@MXV@cursection{2}% \gdef\@MXV@cscenter{0 0 0}% \gdef\@MXV@csorient{null 0 0}% } \define@key{MXV@view}{OPACITY}{% \ifnum\@MXV@cursection=\@ne\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % OPACITY entry not allowed here; must go into a PART section% }{}% \fi% \gdef\@MXV@nopacity{/O #1}% } \define@key{MXV@view}{VISIBLE}{% \ifnum\@MXV@cursection=\@ne\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % VISIBLE entry not allowed here; must go into a PART section% }{}% \fi% \gdef\@MXV@nvisibility{/V #1}% } \define@key{MXV@view}{MATRIX}{% \ifnum\@MXV@cursection=\@ne\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % MATRIX entry not allowed here; must go into a PART section% }{}% \fi% \gdef\@MXV@ntransform{/M [#1]}% } \define@key{MXV@view}{CENTER}{% \ifnum\@MXV@cursection=2\relax\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % CENTER entry not allowed here; must go into a CROSSECT section% }{}% \fi% \gdef\@MXV@cscenter{#1}% } \define@key{MXV@view}{ORIENTATION}{% \ifnum\@MXV@cursection=2\relax\else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % ORIENT entry not allowed here; must go into a CROSSECT section% }{}% \fi% \gdef\@MXV@csorient{#1}% } \define@key{MXV@view}{END}[]{% \ifcase\@MXV@cursection% %END VIEW \edef\@MXV@args{% \@MXV@coo\space\@MXV@ctoc\space\@MXV@roo\space\@MXV@roll\space}% \expandafter\@MXV@ciiwmatrix\@MXV@args% build C2W matrix \global\advance\@MXV@viewscount by \@ne% \ifthenelse{\equal{\@MXV@xname}{}}{% default view name \pdfstringdef\@MXV@xname{View \the\@MXV@viewscount}% }{}% \ifthenelse{\equal{\@MXV@naarray}{}}{}{% \gdef\@MXV@naentry{/NR true/NA [\@MXV@naarray]}% }% \ifthenelse{\equal{\@MXV@saarray}{}}{}{% \gdef\@MXV@saentry{/SA [\@MXV@saarray]}% }% \@MXV@viewobj% create pdf object of 3D view %append current view obj ref to VA array \xdef\@MXV@varray{\@MXV@varray\space\@MXV@@viewobj}% \global\@MXV@viewsprovidedtrue% \def\@MXV@cursection{-1}% \or% %END PART \ifpdf\else\global\advance\@MXV@nodecount by \@ne\fi% \@MXV@nodeobj% create pdf object of 3D node dict %append it to node array \xdef\@MXV@naarray{\@MXV@naarray\space\@MXV@@nodeobj}% \def\@MXV@cursection{0}% \or% %END CROSSSECT \ifpdf\else\global\advance\@MXV@cscount by \@ne\fi% \@MXV@csobj% create pdf object of 3D cross section dict %append it to cross section array \xdef\@MXV@saarray{\@MXV@saarray\space\@MXV@@csobj}% \def\@MXV@cursection{0}% \else% \PackageError{movie15}{% File \@MXV@viewsfileii, line \the\@MXV@inputlineno: % There is nothing to be ENDed here% }{}% \fi% }% %macro for generating an array of 3D views (varray) \def\@MXV@procinputline#1{\setkeys{MXV@view}{#1}} \newcount\@MXV@inputlineno \def\@MXV@buildva{% \global\@MXV@viewscount=0% \xdef\@MXV@varray{}% empty varray % %default view (one of the command options 3Dcoo, 3Dc2c, etc. given) \edef\@MXV@args{% \@MXV@coo\space\@MXV@ctoc\space\@MXV@roo\space\@MXV@roll\space}% \expandafter\@MXV@ciiwmatrix\@MXV@args% build C2W matrix \pdfstringdef\@MXV@xname{Default}% \if@MXV@defaultviewprovided% \@MXV@viewobj% create pdf object of 3D view \edef\@MXV@defaultview{/3DV \@MXV@@viewobj}% \fi% % %read out 3D views file \IfFileExists{\@MXV@viewsfile}{% \edef\@MXV@endlinechar{\the\endlinechar}% \endlinechar=-1% suppress trailing space at input line end \openin\@MXV@@viewsfile=\@MXV@viewsfile% \loop% \read\@MXV@@viewsfile to \@MXV@inputline% \if\@MXV@inputline\relax\else% \expandafter\@MXV@parseline\@MXV@inputline% \edef\@MXV@args{\@MXV@coo\space\@MXV@ctoc\space\@MXV@roo\space\@MXV@roll\space}% \expandafter\@MXV@ciiwmatrix\@MXV@args% build C2W matrix \global\advance\@MXV@viewscount by 1% \ifthenelse{\equal{\@MXV@xname}{}}{% \pdfstringdef\@MXV@xname{View \the\@MXV@viewscount}% }{}% \@MXV@viewobj% create pdf object of 3D view %append current view obj ref to VA array \xdef\@MXV@varray{\@MXV@varray\space\@MXV@@viewobj}% \setboolean{@MXV@viewsprovided}{true}% \repeat% \closein\@MXV@@viewsfile% \endlinechar=\@MXV@endlinechar% reset endlinechar }{}% %read out 3D views file (new version) \def\@MXV@cursection{-1}% views file is devided in sections \IfFileExists{\@MXV@viewsfileii}{% \begingroup% \endlinechar=-1% suppress trailing space at input line end % \catcode`\#=14\relax% make `#' a comment char % \catcode`\%=12\relax% make `%' an ordinary char \@MXV@inputlineno=\z@% \openin\@MXV@@viewsfile=\@MXV@viewsfileii% \read\@MXV@@viewsfile to \@MXV@inputline% \ifeof\@MXV@@viewsfile\setboolean{@MXV@eof}{true}\else% \setboolean{@MXV@eof}{false}\fi% \whiledo{\NOT\boolean{@MXV@eof}}{% \advance\@MXV@inputlineno by \@ne% %process input line \edef\@MXV@@inputline{{\@MXV@inputline}}% \expandafter\@MXV@procinputline\@MXV@@inputline% \read\@MXV@@viewsfile to \@MXV@inputline% \ifeof\@MXV@@viewsfile% \setboolean{@MXV@eof}{true}% \else% \setboolean{@MXV@eof}{false}% \fi% }% \closein\@MXV@@viewsfile% \endgroup% }{}% % %make the first view in the VA array the default view, if no default one has %explicitly been provided, but if the VA array itself is empty too (no %additional views provided) use our fallback view (c2c=0 -1 0) as default \ifthenelse{\NOT\boolean{@MXV@defaultviewprovided}% \AND\boolean{@MXV@viewsprovided}}{% \xdef\@MXV@defaultview{/3DV /F}% }{}% \ifthenelse{\NOT\boolean{@MXV@defaultviewprovided}% \AND\NOT\boolean{@MXV@viewsprovided}}{% \@MXV@viewobj% create pdf object of 3D view \edef\@MXV@defaultview{/3DV \@MXV@@viewobj}% }{}% } %following macros, including the 3D inclusion macro have driver specific %implementations \ifpdf% %pdfLaTeX versions %macro for creating 3D view object \def\@MXV@viewobj{% %projection dict \pdfobj {<>}% \pdfrefobj\pdflastobj% % \pdfobj {<<% /MS/M% define the view as C2W matrix /CO \@MXV@roo% orbital radius /P \the\pdflastobj\space 0 R% /C2W [\@MXV@matrix]% /XN(\@MXV@xname)% name of the view appearing in the drop down list \@MXV@background% \@MXV@lights% \@MXV@render% \@MXV@naentry% node dictionaries \@MXV@saentry% node dictionaries >>}\pdfrefobj\pdflastobj% \xdef\@MXV@@viewobj{\the\pdflastobj\space 0 R}% }% \def\@MXV@nodeobj{% \pdfobj {<<% /Type/3DNode% /N (\@MXV@partname)% \@MXV@nopacity\@MXV@nvisibility\@MXV@ntransform\@MXV@nrender% >>}\pdfrefobj\pdflastobj% \xdef\@MXV@@nodeobj{\the\pdflastobj\space 0 R}% }% \def\@MXV@csobj{% \pdfobj {<<% /Type/3DCrossSection% /C [\@MXV@cscenter]% /O [\@MXV@csorient]% >>}\pdfrefobj\pdflastobj% \xdef\@MXV@@csobj{\the\pdflastobj\space 0 R}% }% %macro for creating resource objects from 3D and image files, to be used %in 3D JavaScript \def\@MXV@addresource#1{% %determine file type \filename@parse{#1}% \ifthenelse{% \equal{\filename@ext}{u3d}\OR% \equal{\filename@ext}{U3D}% }{% \def\@MXV@restype{U3D}% }{% \def\@MXV@restype{image}% }% \ifthenelse{\equal{\@MXV@restype}{image}}{% %embed the same image file only once \ifthenelse{\equal{\@MXV@getlabelvalue{\pdfmdfivesum file {#1}}}{undefined}}{% \immediate\pdfximage {#1}% \xdef\@MXV@resourcetree{% build name tree for embedded resources \@MXV@resourcetree\space (#1) \the\pdflastximage\space 0 R% }% \@MXV@newlabel{\pdfmdfivesum file {#1}}{\the\pdflastximage}% }{% \xdef\@MXV@resourcetree{% \@MXV@resourcetree\space (#1) \@MXV@getlabelvalue{\pdfmdfivesum file {#1}}\space 0 R% }% }% }{% %embed the same 3D file only once \ifthenelse{\equal{\@MXV@getlabelvalue{\pdfmdfivesum file {#1}}}{undefined}}{% \pdfobj stream % attr {% /Subtype/\@MXV@restype% }% file {#1}% \pdfrefobj\pdflastobj% \xdef\@MXV@resourcetree{% \@MXV@resourcetree\space (#1) \the\pdflastobj\space 0 R% }% \@MXV@newlabel{\pdfmdfivesum file {#1}}{\the\pdflastobj}% }{% \xdef\@MXV@resourcetree{% \@MXV@resourcetree\space (#1) \@MXV@getlabelvalue{\pdfmdfivesum file {#1}}\space 0 R% }% }% }% } %3D inclusion macro \newcommand{\@MXV@includeiiid}[5][]{% %insert box or poster \@MXV@box{#2}{#3}{#4}% % \if@MXV@externalviewer\else% \setkeys{MXV@iiid}{#1}%process deferred options \ifnum\@MXV@iiidrepeat=0\else% \edef\@MXV@animstyle{% animation style dict /AN <<% \@MXV@iiidpalindrome\@MXV@iiidrate/PC \the\@MXV@iiidrepeat% >>% }% \fi% %java script file, stream object \IfFileExists{\@MXV@jscriptiiidfile}{% \pdfobj stream file {\@MXV@jscriptiiidfile}% \pdfrefobj\pdflastobj% \xdef\@MXV@jscriptiiid{/OnInstantiate \the\pdflastobj\space 0 R}% }{\xdef\@MXV@jscriptiiid{}}% % %build the array of 3D views \@MXV@buildva% \fi% % %3D stream object \if@MXV@inline% \ifthenelse{% \NOT\boolean{@MXV@presentation}\OR% \equal{\@MXV@getlabelvalue{\@MXV@label.3dstream}}{undefined}% }{% \pdfobj stream% attr {% /Subtype/\@MXV@iiidsubtype% \if@MXV@externalviewer\else% /VA [\@MXV@varray]% /DV/F% use first entry in VA as default view \@MXV@animstyle% \@MXV@jscriptiiid% \if@MXV@resource% /Resources <<% /Names [\@MXV@resourcetree]% >>% \fi% \fi% }% file {#5}% \pdfrefobj\pdflastobj% \edef\@MXV@iiidstream{\the\pdflastobj}% \if@MXV@presentation% \@MXV@newlabel{\@MXV@label.3dstream}{\@MXV@iiidstream}% \fi% }{% \edef\@MXV@iiidstream{\@MXV@getlabelvalue{\@MXV@label.3dstream}}% }% \fi% % \makebox[0pt][r]{\makebox[#2][l]{% %insert FileAttachment annotation \ifthenelse{\boolean{@MXV@inline}\AND\boolean{@MXV@externalviewer}% % since Reader 7.0.7, we cannot place a file attachment annot behind % the 3D annot :-( % \OR\boolean{@MXV@attachment} }{% \pdfannot width #2 height #3 depth #4 {% /Subtype /FileAttachment% /F 0% /T (\@MXV@filename)% /Contents (3D Object (\@MXV@mime))% \if@MXV@externalviewer% /Name/Paperclip% /C [1 1 1]% \else% /AP <>/R<<>>/D<<>>>>% \fi% /FS <<% /F(#5)% /Type/Filespec% /EF << /F \@MXV@iiidstream\space 0 R >>% >>% }% }{% \if@MXV@url% %insert Link annotation, if 3D file is a URL \pdfannot width #2 height #3 depth #4 {% /Subtype /Link% /F 0% \if@MXV@externalviewer% \@MXV@urlattr% \else% /H /N% /Border [0 0 0]% \fi% /A <>% /Contents (3D Object (\@MXV@mime))% }% \else% %else insert Launch action for local external 3D file \if@MXV@inline\else% \pdfannot width #2 height #3 depth #4 {% /Subtype /Link% /F 0% \if@MXV@externalviewer% \@MXV@runattr% \else% /H /N% /Border [0 0 0]% \fi% /A <<% /F (#5)% /S /Launch% >>% /Contents (3D Object (\@MXV@mime))% }% \fi% \fi% }% % \if@MXV@externalviewer\else% %appearance dict dummy, to be shared by all 3D annots \ifthenelse{\isundefined{\@MXV@apdict}}{% \pdfobj stream attr {/BBox [0 0 0.001 0.001]} {}\pdfrefobj\pdflastobj% \xdef\@MXV@apdict{/AP << /N \the\pdflastobj\space 0 R >>}% }{}% %3D reference dict \if@MXV@presentation% \ifthenelse{% \equal{\@MXV@getlabelvalue{\@MXV@label.3dref}}{undefined}% }{% \pdfobj {<<% /Type/3DRef% /3DD \@MXV@iiidstream\space 0 R% 3D stream object >>}\pdfrefobj\pdflastobj% \edef\@MXV@iiidstreamorref{\the\pdflastobj}% \@MXV@newlabel{\@MXV@label.3dref}{\the\pdflastobj}% }{% \edef\@MXV@iiidstreamorref{\@MXV@getlabelvalue{\@MXV@label.3dref}}% }% \else% \edef\@MXV@iiidstreamorref{\@MXV@iiidstream}% \fi% %annotation object of subtype `3D' \pdfannot width #2 height #3 depth #4 {% /Subtype/3D% /F 4% we cannot put F 5 here; bug in Reader; 3D annot would be /T (\@MXV@filename)% disabled even if plugin were available /Contents (3D Object (\@MXV@mime))% \ifx\@MXV@@label\@empty\else% /NM (\@MXV@@label)% \fi% /P \@MXV@pdfpageref{@MXV@annot\the\@MXV@includes.page} 0 R% \@MXV@apdict% /AP <>/R<<>>/D<<>>>> doesn't work here \@MXV@defaultview% \@MXV@iiidia% /3DD \@MXV@iiidstreamorref\space 0 R% 3D stream or reference object /3DA << \@MXV@activation\@MXV@deactivation\@MXV@iiidtoolb >>% }% %label for later annot obj number determination, to be used in %movieref's \ifx\@MXV@@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@@label.annot}{\the\pdflastannot}% \@MXV@newlabel{@MXV@\@MXV@@label.annot}{\the\pdflastannot}% \fi% \fi}}% }% \else% %dvips versions %macro for creating 3D view object and associated projection dict \def\@MXV@viewobj{% %projection dict \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {pdict\the\@MXV@includes_\the\@MXV@viewscount}% /type/dict% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {pdict\the\@MXV@includes_\the\@MXV@viewscount} <<% /Subtype/P/FOV \@MXV@aac/PS/Min% >>% }% }% % \pdfmark{% pdfmark=/OBJ,% Raw={% /type/dict% /_objdef {viewobj\the\@MXV@includes_\the\@MXV@viewscount}% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {viewobj\the\@MXV@includes_\the\@MXV@viewscount} <<% /MS/M% /CO \@MXV@roo% /P {pdict\the\@MXV@includes_\the\@MXV@viewscount}% /C2W[\@MXV@matrix]% /XN(\@MXV@xname)% \@MXV@background% \@MXV@lights% \@MXV@render% \@MXV@naentry% \@MXV@saentry% >>% }% }% \xdef\@MXV@@viewobj{{viewobj\the\@MXV@includes_\the\@MXV@viewscount}}% }% %3D node object \def\@MXV@nodeobj{% \pdfmark{% pdfmark=/OBJ,% Raw={% /type/dict% /_objdef {nodeobj\the\@MXV@includes_\the\@MXV@viewscount_% \the\@MXV@nodecount}% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {nodeobj\the\@MXV@includes_\the\@MXV@viewscount_\the\@MXV@nodecount} <<% /Type/3DNode% /N (\@MXV@partname)% \@MXV@nopacity\@MXV@nvisibility\@MXV@ntransform% >>% }% }% \xdef\@MXV@@nodeobj{% {nodeobj\the\@MXV@includes_\the\@MXV@viewscount_\the\@MXV@nodecount}}% }% %3D cross section object \def\@MXV@csobj{% \pdfmark{% pdfmark=/OBJ,% Raw={% /type/dict% /_objdef {csobj\the\@MXV@includes_\the\@MXV@viewscount_% \the\@MXV@cscount}% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {csobj\the\@MXV@includes_\the\@MXV@viewscount_\the\@MXV@cscount} <<% /Type/3DCrossSection% /C [\@MXV@cscenter]% /O [\@MXV@csorient]% >>% }% }% \xdef\@MXV@@csobj{% {csobj\the\@MXV@includes_\the\@MXV@viewscount_\the\@MXV@cscount}}% }% % %macro for creating resource objects from 3D and image files \def\@MXV@addresource#1{% %determine file type \filename@parse{#1}% \ifthenelse{% \equal{\filename@ext}{u3d}\OR% \equal{\filename@ext}{U3D}% }{% \def\@MXV@restype{U3D}% }{% \def\@MXV@restype{image}% }% \ifthenelse{\equal{\@MXV@restype}{image}}{% %embed the same image file only once \ifthenelse{\equal{\@MXV@getlabelvalue{\pdfmdfivesum file {#1}}}{undefined}}{% %increment counter of embedded resource files \global\advance\@MXV@rescount by 1% %create Image XObject from next raster image \special{ps:% read image resource from file [ /_objdef {resource\the\@MXV@rescount} /NI pdfmark save gsave { /showpage {} def /setpagedevice /pop load def newpath clip (#1) run } ?pdfmark 0 0 1 [1 0 0 1 0 0] {} image %empty dummy, in case #1 is not grestore restore %a valid image file }% \xdef\@MXV@resourcetree{% build name tree for embedded resources \@MXV@resourcetree\space (#1) {resource\the\@MXV@rescount}% }% \@MXV@newlabel{\pdfmdfivesum file {#1}}{resource\the\@MXV@rescount}% }{% \xdef\@MXV@resourcetree{% \@MXV@resourcetree\space (#1) {\@MXV@getlabelvalue{\pdfmdfivesum file {#1}}}% }% }% }{% %embed the same 3D file only once \ifthenelse{\equal{\@MXV@getlabelvalue{\pdfmdfivesum file {#1}}}{undefined}}{% \global\advance\@MXV@rescount by 1% \special{ps: [ /_objdef {resource\the\@MXV@rescount} /type/stream /OBJ pdfmark [ {resource\the\@MXV@rescount} <<% /Subtype/\@MXV@restype% >> /PUT pdfmark% [ {resource\the\@MXV@rescount} (#1) (r) file /PUT pdfmark }% \xdef\@MXV@resourcetree{% \@MXV@resourcetree\space (#1) {resource\the\@MXV@rescount}% }% \@MXV@newlabel{\pdfmdfivesum file {#1}}{resource\the\@MXV@rescount}% }{% \xdef\@MXV@resourcetree{% \@MXV@resourcetree\space (#1) {\@MXV@getlabelvalue{\pdfmdfivesum file {#1}}}% }% }% }% } % %3D inclusion macro \newcommand{\@MXV@includeiiid}[5][]{% % \if@MXV@externalviewer\else% \setkeys{MXV@iiid}{#1}%process deferred options \ifnum\@MXV@iiidrepeat=0\else% \edef\@MXV@animstyle{% animation style dict /AN <<% \@MXV@iiidpalindrome\@MXV@iiidrate/PC \the\@MXV@iiidrepeat% >>% }% \fi% %java script file, stream object \IfFileExists{\@MXV@jscriptiiidfile}{% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {jscriptiiid\the\@MXV@includes}% /type/stream% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {jscriptiiid\the\@MXV@includes}% (\@MXV@jscriptiiidfile) (r) file% }% }% \xdef\@MXV@jscriptiiid{% /OnInstantiate {jscriptiiid\the\@MXV@includes}% }% }{\def\@MXV@jscriptiiid{}}% % %build the array of 3D views \@MXV@buildva% \fi% % %3D stream object \if@MXV@inline% \ifthenelse{% \NOT\boolean{@MXV@presentation}\OR% \equal{\@MXV@getlabelvalue{\@MXV@label.3dstream}}{undefined}% }{% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {iiiDfile\the\@MXV@includes}% /type/stream% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {iiiDfile\the\@MXV@includes} <<% /Subtype/\@MXV@iiidsubtype% \if@MXV@externalviewer\else% /VA [\@MXV@varray]% /DV/F% use first entry in VA as default view \@MXV@animstyle% \if@MXV@resource% /Resources <<% /Names [\@MXV@resourcetree]% >>% \fi% \@MXV@jscriptiiid% \fi% >>% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {iiiDfile\the\@MXV@includes}% (#5) (r) file% }% }% \edef\@MXV@iiidstream{iiiDfile\the\@MXV@includes}% \if@MXV@presentation% \@MXV@newlabel{\@MXV@label.3dstream}{\@MXV@iiidstream}% \fi% }{% \edef\@MXV@iiidstream{\@MXV@getlabelvalue{\@MXV@label.3dstream}}% }% \fi% % %insert FileAttachment annotation \ifthenelse{\boolean{@MXV@inline}\AND\boolean{@MXV@externalviewer}% % \OR\boolean{@MXV@attachment} }{% \makebox[0pt][l]{% \pdfmark[\phantom{\@MXV@box{#2}{#3}{#4}}]{% pdfmark=/ANN,% Subtype=/FileAttachment,% Raw={% /F 0% /T (\@MXV@filename)% /Contents (3D Object (\@MXV@mime))% \if@MXV@externalviewer% /Name/Paperclip% /C [1 1 1]% \else% /AP <>/R<<>>/D<<>>>>% \fi% /FS <<% /F(#5)% /Type/Filespec% /EF <>% >>% }% }% }% }{% \if@MXV@url% %insert Link annotation, if 3D file is a URL \makebox[0pt][l]{% \pdfmark[\phantom{\@MXV@box{#2}{#3}{#4}}]{% pdfmark=/ANN,% Subtype=/Link,% Raw={% /F 0% \if@MXV@externalviewer% /C [\@urlbordercolor]% /H \@pdfhighlight% \else% /H /N% /Border [0 0 0]% \fi% /Action <>% /Contents (3D Object (\@MXV@mime))% }% }% }% \else% %else insert Launch action for local external 3D file \if@MXV@inline\else% \makebox[0pt][l]{% \pdfmark[\phantom{\@MXV@box{#2}{#3}{#4}}]{% pdfmark=/ANN,% Subtype=/Link,% Raw={% /F 0% \if@MXV@externalviewer% /C [\@urlbordercolor]% /H \@pdfhighlight% \else% /H /N% /Border [0 0 0]% \fi% /Action <<% /F (#5)% /S /Launch% >>% /Contents (3D Object (\@MXV@mime))% }% }% }% \fi% \fi% }% \if@MXV@externalviewer% \phantom{\@MXV@box{#2}{#3}{#4}}% \else% %appearance dict dummy, to be shared by all 3D annots \ifthenelse{\isundefined{\@MXV@apdict}}{% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {apdict}% /type/stream% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {apdict}% ()% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {apdict} <> }% }% \xdef\@MXV@apdict{/AP << /N {apdict}>>}% }{}% %3D reference dict \if@MXV@presentation% \ifthenelse{% \equal{\@MXV@getlabelvalue{\@MXV@label.3dref}}{undefined}% }{% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {iiiDref\the\@MXV@includes}% /type/dict% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {iiiDref\the\@MXV@includes} <<% /Type/3DRef% /3DD {\@MXV@iiidstream}% 3D stream object >>% }% }% \edef\@MXV@iiidstreamorref{iiiDref\the\@MXV@includes}% \@MXV@newlabel{\@MXV@label.3dref}{\@MXV@iiidstreamorref}% }{% \edef\@MXV@iiidstreamorref{\@MXV@getlabelvalue{\@MXV@label.3dref}}% }% \else% \edef\@MXV@iiidstreamorref{\@MXV@iiidstream}% \fi% %annotation object of subtype `3D' \pdfmark[\phantom{\@MXV@box{#2}{#3}{#4}}]{% pdfmark=/ANN,% Subtype=/3D,% Raw={% /_objdef {3Dannot\the\@MXV@includes}% /F 4% /T (\@MXV@filename)% \ifx\@MXV@@label\@empty\else% /NM (\@MXV@@label)% \fi% /Contents (3D Object (\@MXV@mime))% /P {ThisPage}% \@MXV@apdict% /AP <>/R<<>>/D<<>>>> doesn't work here \@MXV@defaultview% \@MXV@iiidia% /3DD {\@MXV@iiidstreamorref}% 3D stream or reference object /3DA <<\@MXV@activation\@MXV@deactivation\@MXV@iiidtoolb>>% }% }% \ifx\@MXV@@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@@label.annot}{\the\@MXV@includes}% \@MXV@newlabel{@MXV@\@MXV@@label.annot}{\the\@MXV@includes}% \fi% \fi% }% \fi% }{} %settings for newly opened media players \def\@MXV@settings#1#2#3#4#5#6#7{% var settings={% privateData: {% paused: false }, autoPlay: false, visible: false, volume: #7 #1% showUI (controls) #2% palindrome #3% repeat #4% rate #5% startAt #6% endAt }; } %JavaScript event handler routines for 2D media activation \def\@MXV@events#1#2#3{% #1: playerid, #2: mouse?, #3: autoplay? var events=new app.media.Events({% %on focus change from one movie to another, events are fired in the %following order: (1) onBlur, (2) onFocus, (3) afterBlur, (4) afterFocus onBlur: function (e) {% if(focusonplayer > 0){% focusonplayer=0; } }, afterBlur: function (e) {% %only resume if we click outside of any media if(focusonplayer==0){% try{ e.target.settings.privateData.paused=false; e.target.play(); }catch(e){} } }, onFocus: function (e) {% focusonplayer=#1; }, afterFocus: function (e) {% if(!e.target.isPlaying){%play on click if paused try{ e.target.settings.privateData.paused=false; e.target.play(); if(!e.target.isPlaying){%still not playing?! %sometimes play() fails, in particular if the movie has reached %its end before getting the focus; but this works: if( e.target.settings.startAt.time || e.target.settings.startAt.frame || e.target.settings.startAt.marker || e.target.id == 'vnd.adobe.swname:AAPL_QuickTime' ){ e.target.seek(e.target.settings.startAt); }else{ e.target.stop(); } e.target.play(); } } catch (e){} } \@MXV@if{#2}% else{% %media can only be paused if mouse option is set try{ e.target.pause(); e.target.settings.privateData.paused=true; }catch (e){} } \fi% \if@MXV@issound\else e.target.visible=true;\fi% }, onPlay: function (e) {% e.target.settings.privateData.paused=false; }, onPause: function (e) {% e.target.settings.privateData.paused=true; }, afterReady: function (e) {% try{ if( e.target.settings.startAt.time || e.target.settings.startAt.frame || e.target.settings.startAt.marker ){ e.target.play(); e.target.pause(); e.target.stop(); e.target.settings.privateData.paused=false; e.target.seek(e.target.settings.startAt); } \if@MXV@issound\else e.target.visible=true;\fi% \@MXV@if{#3} e.target.settings.privateData.paused=false; e.target.play(); \fi } catch (e){} } }); }% %output driver specific implementations of the 2D inclusion macro \ifpdf% %pdfLaTeX version \def\@MXV@includemovie#1#2#3#4{% %insert box or poster \@MXV@box{#1}{#2}{#3}% % \if@MXV@externalviewer\else% %new action dict \pdfobj reserveobjnum% \@MXV@adict=\pdflastobj% % %new additional actions dict \pdfobj reserveobjnum% \@MXV@aadict=\pdflastobj% % \fi% %embedded file entry `/EF' \if@MXV@inline% %embed the same media file only once \ifthenelse{\equal{\@MXV@getlabelvalue{\pdfmdfivesum file {#4}}}{undefined}}{% \pdfobj stream % attr {% /Type/EmbeddedFile% /Subtype (\@MXV@mime)% }% file {#4}% \pdfrefobj\pdflastobj% \edef\@MXV@efentry{% /EF << /F \the\pdflastobj\space 0 R >>% }% \@MXV@newlabel{\pdfmdfivesum file {#4}}{\the\pdflastobj}% }{% \edef\@MXV@efentry{% /EF << /F \@MXV@getlabelvalue{\pdfmdfivesum file {#4}}\space 0 R >>% }% }% \else\def\@MXV@efentry{}\fi% % \ifthenelse{\boolean{@MXV@externalviewer}\AND\NOT\boolean{@MXV@inline}}{}{% %new file specification object \pdfobj {<<% /F(#4)% \@MXV@fsentry% \@MXV@efentry% /Type/Filespec% >>}\pdfrefobj\pdflastobj% \edef\@MXV@filespec{\the\pdflastobj}% }% % \makebox[0pt][r]{\makebox[#1][l]{% %insert FileAttachment annotation \ifthenelse{\boolean{@MXV@inline}\AND\boolean{@MXV@externalviewer}\OR% \boolean{@MXV@attachment}% }{% \pdfannot width #1 height #2 depth #3 {% /Subtype /FileAttachment% /F 0% /T (\@MXV@filename)% /Contents (Media File (\@MXV@mime))% \if@MXV@externalviewer% %a coloured border, as with external links, would be much nicer /Name/Paperclip% /C [1 1 1]% \else% /AP <>/R<<>>/D<<>>>>% \fi% /FS \@MXV@filespec\space 0 R% }% }{% \if@MXV@url% %insert Link annotation, if media file is a URL \pdfannot width #1 height #2 depth #3 {% /Subtype /Link% /F 0% \if@MXV@externalviewer% \@MXV@urlattr% \else% /H /N% /Border [0 0 0]% \fi% /A <>% /Contents (Media File (\@MXV@mime))% }% \else% %else insert Launch action for local external media file \if@MXV@inline\else% \pdfannot width #1 height #2 depth #3 {% /Subtype /Link% /F 0% \if@MXV@externalviewer% \@MXV@runattr% \else% /H /N% /Border [0 0 0]% \fi% /A <<% /F (#4)% /S /Launch% >>% /Contents (Media File (\@MXV@mime))% }% \fi% \fi% }% % \if@MXV@externalviewer\else% %annotation object of subtype `Screen' \pdfannot width #1 height #2 depth #3 {% /Subtype /Screen% /Border [0 0 0]% no border (PDF-1.1) /BS <>% no border (PDF-1.5) /F 5% disable annot if multimedia is not available /T (\@MXV@filename)% /Contents (Media File (\@MXV@mime))% /P \@MXV@pdfpageref{@MXV@annot\the\@MXV@includes.page} 0 R% /A \the\@MXV@adict\space 0 R% /AA \the\@MXV@aadict\space 0 R% /AP <>/R<<>>/D<<>>>>% }\edef\@MXV@screenannot{\the\pdflastannot}% %label for later annot obj number determination, to be used in %movieref's only \ifx\@MXV@@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@@label.annot}{\@MXV@screenannot}% \@MXV@newlabel{@MXV@\@MXV@@label.annot}{\@MXV@screenannot}% \fi% % %new media clip object of subtype `Media Clip Data' (/S/MCD) \pdfobj {<<% /D \@MXV@filespec\space 0 R% /P <>% /S/MCD% /CT (\@MXV@mime)% >>}\pdfrefobj\pdflastobj% % %new rendition object of subtype `Media Rendition' (/S/MR) \pdfobj {<<% /C \the\pdflastobj\space 0 R% /S/MR% /SP <>>>% /P <<% \@MXV@player% /BE <<% /F 2% \@MXV@@repeat\@MXV@@volume\@MXV@@ctrls% /D <>% >>% >>% >>}\edef\@MXV@mediarendition{\the\pdflastobj}\pdfrefobj\pdflastobj% %label for later rendition obj number determination \ifx\@MXV@@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@@label.rendition}{\@MXV@mediarendition}% \@MXV@newlabel{@MXV@\@MXV@@label.rendition}{\@MXV@mediarendition}% \fi% % %action dictionary \pdfobj useobjnum \@MXV@adict {<<% /R \@MXV@mediarendition\space 0 R% /S/Rendition% /OP 0% fallback if /JS doesn't work or is empty \@MXV@activationjsentry% /AN \@MXV@screenannot\space 0 R% >>}\pdfrefobj\pdflastobj% % %create play/stop/resume/pause actions \pdfobj {<<% /R \@MXV@mediarendition\space 0 R% /S/Rendition% \@MXV@pageopenopentry% /OP fallback if /JS doesn't work \@MXV@pageopenjsentry% /AN \@MXV@screenannot\space 0 R% >>}\edef\@MXV@pageopenaction{\the\pdflastobj}\pdfrefobj\pdflastobj% % \pdfobj {<<% /R \@MXV@mediarendition\space 0 R% /S/Rendition% \@MXV@pagecloseopentry% \@MXV@pageclosejsentry% /AN \@MXV@screenannot\space 0 R% >>}\edef\@MXV@pagecloseaction{\the\pdflastobj}\pdfrefobj\pdflastobj% % %populate additional actions dictionary \pdfobj useobjnum \@MXV@aadict {<<% /PO \@MXV@pageopenaction\space 0 R% /PC \@MXV@pagecloseaction\space 0 R% >>}\pdfrefobj\pdflastobj% \fi}}% }% \else% %dvips version \def\@MXV@includemovie#1#2#3#4{% %insert FileAttachment annotation \ifthenelse{\boolean{@MXV@inline}\AND\boolean{@MXV@externalviewer}\OR% \boolean{@MXV@attachment}% }{% \makebox[0pt][l]{% \pdfmark[\phantom{\@MXV@box{#1}{#2}{#3}}]{% pdfmark=/ANN,% Subtype=/FileAttachment,% Raw={% /F 0% /T (\@MXV@filename)% /Contents (Media File (\@MXV@mime))% \if@MXV@externalviewer% /Name/Paperclip% /C [1 1 1]% \else% /AP <>/R<<>>/D<<>>>>% \fi% /FS {filespec\the\@MXV@includes}% }% }% }% }{% \if@MXV@url% %insert Link annotation, if media file is a URL \makebox[0pt][l]{% \pdfmark[\phantom{\@MXV@box{#1}{#2}{#3}}]{% pdfmark=/ANN,% Subtype=/Link,% Raw={% /F 0% \if@MXV@externalviewer% /C [\@urlbordercolor]% /H \@pdfhighlight% \else% /H /N% /Border [0 0 0]% \fi% /Action <>% /Contents (Media File (\@MXV@mime))% }% }% }% \else% %else insert Launch action for local external media file \if@MXV@inline\else% \makebox[0pt][l]{% \pdfmark[\phantom{\@MXV@box{#1}{#2}{#3}}]{% pdfmark=/ANN,% Subtype=/Link,% Raw={% /F 0% \if@MXV@externalviewer% /C [\@urlbordercolor]% /H \@pdfhighlight% \else% /H /N% /Border [0 0 0]% \fi% /Action <<% /F (#4)% /S /Launch% >>% /Contents (Media File (\@MXV@mime))% }% }% }% \fi% \fi% }% % \if@MXV@externalviewer% \@MXV@box{#1}{#2}{#3}% \else% %annotation object of subtype `Screen' \pdfmark[\@MXV@box{#1}{#2}{#3}]{% pdfmark=/ANN,% Subtype=/Screen,% Border={0 0 0},% Raw={% /_objdef {screenannot\the\@MXV@includes}% /F 5% /T (\@MXV@filename)% /Contents (Media File (\@MXV@mime))% /BS <>% no border (PDF-1.5) /P {ThisPage}% /AA {aadict\the\@MXV@includes}% /AP <>/R<<>>/D<<>>>>% }% }% \ifx\@MXV@@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@@label.annot}{\the\@MXV@includes}% \@MXV@newlabel{@MXV@\@MXV@@label.annot}{\the\@MXV@includes}% \fi% % %entire action entry moved outside screen annotation \pdfmark{% pdfmark=/PUT,% Raw={% {screenannot\the\@MXV@includes} <<% /A <<% /R {mediarendition\the\@MXV@includes}% /S/Rendition% /OP 0% fallback, if /JS doesn't work or is empty \@MXV@activationjsentry% /AN {screenannot\the\@MXV@includes}% >>% >>% }% }% % %new rendition object of subtype `Media Rendition' (/S/MR) \pdfmark{% pdfmark=/OBJ,% Raw={% /type/dict% /_objdef {mediarendition\the\@MXV@includes}% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {mediarendition\the\@MXV@includes} <<% /C {mediaclipdata\the\@MXV@includes}% /S/MR% %screen parameters: fully transparent, hidden if audio mime type /SP <>>>% /P <<%Media Play Parameters \@MXV@player% /BE <<%Parameters need only be honored by the player in %the best effort sense /F 2%scale media's width and height to fit the %annotation rectangle \@MXV@@repeat\@MXV@@volume\@MXV@@ctrls% /D <>%movie remains opened >>% >>% >>% }% }% % %new media clip object of subtype `Media Clip Data' (/S/MCD) \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {mediaclipdata\the\@MXV@includes}% /type/dict% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {mediaclipdata\the\@MXV@includes} <<% /D {filespec\the\@MXV@includes}% /P <>% /S/MCD% /CT (\@MXV@mime)% mime type >>% }% }% \fi% % %new file specification object \ifthenelse{\boolean{@MXV@externalviewer}\AND\NOT\boolean{@MXV@inline}}{}{% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {filespec\the\@MXV@includes}% /type/dict% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {filespec\the\@MXV@includes} <<% \@MXV@fsentry /F(#4)% file name /Type/Filespec% >>% }% }% }% % %embedded file entry `/EF' \if@MXV@inline% %embed the same media file only once \ifthenelse{\equal{\@MXV@getlabelvalue{\pdfmdfivesum file {#4}}}{undefined}}{% %new stream object \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {fstream\the\@MXV@includes}% /type/stream% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {fstream\the\@MXV@includes}% (#4) (r) file% read in file contents }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {fstream\the\@MXV@includes} <<% /Type/EmbeddedFile% /Subtype(\@MXV@mime)% >>% }% }% \edef\@MXV@moviestream{fstream\the\@MXV@includes}% \@MXV@newlabel{\pdfmdfivesum file {#4}}{fstream\the\@MXV@includes}% }{% \edef\@MXV@moviestream{\@MXV@getlabelvalue{\pdfmdfivesum file {#4}}}% }% % put the embedded file entry into file spec object \pdfmark{% pdfmark=/PUT,% Raw={% {filespec\the\@MXV@includes} <<% /EF << /F {\@MXV@moviestream} >>% >>% }% }% \fi% % \if@MXV@externalviewer\else% %create actions for page open/close events \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {pageopenaction\the\@MXV@includes}% /type/dict% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {pageopenaction\the\@MXV@includes} <<% /R {mediarendition\the\@MXV@includes}% /S/Rendition% \@MXV@pageopenopentry% /OP fallback, if /JS doesn't work \@MXV@pageopenjsentry% /AN {screenannot\the\@MXV@includes}% >>% }% }% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {pagecloseaction\the\@MXV@includes}% /type/dict% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {pagecloseaction\the\@MXV@includes} <<% /R {mediarendition\the\@MXV@includes}% /S/Rendition% \@MXV@pagecloseopentry% \@MXV@pageclosejsentry% /AN {screenannot\the\@MXV@includes}% >>% }% }% % %create and populate additional actions dictionary, always add entries %for page open/close events \pdfmark{% pdfmark=/OBJ,% Raw={% /type/dict% /_objdef {aadict\the\@MXV@includes}% }% }% % \pdfmark{% pdfmark=/PUT,% Raw={% {aadict\the\@MXV@includes} <<% /PO {pageopenaction\the\@MXV@includes}% /PC {pagecloseaction\the\@MXV@includes}% >>% }% }% \fi% }% \fi %definition of user command `\includemovie' \newcommand{\includemovie}[4][]{% \leavevmode% \@MXV@reset% all macros and options \setkeys{MXV@user}{#1}% parse options % %total height of text \@MXV@totalheight=\@MXV@height% \advance\@MXV@totalheight by \@MXV@depth% %traiselen=distance at which text is to be raised to centre it vertically %braiselen=vertical centre of media box (auxiliary measure) \@MXV@traiselen=0.5\@MXV@height% \advance\@MXV@traiselen by -0.5\@MXV@depth% % \ifthenelse{\equal{#3}{}}{% no height argument \@MXV@braiselen=0.5\@MXV@height% }{%override height of text, height argument given \@MXV@braiselen=#3% \@MXV@braiselen=0.5\@MXV@braiselen% \setlength{\@MXV@height}{#3}% }% % \ifthenelse{\equal{\@MXV@boxdepth}{}}{% no depth option given \ifthenelse{\lengthtest{\@MXV@totalheight>\@MXV@height}}{% %depth of text only taken into account, if the total height %is smaller than the height of the display box \advance\@MXV@braiselen by -0.5\@MXV@depth% }{% \@MXV@depth=0pt% }% }{%override depth of text, depth option given \setlength{\@MXV@@boxdepth}{\@MXV@boxdepth}% \advance\@MXV@braiselen by -0.5\@MXV@@boxdepth% \setlength{\@MXV@depth}{\@MXV@boxdepth}% }% %finally centre text vertically \ifthenelse{\NOT\equal{#3}{}\OR\NOT\equal{\@MXV@boxdepth}{}}{% \advance\@MXV@traiselen by -\@MXV@braiselen% \@MXV@traiselen=-\@MXV@traiselen% \savebox{\@MXV@textbox}{\raisebox{\@MXV@traiselen}[0pt][0pt]{% \usebox{\@MXV@textbox}}}% }{}% \ifthenelse{\equal{#2}{}}{}{%override horiz. dimension of text \setlength{\@MXV@width}{#2}% %centre text horizontally \savebox{\@MXV@textbox}{\makebox[\@MXV@width][c]{\usebox{\@MXV@textbox}}}% }% % %find out whether the contents should be hidden or not (for presentations) \setboolean{@MXV@hide}{false}% % \ifthenelse{\boolean{@MXV@powerdot}}{% % \ifthenelse{\boolean{pd@overlay}}{}{% % \ifthenelse{\pd@method=2}{}{% % \setboolean{@MXV@hide}{true}% % }% % }% % }{}% \ifthenelse{\boolean{@MXV@beamer}}{% \ifthenelse{\boolean{beamer@anotherslide}}{% \setboolean{@MXV@hide}{true}% }{}% }{}% % \ifthenelse{\boolean{@MXV@hide}}{% %insert whitespace instead of annot \phantom{\vrule width \@MXV@width height \@MXV@height depth \@MXV@depth}% }{% \ifthenelse{\NOT\boolean{@MXV@url}\AND\boolean{@MXV@inline}}{% \IfFileExists{#4}{}{% \PackageError{movie15}{% File `#4' cannot be opened for embedding.\MessageBreak Did you forget to set option `url' or `inline=false'? }{% Try any of the options `url' or `inline=false'! }% }% }{}% % %guess the mime type based on the filename extension \filename@parse{#4}% \ifthenelse{\equal{\@MXV@mime}{@MXV@auto}}{% \@MXV@guessmime{#4}{\filename@ext}}{}% \if\filename@ext\relax% \xdef\@MXV@filename{\filename@base}% \else% \xdef\@MXV@filename{\filename@base.\filename@ext}% \fi% \expandafter\@MXV@@issound\@MXV@mime:% % %if 3D object is not embedded inline we must use some external player :( \ifthenelse{% \boolean{@MXV@iiid}% \AND\NOT\boolean{@MXV@inline}% }{% \setboolean{@MXV@externalviewer}{true}% }{}% % \edef\@MXV@urlattr{% \if@MXV@beamer% /Border [1 1 1]% \else% /Border [\@pdfborder]% \fi% /C [\@urlbordercolor]% /H \@pdfhighlight% }% \edef\@MXV@runattr{% \if@MXV@beamer% /Border [1 1 1]% \else% /Border [\@pdfborder]% \fi% /C [\@runbordercolor]% /H \@pdfhighlight% }% % \global\advance\@MXV@includes by 1%increment counter % %label this annotation for later page number determination \@MXV@labeltoaux{@MXV@annot\the\@MXV@includes.page}{% \noexpand\the\@MXV@page}% % %label this annotation for later annot id number determination & %check for multiply-defined labels % \@MXV@label --> automatic (presentation mode) or user defined label % \@MXV@@label = \@MXV@label (non presentation doc classes) % \@MXV@@label = \@MXV@label + physical page No. (presentation mode) \ifx\@MXV@label\@empty% %when used with presentation packages, annots must be labelled, %use the media file name, if no label provided \ifthenelse{\boolean{@MXV@presentation}}{% \xdef\@MXV@label{#4}% }{}% \fi% \ifx\@MXV@label\@empty\else% \ifthenelse{\boolean{@MXV@presentation}}{% %in presentation mode, the label must be extended by the physical page No. \xdef\@MXV@@label{\@MXV@label.\@MXV@getlabelvalue{@MXV@annot\the\@MXV@includes.page}}% }{% \xdef\@MXV@@label{\@MXV@label}% }% \fi% \ifx\@MXV@@label\@empty\else% \ifthenelse{% \NOT\equal{\@MXV@getlabelvalue{@MXV@\@MXV@@label.annotid}}{undefined}% \AND% \NOT\equal{\@MXV@getlabelvalue{@MXV@\@MXV@@label.annotid}}{% \the\@MXV@includes}% }{% \PackageWarning{movie15}{% Label `\@MXV@label' multiply defined% }% \ifthenelse{\isundefined{\@MXV@multiwarning}}{% \gdef\@MXV@multiwarning{}% \AtEndDocument{% \PackageWarningNoLine{movie15}{% @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak @@ There were multiply-defined labels! @@\MessageBreak @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}% }% }{}% }{}% \if@MXV@@draft% \@MXV@labeltoaux{@MXV@\@MXV@label.draft}{true}% \else% \@MXV@labeltoaux{@MXV@\@MXV@label.draft}{false}% \fi% \@MXV@labeltoaux{@MXV@\@MXV@@label.annotid}{\the\@MXV@includes}% \if@MXV@presentation\else% \@MXV@newlabel{@MXV@\@MXV@@label.annotid}{\the\@MXV@includes}% \fi% \fi% % \ifthenelse{\boolean{@MXV@@draft}}{}{% \ifthenelse{\boolean{@MXV@externalviewer}}{% \ifx\@MXV@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@label.externalviewer}{true}% \@MXV@newlabel{@MXV@\@MXV@label.externalviewer}{true}% \fi% }{% %what is to be put into movie link annot depends on the following \ifx\@MXV@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@label.externalviewer}{false}% \@MXV@newlabel{@MXV@\@MXV@label.externalviewer}{false}% \fi% % %depending on options do content specific stuff \ifthenelse{\boolean{@MXV@iiid}}{% % #### 3D #### \if@MXV@externalviewer\else% \ifthenelse{\equal{\@MXV@iiidpalindrome}{/Subtype/Oscillating}}{% \global\multiply\@MXV@iiidrepeat by 2% }{}% \ifthenelse{\boolean{@MXV@autoplay}\OR\boolean{@MXV@autoresume}}{% \def\@MXV@activation{/A/PV/AIS/L}% open 3D object, run animation }{% \if@MXV@runposter% \def\@MXV@activation{/A/PV/AIS/I}%open 3D obj but don't run animation \else% \def\@MXV@activation{/A/XA}% explicit activation by user \fi% }% \if@MXV@autostop% \def\@MXV@deactivation{/D/PI/DIS/I}% \else% \if@MXV@autopause% \def\@MXV@deactivation{/D/PI/DIS/I}% \else% \if@MXV@autoclose% \def\@MXV@deactivation{/D/PI/DIS/U}% \else%@MXV@continue \def\@MXV@deactivation{/D/PI/DIS/L}% \fi% \fi% \fi% %counter for 3D inclusion on current page \ifthenelse{% \equal{% \@MXV@getlabelvalue{@MXV@annot\the\@MXV@includes.page}% }{\@MXV@oldpage}% }{% \global\advance\@MXV@iiidoncurpage by 1% }{% \global\@MXV@iiidoncurpage=1% }% \xdef\@MXV@oldpage{\@MXV@getlabelvalue{% @MXV@annot\the\@MXV@includes.page}}% \fi% \ifx\@MXV@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@label.3D}{true}% \@MXV@newlabel{@MXV@\@MXV@label.3D}{true}% \@MXV@labeltoaux{@MXV@\@MXV@label.3Dbg}{\@MXV@defaultbg}% \@MXV@newlabel{@MXV@\@MXV@label.3Dbg}{\@MXV@defaultbg}% \@MXV@labeltoaux{@MXV@\@MXV@label.3Dlights}{\@MXV@defaultlights}% \@MXV@newlabel{@MXV@\@MXV@label.3Dlights}{\@MXV@defaultlights}% \@MXV@labeltoaux{@MXV@\@MXV@label.3Drender}{\@MXV@defaultrender}% \@MXV@newlabel{@MXV@\@MXV@label.3Drender}{\@MXV@defaultrender}% \fi% \ifx\@MXV@@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@@label.3Doncurpage}{\the\@MXV@iiidoncurpage}% \@MXV@newlabel{@MXV@\@MXV@@label.3Doncurpage}{\the\@MXV@iiidoncurpage}% \fi% }{%#### 2D #### %get the player ID \if@MXV@presentation% \ifthenelse{% \equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.playerid}}{undefined}% }{% \global\advance\@MXV@players by 1%increment counter }{% \global\@MXV@players=\@MXV@getlabelvalue{@MXV@\@MXV@label.playerid}% }% \@MXV@labeltoaux{@MXV@\@MXV@label.playerid}{\the\@MXV@players}% \@MXV@newlabel{@MXV@\@MXV@label.playerid}{\the\@MXV@players}% \edef\@MXV@currplayer{\the\@MXV@players}% \else% \ifx\@MXV@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@label.playerid}{\the\@MXV@includes}% \@MXV@newlabel{@MXV@\@MXV@label.playerid}{\the\@MXV@includes}% \fi% \edef\@MXV@currplayer{\the\@MXV@includes}% \fi% % \ifx\@MXV@startat\@empty% default start position \gdef\@MXV@startat{, startAt: 0}% \fi% %write player settings to aux file \ifx\@MXV@label\@empty\else% \@MXV@labeltoaux{@MXV@\@MXV@label.mouse}{% \if@MXV@mouse true\else false\fi}% \@MXV@labeltoaux{@MXV@\@MXV@label.showUI}{\@MXV@ctrls}% \@MXV@labeltoaux{@MXV@\@MXV@label.palindrome}{\@MXV@palindrome}% \@MXV@labeltoaux{@MXV@\@MXV@label.repeat}{\@MXV@repeat}% \@MXV@labeltoaux{@MXV@\@MXV@label.rate}{\@MXV@rate}% \@MXV@labeltoaux{@MXV@\@MXV@label.startAt}{\@MXV@startat}% \@MXV@labeltoaux{@MXV@\@MXV@label.endAt}{\@MXV@endat}% \@MXV@labeltoaux{@MXV@\@MXV@label.volume}{\@MXV@volume}% \@MXV@labeltoaux{@MXV@\@MXV@label.autoplay}{% \if@MXV@autoplay true\else false\fi}% \@MXV@labeltoaux{@MXV@\@MXV@label.3D}{false}% \@MXV@labeltoaux{@MXV@\@MXV@label.issound}{% \if@MXV@issound true\else false\fi}% % \@MXV@newlabel{@MXV@\@MXV@label.mouse}{% \if@MXV@mouse true\else false\fi}% \@MXV@newlabel{@MXV@\@MXV@label.showUI}{\@MXV@ctrls}% \@MXV@newlabel{@MXV@\@MXV@label.palindrome}{\@MXV@palindrome}% \@MXV@newlabel{@MXV@\@MXV@label.repeat}{\@MXV@repeat}% \@MXV@newlabel{@MXV@\@MXV@label.rate}{\@MXV@rate}% \@MXV@newlabel{@MXV@\@MXV@label.startAt}{\@MXV@startat}% \@MXV@newlabel{@MXV@\@MXV@label.endAt}{\@MXV@endat}% \@MXV@newlabel{@MXV@\@MXV@label.volume}{\@MXV@volume}% \@MXV@newlabel{@MXV@\@MXV@label.autoplay}{% \if@MXV@autoplay true\else false\fi}% \@MXV@newlabel{@MXV@\@MXV@label.3D}{false}% \@MXV@newlabel{@MXV@\@MXV@label.issound}{% \if@MXV@issound true\else false\fi}% % \fi% % \ifthenelse{\boolean{@MXV@autoplay}\OR\boolean{@MXV@runposter}}{% \xdef\@MXV@pageopenopentry{/OP 4}% }{% \if@MXV@autoresume% \xdef\@MXV@pageopenopentry{/OP 3}% \else% \xdef\@MXV@pageopenopentry{/OP 2}% \fi% }% % \if@MXV@autostop% \xdef\@MXV@pagecloseopentry{/OP 1}% \else% \if@MXV@autopause% \xdef\@MXV@pagecloseopentry{/OP 2}% \else% \if@MXV@autoclose% \xdef\@MXV@pagecloseopentry{/OP 1}% \else% @MXV@continue \xdef\@MXV@pagecloseopentry{/OP 3}% \fi% \fi% \fi% % %JavaScripts for playback control %script for page invisible event \if@MXV@autopause% \xdef\@MXV@pageclosejsentry{% /JS ( try{% if(player\@MXV@currplayer.isPlaying){% player\@MXV@currplayer.pause(); player\@MXV@currplayer.settings.privateData.paused=true; } focusonplayer=-1; %page change player\@MXV@currplayer.visible=false; } catch(e){} )% }% \else% \if@MXV@autostop% \xdef\@MXV@pageclosejsentry{% /JS ( try{% player\@MXV@currplayer.settings.privateData.paused=false; %players tend to be bugged, always stop from playing state if(!player\@MXV@currplayer.isPlaying){ player\@MXV@currplayer.play(); } player\@MXV@currplayer.stop(); if( player\@MXV@currplayer.settings.startAt.time || player\@MXV@currplayer.settings.startAt.frame || player\@MXV@currplayer.settings.startAt.marker || player\@MXV@currplayer.id == 'vnd.adobe.swname:AAPL_QuickTime' ){ player\@MXV@currplayer.seek(% player\@MXV@currplayer.settings.startAt); } focusonplayer=-1; player\@MXV@currplayer.visible=false; } catch(e){} )% }% \else% \if@MXV@autoclose% \xdef\@MXV@pageclosejsentry{% /JS ( try{% player\@MXV@currplayer.close(app.media.closeReason.general); focusonplayer=-1; %page change player\@MXV@currplayer.visible=false; } catch(e){} )% }% \else% \xdef\@MXV@pageclosejsentry{%@MXV@continue /JS ( try{% focusonplayer=-1; %page change player\@MXV@currplayer.visible=false; } catch(e){} )% }% \fi% \fi% \fi% % %script for activation/resume on page open event \xdef\@MXV@pageopenjsentry{% /JS ( try{% if(player\@MXV@currplayer.isOpen){% %drag the player on the current slide (presentation mode) player\@MXV@currplayer.page=this.pageNum; %... and make it visible \if@MXV@issound\else player\@MXV@currplayer.visible=true;\fi% % %start or resume media which have autoplay option set; %also resume paused media which have autoresume option set \if@MXV@autoplay% player\@MXV@currplayer.settings.privateData.paused=false; player\@MXV@currplayer.play(); if(!player\@MXV@currplayer.isPlaying){% still not playing?! if( player\@MXV@currplayer.settings.startAt.time || player\@MXV@currplayer.settings.startAt.frame || player\@MXV@currplayer.settings.startAt.marker || player\@MXV@currplayer.id=='vnd.adobe.swname:AAPL_QuickTime' ){ player\@MXV@currplayer.seek( player\@MXV@currplayer.settings.startAt); }else{ player\@MXV@currplayer.stop(); } player\@MXV@currplayer.play(); } \else% \if@MXV@autoresume% if(player\@MXV@currplayer.settings.privateData.paused){% player\@MXV@currplayer.settings.privateData.paused=false; player\@MXV@currplayer.play(); if(!player\@MXV@currplayer.isPlaying){% if( player\@MXV@currplayer.settings.startAt.time || player\@MXV@currplayer.settings.startAt.frame || player\@MXV@currplayer.settings.startAt.marker || player\@MXV@currplayer.id == 'vnd.adobe.swname:AAPL_QuickTime' ){ player\@MXV@currplayer.seek(% player\@MXV@currplayer.settings.startAt); }else{ player\@MXV@currplayer.stop();% } player\@MXV@currplayer.play(); } } \fi% \fi% } else{% throw 'isClosed'; } } catch(e){% \@MXV@if{\if@MXV@autoplay true\else\if@MXV@runposter true\else % false\fi\fi}% if(focusonplayer==undefined){% var focusonplayer=0; %shared by all annots } \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% \@MXV@events{\@MXV@currplayer}% {\if@MXV@mouse true\else false\fi}% {\if@MXV@autoplay true\else false\fi}% var player\@MXV@currplayer=app.media.openPlayer({% settings: settings, events: events }); \fi% }% ) }% % %script for normal activation by mouse click \xdef\@MXV@activationjsentry{% /JS ( app.focusRect=true;% if(focusonplayer==undefined){% var focusonplayer=0; %shared by all annots } \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% \@MXV@events{\@MXV@currplayer}{\if@MXV@mouse true\else false\fi}% {true}% var player\@MXV@currplayer=app.media.openPlayer({% settings: settings, events: events }); ) }% }% }% }% draft? % %insert link target, if media has been labelled \ifthenelse{\NOT\equal{\@MXV@@label}{}}{% \raisebox{\@MXV@height}{% \ifpdf% \pdfdest name {@MXV@\@MXV@@label} xyz % \else% \hypertarget{@MXV@\@MXV@@label}{}% \fi% }% }{}% % \ifthenelse{\boolean{@MXV@@draft}}{% \makebox[0pt][l]{\usebox{\@MXV@textbox}}% \@MXV@draftbox{\@MXV@width}{\@MXV@height}{\@MXV@depth}{#4}% }{% %insert textbox, obscured by poster \ifthenelse{\boolean{@MXV@boxopt}\AND\NOT\boolean{@MXV@textoverposter}}{% \makebox[0pt][l]{\usebox{\@MXV@textbox}}% }{}% % %insert annotation \ifthenelse{\boolean{@MXV@iiid}}{% \edef\@MXV@iiidopt{[\@MXV@iiidopt]}% \expandafter\@MXV@includeiiid\@MXV@iiidopt{\@MXV@width}{\@MXV@height}{\@MXV@depth}{#4}% }{% \@MXV@includemovie{\@MXV@width}{\@MXV@height}{\@MXV@depth}{#4}% }% % %insert textbox, overprinting the poster \ifthenelse{\boolean{@MXV@boxopt}\AND\boolean{@MXV@textoverposter}}{% \makebox[0pt][r]{\usebox{\@MXV@textbox}}% }{}% }% }% } %for remote control of media \newcommand\movieref[3][]{% \leavevmode% % save text argument \savebox{\@MXV@textbox}{\ifHy@colorlinks\color{\@linkcolor}\fi#3}% % %find out whether the contents should be hidden or not (for presentations) \setboolean{@MXV@hide}{false}% % \ifthenelse{\boolean{@MXV@powerdot}}{% % \ifthenelse{\boolean{pd@overlay}}{}{% % \ifthenelse{\pd@method=2}{}{% % \setboolean{@MXV@hide}{true}% % }% % }% % }{}% \ifthenelse{\boolean{@MXV@beamer}}{% \ifthenelse{\boolean{beamer@anotherslide}}{% \setboolean{@MXV@hide}{true}% }{}% }{}% % \ifthenelse{\boolean{@MXV@hide}}{% %put whitespace instead of link annot \phantom{\usebox{\@MXV@textbox}}% }{% \@MXV@reset% % \xdef\@MXV@label{#2}% % \global\advance\@MXV@links by 1%increment link counter % %label this link for later page number determination \@MXV@labeltoaux{@MXV@link\the\@MXV@links.page}{\noexpand\the\@MXV@page}% % \ifthenelse{\boolean{@MXV@presentation}}{% %in presentation mode the label must be extended by the physical page No. \xdef\@MXV@@label{\@MXV@label.\@MXV@getlabelvalue{@MXV@link\the\@MXV@links.page}}% }{% \xdef\@MXV@@label{\@MXV@label}% }% % %check if label is defined at all \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@@label.annotid}}{undefined}}{% \usebox{\@MXV@textbox}% write out text box \PackageWarning{movie15}{% Reference `\@MXV@label' on page \thepage \space undefined% }% \ifthenelse{\isundefined{\@MXV@undefwarning}}{% \gdef\@MXV@undefwarning{}% \AtEndDocument{% \PackageWarningNoLine{movie15}{% @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\MessageBreak% @@ There were undefined references! @@\MessageBreak% @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}% }% }{}% }{% \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.draft}}{true}}{% \setboolean{@MXV@@draft}{true}% if the screen annotation is in draft mode }{}% \if@MXV@@draft\else% \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.externalviewer}}{true}}{% \setboolean{@MXV@externalviewer}{true}% }{% \setboolean{@MXV@externalviewer}{false}% }% \if@MXV@externalviewer\else% %movieref used in 3D context? \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.3D}}{true}}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \setboolean{@MXV@iiid}{true}% }{% \@MXV@neediiiD% }% }{}% % %actions completely different in 3D & 2D context \ifthenelse{\boolean{@MXV@iiid}}{% #### 3D #### %retrieve default background colour \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.3Dbg}}{undefined}}{% \gdef\@MXV@defaultbg{1 1 1}% }{% \xdef\@MXV@defaultbg{\@MXV@getlabelvalue{@MXV@\@MXV@label.3Dbg}}% }% %retrieve default lighting scheme \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.3Dlights}}{undefined}}{% \gdef\@MXV@defaultlights{}% }{% \xdef\@MXV@defaultlights{\@MXV@getlabelvalue{@MXV@\@MXV@label.3Dlights}}% }% %retrieve default render mode \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.3Drender}}{undefined}}{% \gdef\@MXV@defaultrender{Solid}% }{% \xdef\@MXV@defaultrender{\@MXV@getlabelvalue{@MXV@\@MXV@label.3Drender}}% }% \setkeys{MXV@user}{#1}% \if@MXV@defaultviewprovided% define a new view, %using any of the coo, c2c, roo, caa options \pdfstringdef\@MXV@xname{}% \edef\@MXV@args{\@MXV@coo\space\@MXV@ctoc\space\@MXV@roo\space\@MXV@roll\space}% \expandafter\@MXV@ciiwmatrix\@MXV@args% build C2W matrix \@MXV@viewobj% create pdf object of 3D view \edef\@MXV@iiidview{\@MXV@@viewobj}% %else use the indexed view specified by option `3Dviewindex' \fi% % %create JavaScript (options 3Djscript, 3Dcalculate, 3Dgetview) \ifthenelse{\NOT\equal{\@MXV@jscriptiiidfile}{}% \OR\NOT\equal{\@MXV@calc}{}% \OR\boolean{@MXV@iiidgetview}% }{% \edef\@MXV@linkjscriptiiid{% try{% %fill hash (annot3D) with refs to Annot3D objects annot3D['\@MXV@label']=getAnnots3D(% \@MXV@getlabelvalue{% @MXV@annot\@MXV@getlabelvalue{@MXV@\@MXV@@label.annotid}.page% }-1% )[\@MXV@getlabelvalue{@MXV@\@MXV@@label.3Doncurpage}-1];% annot3D['\@MXV@label'].activated=true;% }catch(e){% try{% annot3D=new Array;% annot3D['\@MXV@label']=getAnnots3D(% \@MXV@getlabelvalue{% @MXV@annot\@MXV@getlabelvalue{@MXV@\@MXV@@label.annotid}.page% }-1% )[\@MXV@getlabelvalue{@MXV@\@MXV@@label.3Doncurpage}-1];% annot3D['\@MXV@label'].activated=true;% }catch(e){% var spc=String.fromCharCode(32);% app.alert('3D' + spc + 'annotation' + spc + 'could' + spc +% 'not' + spc + 'be' + spc + 'activated!');% }% }% }% \if@MXV@iiidgetview% \edef\@MXV@linkjscriptiiid{% \@MXV@linkjscriptiiid try{ %JavaScript to print the camera settings of the current view var scene=annot3D['\@MXV@label'].context3D.scene;% var camera=scene.cameras.getByIndex(0);% var coo=camera.targetPosition;% var c2c=camera.position.subtract(coo);% var roo=c2c.length;% c2c.normalize();% % %assemble result string var spc=String.fromCharCode(32);% var nl=String.fromCharCode(10);% var charht=2;% var res='VIEW\%={}'+nl;% var x = (Math.abs(coo.x) < 1e-12 ? 0 : coo.x);% var y = (Math.abs(coo.y) < 1e-12 ? 0 : coo.y);% var z = (Math.abs(coo.z) < 1e-12 ? 0 : coo.z);% if(Math.sqrt(x*x + y*y + z*z) > 0){% res+=spc+spc;% res+=util.printf('COO=\%s' + spc + '\%s' + spc + '\%s' +nl,% (Math.abs(x) < 1.001e-6 && Math.abs(x) > 0 ?% util.printf('\%.18f', x): x),% (Math.abs(y) < 1.001e-6 && Math.abs(y) > 0 ?% util.printf('\%.18f', y): y),% (Math.abs(z) < 1.001e-6 && Math.abs(z) > 0 ?% util.printf('\%.18f', z): z)% );% charht+=2;% }% x = (Math.abs(c2c.x) < 1e-12 ? 0 : c2c.x);% y = (Math.abs(c2c.y) < 1e-12 ? 0 : c2c.y);% z = (Math.abs(c2c.z) < 1e-12 ? 0 : c2c.z);% if(!(x==0 && y==-1 && z==0)){% res += spc + spc;% res+=util.printf('C2C=\%s' + spc + '\%s' + spc + '\%s' +nl,% (Math.abs(x) < 1.001e-6 && Math.abs(x) > 0 ?% util.printf('\%.18f', x): x),% (Math.abs(y) < 1.001e-6 && Math.abs(y) > 0 ?% util.printf('\%.18f', y): y),% (Math.abs(z) < 1.001e-6 && Math.abs(z) > 0 ?% util.printf('\%.18f', z): z)% );% charht+=2;% }% if(roo > 0.11e-17){% res+= spc + spc;% res+=util.printf('ROO=\%s' + nl,% (roo < 1.001e-6 ? util.printf('\%.12f', roo): roo)% );% charht+=2;% }% %determine the camera roll (camera.roll is bugged) %%camera up-vector from camera.up, the latter being the positional vector %%of the actual camera up-vector tip %var up = camera.up.subtract(camera.position);% %up.normalize();% %%find the camera up-vector up0, that corresponds to zero roll %%(Gram-Schmitt orthogonalisation) %var worldup=new annot3D['\@MXV@label'].context3D.Vector3();% %worldup.set(0,0,1);% %var out=c2c.scale(-1);% %var up0=worldup.subtract(out.scale(out.dot(worldup)));% %up0.normalize();% %var up0xup=up0.cross(up);% %var roll=0;% %if(up0xup.length>0){% % up0xup.normalize();% % var up0dotup=up.dot(up0);% % up0dotup=(Math.abs(up0dotup) > 1 ? Math.round(up0dotup) : up0dotup);% % %compute the angle between camera up and up0 vectors % roll=Math.acos(up0dotup)*180/Math.PI*out.dot(up0xup);% %}% var roll = camera.roll*180/Math.PI;% if(util.printf('\%.4f', roll)!=0){% res+=util.printf(spc +spc + 'ROLL=\%s' + nl, roll);% charht+=2;% }% aac=camera.fov * 180/Math.PI;% if(util.printf('\%.5f', aac)!=30){% res+=util.printf(spc + spc + 'AAC=\%s' + nl,% (Math.abs(aac) < 1.001e-6 ? util.printf('\%.18f', aac): aac)% );% charht+=2;% }% rgb=scene.background.getColor();% res+=spc + spc;% res+=util.printf('BGCOLOR=\%f' + spc + '\%f' + spc + '\%f'% + nl, rgb.r, rgb.g, rgb.b);% charht+=2;% switch(scene.lightScheme){% case scene.LIGHT_MODE_FILE: curlights='Artwork';break; case scene.LIGHT_MODE_NONE: curlights='None';break; case scene.LIGHT_MODE_WHITE: curlights='White';break; case scene.LIGHT_MODE_DAY: curlights='Day';break; case scene.LIGHT_MODE_NIGHT: curlights='Night';break; case scene.LIGHT_MODE_BRIGHT: curlights='Hard';break; case scene.LIGHT_MODE_RGB: curlights='Primary';break; case scene.LIGHT_MODE_BLUE: curlights='Blue';break; case scene.LIGHT_MODE_RED: curlights='Red';break; case scene.LIGHT_MODE_CUBE: curlights='Cube';break; case scene.LIGHT_MODE_CAD: curlights='CAD';break; case scene.LIGHT_MODE_HEADLAMP: curlights='Headlamp';break; }% res+=spc+spc+'LIGHTS='+curlights+nl;% charht+=2;% switch(scene.renderMode){% case scene.RENDER_MODE_BOUNDING_BOX: defaultrender='BoundingBox';break; case scene.RENDER_MODE_TRANSPARENT_BOUNDING_BOX: defaultrender='TransparentBoundingBox';break; case scene.RENDER_MODE_TRANSPARENT_BOUNDING_BOX_OUTLINE: defaultrender='TransparentBoundingBoxOutline';break; case scene.RENDER_MODE_VERTICES: defaultrender='Vertices';break; case scene.RENDER_MODE_SHADED_VERTICES: defaultrender='ShadedVertices';break; case scene.RENDER_MODE_WIREFRAME: defaultrender='Wireframe';break; case scene.RENDER_MODE_SHADED_WIREFRAME: defaultrender='ShadedWireframe';break; case scene.RENDER_MODE_SOLID: defaultrender='Solid';break; case scene.RENDER_MODE_TRANSPARENT: defaultrender='Transparent';break; case scene.RENDER_MODE_SOLID_WIREFRAME: defaultrender='SolidWireframe';break; case scene.RENDER_MODE_TRANSPARENT_WIREFRAME: defaultrender='TransparentWireframe';break; case scene.RENDER_MODE_ILLUSTRATION: defaultrender='Illustration';break; case scene.RENDER_MODE_SOLID_OUTLINE: defaultrender='SolidOutline';break; case scene.RENDER_MODE_SHADED_ILLUSTRATION: defaultrender='ShadedIllustration';break; case scene.RENDER_MODE_HIDDEN_WIREFRAME: defaultrender='HiddenWireframe';break; }% res+=spc+spc+'RENDERMODE='+defaultrender+nl;% charht+=2;% for(var i=0;i40?40:charht);% %open pop-up displaying the result string var settings={% initialize: function(dialog) {% dialog.load({% 'text': res% });% },% description: {% name: 'Current' + spc + '3D' + spc + 'Camera' + spc + 'Settings',% elements: [% {% type: 'static_text',% name: 'Add' + spc + 'the' + spc + 'following' + spc + 'VIEW' + spc + 'section' + spc + % 'to' + spc + 'a' + spc + 'file' + spc + 'of' + spc +% 'predefined' + spc + 'views.' + spc +% '(See' + spc + 'option' + spc + '3Dviews2!)'% },% {% type: 'edit_text',% item_id: 'text',% alignment: 'align_fill',% multiline: true,% char_width: 80,% char_height: charht,% readonly: true% },% {% type: 'ok',% ok_name: 'Close'% }% ]% }% };% app.execDialog(settings);% }catch(e){% var spc=String.fromCharCode(32);% app.alert('Error' + spc + 'while' + spc + 'executing' + spc +% '3Dgetview:' + spc + e);% }% }% \fi% \ifx\@MXV@calc\@empty\else% \edef\@MXV@linkjscriptiiid{% \@MXV@linkjscriptiiid try{ % console.show(); % console.clear(); %constructor for doubly linked list function List(){% this.first_node=null;% this.last_node=new Node(undefined);% }% List.prototype.push_back=function(x){% var new_node=new Node(x);% if(this.first_node==null){% this.first_node=new_node;% new_node.prev=null;% }else{% new_node.prev=this.last_node.prev;% new_node.prev.next=new_node;% }% new_node.next=this.last_node;% this.last_node.prev=new_node;% };% List.prototype.move_to_front=function(it){% var node=it.get();% if(node.next!=null && node.prev!=null){% node.next.prev=node.prev;% node.prev.next=node.next;% node.prev=null;% node.next=this.first_node;% this.first_node.prev=node;% this.first_node=node;% }% };% List.prototype.begin=function(){% var i=new Iterator();% i.target=this.first_node;% return(i);% };% List.prototype.end=function(){% var i=new Iterator();% i.target=this.last_node;% return(i);% };% function Iterator(it){% if( it!=undefined ){% this.target=it.target;% }else {% this.target=null;% }% }% Iterator.prototype.set=function(it){this.target=it.target;};% Iterator.prototype.get=function(){return(this.target);};% Iterator.prototype.deref=function(){return(this.target.data);};% Iterator.prototype.incr=function(){% if(this.target.next!=null){this.target=this.target.next;}% };% %constructor for node objects that populate the linked list function Node(x){% this.prev=null;% this.next=null;% this.data=x;% }% function sqr(r){return(r*r);}%helper function %The following code borrows heavily from Bernd Gaertners `Miniball' software, %originally written in C++, for computing the smallest enclosing ball of a %set of points; see: http://www.inf.ethz.ch/personal/gaertner/miniball.html function Basis(){% this.m=0;% this.q0=new Array(3);% this.z=new Array(4);% this.f=new Array(4);% this.v=new Array(new Array(3), new Array(3), new Array(3), new Array(3));% this.a=new Array(new Array(3), new Array(3), new Array(3), new Array(3));% this.c=new Array(new Array(3), new Array(3), new Array(3), new Array(3));% this.sqr_r=new Array(4);% this.current_c=this.c[0];% this.current_sqr_r=0;% this.reset();% }% Basis.prototype.center=function(){return(this.current_c);};% Basis.prototype.size=function(){return(this.m);};% Basis.prototype.pop=function(){--this.m;};% Basis.prototype.excess=function(p){% var e=-this.current_sqr_r;% for(var k=0;k<3;++k){% e+=sqr(p[k]-this.current_c[k]);% }% return(e);% };% Basis.prototype.reset=function(){% this.m=0;% for(var j=0;j<3;++j){% this.c[0][j]=0;% }% this.current_c=this.c[0];% this.current_sqr_r=-1;% };% Basis.prototype.push=function(p){% var i, j;% var eps=1e-32;% if(this.m==0){% for(i=0;i<3;++i){% this.q0[i]=p[i];% }% for(i=0;i<3;++i){% this.c[0][i]=this.q0[i];% }% this.sqr_r[0]=0;% }else {% for(i=0;i<3;++i){% this.v[this.m][i]=p[i]-this.q0[i];% }% for(i=1;i 0){% if(this.B.push(j.deref())){% this.mtf_mb(j);% this.B.pop();% if(this.support_end.get()==j.get()){% this.support_end.incr();% }% this.L.move_to_front(j);% }% }% }% };% Miniball.prototype.check_in=function(b){% this.L.push_back(b);% };% Miniball.prototype.build=function(){% this.B.reset();% this.support_end.set(this.L.begin());% this.mtf_mb(this.L.end());% };% Miniball.prototype.center=function(){% return(this.B.center());% };% Miniball.prototype.radius=function(){% return(Math.sqrt(this.B.current_sqr_r));% };% %create Miniball object var mb=new Miniball();% %scene object var scene=annot3D['\@MXV@label'].context3D.scene;% %aperture angle of the virtual camera var camera=scene.cameras.getByIndex(0);% if('\@MXV@calc'=='current'){% var aac=camera.fov*180/Math.PI;% }else{% var aac=\@MXV@calc;% }% %auxiliary vectors var dir=new annot3D['\@MXV@label'].context3D.Vector3();% var up=new annot3D['\@MXV@label'].context3D.Vector3();% var corner=new annot3D['\@MXV@label'].context3D.Vector3();% %auxiliary 4x4 matrix var bbox4x4=new annot3D['\@MXV@label'].context3D.Matrix4x4();% %iterate over all visible mesh nodes in the scene for(i=0;i) seems %to be bugged, therefore we must resort to the %multiply() method using an auxiliary matrix %which contains the local bounding box corner coordinates % %auxiliary matrix from bbox.min coordinates bbox4x4.setView(bbox.min, dir, up);% %transform to world coordinates bbox4x4=trans.multiply(bbox4x4.transpose);% %extract the transformed coordinates corner.set(bbox4x4.transpose.translation);% %check-in corner position into Miniball mb.check_in(new Array(corner.x, corner.y, corner.z));% %the same procedure with bbox.max bbox4x4.setView(bbox.max, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% %and with all remaining 6 bbox corners corner.set(bbox.min.x, bbox.max.y, bbox.max.z);% bbox4x4.setView(corner, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% corner.set(bbox.min.x, bbox.min.y, bbox.max.z);% bbox4x4.setView(corner, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% corner.set(bbox.min.x, bbox.max.y, bbox.min.z);% bbox4x4.setView(corner, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% corner.set(bbox.max.x, bbox.min.y, bbox.min.z);% bbox4x4.setView(corner, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% corner.set(bbox.max.x, bbox.min.y, bbox.max.z);% bbox4x4.setView(corner, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% corner.set(bbox.max.x, bbox.max.y, bbox.min.z);% bbox4x4.setView(corner, dir, up);% bbox4x4=trans.multiply(bbox4x4.transpose);% corner.set(bbox4x4.transpose.translation);% mb.check_in(new Array(corner.x, corner.y, corner.z));% }% %compute the smallest enclosing bounding sphere mb.build();% %bounding sphere centre var coo=new annot3D['\@MXV@label'].context3D.Vector3();% coo.set((mb.center())[0], (mb.center())[1], (mb.center())[2]);% %radius of orbit var roo=mb.radius()/ Math.sin(aac * Math.PI/ 360.);% %result string var res='';% var spc=String.fromCharCode(32);% var nl=String.fromCharCode(10);% var charht=2;% var multiln=false;% res+=util.printf(% '3Droo=\%s,',(roo < 1.001e-6 ? util.printf('\%.18f', roo): roo) );% if(util.printf('\%.5f', aac)!=30){% charht+=2;multiln=true; res+=util.printf(nl+'3Daac=\%s,',% (Math.abs(aac) < 1.001e-6 && Math.abs(aac) > 0 ?% util.printf('\%.18f', aac): aac)% );% }% if(coo.length){% charht+=2;multiln=true; res+=util.printf(nl+'3Dcoo=\%s' + spc + '\%s' + spc + '\%s,',% (Math.abs(coo.x) < 1.001e-6 && Math.abs(coo.x) > 0 ?% util.printf('\%.18f', coo.x): coo.x),% (Math.abs(coo.y) < 1.001e-6 && Math.abs(coo.y) > 0 ?% util.printf('\%.18f', coo.y): coo.y),% (Math.abs(coo.z) < 1.001e-6 && Math.abs(coo.z) > 0 ?% util.printf('\%.18f', coo.z): coo.z)% );% }% % change camera position and target accordingly camera.fov=aac*Math.PI/180;% camera.targetPosition.set(coo);% var c2c=camera.position.subtract(coo);% c2c.normalize();% camera.position.set(coo.add(c2c.scale(roo)));% %output settings var x=(Math.abs(c2c.x) < 1e-12 ? 0 : c2c.x);% var y=(Math.abs(c2c.y) < 1e-12 ? 0 : c2c.y);% var z=(Math.abs(c2c.z) < 1e-12 ? 0 : c2c.z);% if(!(x==0 && y==-1 && z==0)){% charht+=2;multiln=true; res+=util.printf(nl+'3Dc2c=\%s' + spc + '\%s' + spc + '\%s,',% (Math.abs(x) < 1.001e-6 && Math.abs(x) > 0 ?% util.printf('\%.18f', x): x),% (Math.abs(y) < 1.001e-6 && Math.abs(y) > 0 ?% util.printf('\%.18f', y): y),% (Math.abs(z) < 1.001e-6 && Math.abs(z) > 0 ?% util.printf('\%.18f', z): z)% );% }% %determine the camera roll var roll = camera.roll*180/Math.PI;% if(util.printf('\%.4f', roll)!=0){% charht+=2;multiln=true; res+=util.printf(nl+'3Droll=\%s,',roll);% }% %determine background colour rgb=scene.background.getColor();% if(rgb.r!=1.0||rgb.g!=1.0||rgb.b!=1.0){% charht+=2;multiln=true; res+=util.printf(nl+'3Dbg=\%f' + spc + '\%f' + spc + '\%f,',% rgb.r, rgb.g, rgb.b);% }% %determine lighting scheme switch(scene.lightScheme){% case scene.LIGHT_MODE_FILE: curlights='Artwork';break; case scene.LIGHT_MODE_NONE: curlights='None';break; case scene.LIGHT_MODE_WHITE: curlights='White';break; case scene.LIGHT_MODE_DAY: curlights='Day';break; case scene.LIGHT_MODE_NIGHT: curlights='Night';break; case scene.LIGHT_MODE_BRIGHT: curlights='Hard';break; case scene.LIGHT_MODE_RGB: curlights='Primary';break; case scene.LIGHT_MODE_BLUE: curlights='Blue';break; case scene.LIGHT_MODE_RED: curlights='Red';break; case scene.LIGHT_MODE_CUBE: curlights='Cube';break; case scene.LIGHT_MODE_CAD: curlights='CAD';break; case scene.LIGHT_MODE_HEADLAMP: curlights='Headlamp';break; }% if(curlights!='Artwork'){% charht+=2;multiln=true; res+=util.printf(nl+'3Dlights=\%s,', curlights);% }% %determine global render mode switch(scene.renderMode){% case scene.RENDER_MODE_BOUNDING_BOX: currender='BoundingBox';break; case scene.RENDER_MODE_TRANSPARENT_BOUNDING_BOX: currender='TransparentBoundingBox';break; case scene.RENDER_MODE_TRANSPARENT_BOUNDING_BOX_OUTLINE: currender='TransparentBoundingBoxOutline';break; case scene.RENDER_MODE_VERTICES: currender='Vertices';break; case scene.RENDER_MODE_SHADED_VERTICES: currender='ShadedVertices';break; case scene.RENDER_MODE_WIREFRAME: currender='Wireframe';break; case scene.RENDER_MODE_SHADED_WIREFRAME: currender='ShadedWireframe';break; case scene.RENDER_MODE_SOLID: currender='Solid';break; case scene.RENDER_MODE_TRANSPARENT: currender='Transparent';break; case scene.RENDER_MODE_SOLID_WIREFRAME: currender='SolidWireframe';break; case scene.RENDER_MODE_TRANSPARENT_WIREFRAME: currender='TransparentWireframe';break; case scene.RENDER_MODE_ILLUSTRATION: currender='Illustration';break; case scene.RENDER_MODE_SOLID_OUTLINE: currender='SolidOutline';break; case scene.RENDER_MODE_SHADED_ILLUSTRATION: currender='ShadedIllustration';break; case scene.RENDER_MODE_HIDDEN_WIREFRAME: currender='HiddenWireframe';break; }% if(currender!='Solid'){% charht+=2;multiln=true; res+=util.printf(nl+'3Drender=\%s,', currender);% }% var settings={% initialize: function(dialog){% dialog.load({% 'text': res% });% },% description: {% name: '3D' + spc + 'Camera' + spc + 'Settings',% elements: [% {% type: 'static_text',% name: 'Copy' + spc + 'and' + spc + 'paste' + spc +% 'the' + spc + 'following' + spc + 'to' + spc +% 'the' + spc + 'option' + spc + 'list' + spc +% 'of' + spc + spc + '\string\\\string\\includemovie!'% },% {% type: 'edit_text',% item_id: 'text',% alignment: 'align_fill',% multiline: multiln,% char_width: 80,% char_height: charht,% readonly: true% },% {% type: 'ok',% ok_name: 'Close'% }% ]% }% };% app.execDialog(settings);% }catch(e){% var spc=String.fromCharCode(32);% app.alert('Error' + spc + 'while' + spc + 'executing' + spc +% '3Dcalculate:' + spc + e);% }% }% \fi% %create stream from user provided JavaScript file \ifx\@MXV@jscriptiiidfile\@empty\else% \ifthenelse{% create only once \equal{\@MXV@getlabelvalue{\pdfmdfivesum file {\@MXV@jscriptiiidfile}}}{undefined}% }{% \ifpdf% \pdfobj stream file {\@MXV@jscriptiiidfile}% \pdfrefobj\pdflastobj% \edef\@MXV@userjscriptiiidstream{\the\pdflastobj\space 0 R}% \@MXV@newlabel{\pdfmdfivesum file {\@MXV@jscriptiiidfile}}{\the\pdflastobj}% \else% \pdfmark{% pdfmark=/OBJ,% Raw={% /_objdef {linkuserjscriptiiid\the\@MXV@links}% /type/stream% }% }% \pdfmark{% pdfmark=/PUT,% Raw={% {linkuserjscriptiiid\the\@MXV@links}% (\@MXV@jscriptiiidfile) (r) file% }% }% \edef\@MXV@userjscriptiiidstream{% {linkuserjscriptiiid\the\@MXV@links}% }% \@MXV@newlabel{\pdfmdfivesum file {\@MXV@jscriptiiidfile}}% {linkuserjscriptiiid\the\@MXV@links}% \fi% }{% \ifpdf% \edef\@MXV@userjscriptiiidstream{% \@MXV@getlabelvalue{\pdfmdfivesum file {\@MXV@jscriptiiidfile}}\space 0 R% }% \else% \edef\@MXV@userjscriptiiidstream{% {\@MXV@getlabelvalue{\pdfmdfivesum file {\@MXV@jscriptiiidfile}}}% }% \fi% }% \fi% \edef\@MXV@jscriptiiidaction{% /Next <<% /S/JavaScript% /JS (\@MXV@linkjscriptiiid)% \ifx\@MXV@jscriptiiidfile\@empty\else% /Next <<% /S/JavaScript% /JS \@MXV@userjscriptiiidstream% user provided script >>% \fi% >>% }% }{\edef\@MXV@jscriptiiidaction{}}% }{% #### 2D #### \setkeys{MXV@user}{#1}% %retrieve original settings \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.mouse}}{true}}{% \setboolean{@MXV@mouse}{true}% }{% \setboolean{@MXV@mouse}{false}% }% \edef\@MXV@ctrls{\@MXV@getlabelvalue{@MXV@\@MXV@label.showUI}}% \edef\@MXV@palindrome{\@MXV@getlabelvalue{@MXV@\@MXV@label.palindrome}}% \edef\@MXV@repeat{\@MXV@getlabelvalue{@MXV@\@MXV@label.repeat}}% \edef\@MXV@rate{\@MXV@getlabelvalue{@MXV@\@MXV@label.rate}}% \edef\@MXV@startat{\@MXV@getlabelvalue{@MXV@\@MXV@label.startAt}}% \edef\@MXV@endat{\@MXV@getlabelvalue{@MXV@\@MXV@label.endAt}}% \edef\@MXV@volume{\@MXV@getlabelvalue{@MXV@\@MXV@label.volume}}% \if@MXV@linkreset\else% \setkeys{MXV@user}{#1}%override with new settings \fi% % \edef\@MXV@operation{}% % %get the player ID \edef\@MXV@currplayer{\@MXV@getlabelvalue{@MXV@\@MXV@label.playerid}}% % %see whether a sound inclusion is being referenced \ifthenelse{\equal{\@MXV@getlabelvalue{@MXV@\@MXV@label.issound}}{true}}{% \setboolean{@MXV@issound}{true}% }{% \setboolean{@MXV@issound}{false}% }% % %create /OP and /JS entries \if@MXV@linkplay% \edef\@MXV@operation{% /OP 0% /JS (% if(focusonplayer==undefined){% var focusonplayer=0; %shared by all annots }% \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% \@MXV@events{\@MXV@currplayer}% {\if@MXV@mouse true\else false\fi}% {true}% \if@MXV@requirereopen\else try{% \ifx\@MXV@@startat\@empty player\@MXV@currplayer.seek(% player\@MXV@currplayer.settings.startAt% ); \else player\@MXV@currplayer.seek(\@MXV@@startat); \fi player\@MXV@currplayer.play(); \ifx\@MXV@@startat\@empty player\@MXV@currplayer.seek(% player\@MXV@currplayer.settings.startAt% ); \else player\@MXV@currplayer.seek(\@MXV@@startat); \fi }% catch(e)\@charlb% \fi% try{% if(player\@MXV@currplayer.isOpen){% player\@MXV@currplayer.close(% app.media.closeReason.general); player\@MXV@currplayer=null; }% }% catch(e){}% % try{% var player\@MXV@currplayer=app.media.openPlayer({% settings: settings,% events: events% });% }% catch (e){}% \if@MXV@requirereopen\else \@charrb% \fi% )% }% \fi% \if@MXV@linkresume% resume/pause \edef\@MXV@operation{% /OP 3% /JS (% try{% \if@MXV@issound\else player\@MXV@currplayer.visible=true;\fi% if(!player\@MXV@currplayer.isPlaying){% player\@MXV@currplayer.settings.privateData.paused=false; player\@MXV@currplayer.play(); if(!player\@MXV@currplayer.isPlaying){% %media at end will restart from beginning if( player\@MXV@currplayer.settings.startAt.time || player\@MXV@currplayer.settings.startAt.frame || player\@MXV@currplayer.settings.startAt.marker || player\@MXV@currplayer.id == 'vnd.adobe.swname:AAPL_QuickTime' ){ player\@MXV@currplayer.seek( player\@MXV@currplayer.settings.startAt); }else{ player\@MXV@currplayer.stop(); } player\@MXV@currplayer.play(); }% }% else{% player\@MXV@currplayer.pause(); player\@MXV@currplayer.settings.privateData.paused=true; }% }% catch(e){% open new player if not yet open if(focusonplayer==undefined){% var focusonplayer=0; %shared by all annots }% \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% \@MXV@events{\@MXV@currplayer}% {\if@MXV@mouse true\else false\fi}% {true}% try{% var player\@MXV@currplayer=app.media.openPlayer({% settings: settings,% events: events% }); }% catch (e){}% }% )% }% \fi% \if@MXV@linkstop% \edef\@MXV@operation{% /OP 1% /JS (% try{% if(!player\@MXV@currplayer.isPlaying){% player\@MXV@currplayer.settings.privateData.paused=false; player\@MXV@currplayer.play(); }% player\@MXV@currplayer.stop(); if( player\@MXV@currplayer.settings.startAt.time || player\@MXV@currplayer.settings.startAt.frame || player\@MXV@currplayer.settings.startAt.marker || player\@MXV@currplayer.id == 'vnd.adobe.swname:AAPL_QuickTime' ){ player\@MXV@currplayer.seek(% player\@MXV@currplayer.settings.startAt); } }% catch(e){}% )% }% \fi% \if@MXV@linkpause% pause/resume \edef\@MXV@operation{% /OP 2% /JS (% try{% \if@MXV@issound\else player\@MXV@currplayer.visible=true;\fi% if(!player\@MXV@currplayer.isPlaying){% player\@MXV@currplayer.settings.privateData.paused=false; player\@MXV@currplayer.play(); if(!player\@MXV@currplayer.isPlaying){% %media at end will restart from beginning if( player\@MXV@currplayer.settings.startAt.time || player\@MXV@currplayer.settings.startAt.frame || player\@MXV@currplayer.settings.startAt.marker || player\@MXV@currplayer.id == 'vnd.adobe.swname:AAPL_QuickTime' ){ player\@MXV@currplayer.seek( player\@MXV@currplayer.settings.startAt); }else{ player\@MXV@currplayer.stop(); } player\@MXV@currplayer.play(); }% }% else{% player\@MXV@currplayer.pause(); player\@MXV@currplayer.settings.privateData.paused=true; }% }% catch(e){% open new player if not yet open if(focusonplayer==undefined){% var focusonplayer=0; %shared by all annots }% \@MXV@settings{\@MXV@ctrls}{\@MXV@palindrome}{\@MXV@repeat}% {\@MXV@rate}{\@MXV@startat}{\@MXV@endat}{\@MXV@volume}% \@MXV@events{\@MXV@currplayer}% {\if@MXV@mouse true\else false\fi}% {true}% try{% var player\@MXV@currplayer=app.media.openPlayer({% settings: settings,% events: events% }); }% catch (e){}% }% )% }% \fi% \if@MXV@linkclose% \edef\@MXV@operation{% /OP 1% /JS (% try{% player\@MXV@currplayer.close(% app.media.closeReason.general); player\@MXV@currplayer=null; }% catch(e){}% )% }% \fi% }% \fi% \fi% % \ifpdf% \ifthenelse{\isundefined{\@pdfborder}}{% \def\@MXV@linkattr{}% }{% \edef\@MXV@linkattr{% \if@MXV@beamer% \@MXV@pdfborder% \else% /Border [\@pdfborder]% \fi% /C [\@linkbordercolor]% /H \@pdfhighlight% }% }% % \pdfstartlink% attr{\@MXV@linkattr}% user{% /Subtype /Link% /A <<% /S/GoTo% /D (@MXV@\@MXV@@label)% \if@MXV@@draft\else% \if@MXV@externalviewer\else% \if@MXV@iiid% \ifx\@MXV@iiidview\@empty\else% /Next <<% /S/GoTo3DView% /TA \@MXV@getlabelvalue{@MXV@\@MXV@@label.annot}\space 0 R% /V \@MXV@iiidview% \fi% \@MXV@jscriptiiidaction% \ifx\@MXV@iiidview\@empty\else% >>% \fi% \else% /Next <<% /S/Rendition% /R \@MXV@getlabelvalue{@MXV@\@MXV@@label.rendition}\space 0 R% /AN \@MXV@getlabelvalue{@MXV@\@MXV@@label.annot}\space 0 R% \@MXV@operation% >>% \fi% \fi% \fi% >>% }% \usebox{\@MXV@textbox}% write out text box \pdfendlink% \else% \pdfmark[{\usebox{\@MXV@textbox}}]{% pdfmark=/ANN,% Subtype=/Link,% Color=\@linkbordercolor,% AcroHighlight=\@pdfhighlight,% Raw={% \@MXV@pdfborder% /_objdef {linkannot\the\@MXV@links}% /Action <<% /S/GoTo% /D/@MXV@\@MXV@@label% \if@MXV@@draft\else% \if@MXV@externalviewer\else% \if@MXV@iiid% \ifx\@MXV@iiidview\@empty\else% /Next <<% /S/GoTo3DView% /TA {3Dannot\@MXV@getlabelvalue{@MXV@\@MXV@@label.annot}}% /V \@MXV@iiidview% \fi% \@MXV@jscriptiiidaction% \ifx\@MXV@iiidview\@empty\else% >>% \fi% \else% /Next <<% /S /Rendition% /R {mediarendition\@MXV@getlabelvalue{@MXV@\@MXV@@label.annotid}}% /AN {screenannot\@MXV@getlabelvalue{@MXV@\@MXV@@label.annot}}% \@MXV@operation% >>% \fi% \fi% \fi% >>% }% }% \fi% }% }% } %set to true for certain \movieref options, which require the media player to %be re-opened \newboolean{@MXV@requirereopen} %standard keys to be processed first %key definitions for options to \includemovie \define@key{MXV@user}{draft}[true]{% \setboolean{@MXV@@draft}{#1}% } \define@key{MXV@user}{final}[true]{% \ifthenelse{\equal{#1}{true}}{% \setboolean{@MXV@@draft}{false}% }{% \setboolean{@MXV@@draft}{true}% }% } \define@key{MXV@user}{label}{%for use with movieref \gdef\@MXV@label{#1}% } \define@key{MXV@user}{controls}[true]{% \setboolean{@MXV@requirereopen}{true}% \xdef\@MXV@ctrls{, showUI: #1}% \xdef\@MXV@@ctrls{/C #1}% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@iiidtoolb{/TB #1}% }{}% } \define@key{MXV@user}{toolbar}[true]{% \xdef\@MXV@ctrls{, showUI: #1}% \xdef\@MXV@@ctrls{/C #1}% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@iiidtoolb{/TB #1}% }{}% } \define@key{MXV@user}{volume}{% \def\@MXV@@volume{/V #1}% \def\@MXV@volume{#1}% \setboolean{@MXV@requirereopen}{true}% } \define@key{MXV@user}{mimetype}{% \ifthenelse{\equal{#1}{model/u3d}}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \setboolean{@MXV@iiid}{true}% \xdef\@MXV@iiidsubtype{U3D}% }{\@MXV@neediiiD}% }{}% \def\@MXV@mime{#1}% } \define@key{MXV@user}{playerid}{% \def\@MXV@player{% /PL<>>>]>>% }% } \define@key{MXV@user}{autoplay}[true]{% \setboolean{@MXV@autoplay}{#1}% \if@MXV@autoplay% \setboolean{@MXV@autoresume}{false}% \fi% } \define@key{MXV@user}{autostop}[true]{% \setboolean{@MXV@autostop}{#1}% \if@MXV@autostop% \setboolean{@MXV@autopause}{false}% \fi% } \define@key{MXV@user}{autoresume}[true]{% \setboolean{@MXV@autoresume}{#1}% \if@MXV@autoresume% \setboolean{@MXV@autoplay}{false}% \setboolean{@MXV@autoclose}{false}% \fi% } \define@key{MXV@user}{autopause}[true]{% \setboolean{@MXV@autopause}{#1}% \if@MXV@autopause% \setboolean{@MXV@autostop}{false}% \setboolean{@MXV@autoclose}{false}% \fi% } \define@key{MXV@user}{autoclose}[true]{% \setboolean{@MXV@autoclose}{#1}% \if@MXV@autoclose% \setboolean{@MXV@autostop}{false}% \setboolean{@MXV@autopause}{false}% \fi% } \define@key{MXV@user}{continue}[true]{% \setboolean{@MXV@autostop}{false}% \setboolean{@MXV@autopause}{false}% \setboolean{@MXV@autoclose}{false}% } \define@key{MXV@user}{open}[true]{% %no longer supported; once open, media remains loaded %to avoid reloading when media is to be played again } \define@key{MXV@user}{mouse}[true]{% \setboolean{@MXV@mouse}{#1}% \setboolean{@MXV@requirereopen}{true}% \ifthenelse{\equal{false}{#1}\AND\boolean{@MXV@iiiDfeat}}{% \def\@MXV@iiidia{/3DI #1}% }{}% } \define@key{MXV@user}{palindrome}[true]{% \xdef\@MXV@palindrome{, palindrome: #1}% \setboolean{@MXV@requirereopen}{true}% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@iiidpalindrome{/Subtype/Oscillating}% }{}% } \define@key{MXV@user}{rate}{% \setboolean{@MXV@requirereopen}{true}% \xdef\@MXV@rate{, rate: #1}% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@iiidrate{/TM #1}% }{}% } \define@key{MXV@user}{repeat}[Infinity]{% \setboolean{@MXV@requirereopen}{true}% \ifthenelse{% \equal{#1}{Infinity}\OR% \equal{#1}{0}% }{% \xdef\@MXV@repeat{, repeat: Infinity}% \xdef\@MXV@@repeat{/RC 0}% }{% \xdef\@MXV@repeat{, repeat: #1}% \xdef\@MXV@@repeat{/RC #1}% }% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \ifthenelse{\equal{#1}{Infinity}}{% \global\@MXV@iiidrepeat=-1% }{% \global\@MXV@iiidrepeat=#1% }% }{}% } \define@key{MXV@user}{startat}{% \xdef\@MXV@startat{, startAt: {#1}}% \xdef\@MXV@@startat{{#1}}% } \define@key{MXV@user}{endat}{% \setboolean{@MXV@requirereopen}{true}% \xdef\@MXV@endat{, endAt: {#1}}% } \define@key{MXV@user}{poster}[true]{% \ifthenelse{\equal{#1}{true}}{% option without arg \setboolean{@MXV@runposter}{true}% }{% \def\@MXV@box##1##2##3{% \ifpdf% \mbox{\pdfximage width ##1 height ##2 depth ##3 {#1}}% \pdfrefximage\pdflastximage% \else% \ifthenelse{\isundefined{\includegraphics}}{\@MXV@missing{graphics}}{}% \@MXV@totalheight=##2% \advance\@MXV@totalheight by ##3% \raisebox{-##3}[##2][##3]{% \includegraphics[% width=##1,height=##2,totalheight=\@MXV@totalheight,clip]{#1}% }% \fi% }% }% } \define@key{MXV@user}{externalviewer}[true]{% \setboolean{@MXV@externalviewer}{#1}% } \define@key{MXV@user}{inline}[true]{% \if@MXV@url% \setboolean{@MXV@inline}{false}% \else% \setboolean{@MXV@inline}{#1}% \fi% \if@MXV@inline\else% \setboolean{@MXV@attachment}{false}% \fi% } \define@key{MXV@user}{url}[true]{% \setboolean{@MXV@url}{#1}% \if@MXV@url% \setboolean{@MXV@inline}{false}% \setboolean{@MXV@attachment}{false}% \def\@MXV@fsentry{/FS /URL}% \fi% } \define@key{MXV@user}{attach}[true]{% \setboolean{@MXV@attachment}{#1}% \if@MXV@attachment% \setboolean{@MXV@inline}{true}% \fi% } \define@key{MXV@user}{text}{% \setboolean{@MXV@boxopt}{true}% \savebox{\@MXV@textbox}{#1}% \@MXV@width=\wd\@MXV@textbox% \@MXV@height=\ht\@MXV@textbox% \@MXV@depth=\dp\@MXV@textbox% } \define@key{MXV@user}{textoverposter}[true]{% \setboolean{@MXV@textoverposter}{#1}% } \define@key{MXV@user}{depth}{%set depth of display area \gdef\@MXV@boxdepth{#1}% } %3D specific options \define@key{MXV@user}{3Dbg}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \def\@MXV@defaultbg{#1}% \def\@MXV@background{/BG<>}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Djscript}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \IfFileExists{#1}{% \def\@MXV@jscriptiiidfile{#1}% }{% \PackageError{movie15}{Script file `#1' cannot be opened for embedding% }{% Make sure file `#1' exists and is readable!% }% }% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dcoo}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \def\@MXV@coo{#1}% \setboolean{@MXV@defaultviewprovided}{true}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dc2c}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \def\@MXV@ctoc{#1}% \setboolean{@MXV@defaultviewprovided}{true}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Droo}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \def\@MXV@roo{#1}% \setboolean{@MXV@defaultviewprovided}{true}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Daac}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \def\@MXV@aac{#1}% \setboolean{@MXV@defaultviewprovided}{true}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Droll}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \def\@MXV@roll{#1}% \setboolean{@MXV@defaultviewprovided}{true}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dviews}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \IfFileExists{#1}{% \def\@MXV@viewsfileii{}% \def\@MXV@viewsfile{#1}% }{% \PackageError{movie15}{3D views file `#1' cannot be opened% }{% Make sure file `#1' exists and is readable!% }% }% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dviews2}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \IfFileExists{#1}{% \def\@MXV@viewsfile{}% \def\@MXV@viewsfileii{#1}% }{% \PackageError{movie15}{3D views file `#1' cannot be opened% }{% Make sure file `#1' exists and is readable!% }% }% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dlights}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@defaultlights{#1}% \gdef\@MXV@lights{/LS <>}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Drender}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@defaultrender{#1}% \gdef\@MXV@render{/RM <>}% }{\@MXV@neediiiD}% } %options for \movieref command \define@key{MXV@user}{play}[true]{% \setboolean{@MXV@linkplay}{#1}% \if@MXV@linkplay% \setboolean{@MXV@linkpause}{false}% \setboolean{@MXV@linkresume}{false}% \setboolean{@MXV@linkstop}{false}% \setboolean{@MXV@linkclose}{false}% \fi% } \define@key{MXV@user}{pause}[true]{% \setboolean{@MXV@linkpause}{#1}% \if@MXV@linkpause% \setboolean{@MXV@linkresume}{false}% \setboolean{@MXV@linkstop}{false}% \setboolean{@MXV@linkclose}{false}% \setboolean{@MXV@linkplay}{false}% \fi% } \define@key{MXV@user}{resume}[true]{% \setboolean{@MXV@linkresume}{#1}% \if@MXV@linkresume% \setboolean{@MXV@linkpause}{false}% \setboolean{@MXV@linkstop}{false}% \setboolean{@MXV@linkclose}{false}% \setboolean{@MXV@linkplay}{false}% \fi% } \define@key{MXV@user}{stop}[true]{% \setboolean{@MXV@linkstop}{#1}% \if@MXV@linkstop% \setboolean{@MXV@linkpause}{false}% \setboolean{@MXV@linkresume}{false}% \setboolean{@MXV@linkclose}{false}% \setboolean{@MXV@linkplay}{false}% \fi% } \define@key{MXV@user}{close}[true]{% \setboolean{@MXV@linkclose}{#1}% \if@MXV@linkclose% \setboolean{@MXV@linkpause}{false}% \setboolean{@MXV@linkresume}{false}% \setboolean{@MXV@linkstop}{false}% \setboolean{@MXV@linkplay}{false}% \fi% } \define@key{MXV@user}{reset}[true]{% \setboolean{@MXV@linkreset}{#1}% \if@MXV@linkreset% \setboolean{@MXV@requirereopen}{true}% \fi% } \define@key{MXV@user}{default}[true]{% synonyme for `reset' \setboolean{@MXV@linkreset}{#1}% \if@MXV@linkreset% \setboolean{@MXV@requirereopen}{true}% \fi% } \define@key{MXV@user}{3Dviewindex}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \ifthenelse{% \equal{#1}{F}% \OR\equal{#1}{L}% \OR\equal{#1}{N}% \OR\equal{#1}{P}% \OR\equal{#1}{D}% }{% \gdef\@MXV@iiidview{/#1}% any of F, L, N, P, D }{% \gdef\@MXV@iiidview{#1}% number (index) }% \setboolean{@MXV@defaultviewprovided}{false}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dcalculate}[current]{% %calculate optimal 3D settings for roo and coo for a given aac \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \gdef\@MXV@calc{#1}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dgetview}[true]{% %print current 3D camera settings \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \setboolean{@MXV@iiidgetview}{#1}% }{\@MXV@neediiiD}% } \define@key{MXV@user}{3Dresource}{% \ifthenelse{\boolean{@MXV@iiiDfeat}}{% \IfFileExists{#1}{% \setboolean{@MXV@resource}{true}% \xdef\@MXV@iiidopt{3Dresource=#1, \@MXV@iiidopt}% }{% \PackageError{movie15}{3D resource file `#1' cannot be opened% }{% Make sure file `#1' exists and is readable!% }% }% }{\@MXV@neediiiD}% } %compatibility options for \movie and \hyperlinkmovie commands \define@key{MXV@user}{borderwidth}{% %ignored; acroread doesn't draw borders around screen annots anyway } \define@key{MXV@user}{height}{%set height of display area \gdef\@MXV@boxheight{#1}% } \define@key{MXV@user}{width}{%set width of display area \gdef\@MXV@boxwidth{#1}% } \define@key{MXV@user}{autostart}[true]{% \xdef\@MXV@autostart{, autoplay=#1}% } \define@key{MXV@user}{loop}[Infinity]{% \xdef\@MXV@loop{, repeat=#1}% } \define@key{MXV@user}{once}[]{% \xdef\@MXV@loop{, repeat=1}% } \define@key{MXV@user}{showcontrols}[true]{% \xdef\@MXV@showcontrols{, controls=#1}% } \define@key{MXV@user}{start}{% \gdef\@MXV@starttime##1s{% \global\@MXV@start=##1pt% }% \@MXV@starttime #1% } \define@key{MXV@user}{duration}{% \gdef\@MXV@durationtime##1s{% \global\@MXV@end=##1pt% }% \@MXV@durationtime #1% } %options to be passed to internal macro \@MXV@includeiiid \define@key{MXV@iiid}{3Dresource}{% \@MXV@addresource{#1}% } %compatibility macros \providecommand\movie[3][]{% \leavevmode% \@MXV@reset% \def\@MXV@autostart{}\def\@MXV@loop{}\def\@MXV@showcontrols{}% \def\@MXV@starttime{}\def\@MXV@durationtime{}% \setkeys{MXV@user}{#1}% % %sanity checks \if@MXV@boxopt% \PackageError{movie15}{% Option `text' cannot be used with command `\string\movie'.\MessageBreak Instead, put text into the 1st argument of `\string\movie' }{}% \fi% % \ifx\@MXV@durationtime\@empty\else\ifx\@MXV@startat\@empty\else% \PackageError{movie15}{% Options `startat' and `duration' cannot be used\MessageBreak together.\MessageBreak Possible combinations are `startat'/`endat',\MessageBreak `start'/`endat' or `start'/`duration' }{}% \fi\fi% % %option list \edef\@MXV@movieoptions{#1\@MXV@autostart\@MXV@loop\@MXV@showcontrols}% % %determine playback section \ifx\@MXV@starttime\@empty\else% \edef\@MXV@movieoptions{\@MXV@movieoptions, % startat=time:\strip@pt\@MXV@start}% \fi% \ifx\@MXV@durationtime\@empty\else% \advance\@MXV@end by \@MXV@start% \edef\@MXV@movieoptions{\@MXV@movieoptions, % endat=time:\strip@pt\@MXV@end}% \fi% % %text option from 2nd argument \savebox{\@MXV@textbox}{#2}% \edef\@MXV@movieoptions{[\@MXV@movieoptions, text={\noexpand\usebox{% \noexpand\@MXV@textbox}}]}% \expandafter% \includemovie\@MXV@movieoptions{\@MXV@boxwidth}{\@MXV@boxheight}{#3}% } \newcommand\hyperlinkmovie[3][]{% \leavevmode% \@MXV@reset% \def\@MXV@autostart{}\def\@MXV@loop{}\def\@MXV@showcontrols{}% \def\@MXV@starttime{}\def\@MXV@durationtime{}% \setkeys{MXV@user}{#1}% % %sanity check \ifx\@MXV@durationtime\@empty\else\ifx\@MXV@startat\@empty\else% \PackageError{movie15}{% Options `startat' and `duration' cannot be used\MessageBreak together.\MessageBreak Possible combinations are `startat'/`endat',\MessageBreak `start'/`endat' or `start'/`duration' }{}% \fi\fi% % %option list \edef\@MXV@movieoptions{#1\@MXV@autostart\@MXV@loop\@MXV@showcontrols}% % %determine playback section \ifx\@MXV@starttime\@empty\else% \edef\@MXV@movieoptions{\@MXV@movieoptions, % startat=time:\strip@pt\@MXV@start}% \fi% \ifx\@MXV@durationtime\@empty\else% \advance\@MXV@end by \@MXV@start% \edef\@MXV@movieoptions{\@MXV@movieoptions, % endat=time:\strip@pt\@MXV@end}% \fi% % \edef\@MXV@movieoptions{[\@MXV@movieoptions]}% \expandafter\movieref\@MXV@movieoptions{#2}{#3}% }