summaryrefslogtreecommitdiff
path: root/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex
blob: aa98bee57d1f1c115d616bae9cd85ace07f388e8 (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
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
% makeindex < aebpro_man.idx > aebpro_man.ind
\documentclass{article}
\usepackage[fleqn]{amsmath}
\usepackage[
    web={centertitlepage,designv,tight*,usetemplates,
        forcolorpaper,latextoc,pro},%usesf,
        eforms,aebxmp
]{aeb_pro}
%\usepackage{multicol}
\usepackage{aeb_mlink}
\usepackage[usepopup]{ltx4yt}
\usepackage{array}
\usepackage[altbullet]{lucidbry}

\usepackage{makeidx}
\makeindex
\usepackage{acroman}

\leftmargini\parindent


\usepackage[active]{srcltx}

\urlstyle{rm}
\let\tops\texorpdfstring
\let\pkg\textsf
\let\app\textsf
\let\opt\texttt
\let\uif\textsf
\let\env\texttt
\def\meta#1{\textit{\texttt{#1}}}
\def\ameta#1{$\langle\textit{\texttt{#1}}\rangle$}
\newdimen\aebdimen \aebdimen6pt %\partopsep  \advance\aebdimen\partopsep
\newcommand\bVerb[1][]{\begingroup#1\vskip\aebdimen\parindent0pt}%
\def\eVerb{\vskip\aebdimen\endgroup\noindent}
\def\SUB#1{\ensuremath{{}_{\text{#1}}}}
\def\darg#1{\texttt{\{#1\}}}
\def\takeMeasure{\bgroup\obeyspaces\takeMeasurei}
\def\takeMeasurei#1{\global\setbox\webtempboxi\hbox{\ttfamily#1}\egroup}
\def\bxSize{\wd\webtempboxi+2\fboxsep+2\fboxrule}
\let\amtIndent\leftmargini
\makeatletter
\def\setDisplayNumber#1#2{\kern0pt
    \setlength\abovedisplayshortskip{0pt}%
    \setlength\belowdisplayshortskip{0pt}%
    \setlength\abovedisplayskip{0pt}%
    \setlength\belowdisplayskip{0pt}%
    \begin{equation}\label{#2}\end{equation}\kern0pt
}
\renewenvironment{quote}[1][]
   {\def\@rgi{#1}\ifx\@rgi\@empty
    \let\rghtm\@empty\else\def\rghtm{\rightmargin\leftmargin}\fi
    \list{}{\rghtm} %{\rightmargin\leftmargin}%
    \item\relax}
   {\endlist}
\renewcommand*\descriptionlabel[1]{\hspace\labelsep
    \normalfont #1}
\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{5}
\renewcommand*{\theparagraph}{\texorpdfstring{\protect\P\protect\ }{\textparagraph}}
\renewcommand{\paragraph}
    {\renewcommand{\@seccntformat}[1]{\theparagraph}%
    \@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}} %\color{\aeb@subsubsectioncolor}
\renewcommand*\l@paragraph{\@dottedtocline{4}{5.0em}{1em}} %{7.0em}{4.1em}}
\def\chgCurrLblName#1{\def\@currentlabelname{#1}}
\def\echgCurrLblName#1{\edef\@currentlabelname{#1}}
\makeatother

\reversemarginpar
\def\FmtMP#1{\marginpar{\slshape\raggedleft\small#1}}


\newcommand{\YT}{\textsf{YouTube}}


%\def\tutpath{doc/tutorial}
%\def\tutpathi{tutorial}

\DeclareDocInfo
{
    university={\AcroTeX.Net},
    title={The \texorpdfstring{\textsf{ltx4yt} Package\\[1em]}{: }
        Playing \texorpdfstring{\YT}{YouTube} Videos in the default browser},
    author={D. P. Story},
    email={dpstory@acrotex.net},
    subject={Playing YouTube Videos in PDF},
    talksite={\url{www.acrotex.net}},
    version={0.7, 2020/07/30},
    keywords={AcroTeX, PDF, YouTube, Browser},
    copyrightStatus=True,
    copyrightNotice={Copyright (C) \the\year, D. P. Story},
    copyrightInfoURL={http://www.acrotex.net}
}

\def\dps{$\hbox{$\mathfrak D$\kern-.3em\hbox{$\mathfrak P$}%
   \kern-.6em \hbox{$\mathcal S$}}$}

\universityLayout{fontsize=Large}
\titleLayout{fontsize=LARGE}
\authorLayout{fontsize=Large}
\tocLayout{fontsize=Large,color=aeb}
\sectionLayout{indent=-40pt,fontsize=large,color=aeb} %,afterskip=1sp}
\subsectionLayout{indent=-20pt,color=aeb} %,afterskip=1sp}
\subsubsectionLayout{indent=0pt,color=aeb} %,afterskip=1sp}
\subsubDefaultDing{\texorpdfstring{$\bullet$}{\textrm\textbullet}}

