summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/pdfextra/examples/pdfextra-example-latex.tex
blob: dc5a31f9f180b1672e8d007c67c45d691308a98b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
% 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}