summaryrefslogtreecommitdiff
path: root/macros/luatex/optex/pdfextra/examples/pdfextra-example.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/optex/pdfextra/examples/pdfextra-example.tex')
-rw-r--r--macros/luatex/optex/pdfextra/examples/pdfextra-example.tex341
1 files changed, 341 insertions, 0 deletions
diff --git a/macros/luatex/optex/pdfextra/examples/pdfextra-example.tex b/macros/luatex/optex/pdfextra/examples/pdfextra-example.tex
new file mode 100644
index 0000000000..6093bf7def
--- /dev/null
+++ b/macros/luatex/optex/pdfextra/examples/pdfextra-example.tex
@@ -0,0 +1,341 @@
+% PDFextra example file.
+% This file, apart from other topics, shows how to port 3D examples from media9
+% (https://ctan.org/pkg/media9) documentation. You probably have to adjust path
+% searching to succesfully compile this example, e.g.:
+%
+% \begtt
+% env TEXMFDOTDIR=.:~/src/texlive/texmf-dist/source/latex/media9/files/ optex pdfextra-example.tex
+% \endtt
+
+% basic \OpTeX/ settings
+\enlang\enquotes
+\fontfam[lm]
+
+%\pdfobjcompresslevel=0
+%\pdfcompresslevel=0
+
+% load the package from standard search path
+\load[pdfextra]
+
+% Before using \hlink we must activate hyperlinks
+\hyperlinks\Blue\Green
+
+% Maybe we want to greet the user and jump to page 2 right at the start?
+\openaction[
+ js:{%
+ app.alert("Javascript alert, open action");
+ console.println("printing to console from openaction");},
+ pg:2,
+]
+
+
+
+% 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,
+]{\picwidth=\hsize \inspic{example-image.pdf}}
+
+% Maybe add action 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]{\inspic{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\typoscale[2000/2000]\inoval{NEXT PAGE}}
+
+
+
+\vfil\break
+
+
+
+% deliver fresh random number to everyone who sees this page using "page open"
+% trigger event of page's actions
+\pageactions[
+ {O} {js:{app.alert("Random number for you is " + getRandomNumber());}}
+]
+
+% "previous page" link with "Split" transition
+\hlink[pg:1, transition:Split]{Go to previous page (with transition).}
+
+
+
+\vfil\break
+
+% 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)
+\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,
+]{{\White\vrule width\hsize height\hsize}}
+
+\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.}
+
+
+
+\vfil\break
+
+
+% 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` 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.
+\colordef\GreyBG{0.1\Black}
+
+% Define the 3D Rich Media annotation. One view is automatically detected from
+% name ("epix"). Scripts will run in turn at initialization time.
+\RM[epix][
+ scripts={
+ asylabels.js,
+ 3Dspintool.js,
+ 3dmenu,
+ },
+ background=\GreyBG,
+]{\picwidth=0.8\hsize \picheight=0.8\hsize \inspic{epixposter.pdf}}
+
+
+
+\vfil\break
+
+
+
+% Second media9 example is "dice" it has a lot of views, but they are simple.
+% This time we can't use the deduction with same name.
+\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 previews mostly sets dimensions, because it will not be
+% shown much. (Except in viewers that don't support 3D Rich Media -- all except
+% Acrobat).
+\RM[dice.u3d][
+ views={Front, Back, Left, Right, Top, Bottom, Fish Eye at Centre},
+ activation=auto,
+ scripts=3dmenu,
+]{{\Red \vrule height.5\hsize width.5\hsize}}
+
+% 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}}
+
+% And define the action buttons using this new custom action.
+\hlink[diceview:/N]{Next view}
+\hlink[diceview:(Back)]{View \"Back"}
+\hlink[diceview:5]{6th view in the list}
+
+
+\vfil\break
+
+
+% Last media9 example ported. It has its own JavaScript file for animation,
+% which can be customized at runtime using JavaScript actions that access 3D
+% conotext.
+\filedef/e[malte]{malte.u3d}
+\DDDview[malte][c2c=1 1 1, roo=0.25]
+\RM[malte][
+ activation=auto,
+ scripts={3dmenu, malte.js},
+]{{\Blue \vrule height.5\hsize width0.5\hsize}}
+
+{\picheight=1.44em
+% Normal JavaScript actions, but we access functions defined globaly in the 3D
+% JavaScript context of "malte" Rich Media annotation.
+\hlink[js:\DDDcontext{malte}.cntrClockWise();]{\inspic{boutona.pdf}}
+\hlink[js:\DDDcontext{malte}.pause();]{\inspic{boutonb.pdf}}
+\hlink[js:\DDDcontext{malte}.clockWise();]{\inspic{boutonc.pdf}}
+\hlink[js:\DDDcontext{malte}.scaleSpeed(1/1.1);]{\inspic{boutond.pdf}}
+\hlink[js:\DDDcontext{malte}.origSpeed();]{\inspic{boutone.pdf}}
+\hlink[js:\DDDcontext{malte}.scaleSpeed(1.1);]{\inspic{boutonf.pdf}}
+}
+
+
+\vfil\break
+
+
+% Lastly a showcase of transitions / page durations in \OpTeX/ slideshow.
+% Because transitions are displayed only in fullscreen mode, we could request
+% it by using "\fullscreen". But we have more pages before this, so we didn't.
+
+% We just turn the rest of the document into slideshow.
+\slides
+\slideshow
+% To see the transitions better, we color each page with a background color.
+\global\pgbackground={\bgcolor \hrule height\pdfpageheight width\pdfpagewidth}
+\glet\bgcolor=\Yellow
+
+% Transitions on all pages where it is not said otherwise will be of type
+% "Wipe" and be 1 second long.
+\transitions[Wipe:1]
+
+% The slides will by default be shown for 3 seconds before advancing to the next one.
+\defaultpageduration[3]
+% But the first slide has override to only be shown for 1 second.
+\pageduration[1]
+
+\tit Presentation
+
+\subtit Transistions and durations
+
+\pg;
+\glet\bgcolor=\Red
+% All transitions are defined on the page object and they are shown when we go
+% to that page. That means that we probably didn't see the "Wipe:1" animation
+% of the first slide, because we already were there. However, this second slide
+% with "Fade" is now shown correctly. (The first one also will, when we go
+% back.)
+\transition[Fade]
+
+\sec First slide
+
+Some\pg+
+% In a slideshow, by using \pg+ we are on a new PDF page with independently set
+% transition/duration. We can use this to disable page durations -- we have
+% seen the "single page override" in action on previous page, and the default
+% duration on this "page".
+\defaultpageduration[]
+
+% Also apply a long transition on this "page"/"slide"/"subslide".
+\transition[Dissolve:4]
+
+% More uses of currently set default values follow.
+text\pg+
+
+to\pg+
+
+test\pg+
+
+slideshow
+
+\pg;
+% Now show different transitions on differently colored pages:
+\glet\bgcolor=\Green
+\transition[Split:3:/Dm /V /M /I]
+
+\sec Second slide
+
+\transitions[Blinds:2]
+
+more\pg+
+
+text
+
+\transitions[Wipe]
+
+\pg;
+\glet\bgcolor=\Brown
+\transition[Dissolve]
+
+\sec Third slide
+
+\pg;
+\glet\bgcolor=\Red
+\transition[Box]
+
+\sec More
+
+\pg;
+\glet\bgcolor=\Yellow
+
+\sec slides
+
+\pg;
+\glet\bgcolor=\Red
+
+\sec using
+
+\pg;
+\glet\bgcolor=\Yellow
+
+\sec default transition
+
+bye\pg+
+
+bye
+
+\bye