\newenvironment{eqComments}[1][\strut]{\smallskip\leftskip-\labelwidth
\item[]\textbf{\textcolor{blue}{#1}}}{\par\smallskip}

\begin{popupmenu}{YTSea}
  \puIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
  \puIdTitle{\Esc"Sea Hunt\Esc" US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}
  \puIdTitle{Theme Song to Sea Hunt*}{2QxXk6X9GDo}
  \puIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
\end{popupmenu}
\ytUseMenus{YTSea}

%\pagestyle{empty}
%\parindent0pt\parskip\medskipamount

\chngDocObjectTo{\newDO}{doc}
\begin{docassembly}
var titleOfManual="The ltx4yt MANUAL";
var manualfilename="Manual_BG_Print_ltx4yt.pdf";
var manualtemplate="Manual_BG_Brown.pdf"; // Blue, Green, Brown
var _pathToBlank="C:/Users/Public/Documents/ManualBGs/"+manualtemplate;
var doc;
var buildIt=false;
if ( buildIt ) {
    console.println("Creating new " + manualfilename + " file.");
    doc = \appopenDoc({cPath: _pathToBlank, bHidden: true});
    var _path=this.path;
    var pos=_path.lastIndexOf("/");
    _path=_path.substring(0,pos)+"/"+manualfilename;
    \docSaveAs\newDO ({ cPath: _path });
    doc.closeDoc();
    doc = \appopenDoc({cPath: manualfilename, oDoc:this, bHidden: true});
    f=doc.getField("ManualTitle");
    f.value=titleOfManual;
    doc.flattenPages();
    \docSaveAs\newDO({ cPath: manualfilename });
    doc.closeDoc();
} else {
    console.println("Using the current "+manualfilename+" file.");
}
var _path=this.path;
var pos=_path.lastIndexOf("/");
_path=_path.substring(0,pos)+"/"+manualfilename;
\addWatermarkFromFile({
    bOnTop:false,
    bOnPrint:false,
    cDIPath:_path
});
\executeSave();
\end{docassembly}

\begin{document}

\maketitle

\selectColors{linkColor=black}
\tableofcontents
\selectColors{linkColor=webgreen}

\section{Introduction}\label{s:intro}

My beautiful package \pkg{yt4pdf} is gone, time has caught up with it: The
Flash player is no longer in use, anywhere;\footnote{Adobe will formally
abandon Flash Player in December 2020} \app{Google} discontinued its
ActionScript 3.0 Player several years ago. It was \app{Acrobat} and
\app{Google} technologies that were the foundation of the \pkg{yt4pdf}
package.

We turn over a new leaf by writing and publishing the \pkg{ltx4yt} package:
{\LaTeX} for \YT. What \pkg{ltx4yt} does is to provide some tools for
creating links, dropdown lists, popup menus for playing selected {\YT}
videos in the default browser. Perfect for personal use and for academic,
professional, or classroom presentations that refer to {\YT} content.

% I believe that I was vaguely aware of the \href{http://code.google.com/apis/youtube/flash_api_reference.html}
%{{\YT} ActionScript 3.0 Player},\footnote{The YouTube AcrionScript 2.0 Player API
% has been deprecated as of January 27, 2015; however, it is still supported, for now.} but never pursued it because of my
%general lack of interest in {\YT} (\url{www.youtube.com}). Recently, I
%came across a very nice demo PDF that used the API, see
%%\mlhref{http://www.uvsar.com/pdftube/}{PDF Tube - {\YT} API wrapper for PDF documents}.
%``PDF Tube - {\YT} API wrapper for PDF documents'' (the page has
%since been removed).
%The SWF file and JavaScript are made freely available, so I
%downloaded it, and was sufficiently impressed to port the example to
%{\LaTeX} using various members of the {Acro\negthinspace\TeX} Fine Family of Software
%\verb!:-{)!. The SWF file and JavaScript are due to the good folks at
%\textbf{UVSAR} (\url{www.uvsar.com}). The \textbf{UVSAR}'s sample demo also appeared in the forums of
%the \href{http://acrobatusers.com/forum/javascript/embed-youtube-video-pdf}{Acrobat User
%Community}.

%The \textsf{ltx4yt} package uses the \textsf{rmannot} to embed the \textsf{SWF}
%file that plays the {\YT} videos.  There is a complete set of buttons
%that come with the package to control the video: play, pause, stop
%loading, rewind, load a video by its {\YT} video ID, and a button to
%view a video on the {\YT} web site.\footnote{Some videos do not allow
%embedded playback, and must be viewed on the {\YT} web site.}

% http://acrobatusers.com/news/youtube-widget-acrobat

\subsection{Sample files}

The following are the sample files shipped with \textsf{ltx4yt}:
\begin{itemize}
    \item \texttt{ltx4yt-1.tex} demonstrates links created by \cs{ytvId}
        and \cs{ytLink}. Such links created in a PDF are pretty much
        functional for all PDF viewers, including the native PDF viewers of
        all the modern browsers, and PDF viewers on other devices such as
        \app{Android} and \app{iPhones}.

    \item \texttt{ltx4yt-2.tex} demonstrates the PDF forms controls related
        methods of selecting a video to watch. The command pair
        \cs{ytComboList} and \cs{ytComboBtn} provide support for creating a
        dropdown list (combo box) for selecting a video by title, the push
        button takes the selection and passes it to {\YT} for display
        in the default browser. The sample also includes a popup menu for
        selecting video by title. Finally, there is a query field in enter
        query text and to search {\YT} for all related titles.

        This file (\texttt{ltx4yt-2.pdf}) performs as designed in
        \app{Acrobat}, \app{Adobe Reader DC}, and \app{PDFX-Change Editor},
        and \emph{will not} be functional in native PDF viewers of
        browsers. \texttt{ltx4yt-2.pdf} will have no functionality in PDF
        viewers on hand-held devices such as smart phones or tablets.
\end{itemize}
% Advanced examples \href{http://www.math.uakron.edu/~dpstory/aebblog.html}{AeB Blog site}.

\section{Options, Requirements, and Workflows}

\paragraph*{Options.} Currently, this package has two options: \opt{usepopup}\FmtMP{\opt{usepopup}
option} and \opt{!usepopup}. When \opt{usepopup} is taken, additional
commands are defined and supporting document Java\-Script is embedded in the
PDF. See \hyperref[upu]{Section~\ref*{upu}} on page~\pageref*{upu} for details on using popups in the document. The
\opt{!usepopup} is a convenience option that turns off the \opt{usepopup}
option. The default is to not use popups in the document (\opt{!usepopup}).

\paragraph*{Requirements.}
This package requires the \pkg{eforms} package, which is part of \pkg{acrotex}.\footnote{\url{http://www.ctan/pkg/acrotex}}
If the option \opt{usepopup}, the package \opt{popupmenu} is also input.\footnote{\url{http://www.ctan/pkg/popupmenu}}

\paragraph*{Workflows.} This is a general {\LaTeX} package, any workflows can be used to build
a \pkg{ltx4yt} document: \app{pdflatex}, \app{lualatex}, \app{xelatex}, or
\app{dvips\,->\,distiller}.\footnote {\app{dvips\,->\,ps2pdf} can be used if
only links are used to reference {\YT} videos and the \opt{!usepopup} option
is in force (no document JavaScript).}

\section{Basic Methods: Playing a {\YT} video using its Video ID}

There are three methods of playing a {\YT} video based on its video ID:
\begin{itemize}
    \item \textbf{Using links}
    \item \textbf{Using dropdown lists}
    \item \textbf{Using a popup menu}
\end{itemize}
In each of the subsequent sections, we discuss each of these methods in turn.

\subsection{Basic Methods: Links with \tops{\protect\cs}{\textbackslash}{ytvId}}

\textbf{Demo files.} The techniques of this section are illustrated by the two files
\texttt{examples/\allowbreak ltx4yt-1.tex} and \texttt{examples/web-pkg/ltx4yt-w1.tex}.

\newtopic\noindent
The underlying command that creates links is the \pkg{eforms} command \cs{setLink},
this command is not seen, but is part of all link commands in this section.

To create a link that references a {\YT} video from its video ID, use the \cs{ytvId} command.
\bVerb\takeMeasure{\string\ytvId*[\ameta{KV-pairs}]\darg{\ameta{ytvID}}\darg{\ameta{text}}}%
\begin{minipage}{\linewidth}
\begin{minipage}{\bxSize}
\xdef\panelWidth{\the\linewidth}% *[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytvId*[!ameta(KV-pairs)]{!ameta(ytvID)}{!ameta(text)}
\ytvIdPresets{!ameta(KV-pairs)}
\end{Verbatim}
\end{minipage}\hfill
\begin{minipage}{\linewidth-\panelWidth}
\setDisplayNumber\label{display:ytvId}
\end{minipage}\end{minipage}\endgroup
\PD Use the optional asterisk (\texttt*) when the referenced video
\emph{cannot be embedded}; \emph{not specifying} the asterisk means the video
\emph{can be embedded}. \textbf{Embedding is the best way of viewing a video.} The \ameta{KV-pairs} are key-value pairs recognized by the
underlying \cs{setLinks} command. The \ameta{ytvID} is the {\YT} video ID of
the video to be played in the default browser. Finally, \ameta{text} is the
text around of which the link is constructed.

\paragraph*{The \cs{ytvIdPresets} command}
is a convenient way of setting the link options \emph{uniformly} for all
links created by \cs{ytvId}. Individual \ameta{KV-pairs} passed though the
optional argument of \cs{ytvId} will override the preset values. Its default
definition is,
\begin{Verbatim}[xleftmargin=\amtIndent]
\ytvIdPresets{\linktxtcolor{webbrown}}
\end{Verbatim}
This sets the color of the link to a brown color, which is why the links of
this document are brown.

\paragraph*{An example.} There are two ``Kung-Fu Fighting'' videos of interest: \texttt{GZ9e3Dy7obA} and
\texttt{jhUkGIsKvn0}; we set up likes for the first and twice for the second:
\begin{quote}
    \ytvId{GZ9e3Dy7obA}{Kung-Fu Fighting (Bruce Lee)}\\
    \verb~\ytvId{GZ9e3Dy7obA}{Kung-Fu Fighting (Bruce Lee)}~\\[3pt]
    \ytvId{jhUkGIsKvn0}{Kung-Fu Fighting (Carl Douglas)}\\
    \verb~\ytvId{jhUkGIsKvn0}{Kung-Fu Fighting (Carl Douglas)}~\\[3pt]
    \ytvId*{jhUkGIsKvn0}{Kung-Fu Fighting* (Carl Douglas)}\\
    \verb~\ytvId*{jhUkGIsKvn0}{Kung-Fu Fighting* (Carl Douglas)}~
\end{quote}
The first link works fine, just the video and nothing else. The second one
does not, the video poster is loaded, but when you play the video, the
response is \textsf{Video unavailable}. The third link works fine now. The
problem here is that the second video cannot be embedded; we have to use the
\texttt*-option to create a different link, one that goes to the full {\YT}
web site to see one or more advertisements before the video is allowed to be
played, additionally, there are numerous extraneous content everywhere on the
page. When a video \emph{can be embedded}, you get a very clean video
experience, free of advertisements and extraneous content; \emph{this is the
best case}. Try using the first link again to enjoy the experience.

There is a multi-line version of \cs{ytvId},
\bVerb\takeMeasure{\string\ytvIdML*[\ameta{KV-pairs}]\darg{\ameta{ytvID}}\darg{\ameta{text}}}%
\begin{minipage}{\linewidth}
\begin{minipage}{\bxSize}
\xdef\panelWidth{\the\linewidth}% *[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytvIdML*[!ameta(KV-pairs)]{!ameta(ytvID)}{!ameta(text)}
\ytvIdPresets{!ameta(KV-pairs)}
\end{Verbatim}
\end{minipage}\hfill
\begin{minipage}{\linewidth-\panelWidth}
\setDisplayNumber\label{display:ytvIdML}
\end{minipage}\end{minipage}\eVerb This form, which requires \pkg{aeb\_mlink} package and the
\app{dvips\,->distiller}, creates true multi-line links. Here is an example:
\ytvIdML{5y9-EVmreU4}{Lori's Corner: Episode \#1, I met her back in the year
2000, though she probably does not remember.} The applications
\app{pdflatex}, \app{lualatex}, and \app{xelatex} will break this link cross
lines, but does so by creating two links. This link is a single link that
inverts across both lines when clicked. \cs{ytvIdML} uses the same presets
command \cs{ytIdPresets}.

\subsubsection{How to get the {\YT} video ID}

Go to the {\YT} web site and search for a video of interest. Once found, play, then pause
the video. Go the browser's URL address bar and you'll see something like this:
\begin{equation*}
  \texttt{https://www.youtube.com/watch?v=$\underset{\text{ytvId}}{\underbrace{\texttt{dAgfnK528RA}}}$}
\end{equation*}
Copy the ytvId into the first argument of \cs{ytvId} and supply a title: %https://youtu.be/dAgfnK528RA
\begin{quote}
  \ytvId{dAgfnK528RA}{Math Antics - Order of Operations}\\
  \verb~\ytvId{dAgfnK528RA}{Math Antics - Order of Operations}~
\end{quote}
Cool! You can also get the video ID by right clicking on the paused video and
exploring the context menu presented.

\subsubsection{Can the video be embedded?}

I've done a little research on this question, the answer is that there is no
way of knowing in advance. You need to test each link. In the case of video
ID \texttt{dAgfnK528RA}, we found it, we created the link with \cs{ytvId},
we tested it, and it worked! Had it not worked (the dreaded \textsf{Video
unavailable} appears when you try to play the video), we simply use the
\texttt*-option. It's just that simple.

\subsection{Basic Methods: dropdown list}

\textbf{Demo files.} The techniques of this section are illustrated by the two files
\texttt{examples/\allowbreak ltx4yt-2.tex} and \texttt{examples/web-pkg/ltx4yt-w2.tex}.

\newtopic\noindent A dropdown list, a combobox in Adobe's original terminology, is an Adobe form field
that drops down to display a list of menu items. It takes up less page space,
and may be a good choice rather than listing a number of links on the page.

\paragraph*{To create a dropdown list}

\begin{enumerate}
\item
\textbf{Create a play list.} At any point prior to the dropdown list, declare your play list:
\bVerb\takeMeasure{\quad\string\ytIdTitle\darg{\ameta{title\SUB{n}}}\darg{\ameta{ytvId\SUB{n}}}}%
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\declarePlayList{!ameta(\plCmd)}{%
!quad\ytIdTitle{!ameta(title!SUB1)}{!ameta(ytvId!SUB1)}
!quad...
!quad\ytIdTitle{!ameta(title!SUB(n))}{!ameta(ytvId!SUB(n))}
}
\end{Verbatim}
\end{minipage}\eVerb If the video referenced by \ameta{ytvId} \emph{cannot be
embedded}, then place an \FmtMP{use \texttt* in title}\texttt* in the
\ameta{title} as a single to the underlying JavaScript that the video cannot
be embedded.

\item \textbf{Set the initial value and playlist} At any point prior to the dropdown list, set the require
dropdown list information:
\bVerb\takeMeasure{\string\ytPlayList\darg{\ameta{ytvId}}\darg{\ameta{\string\plCmd}}}%\plCmd
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytPlayList{!ameta(ytvId)}{!ameta(\plCmd)}
\end{Verbatim}
\end{minipage}\eVerb
where \ameta{ytvId} is the video ID of the title initially displayed in the
dropdown list, and \ameta{\string\plCmd} is a command defined earlier in a
\cs{declarePlayList} command.

\item \textbf{Place the dropdown list and accompanying \textsf{Play} button.}
\bVerb\takeMeasure{\string\ytComboList[\ameta{KV-pairs}]\darg{\ameta{name}}\darg{\ameta{wd}}\darg{\ameta{ht}}}%\plCmd
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytComboList[!ameta(KV-pairs)]{!ameta(name)}{!ameta(wd)}{!ameta(ht)}
\ytComboBtn[!ameta(KV-pairs)]{!ameta(name)}{!ameta(wd)}{!ameta(ht)}
\end{Verbatim}
\end{minipage}\eVerb where \ameta{name} is a text string of ASCII letters and numbers. The \ameta{name} is appended
on to the field names of these two field; The pair \cs{ytComboList} and
\cs{ytComboBtn} must be passed the same \ameta{name} value. The common
\ameta{name} ties them together.
\end{enumerate}
Below is an abbreviated example, more extensive examples are found in the demo files sited at the beginning of this section.

\declarePlayList{\playList}{% note: put parentheses within braces
  \ytIdTitle{Kung-Fu Fighting {(Bruce Lee)}}{GZ9e3Dy7obA}
  \ytIdTitle{Kung-Fu Fighting* {(Carl Douglas)}}{jhUkGIsKvn0}
  \ytIdTitle{J\"{u}rgen's "favorite" song*}{mLDF5MBMWHE}
  \ytIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
}
\ytPlayList{GZ9e3Dy7obA}{\playList}

\paragraph*{Example} A four-item dropdown list: \ytComboList{YT1}{144bp}{11bp}\olBdry\ytComboBtn{YT1}{33bp}{11bp}

\newtopic\noindent The verbatim listing is,\bVerb
\def\1{\llap{\rlap{\ding{182}}\hskip\amtIndent\relax}}\relax
\def\2{\llap{\rlap{\ding{183}}\hskip\amtIndent\relax}}\relax
\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small,commandchars={!~@}]
\declarePlayList{\playList}{% note: put parentheses within braces
!quad\ytIdTitle{Kung-Fu Fighting {(Bruce Lee)}}{GZ9e3Dy7obA}
!quad\ytIdTitle{Kung-Fu Fighting* {(Carl Douglas)}}{jhUkGIsKvn0}
!1!quad\ytIdTitle{J\"{u}rgen's "favorite" song*}{mLDF5MBMWHE}
!2!quad\ytIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
}
\ytPlayList{GZ9e3Dy7obA}{\playList}
\paragraph*{Example} A two-item dropdown list:
  \ytComboList{YT1}{144bp}{11bp}\olBdry\ytComboBtn{YT1}{33bp}{11bp}
\end{Verbatim}
\endgroup\noindent There are a several observations to make in this markup: line~\ding{182}
uses standard {\LaTeX} markup to describe the u-umlaut, the double quote
requires no special attention; line~\ding{183} the backslash can be expressed
as \cs{cs\darg{\ameta{text}}}. Also note that two of the titles have an
\texttt* in them, this signals that these videos cannot be embedded.

\subsection{Basic Methods: popup menus}\label{upu}

\textbf{Demo files.} The techniques of this section are illustrated by the two files
\texttt{examples/\allowbreak ltx4yt-2.tex} and \texttt{examples/web-pkg/ltx4yt-w2.tex}.

\newtopic\noindent A pop-up menu is a menu list that appears on top of the content of the page, it is generated
by the JavaScript method \texttt{app.popUpMenuEx()}. The advantage of this
method is that it take up no space on the page, it is displayed on top of the
page and is dismissed when an item from the menu list is chosen.

\goodbreak
\newtopic\noindent\textbf{To create a pop-up menu}
\begin{enumerate}
    \item \textbf{Build a menu listing.} Use the \env{popupmenu} environment of
        the \pkg{popumemnu} package to build/design your menu.
\bVerb\takeMeasure{\string\begin\darg{submenu}\darg{title=\ameta{submenu-name\SUB{1}}}}%
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\begin{popupmenu}{!ameta(menu-name)}
\puIdTitle{!ameta(title!SUB1)}{!ameta(ytvId!SUB1)}
...
\puIdTitle{!ameta(title!SUB(m))}{!ameta(ytvId!SUB(m))}
\begin{submenu}{title=!ameta(submenu-name!SUB1)}
!quad\puIdTitle{!ameta(title!SUB(m+1))}{!ameta(ytvId!SUB(m+1))}
!quad..
!quad\puIdTitle{!ameta(title!SUB(m+n))}{!ameta(ytvId!SUB(m+n))}
\end{submenu}
...
\end{popupmenu}
\end{Verbatim}
\end{minipage}\eVerb
You need not have a \env{submenu} structure, but \env{submenu}s are useful for organizing the links.
The first argument of \cs{puIdTitle} is passed through \cs{pdfstringdef}, this enables you to use
{\LaTeX} markups for accents, for example. If the second argument (\ameta{ytvId}) is empty, then
that entry has no action associated with it, and can be used as a menu heading.

\item \textbf{Create the menu data.} Following all \env{popupmenu}
    environments, yet still in the preamble\FmtMP{preamble},  insert the
    following command:
\bVerb\takeMeasure{\string\ytUseMenus\darg{\ameta{menu-name\SUB{1}},...,\ameta{menu-name\SUB{k}}}}%
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytUseMenus{!ameta(menu-name!SUB1),...,!ameta(menu-name!SUB(k))}
...
!color(gray)\begin{document}
\end{Verbatim}
\end{minipage}\eVerb The argument of \cs{ytUseMenus} is a comma-delimited list
of \ameta{menu-name}s declared as the first argument of \env{popupmenu}
environments.

\item \textbf{Place the \cs{ytPopupBtn} command.}
\bVerb\takeMeasure{\string\ytPopupBtn[\ameta{KV-pairs}]\darg{\ameta{menu-name}\darg{\ameta{wd}}\darg{\ameta{ht}}}}%
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytPopupPresets{!ameta(KV-pairs)}
\ytPopupBtn[!ameta(KV-pairs)]{!ameta(menu-name)}{!ameta(wd)}{!ameta(ht)}
\end{Verbatim}
\end{minipage}\eVerb Employ \cs{ytPopupPresets} as a way to pass \ameta{KV-pairs} to all
\cs{ytPopupBtn} commands in the document. For an individual \cs{ytPopupBtn}
command, its \ameta{KV-pairs} argument passes key-values to that
\cs{ytPopupBtn}, these \ameta{KV-pairs} will override the ones of
\cs{ytPopupPresets}. The second argument, \ameta{menu-name}, is name of the
pop-up menu data you want to use. This menu data is created earlier in the
preamble by the \env{popumenu} environment and referenced again in the argument
of \cs{ytUseMenus}.
\end{enumerate}

\paragraph*{Example.} \ytPopupBtn[\CA{Sea Hunt}]{YTSea}{20bp}{5bp}
Let's create a short pop-up menu, more extensive examples are found
in \texttt{examples/\allowbreak ltx4yt-2.tex} and \texttt{examples/web-pkg/ltx4yt-w2.tex}.
\bVerb\def\1{\llap{\rlap{\ding{182}}\hskip\amtIndent\relax}}\relax
\def\2{\llap{\rlap{\ding{183}}\hskip\amtIndent\relax}}\relax
\def\3{\llap{\rlap{\ding{184}}\hskip\amtIndent\relax}}\relax
\def\4{\llap{\rlap{\ding{185}}\hskip\amtIndent\relax}}\relax
\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small,commandchars={!~@}]
\begin{popupmenu}{YTSea}
!1!quad\puIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
!2!quad\puIdTitle{\Esc"Sea Hunt\Esc"
!qquad~US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}@
!quad\puIdTitle{Theme Song to Sea Hunt*}{2QxXk6X9GDo}
!3!quad\puIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
\end{popupmenu}
!4\ytUseMenus{YTSea}
...
\begin{document}
...
...
\paragraph*{Example.}
\ytPopupBtn[\CA{Sea Hunt}]{YTSea}{20bp}{5bp} Let's ...
\end{Verbatim}
\eVerb The first argument of \cs{puIdTitle} is passed through
\cs{pdfstringdef}, this enables you to use {\LaTeX} markup on accents, as in
\ding{182}. In line \ding{183}, a special locally defined command \cs{Esc} is
used to ``escape'' the double quotes so that we \verb~\"~ to appear in the
document JavaScript, which is where the menu items appear within the PDF. In
line~\ding{184} a special locally defined command \cs{cs} is used to create a
backslash, in a manner similar to {\LaTeX} markup. Note the presence of the
\FmtMP{\texttt{*} noted}\texttt{*} in the title of two of the menu items;
this is used to signal to the underlying JavaScript that the title cannot be
embedded. Finally, we the \env{popupmenu} environment, we declare, in line~\ding{185},
that we are using the menu named \texttt{YTSea}.

\newlength\ytlength

\section{Advanced Methods: Playing video with \tops{\protect\cs}{\textbackslash}{ytLink}}

The link earlier discussed is \cs{ytvId}, which takes as its first argument
the video ID of the targeted video. It then constructs a URL one way or
another, depending on the presence of the \texttt*-option. This method is
pretty rigid, one size fits all, if you will. A more flexible method of
constructing links is to use the \cs{ytLink} command.
\bVerb\takeMeasure{\string\ytLink\darg{\string\embedId\darg{\ameta{ytvId}}\string\params\darg{\ameta{params}}\darg{\ameta{text}}}}%
\setlength\ytlength{\bxSize}%
\def\1{\rlap{\hskip\ytlength\relax\ding{182}}}%
\def\2{\rlap{\hskip\ytlength\relax\ding{183}}}%
\def\3{\rlap{\hskip\ytlength\relax\ding{184}}}%
\def\4{\rlap{\hskip\ytlength\relax\ding{185}}}%
\def\5{\rlap{\hskip\ytlength\relax\ding{186}}}%
\def\6{\rlap{\hskip\ytlength\relax\llap{\sffamily(presets for \cs{ytvId})\hskip2\fboxsep\hskip2\fboxrule}}}%
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
!1\ytLink{\embedId{!ameta(ytvId)}\params{!ameta(params)}}{!ameta(text)}
!2\ytLink{\watchId{!ameta(ytvId)}\params{!ameta(params)}}{!ameta(text)}
!3\ytLink{\embed{!ameta(spec)}}{!ameta(text)}
!4\ytLink{!ameta(spec)}{!ameta(text)}
!5\ytLink{\channel{!ameta(name)}}{!ameta(text)}
!5\ytLink{\user{!ameta(name)}}{!ameta(text)}
!6\ytvIdPresets{!ameta(KV-pairs)}
\end{Verbatim}
\end{minipage}\eVerb Each of these has an optional first argument \ameta{KV-pairs} that is not shown above.
Let's take a look at each of these in turn and illustrate with examples. Yes,
{\YT} has a number of parameter is recognizes in its urls, see
\href{https://developers.google.com/youtube/player_parameters#Parameters}{here}
for a discussion.
\begin{enumerate}
  \item[\ding{182}] Use this form \emph{when you can embed} a video
      \ameta{ytvId} with additional parameters. (this best type of video).
      The \cs{params} argument \emph{must follow} the \cs{embedId}, its
      arguments are any parameters you want to append to the URL. The use
      of \cs{params} is optional; however, without \cs{params} you
      should use \verb|\ytvId*{|\ameta{ytvID}\verb|}{|\ameta{text}\verb|}|.
      For example, we auto play a video with modest branding:\\[3pt]
     \ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&modestbranding=1}}{Lori's Corner: Episode \#1}\\\small
     \verb!\ytLink{\embedId{5y9-EVmreU4}!\\
     \null\qquad\verb!\params{autoplay=1&modestbranding=1}}{Lori's Corner: Episode \#1}!

     The demo file \texttt{ltx4yt-1.tex} contains an example of this type
     of link that sets up a small play list of three videos.

  \item[\ding{183}]  Use this form \emph{when you \emph{cannot} embed} (or
      you want to play the video on the main {\YT} site) \ameta{ytvId} with
      additional parameters. The \cs{params} argument must follow the
      \cs{watchId}, its argument are any parameters you want to append to
      the URL. The use of \cs{params} is optional; however, without the
      \cs{params} you may as well use
      \verb|\ytvId*{|\ameta{ytvID}\verb|}{|\ameta{text}\verb|}|.
    \\[3pt]
    \ytLink{\watchId{5y9-EVmreU4}\params{autoplay=1}}{Lori's Corner: Episode \#1}\\
    \verb!\ytLink{\watchId{5y9-EVmreU4}!\\
    \null\qquad\verb!\params{autoplay=1}}{Lori's Corner: Episode \#1}!

  \item[\ding{184}] A more general form that allows you to formulate general URLs. For example, we \emph{search}
    for {\YT} videos on \app{Adobe Acrobat DC}:\\[3pt]
    \ytLink{\embed{listType=search&list=Adobe Acrobat DC}}{Search for Adobe Acrobat DC}\\
    \verb!\ytLink{\embed{listType=search&list=Adobe Acrobat DC}}!\\
    \null\qquad\verb!{Search for Adobe Acrobat DC}!
  \item[\ding{185}] The most general form, \ameta{spec} is simply appended, ie,
  \texttt{https://www.youtube.com/\ameta{spec}}\\[3pt]
  \ytLink{embed?listType=search&list=LaTeX typesetting}{Totally custom search link}\\
  \verb|\ytLink{embed?listType=search&list=LaTeX typesetting}|\\
  \null\qquad\verb|{Totally custom search link}|
  \item[\ding{186}] There are a couple of URLs for displaying a channel on \YT, at least there are a couple
  that I have discovered.
  Use this form to see channel of a particular contributor to {\YT}. For example,\\[3pt]
  \ytLink{\channel{rocketjump}}{The RocketJump Channel}\\
  \verb|\ytLink{\channel{rocketjump}}{The RocketJump Channel}|\\[3pt]
  \ytLink{\user{freddiew}}{Freddie Diew's Channel}\\
  \verb|\ytLink{\user{freddiew}}{Freddie Diew's channel}|

  To get the true \ameta{name} of a channel, go to {\YT} and search for that channel. For example,
  search for \textsf{RocketJump}. On the resulting page, click on a RocketJump link and look at the
  location bar in the browser to see the path, it may come up \texttt{c/rocketjump} or \texttt{user/freddiew}.
\end{enumerate}

\newtopic\noindent There is a multi-line version of \cs{ytLink}.
\bVerb\takeMeasure{\string\ytLinkML*[\ameta{KV-pairs}]\darg{\ameta{spec}}\darg{\ameta{text}}}%
\begin{minipage}{\linewidth}
\begin{minipage}{\bxSize}
\xdef\panelWidth{\the\linewidth}% *[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytLinkML*[!ameta(KV-pairs)]{!ameta(spec)}{!ameta(text)}
\ytvIdPresets{!ameta(KV-pairs)}
\end{Verbatim}
\end{minipage}\hfill
\begin{minipage}{\linewidth-\panelWidth}
\setDisplayNumber\label{display:ytLinkML}
\end{minipage}\end{minipage}\eVerb This form, which requires \pkg{aeb\_mlink} package and the
\app{dvips\,->distiller}, creates true multi-line links. \cs{ytLinkML} has the same variations
of \cs{ytLink} (lines \ding{182}--\ding{186}) described earlier

\section{Searching {\YT}} %\previewOn

Want to interactively search {\YT} for your favorate video? Search using the commands \cs{ytInputQuery}
and \cs{ytSearch}:
\bVerb\takeMeasure{\string\ytInputQuery[\ameta{KV-pairs}]\darg{\ameta{wd}}\darg{\ameta{ht}}}%
\begin{minipage}{\linewidth}
\begin{minipage}{\bxSize}
\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
\ytInputQuery[!ameta(KV-pairs)]{!ameta(wd)}{!ameta(ht)}
\ytSearch[!ameta(KV-pairs)]{!ameta(wd)}{!ameta(ht)}
\ytClearQuery[!ameta(KV-pairs)]{!ameta(wd)}{!ameta(ht)}
\end{Verbatim}
\end{minipage}
\quad\ytInputQuery{1.5in}{11bp}\olBdry
\ytSearch{}{11bp}\olBdry
\ytClearQuery{}{11bp}
\end{minipage}
\eVerb \cs{ytInputQuery} is an input box to enter query text; \cs{ytSearch} is a push button that searchs
{\YT} for the text entered into \cs{ytInputQuery}; and finally, \cs{ytClear} clears \cs{ytInputQuery}.


\newtopic\noindent
That's all for now, I simply must get back to my retirement. {\dps}

\end{document}