summaryrefslogtreecommitdiff
path: root/macros/luatex/optex/pdfextra/examples/pdfextra-example.tex
blob: 6093bf7def5aaa44f0cceac0ea0943ad5f0460ec (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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
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