% Compiled with: % env TEXMFDOTDIR='..//:~/src/texlive/texmf-dist/source/latex/media9/files/' lualatex pdfextra-example-latex.tex \documentclass{article} \usepackage{hyperref} \usepackage{xcolor} \usepackage{graphicx} \usepackage{pdfextra} \sdef{_linkcolor}{\color{blue}} \begin{document} % Using document level JavaScript we can run initialization code right at the % start (this is more flexible than \openaction). \dljavascript[random]{ function getRandomNumber() { return 4; % chosen by fair dice roll, ![https://xkcd.com/221/] } console.println("initialized with seed " + getRandomNumber()); } % For external references we need to `\filedef` "external" and "url" files % beforehand: \filedef/u[doc-internet]{http://petr.olsak.net/ftp/olsak/optex/optex-doc.pdf} \filedef/x[doc-local]{optex-doc.pdf} % We then try to reference them using external references: \hlink[extref:doc-internet:ref:langphrases]{OpTeX documentation, section ``Multilingual phrases and quotation marks''.} \hlink[extpgref:doc-internet:12]{OpTeX documentation, page 12.} % Insert a video twice with different settings: \filedef/e[video]{example-movie.mp4} % Insert video into page using Renditions mechanism with controls and autoplay. \render[video][ controls=true, aactions=\renditionautoplay, ]{\includegraphics[width=\textwidth]{example-image.pdf}} % We set red text color, blue border (RGB triplet) for "rendition" links. \sdef{_renditionlinkcolor}{\color{red}} \sdef{_renditionborder}{0 1 0} % Then we add some buttons. \hlink[rendition::play]{play} \hlink[rendition::pause]{pause} \hlink[rendition::stop]{stop} \hlink[rendition::resume]{resume} % Render the same file again, but with different dimensions, no controls % and explicit activation. \render[video]{\includegraphics{example-image.pdf}} % This one can't have buttons, because it doesn't have its own name -- "video" % is used by the previous one. % Add already embedded video to the list of attachments shown in user % interface. \attach[video] % We are done for this page, who not go to the next one? % % \hlink typesets in group, so we locally disable lining links (our button is % bigger than normal line) \hlink[named:NextPage]{\nolininglinks\scalebox{2}[2]{NEXT PAGE}} \clearpage % Deliver fresh random number to everyone who sees this page using "page open" % ("O") trigger event of page's actions. \pageactions[ {O} {js:{app.alert("Random number for you is " + getRandomNumber());}} ] % Link to previous page (predefined PDF action) with "Split" transition: \hlink[named:PrevPage, transition:Split]{Go to previous page (with transition).} \clearpage % A 3D Rich Media annotation with a custom view and script follows: % First we define the 3D file, so we can use same name for the view and have it % auto included. \filedef/e[example]{pdfextra-example-part.prc} % Then a simplistic "front" view. \DDDview[example][ projection=ortho, roo=400, ] % A 3D JavaScript script that will define function to use with action button. % (we write the script only now, so we don't have to carry around an extra file % in the package, you would normally have the contents in the file -- "turn.js" % in this case). \newwrite\js \immediate\openout\js=turn.js % rotate every node by angle degrees along $x$ axis \immediate\write\js{\detokenize{ function turn(angle) { angle = angle * Math.PI / 180; for (var i = 0; i < scene.nodes.count; i++) { var node = scene.nodes.getByIndex(i); node.transform.rotateAboutXInPlace(angle); } } }} \closeout\js % The annotation itself, with our script above. \RM[example][ activation=auto, scripts=turn.js, ]{\textcolor{white}{\vrule width\textwidth height\textwidth}} \hlink[js:\DDDcontext{example}.turn(10);]{Turn by 10 degrees along $x$ axis.}\par \hlink[js:\DDDcontext{example}.turn(30);]{Turn by 30 degrees along $x$ axis.}\par \hlink[js:\DDDcontext{example}.turn(90);]{Turn by 90 degrees along $x$ axis.} \clearpage % Here is the "epix" 3D model example from media9 documentation ported to % pdfextra. % % First we define a view with the same name as the future Rich Media % annotation. This view will then automatically be used if no `views` key is % specified. No need to be excessive with decimal numbers. \DDDview[epix][ FOV=30, c2c=4 2 3, coo=4.41 2.19 0, roo=430, ] % 3Dmenu is used often, lets use shortcut instead. \filedef/e[3dmenu]{3Dmenu.js} % We want to use the nice "epix" name for the view and annotation. \filedef/e[epix]{epix.prc} % Just to spice things up, we diverge a bit from media9 and define custom % background color. We can't use LaTeX's colors, so we use RGB triplet. \newcommand{\GreyBG}{0.9 0.9 0.9} % Define the 3D Rich Media annotation. One view is automatically detected from % name ("epix"). Scripts will run in specified order at initialization time % (when the annotation is activated). \RM[epix][ scripts={ asylabels.js, 3Dspintool.js, 3dmenu, }, background=\GreyBG, ]{\includegraphics[width=0.8\textwidth, height=0.8\textwidth]{epixposter.pdf}} \clearpage % Second media9 example is "dice" it has a lot of views, but they are simple. % This time we can't use the view name deduction from `\RM` name -- there is % more than one view. \DDDview[Front][roo=27] \DDDview[Back][roo=27, c2c=0 1 0] \DDDview[Left][roo=27, c2c=-1 0 0] \DDDview[Right][roo=27, c2c=1 0 0] \DDDview[Top][roo=27, c2c=0 0 1] \DDDview[Bottom][roo=27, c2c=0 0 -1] \DDDview[Fish Eye at Centre][fov=120] % We want to use all the defined views, as well as autoactivate the annotation. % This means that the preview mostly sets dimensions, because it will not be % shown much. (Only in viewers that don't support 3D Rich Media -- that is, all % except Acrobat). \RM[dice.u3d][ views={Front, Back, Left, Right, Top, Bottom, Fish Eye at Centre}, activation=auto, scripts=3dmenu, ]{\textcolor{red}{\vrule height.5\textwidth width.5\textwidth}} % A few buttons for switching views. \hlink[goto3dview::/N]{\frame{Next view}} \hlink[goto3dview::(Back)]{\frame{View ``Back''}} \hlink[goto3dview::5]{\frame{6th view in the list}} \clearpage % Last media9 example ported. It has its own JavaScript file for animation, % which can be customized at runtime using JavaScript actions that access 3D % context of the annotation. \filedef/e[malte]{malte.u3d} \DDDview[malte][c2c=1 1 1, roo=0.25] \RM[malte][ activation=auto, scripts={3dmenu, malte.js}, ]{\textcolor{blue}{\vrule height 0.5\textwidth width 0.5\textwidth}} % Normal JavaScript actions, but we access functions defined globaly in the 3D % JavaScript context of "malte" Rich Media annotation. \hlink[js:\DDDcontext{malte}.cntrClockWise();] {\includegraphics[height=1.44em]{boutona.pdf}} \hlink[js:\DDDcontext{malte}.pause();] {\includegraphics[height=1.44em]{boutonb.pdf}} \hlink[js:\DDDcontext{malte}.clockWise();] {\includegraphics[height=1.44em]{boutonc.pdf}} \hlink[js:\DDDcontext{malte}.scaleSpeed(1/1.1);]{\includegraphics[height=1.44em]{boutond.pdf}} \hlink[js:\DDDcontext{malte}.origSpeed();] {\includegraphics[height=1.44em]{boutone.pdf}} \hlink[js:\DDDcontext{malte}.scaleSpeed(1.1);] {\includegraphics[height=1.44em]{boutonf.pdf}} \end{document}