summaryrefslogtreecommitdiff
path: root/obsolete/macros/latex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-07-31 03:03:02 +0000
committerNorbert Preining <norbert@preining.info>2020-07-31 03:03:02 +0000
commitaadc6fbc73f1ca0b93f8c406c46cdb2600bce890 (patch)
tree7dc02572f8c2f46f3873b6e61ad440d9358df42b /obsolete/macros/latex
parentd2d95b04c14dc91a6976651379d33b2b472e6cb8 (diff)
CTAN sync 202007310303
Diffstat (limited to 'obsolete/macros/latex')
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/README.md21
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.pdfbin0 -> 347953 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.tex737
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/config_intacc.def29
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIA9.epsbin0 -> 290523 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIAX.epsbin0 -> 400298 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/graphics/trustmanager.epsbin0 -> 845442 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/graphics/yt_icon_sm.epsbin0 -> 558266 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-1.tex93
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-2.tex152
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-3.tex88
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/graphics/pdfyt_poster.epsbin0 -> 850618 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/swf/pdf_tube_basic.swfbin0 -> 10470 bytes
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/yt4pdf.cfg10
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/yt4pdf.dtx629
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/yt4pdf.ins60
-rw-r--r--obsolete/macros/latex/contrib/yt4pdf/yt4pdf.sty346
17 files changed, 2165 insertions, 0 deletions
diff --git a/obsolete/macros/latex/contrib/yt4pdf/README.md b/obsolete/macros/latex/contrib/yt4pdf/README.md
new file mode 100644
index 0000000000..5d1400140e
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/README.md
@@ -0,0 +1,21 @@
+The yt4pdf package
+Dated: 2016/10/04
+
+The yt4pdf package uses the rmannot package to embed a special SWF file to
+play the YouTube 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 YouTube video ID, and a button to view a video on the
+YouTube web site. Adobe Acrobat 9 or later is required to author a
+document; only Adobe Reader 9 is need to view the created yt4pdf document.
+
+The SWF file for playing the YouTube videos was developed by UVSAR
+(http://www.uvsar.com/pdftube/) and is based on the YouTube chromeless
+player and the YouTube ActionScript 3.0 Player API Reference
+(http://code.google.com/apis/youtube/flash_api_reference.html)
+
+Now, I simply must get back to my retirement.
+
+Dr. D. P. Story
+www.acrotex.net
+dpstory@uakron.edu
+dpstory@acrotex.net
diff --git a/obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.pdf b/obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.pdf
new file mode 100644
index 0000000000..5b0bbca68d
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.pdf
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.tex b/obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.tex
new file mode 100644
index 0000000000..97febc04f1
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/doc/yt4pdf_man.tex
@@ -0,0 +1,737 @@
+% 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{array}
+\usepackage[altbullet]{lucidbry}
+
+\usepackage{makeidx}
+\makeindex
+\usepackage{acroman}
+
+\usepackage[active]{srcltx}
+
+\def\expath{../examples}
+
+\urlstyle{rm}
+\def\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}{\color{\aeb@subsubsectioncolor}\bfseries}}
+\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
+
+
+\newcommand{\YouTube}{\textsf{YouTube}}
+
+
+%\def\tutpath{doc/tutorial}
+%\def\tutpathi{tutorial}
+
+\DeclareDocInfo
+{
+ university={\AcroTeX.Net},
+ title={The \texorpdfstring{\textsf{yt4PDF} Package\\[1em]}{: }
+ Playing \texorpdfstring{\YouTube}{YouTube} Videos in PDF},
+ author={D. P. Story},
+ email={dpstory@acrotex.net},
+ subject={Playing YouTube Videos in PDF},
+ talksite={\url{www.acrotex.net}},
+ version={1.1, 2016/10/04},
+ keywords={AcroTeX, PDF, YouTube, rmannot},
+ 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}
+
+%\pagestyle{empty}
+%\parindent0pt\parskip\medskipamount
+
+\chngDocObjectTo{\newDO}{doc}
+\begin{docassembly}
+var titleOfManual="The yt4pdf MANUAL";
+var manualfilename="Manual_BG_Print_yt4pdf.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}
+
+ I believe that I was vaguely aware of the \href{http://code.google.com/apis/youtube/flash_api_reference.html}
+{{\YouTube} 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 {\YouTube} (\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 - {\YouTube} API wrapper for PDF documents}.
+``PDF Tube - {\YouTube} 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{yt4pdf} package uses the \textsf{rmannot} to embed the \textsf{SWF}
+file that plays the {\YouTube} 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 {\YouTube} video ID, and a button to
+view a video on the {\YouTube} web site.\footnote{Some videos do not allow
+embedded playback, and must be viewed on the {\YouTube} web site.}
+
+% http://acrobatusers.com/news/youtube-widget-acrobat
+
+\subsection{Sample files}
+
+The following are the sample files shipped with \textsf{yt4pdf}:
+\begin{itemize}
+ \item \texttt{yt4pdf-1.tex} demonstrates the basic functionality of
+ the {\YouTube} RMA: the use of the poster, including \cs{ytComboList},
+ \cs{ytComboBtn}, and \cs{ytvId}.
+ \item \texttt{yt4pdf-2.tex} experiments with different ways the
+ {\YouTube} annotation can be displayed
+ \begin{itemize}
+ \item As a small icon, videos are played in a floating window,
+ buttons displayed in the running footer.
+ \item[] This one uses a rollover, popup menu system (as opposed to
+ a combo box). The \textsf{popupmenu} package is used.
+ \item Using a built-in poster, with the combo box under the
+ annotation, control buttons in running footer.
+ \item Same as above, but control buttons moved to a two column
+ format.
+ \item Using the custom {\YouTube} for PDF poster with combo box and
+ control buttons under the RMA.
+ \end{itemize}
+ \item \texttt{yt4pdf-3.tex} illustrates the usage of the \texttt{play} and \texttt{load}
+ keys that are passed in the optional parameter of \cs{ytRmAnnot}.
+\end{itemize}
+% Advanced examples \href{http://www.math.uakron.edu/~dpstory/aebblog.html}{AeB Blog site}.
+
+\section{Requirements}
+
+This package is part of \textsf{AeB Pro}, which means Acrobat Distiller is
+used to create the PDF; the package requires \textsf{rmannot}, which
+creates rich media annotations. Therefore, we require
+\begin{equation*}
+ \boxed{\text{\large\bfseries Adobe Acrobat, version 9.0 or later}}
+\end{equation*}
+To use this package, the document author must have AeB and AeB Pro
+installed, as well as \textsf{rmannot}. The manual for \textsf{rmannot}
+needs to be read closely to properly install it and to function correctly.
+I have made \textsf{rmannot} a required package, and recently
+have made the \textsf{popupmenu} package required as well.
+
+\section{Configuring your installation}
+
+In addition to configuring the \textsf{rmannot} package correctly, the
+\textsf{yt4pdf} package needs configuring as well. The \textsf{yt4pdf} package
+comes with a configuration file \texttt{yt4pdf.cfg}. Open this file in
+your favorite editor to see
+\begin{Verbatim}[fontsize=\small]
+% yt4pdf config file. Delete the \endinput below and replace the path
+% provided with the path to the swf folder of your yt4pdf installation.
+% This path is used to locate the pdf_tube_basic.swf file, used to play
+% YouTube videos.
+\endinput
+\renewcommand{\ytFolder}{C:/Users/Public/Documents/My TeX Files/%
+tex/latex/aeb/aebpro/yt4pdf/swf}
+\end{Verbatim}
+Edit this file so that \cs{ytFolder} points to the \texttt{swf} folder on
+your computer.
+
+\section{The Rich Mediation Annotation for {\YouTube}}
+
+The Rich Media Annotation (RMA) used is \cs{ytRmAnnot}, its definition
+uses the command \cs{rmAnnot}, which is defined in the \textsf{rmannot} package.
+\bVerb\takeMeasure{\string\ytRmAnnot[\ameta{KV-pairs}]\darg{\ameta{name}}\darg{\ameta{width}}\darg{\ameta{height}}}%
+\begin{minipage}{\linewidth}
+\begin{minipage}{\bxSize}
+\xdef\panelWidth{\the\linewidth}%
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytRmAnnot[!ameta(KV-pairs)]{!ameta(name)}{!ameta(width)}{!ameta(height)}
+\end{Verbatim}
+\end{minipage}\hfill
+\begin{minipage}{\linewidth-\panelWidth}
+\setDisplayNumber\label{display:ytRmAnnot}
+\end{minipage}\end{minipage}\endgroup
+\PD
+\begin{enumerate}
+ \item The first (optional) parameter is used to pass the key-value pairs of the
+ \cs{rmAnnot} command. Additionally, there are two other \ameta{KV-pairs}
+ recognized, specialized to the \cs{ytRmAnnot} command.
+ \begin{itemize}
+ \item \texttt{play=\ameta{vID}} Loads and plays the {\YouTube} video with
+ video ID of \ameta{vID}.
+ \item \texttt{load=\ameta{vID}} Loads the specified video's thumbnail
+ (as specified by \ameta{vID}) and prepares the player to play
+ the video. The player does not request the \textsf{FLV} until the play
+ button is pressed.
+ \end{itemize}
+ When you want to play a {\YouTube} video when the page containing
+ the annotation is opened, use the \texttt{play} key; for example
+ \texttt{play=GZ9e3Dy7obA} causes the video whose video ID is
+ \texttt{GZ9e3Dy7obA} to play when the page is opened.
+
+ See the manual for the \pkg{rmannot} package for more details on the
+ key-value pairs that can be passed through the optional first
+ parameter.
+
+ \item The \ameta{name} parameter is a name used to refer to the
+ annotation through underlying JavaScript code. The \ameta{name}
+ should consist of only letters and numbers. The value of this
+ parameter is placed in the macro \cs{ytCurrRMAName}. This macro is
+ used internally by the various control buttons.
+
+ \item The width of the annotation.
+
+ \item The height of the annotation.
+\end{enumerate}
+
+\paragraph*{Annot Dimensions.}
+The width and height of the {\YouTube} annotation should be \texttt{571bp}
+and \texttt{330bp}, respectively, or any re-scaling of these dimensions.
+
+Examples,
+\begin{Verbatim}
+ \ytRmAnnot[posternote=AcroTeX PDF Tube,play=eNzrn8-JFSE,
+ deactivated=pageclose]{YouTube1}{571bp}{330bp}
+\end{Verbatim}
+is a ``full-size'' annotation, while
+\begin{Verbatim}
+ \ytRmAnnot[posternote=AcroTeX PDF Tube,load=eNzrn8-JFSE,
+ deactivated=pageclose]{YouTube1}{571bp/2}{330bp/2}
+\end{Verbatim}
+is half that size. The first example above plays a video when
+the page is opened, the second example loads the thumbnail, and waits play
+the video.
+
+You can also re-scale using either \cs{resizebox} or
+\cs{scalebox} from the \textsf{graphicx} package.
+\begin{Verbatim}
+ \resizebox{2in}{!}{\ytRmAnnot[posternote=AcroTeX PDF Tube,
+ deactivated=pageclose]{YouTube1}{571bp}{330bp}}
+\end{Verbatim}
+or, using \cs{scalebox},
+\begin{Verbatim}
+ \scalebox{.5}{\ytRmAnnot[posternote=AcroTeX PDF Tube,
+ deactivated=pageclose]{YouTube1}{571bp}{330bp}}
+\end{Verbatim}
+
+\textbf{Running multiple videos at once.} At the time of this writing, the
+\pkg{yt4pdf} package is not designed to run more than one video at a
+time, that's not saying it cannot be done, however. It is not recommended,
+indeed, why would you want to look at two {\YouTube} videos at the same
+time?
+
+For documents with multiple {\YouTube} annotations over
+several pages it is recommended, therefore, that the \texttt{deactivated=pageclose}
+should be used in the optional parameter list of the \cs{ytRmAnnot}
+command.
+
+\subsection{The \texorpdfstring{\protect\textsf{yt4pdf}}{yt4pdf} Poster}
+
+The \textsf{rmannot} package provides a standard poster (a gray rectangle
+with text in the lower left corner). However, there is an especially
+designed poster, designed by the folks at \textbf{UVSAR}. (See
+Figure~\ref*{pdfytPoster}, page~\pageref*{pdfytPoster}.)
+
+\begin{figure}[htb]
+\begin{center}
+ \includegraphics[scale=.5]{./graphics/pdfyt_poster}\\
+ \caption{YouTube for PDF poster}\label{pdfytPoster}
+\end{center}
+\end{figure}
+
+\goodbreak
+\textbf{To use this really cool poster:}
+\begin{enumerate}
+ \item Insert the following line into the preamble,
+\begin{Verbatim}[fontsize=\small]
+ \makePoster[bb=0 0 570.794 329.887]{pdfyt_poster}{pdfyt_poster}
+\end{Verbatim}
+The optional parameter should remain as it is, it adjusts the bounding
+box so that the poster is properly placed.
+
+\item Use the \texttt{poster} key in the first optional parameter of
+\cs{ytRmAnnot}, like so,
+\begin{Verbatim}
+ \ytRmAnnot[poster=pdfyt_poster,
+ deactivated=pageclose]{YouTube}{571bp}{330bp}}
+\end{Verbatim}
+\end{enumerate}
+
+\subsection{Control Buttons}
+
+The {\YouTube} rich media annotation (as created by \cs{ytRmAnnot}), comes
+with six (optional) control buttons.
+\bVerb\takeMeasure{\string\ytSelect[\ameta{KV-pairs}]\darg{\ameta{vID}}\darg{\ameta{width}}\darg{\ameta{height}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytPlayToggle[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\ytStopLoading[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\ytMuteToggle[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\ytRewind[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\ytSelect[!ameta(KV-pairs)]{!ameta(vID)}{!ameta(width)}{!ameta(height)}
+\ytOpenWeb[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\end{Verbatim}
+\end{minipage}\endgroup
+\PD The labels are self-explanatory, the \texttt{<kv-pairs>} parameter is
+the standard \textsf{eforms} optional parameter for changing the
+appearance of the form. The \ameta{vID} parameter for \cs{ytSelect} is
+a {\YouTube} video ID.
+
+\goodbreak
+\CmdDescription We give brief descriptions of each of the six control
+buttons.
+\begin{itemize}
+ \item \cs{ytPlayToggle}:
+ This button has several functions, \textsf{PAUSE}, \textsf{PLAY}, \textsf{BUFFERING}, and \textsf{REPLAY}.
+ Initially the button label is on \textsf{PAUSE} (pressing it pauses a playing video);
+ the button label reads \textsf{PLAY} when the video is loaded and paused (pressing it plays or resumes
+ the video); while the video is loading, the button label is
+ \textsf{BUFFERING\dots}. After the video finishes playing, the button
+ label is changed to \textsf{Replay}.
+ \item \cs{ytStopLoading}: Pressing this button stops the streaming of the currently playing
+ video. If the video is started again, there will be some buffering before the play begins.
+ \item \cs{ytMuteToggle}: This button toggles and sound off and on. Button labels are
+ \textsf{MUTE} and \textsf{UNMUTE}.
+ \item \cs{ytRewind}: If the video is playing, this button
+ stops the video, rewinds it to the beginning, and starts play again. If the video
+ is paused, this button rewinds the video to the beginning, the video remains paused.
+ \item \cs{ytSelect}: When this button is pressed, a response dialog opens.
+ The user enters a {\YouTube} video ID into the field. On pressing OK, this video is played.
+
+ \item[] The second parameter \ameta{vID} is the default video
+ that is displayed in the input box of the response box that opens.
+ \item[] \textbf{Note:} Some {\YouTube} videos are security
+ restricted and cannot be played through an embedded player, such as the one used here.
+ If video ID of a video that does not allow embedded playback, a dialog appears giving
+ the user the opportunity to view the video on the web.
+ \item \cs{ytOpenWeb}: The user has the option of pressing this button to view the
+ current video on the web at \texttt{www.youtube.com}.
+\end{itemize}
+
+The first (optional) parameter can be used to modify the appearance of the
+individual buttons. To modify the appearances of the buttons as a group,
+use,
+\bVerb\takeMeasure{\string\ytBtnPresets\darg{\ameta{KV-pairs}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytBtnPresets{!ameta(KV-pairs)}
+\end{Verbatim}
+\end{minipage}\eVerb
+The key-value pairs are ones defined for form fields created by the \textsf{eforms}
+package. The default definition is,
+\begin{Verbatim}[xleftmargin=\amtIndent]
+\ytBtnPresets{\BC{.5 0 0}\S{S}\textFont{HeBo}}
+\end{Verbatim}
+
+The second parameter of \cs{ytRmAnnot} is the name to be associated with
+that annot; the name of the annot is not known until after the annot is
+defined. The command \cs{DeclareYTName},
+\bVerb\takeMeasure{\string\DeclareYTName\darg{\ameta{name}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\DeclareYTName{!ameta(name)}
+\end{Verbatim}
+\end{minipage}\eVerb
+allows you to define the name prior to the creation of the annot. This is
+useful if you want to place the control buttons above the annot itself. By
+specifying the name, the control buttons will know the name of the annot
+they are to control.
+
+\subsection{Controls for playing a {\YouTube} video}
+
+To actually play a video, you must pass a video ID to the underlying SWF
+file. We present two methods here, through links and through a combo box.
+One of the example files, \texttt{yt4pdf-2.pdf}, illustrates another method
+using a popup menu.
+
+\subsubsection{Playing a video through a link}
+
+The command \cs{ytvId} creates a list such that when you click on it, the
+video specified by the second parameter of the command is played in the
+associated Rich Media annotation created by \cs{ytRmAnnot}. The associated
+RMA is the one most recently defined prior to the link. If the link occurs
+before the target RMA, you can use \cs{DeclareYTName} to set the name of
+the target RMA for the link.
+\bVerb\takeMeasure{\string\ytvId[\ameta{KV-pairs}]\darg{\ameta{vID}}\darg{\ameta{text}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytvId[!ameta(KV-pairs)]{!ameta(vID)}{!ameta(text)}
+\end{Verbatim}
+\end{minipage}\endgroup
+\PD The first parameter takes the usual key-value pairs for links created
+by the \textsf{eforms} package. The second parameter is the video ID to be
+played. The third parameter is the text to be displayed by the link,
+usually the title of the {\YouTube} video.
+
+\cs{ytvId} loads and plays the specified video; there is an
+\texttt{*}-form of this command,
+\bVerb\takeMeasure{\string\ytvId*[\ameta{KV-pairs}]\darg{\ameta{vID}}\darg{\ameta{text}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytvId*[!ameta(KV-pairs)]{!ameta(vID)}{!ameta(text)}
+\end{Verbatim}
+\end{minipage}\eVerb
+When this form is used, the {\YouTube} thumbnail image for the video is
+displayed. The player does not
+request the video until the play button is pressed.
+
+You can set the appearances for a all links created by \cs{ytvId} by using
+\cs{ytvIdPresets}
+\bVerb\takeMeasure{\string\ytvIdPresets\darg{\ameta{KV-pairs}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytvIdPresets{!ameta(KV-pairs)}
+\end{Verbatim}
+\end{minipage}\eVerb
+The key-value pairs are ones defined for form fields created by the \textsf{eforms}
+package. The default definition is
+\begin{Verbatim}[xleftmargin=\amtIndent]
+\ytvIdPresets{\linktxtcolor{webbrown}}
+\end{Verbatim}
+
+\subsubsection{Playing a video using a combo box}
+
+You can created a combo box with a play list. There are three commands
+that create the combo list, \cs{ytPlayList}, \cs{ytComboList}, and
+\cs{ytComboBtn}.
+\bVerb\takeMeasure{\string\ytPlayList\darg{\ameta{default\_vId}}\darg{\ameta{playlist}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytPlayList{!ameta(default_vId)}{!ameta(playlist)}
+\end{Verbatim}
+\end{minipage}\eVerb
+This command sets the play list to be displayed in the combo box, it needs
+to be executed before the actual creation of the combo box (using
+\cs{ytComboList}). The first parameter is the default video ID, this title
+will be initially displayed by the combo box. The \ameta{playlist} is
+an array of video IDs and title pairs. The \ameta{playlist} is conveniently defined
+within the \cs{declarePlayList} command:
+\bVerb\takeMeasure{\string\declarePlayList\darg{\ameta{\cs{plCmd}}}\{\%}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\declarePlayList{!ameta(\plCmd)}{%
+ !ameta(array-of-vIDs-titles)
+}
+\end{Verbatim}
+\end{minipage}\eVerb The array of video IDs and title pairs are saved under the command name \ameta{plCmd}.
+For example
+\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small]
+\declarePlayList{\playList}{%
+ [(GZ9e3Dy7obA)(Kung-Fu Fighting {(Bruce Lee version)})]
+ [(eNzrn8-JFSE)(Open at Adobe)]
+ [(5y9-EVmreU4)(Lori's Corner: Episode \#1)]
+}
+\end{Verbatim}
+The format for each pair is \texttt{[(\ameta{vId})(\ameta{title})]}. Notice that in the case
+of the Bruce Lee video, the title itself contains parentheses; to avoid parsing errors when
+the \pkg{eforms} package builds the combo box, \emph{enclose these parentheses in a pair of matching braces}.
+
+In the example above, the array, in its correct format, is loaded
+conveniently into a macro \cs{playList} declared through \cs{declarePlayList}. The macro may then be passed as the
+second parameter of \cs{ytPlayList}. Thus, an example of the use of
+\cs{ytPlayList} is
+\begin{Verbatim}[xleftmargin=\amtIndent]
+\ytPlayList{eNzrn8-JFSE}{\playList}
+\end{Verbatim}
+
+There is a convenience command, \cs{ytIdTitle}, that is used to build
+a \cs{ytPlayList}.
+\bVerb\takeMeasure{\string\ytIdTitle\darg{\ameta{vId}}\darg{\ameta{title}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytIdTitle{!ameta(vId)}{!ameta(title)}
+\end{Verbatim}
+\end{minipage}\eVerb
+The above example can the be re-written as,
+\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small]
+\declarePlayList{\playList}{%
+ \ytIdTitle{GZ9e3Dy7obA}{Kung-Fu Fighting {(Bruce Lee version)}}
+ \ytIdTitle{eNzrn8-JFSE}{Open at Adobe}
+ \ytIdTitle{5y9-EVmreU4}{Lori's Corner: Episode \#1}
+}
+\end{Verbatim}
+
+\paragraph*{The combo box.} The syntax for the combo box itself is
+\bVerb\takeMeasure{\string\ytComboList[\ameta{KV-pairs}]\darg{\ameta{width}}\darg{\ameta{height}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytComboList[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\end{Verbatim}
+\end{minipage}\eVerb
+The \cs{ytComboList} is a combo box of video Ids and titles. The user
+selects a video based on its title, then presses the \textsf{PLAY} button
+(see \cs{ytComboBtn} below). This command is executed \emph{before}
+\cs{ytComboBtn} to set the play list, and the default value.
+\PD\begin{itemize}
+ \item \ameta{KV-pairs}: (optional) The key-value pairs associated with an
+ \textsf{eforms} form field, used to change the appearance of the field.
+ \item \ameta{width}: The width of the combo box
+ \item \ameta{height}: The height of the combo box
+\end{itemize}
+The appearance can be changed locally by the optional first parameter. The
+command \cs{ytComboListPresets} is used to change all combo lists create
+by \cs{ytComboList}. The command takes has one parameter, the key-value
+pairs for changing the appearance. The default definition is
+\verb!\ytComboListPresets{}!.
+
+Originally, I visualized only one combo box per page, recently that
+mind-set has changed. Should you want several combo boxes, as created by
+\cs{ytComboList}, each box must have a unique name. To that end
+\bVerb\takeMeasure{\string\ytNewBaseName[\ameta{name}]}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytNewBaseName[!ameta(name)]
+\ytResetBaseName
+\end{Verbatim}
+\end{minipage}\eVerb
+The first command, \cs{ytNewBaseName}, has one optional parameter, if no
+parameter is supplied, then a base name will be generated; otherwise,
+the title of the combo box will be based on the \ameta{name} passed to
+it. For the command \cs{ytResetBaseName}, the first command effects the JS
+and the field name of \cs{ytComboBtn} described below.
+\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small,commandchars=!()]
+\begin{itemize}
+\item \ytNewBaseName\relax\ytPlayList{!ameta(default_Id)}{\playListii}%
+ \ytComboList{2.5in}{11bp}\kern1bp\ytComboBtn{33bp}{11bp}
+\item \ytNewBaseName[Listiii]\ytPlayList{!ameta(default_Id)}{\playListiii}%
+ \ytComboList{2.5in}{11bp}\kern1bp\ytComboBtn{33bp}{11bp}
+\end{itemize}
+\end{Verbatim}
+\textbf{\textcolor{red}{Note:}} Because \cs{ytNewBaseName} has an optional
+argument, you should place a \cs{relax} after \cs{ytNewBaseName} to prevent
+premature expansion of the \cs{ytplayList} command that follows.
+
+\newtopic Once the selection has been made from the combo box, the user
+can play the selection by pressing the button created by \cs{ytComboBtn}.
+\bVerb\takeMeasure{\string\ytComboBtn[\ameta{KV-pairs}]\darg{\ameta{width}}\darg{\ameta{height}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytComboBtn[!ameta(KV-pairs)]{!ameta(width)}{!ameta(height)}
+\end{Verbatim}
+\end{minipage}\eVerb
+\textbf{\textcolor{red}{Note:}} If you hold down the shift key and click on
+the button, the thumbnail poster is loaded, and the player is ready to
+play the video.
+\PD\begin{itemize}
+ \item \ameta{KV-pairs}: (optional) The key-value pairs associated with an
+ \textsf{eforms} form field, used to change the appearance of the field.
+ \item \ameta{width}: The width of the combo box
+ \item \ameta{height}: The height of the combo box
+\end{itemize}
+The appearance can be changed locally by the optional first parameter. The
+command \cs{ytComboBtnPresets} is used to change all combo lists create
+by \cs{ytComboBtn}. The command takes has one parameter, the key-value
+pairs for changing the appearance. The default definition is
+\verb!\ytComboBtnPresets{}!.
+
+\subsection{Using the \textsf{popupmenu} package}
+
+The \pkg{popupmenu} a required package, \pkg{yt4pdf} adds some commands and
+JS to facilitate its usage. The demo file for this feature is
+\texttt{yt4pdf-2.tex}, where you will find some comments in the source file.
+
+In the preamble, we define our menu structure,
+
+\begin{Verbatim}[numbers=left,xleftmargin=\leftmargini,fontsize=\fontsize{9}{11}\selectfont]
+\begin{popupmenu}{YTMenu}
+ \puIdTitle{Select a You Tube Video}{} % A title has no yt Id
+ \begin{submenu}{title=Music Videos}
+ \puIdTitle{Ink Spots - If I didn't care}{rvwfLe6sLis}
+ \puIdTitle{Ink Spots - My Prayer}{h7KJCns5v3g}
+ \end{submenu}
+ \begin{submenu}{title=Adobe Related Videos}
+ \puIdTitle{Open at Adobe}{eNzrn8-JFSE}
+ \puIdTitle{Lori's Corner Episode \#1}{5y9-EVmreU4}
+ \puIdTitle{Intro to PDF Portfolios}{T9Yzo_hlwP0}
+ \end{submenu}
+\end{popupmenu}
+\ytPopupMenuData{\YTMenu}
+\end{Verbatim}
+The \cs{puIdTitle} is a convenience macro to enter the menu data; the
+first argument is the title of the {\YouTube} video, the second argument
+is the {\YouTube} ID. There may be several \texttt{popupmenu} environments, each
+with a different name. After the last such environment, execute the
+\cs{ytPopuMenuData} command, seen in line~(12). Its argument is a token
+list of all popupmenus; here, we have only one. If there are several, they
+are listed as follows:
+\begin{Verbatim}[xleftmargin=\leftmargini]
+\ytPopupMenuData{\YTMenu\myEduVids\myMusicVids}
+\end{Verbatim}
+
+The menu is displayed as an mouse-over action of button, here is the
+verbatim listing from \texttt{yt4pdf-2.tex}
+
+\begin{Verbatim}[numbers=left,xleftmargin=\leftmargini,fontsize=\fontsize{9}{11}\selectfont]
+\DeclareYTName{ytInWindow}
+...
+\newcommand{\myPBPresets}{%
+ \CA{YT Menu}\textColor{0 0 1}\W1\BC{}\textSize{0}\S{S}
+ \AA{\AAMouseEnter{\JS{ytPopupMenu("\ytCurrRMAName",YTMenu)}}}}
+\setWindowDimPos{%
+ position={halign=center,valign=center,hoffset=0,voffset=0},
+ width={default=571},height={default=330}}%
+\setlength{\pichskip}{3pt}
+\parpic(.25in,.25in){%
+\parbox{.25in}{\offinterlineskip\resizebox{.25in}{!}{%
+ \ytRmAnnot[windowed,poster=yt_poster,deactivated=pageclose]%
+ {ytInWindow}{72bp}{72bp}%
+}}}
+\pushButton[\presets{\myPBPresets}]{myYTMenu}{20bp}{5bp}
+On this page, the You Tube annotation is icon size and the
+video is played in a floating window.
+\end{Verbatim}
+\textbf{Comments:}
+\begin{itemize}
+ \item In line~(1) we declare the name of the {\YouTube} annot to be
+ used. We do this because we need to use the name before the annot is
+ defined. The annot itself is not defined until line~(12).
+ \item Lines~(3)--(5): Define a command to be used for passing the
+ button attributes for the \texttt{myYTMenu} button (seen in
+ line~(15)). In line~(5) we define the action for the button; it is a
+ mouse enter action that executes the \texttt{ytPopupMenu} JS function
+ defined in the \texttt{yt2pdf} package. This function takes two
+ arguments, the first is the name of the target Rich Media Annotation
+ hat will display the videos, this name is \verb!"\ytCurrRMAName"!,
+ where \cs{ytCurrRMAName} holds the name of the most recent {\YouTube}
+ annotation. The second argument is the name of the menu data (defined
+ by the \texttt{popupmenu} environment.
+ \item Lines~(9)--(14): We create an annot so that it appears as an
+ icon, the text of the paragraph wraps around the icon. This is what we
+ do with the \cs{parpic} command. In lines~(12)--(13), we create the
+ {\YouTube} annot using \cs{ytRmAnnot}.
+ \item In line~(15) we have a button with a mouse rollover action. Note
+ we pass the earlier defined presets to this button.
+\end{itemize}
+See the complete source file in \texttt{yt4pdf-2.tex}.
+
+
+\section{Language localizations}
+
+The default language for \textsf{yt4pdf} is English; the English strings
+that \textsf{yt4pdf} uses are listed below. These can be redefined as
+desired.
+\begin{Verbatim}
+\newcommand{\ytStrPLAY}{PLAY}
+\newcommand{\ytStrREPLAY}{REPLAY}
+\newcommand{\ytStrPAUSE}{PAUSE}
+\newcommand{\ytStrBuffering}{Buffering...}
+\newcommand{\ytStrStopLoading}{Stop Loading}
+\newcommand{\ytStrMUTE}{MUTE}
+\newcommand{\ytStrUNMUTE}{UNMUTE}
+\newcommand{\ytStrREWIND}{REWIND}
+\newcommand{\ytStrLoadVideo}{Load Video}
+\newcommand{\ytStrWatchOnWeb}{Watch on YouTube}
+% response dialog box associated with ytSelect()
+\newcommand{\ytRespQues}{Enter the YouTube Video ID}
+\newcommand{\ytRespTitle}{Load a Video}
+\newcommand{\ytRespLabel}{ID:}
+% alert error messages
+\newcommand{\ytStrErrorVideoNotFound}{Error: Video not found}
+\newcommand{\ytStrErrorNoEmbed}{Error: This video does not allow
+ embedded playback \r\r Would you like to view this video
+ on the web?}
+\newcommand{\ytStrConnecTimedOut}{Connection timed out, try again.}
+\end{Verbatim}
+
+\bigskip
+
+That's all for now, I simply must get back to my retirement. {\dps}
+
+\end{document}
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/config_intacc.def b/obsolete/macros/latex/contrib/yt4pdf/examples/config_intacc.def
new file mode 100644
index 0000000000..ac2e0f8e25
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/config_intacc.def
@@ -0,0 +1,29 @@
+\newpage
+
+\begin{minipage}[t]{3in}\parindent20pt\small
+\noindent\makebox[\linewidth][c]{\bfseries\normalsize\color{blue}Configuring
+Preferences}\\[3pt]
+To avoid the security alerts when loading FLV files from You Tube,
+configure your preferences as described below.
+
+Start Adobe Reader 9 or later (or Acrobat~9 or later), and open the \textbf{Preferences}
+dialog box (located in the menu system by selecting \textbf{Edit
+\texttt{>} Preferences} or using the shortcut Ctrl+K); select
+\textbf{Trust Manager} from the left-hand \textbf{Categories} panel. On
+the right side of the dialog box, press the button labeled \textbf{Change
+Settings}, shown below.\par\vspace*{3pt}\centering
+\includegraphics[width=\linewidth]{graphics/trustmanager}
+\end{minipage}\hfill
+\begin{minipage}[t]{\linewidth-3in-10pt}\small
+In the \textbf{Manage Internet Access}, make selections as
+indicated by the red boxes.\par\medskip
+\noindent\makebox[\linewidth][c]{\bfseries\normalsize\color{blue}For Version 9}\\[3pt]
+\noindent\makebox[\linewidth][c]{\includegraphics[width=2in]{graphics/MIA9}}\\[3pt]
+That is, select \textbf{Allow all web sites}\par\medskip
+\noindent\makebox[\linewidth][c]{\bfseries\normalsize\color{blue}For Version 10}\\[3pt]
+\noindent\makebox[\linewidth][c]{\includegraphics[width=2in]{graphics/MIAX}}\\[3pt]
+\textbf{Allow PDF files to access all web sites}\par\medskip
+Exit the dialogs, and try \textbf{YT4PDF}!
+\end{minipage}
+
+\newpage
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIA9.eps b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIA9.eps
new file mode 100644
index 0000000000..e68a0a0b87
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIA9.eps
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIAX.eps b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIAX.eps
new file mode 100644
index 0000000000..71bdbbc0c4
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/MIAX.eps
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/trustmanager.eps b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/trustmanager.eps
new file mode 100644
index 0000000000..ee141a72ec
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/trustmanager.eps
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/yt_icon_sm.eps b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/yt_icon_sm.eps
new file mode 100644
index 0000000000..2e6e0ff10e
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/graphics/yt_icon_sm.eps
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-1.tex b/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-1.tex
new file mode 100644
index 0000000000..fac944ab7a
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-1.tex
@@ -0,0 +1,93 @@
+\documentclass{article}
+\usepackage{amsmath}
+%
+% the driver line is not necessary if you
+% have aebpro.cfg configured to your driver.
+%
+\usepackage[%
+ web={designv,pro,tight,usesf,usetemplates},
+ eforms,graphicxsp={showembeds},aebxmp
+]{aeb_pro}
+\usepackage{rmannot}
+\usepackage{yt4pdf}
+\usepackage{multicol}
+
+\textBgColor{lightgray}
+
+\DeclareDocInfo
+{
+ title=The \texorpdfstring{\textsf{yt4pdf} Package\\[3pt]}{yt4pdf Package: }Demo 1 of You Tube API,
+ author=D. P. Story,
+ university=Acro\negthinspace\TeX.Net,
+ email=dpstory@acrotex.net,
+ subject={Live streamed video from YouTube.com},
+ keywords={You Tube, AeB, rmannot},
+ talksite=\url{http://www.acrotex.net},
+ talkdate={\today}
+}
+\talkdateLabel{Published:}
+
+\def\AcroTeX{Acro\!\TeX}
+
+\makePoster{pdfyt_poster}{pdfyt_poster}
+
+\parindent=0pt\parskip6pt
+\rheader{}
+
+\DeclarePageLayout{footskip=29pt}
+
+\declarePlayList{\playList}{% dps note I've put these parentheses within braces, that was the problem.
+ \ytIdTitle{Kung-Fu Fighting {(Bruce Lee version)}}{GZ9e3Dy7obA}
+ \ytIdTitle{Kung-Fu Fighting {(Original, must view on YouTube)}}{jhUkGIsKvn0}
+ \ytIdTitle{RAF Sculthorpe {(Watch for my Mom!)}}{K7H8QghVs9k}
+ \ytIdTitle{Rocket Jump}{7XzdZ4KcI8Y}
+ \ytIdTitle{Abdul And Cleopatra - Jonathan Richman and the Modern Lovers}{mLDF5MBMWHE}
+}
+
+\begin{document}
+
+\maketitle
+
+\input{config_intacc.def}
+
+\begin{center}\bfseries\Large\color{blue}YT4PDF\end{center}
+
+
+%\previewtrue
+
+\begin{minipage}{571bp/2}
+\ytRmAnnot[poster=pdfyt_poster,deactivated=pageclose]{YouTube}{571bp/2}{330bp/2}
+\end{minipage}\hfill
+\begin{minipage}{\linewidth-290bp-10bp}\centering
+\ytPlayToggle{1in}{11bp}\\[3bp]
+\ytStopLoading[\textSize{0}]{1in}{11bp}\\[3bp]
+\ytMuteToggle{1in}{11bp}\\[3bp]
+\ytRewind{1in}{11bp}\\[3bp]
+\ytSelect[\textSize{0}]{eNzrn8-JFSE}{1in}{11bp}\\[6bp]
+\ytOpenWeb[\textSize{0}]{1in}{11bp}
+\end{minipage}
+
+\medskip
+
+\begin{flushleft}
+\raggedcolumns\bfseries
+Favorites to play:\vspace{-.5\baselineskip}
+\begin{multicols}{2}\ytPlayList{GZ9e3Dy7obA}{\playList}%
+\begin{itemize}
+\item \ytComboList{\linewidth-1bp-33bp}{11bp}\kern1bp\ytComboBtn[\TU{Click to play, shift-click to load thumbnail only}]{33bp}{11bp}
+\item \ytvId{_iUnOpPEg0w}{TegrityGuy}
+
+\item \ytvId*{eNzrn8-JFSE}{Open at Adobe} (load thumbnail)
+
+\columnbreak
+
+\item \ytvId{q-iiFo-6Vi0}{Digital Signature in 9.0 Pro}
+\item \ytvId{5y9-EVmreU4}{Lori's Corner: Episode \#1}
+\item \ytvId{T9Yzo_hlwP0}{Intro to PDF Portfolios}
+\end{itemize}
+\end{multicols}
+\end{flushleft}
+
+
+
+\end{document}
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-2.tex b/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-2.tex
new file mode 100644
index 0000000000..558b39288e
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-2.tex
@@ -0,0 +1,152 @@
+\documentclass{article}
+\usepackage{amsmath}
+%
+% the driver line is not necessary if you
+% have aebpro.cfg configured to your driver.
+%
+\usepackage[%
+ web={designv,pro,tight,usesf,usetemplates},
+ eforms,graphicxsp={showembeds},aebxmp
+]{aeb_pro}
+\usepackage{yt4pdf}
+\usepackage{picins}
+
+% \textBgColor{lightgray}
+
+\DeclareDocInfo
+{
+ title=The \texorpdfstring{\textsf{yt4pdf} Package\\[3pt]}{yt4pdf Package: }Demo 2 of You Tube API,
+ author=D. P. Story,
+ university=Acro\negthinspace\TeX.Net,
+ email=dpstory@acrotex.net,
+ subject={Live streamed video from YouTube.com},
+ keywords={You Tube, AeB, rmannot},
+ talksite=\url{http://www.acrotex.net},
+ talkdate={\today}
+}
+\talkdateLabel{Published:}
+
+\def\AcroTeX{Acro\!\TeX}
+
+\makePoster{pdfyt_poster}{pdfyt_poster}
+\makePoster{yt_poster}{graphics/yt_icon_sm}
+
+\parindent=0pt\parskip6pt
+\rheader{}
+
+\DeclarePageLayout{footskip=15.5pt}
+
+%\previewtrue
+
+\declarePlayList{\playList}{%
+ \ytIdTitle{Kung-Fu Fighting {(Bruce Lee version)}}{GZ9e3Dy7obA}
+ \ytIdTitle{Kung-Fu Fighting {(Original, must view on YouTube)}}{jhUkGIsKvn0}
+ \ytIdTitle{RAF Sculthorpe {(Watch for my Mom!)}}{K7H8QghVs9k}
+ \ytIdTitle{Rocket Jump}{7XzdZ4KcI8Y}
+}
+
+%
+% Note: popupmenu package version 1.0 (2010/09/18) or later required here.
+%
+\begin{popupmenu}{YTMenu}
+ \puIdTitle{Select a You Tube Video}{} % A title has no yt Id
+ \begin{submenu}{title=Music Videos}
+ \puIdTitle{Kung-Fu Fighting (Bruce Lee version)}{GZ9e3Dy7obA}
+ \puIdTitle{Kung-Fu Fighting (Original, view on You Tube)}{jhUkGIsKvn0}
+ \puIdTitle{Ink Spots - If I didn't care}{rvwfLe6sLis}
+ \puIdTitle{Ink Spots - My Prayer}{h7KJCns5v3g}
+ \end{submenu}
+ \begin{submenu}{title=Adobe Related Videos}
+ \puIdTitle{Open at Adobe}{eNzrn8-JFSE}
+ \puIdTitle{Lori's Corner Episode \#1}{5y9-EVmreU4}
+ \puIdTitle{Intro to PDF Portfolios}{T9Yzo_hlwP0}
+ \end{submenu}
+ \begin{submenu}{title=Action Videos}
+ \puIdTitle{Rocket Jump}{7XzdZ4KcI8Y}
+ \puIdTitle{AimBot}{NYGlWjIKoY4}
+ \puIdTitle{Flower Warfare}{031Dshcnso4}
+ \puIdTitle{Modern Warfare: Frozen Crossing Pt. 1}{rzQMGMuD1sU}
+ \puIdTitle{Modern Warfare: Frozen Crossing Pt. 2}{a08ViuvORRM}
+ \end{submenu}
+\end{popupmenu}
+
+% After defining all menus used with YouTube videos, we declare them using \ytPopupMenuData
+% The argument is a token list: \ytPopupMenuData{\myEducationMenu\myFunMenu...}
+\ytPopupMenuData{\YTMenu}
+
+\begin{document}
+
+\maketitle
+
+\input{config_intacc.def}
+
+
+\begin{center}\bfseries\Large\color{blue}YT4PDF\end{center}
+
+\DeclareYTName{ytInWindow}
+\ytBtnPresets{\BC{.5 0 0}\W{1}\S{S}\textFont{HeBo}}%
+{\setlength{\dimen0}{(\linewidth)/6-1bp}\xdef\ytWidth{\the\dimen0}} %-.5bp
+\cfooter{\makebox[\linewidth][c]{\kern1bp\ytPlayToggle{\ytWidth}{11bp}\kern1bp\ytStopLoading[\textSize{0}]{\ytWidth}{11bp}\kern1bp
+\ytMuteToggle{\ytWidth}{11bp}\kern1bp\ytRewind{\ytWidth}{11bp}\kern1bp
+\ytSelect[\textSize{0}]{eNzrn8-JFSE}{\ytWidth}{11bp}\kern1bp\ytOpenWeb[\textSize{0}]{\ytWidth}{11bp}}}
+
+\newcommand{\myPBPresets}{\CA{YT Menu}\textColor{0 0 1}\W1\BC{}\textSize{0}
+ \S{S}\AA{\AAMouseEnter{\JS{ytPopupMenu("\ytCurrRMAName",YTMenu)}}}}
+
+\setWindowDimPos{position={halign=center,valign=center,hoffset=0,voffset=0},
+ width={default=571},height={default=330}}%
+
+\setlength{\pichskip}{3pt}
+\parpic(.25in,.25in){%
+\parbox{.25in}{\offinterlineskip\resizebox{.25in}{!}
+{\ytRmAnnot[windowed,poster=yt_poster,deactivated=pageclose]{ytInWindow}{72bp}{72bp}}}}
+\pushButton[\presets{\myPBPresets}]{myYTMenu}{20bp}{5bp}
+On this page, the You Tube annotation is icon size and the video is played
+in a floating window.
+
+Move the window by dragging its title bar. Resize it by dragging the
+lower-right corner. Close the window by clicking on the upper-right
+corner.
+
+The \textsf{YT Menu} uses the \textsf{popupmenu} package. Alternatively,
+we could just use the combo box that has been used already, but, I thought
+we might try something different.
+
+\newpage
+
+\ytRmAnnot[posternote=AcroTeX PDF Tube,deactivated=pageclose]{YouTube1}{571bp/2}{330bp/2}\\
+\ytPlayList{GZ9e3Dy7obA}{\playList}\ytComboListPresets{\textSize{9}}%
+\ytComboList{(571bp/2)-1bp-33bp}{11bp}\kern1bp\ytComboBtn[\TU{Click to play, shift-click to load thumbnail only}]{33bp}{11bp}
+
+\newpage
+\cfooter{}
+\begin{minipage}{571bp/2}
+\ytRmAnnot[posternote=AcroTeX PDF Tube,deactivated=pageclose]{YouTube2}{571bp/2}{330bp/2}\\
+\ytPlayList{GZ9e3Dy7obA}{\playList}\ytComboListPresets{\textSize{9}}%
+\ytComboList{(571bp/2)-1bp-33bp}{11bp}\kern1bp\ytComboBtn[\TU{Click to play, shift-click to load thumbnail only}]{33bp}{11bp}
+\end{minipage}\hfill
+\begin{minipage}{\linewidth-290bp-10bp}\centering
+\ytPlayToggle{1in}{11bp}\\[3bp]
+\ytStopLoading[\textSize{0}]{1in}{11bp}\\[3bp]
+\ytMuteToggle{1in}{11bp}\\[3bp]
+\ytRewind{1in}{11bp}\\[3bp]
+\ytSelect[\textSize{0}]{eNzrn8-JFSE}{1in}{11bp}\\[6bp]
+\ytOpenWeb[\textSize{0}]{1in}{11bp}
+\end{minipage}
+
+\newpage
+
+\begin{center}
+\begin{minipage}{571bp/2}
+\ytRmAnnot[poster=pdfyt_poster,deactivated=pageclose]{YouTube3}{571bp/2}{330bp/2}\\
+\ytPlayList{GZ9e3Dy7obA}{\playList}\ytComboListPresets{\textSize{9}}%
+\ytComboList{(571bp/2)-1bp-33bp}{11bp}\kern1bp\ytComboBtn[\TU{Click to play, shift-click to load thumbnail only}]{33bp}{11bp}\\[1bp]
+{\setlength{\dimen0}{(\linewidth+1bp)/6-1bp}\xdef\ytWidth{\the\dimen0}}%
+\ytPlayToggle{\ytWidth}{11bp}\kern1bp\ytStopLoading[\textSize{0}]{\ytWidth}{11bp}\kern1bp
+\ytMuteToggle{\ytWidth}{11bp}\kern1bp\ytRewind{\ytWidth}{11bp}\kern1bp
+\ytSelect[\textSize{0}]{eNzrn8-JFSE}{\ytWidth}{11bp}\kern1bp
+\ytOpenWeb[\textSize{0}\CA{View on Web}]{\ytWidth}{11bp}
+\end{minipage}
+\end{center}
+
+\end{document}
diff --git a/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-3.tex b/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-3.tex
new file mode 100644
index 0000000000..03625c9fe1
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/examples/yt4pdf-3.tex
@@ -0,0 +1,88 @@
+%\ytIdTitle{No Ordinary Love - Sade}{_WcWHZc8s2I}
+\documentclass{article}
+\usepackage{amsmath}
+%
+% the driver line is not necessary if you
+% have aebpro.cfg configured to your driver.
+%
+\usepackage[%
+ web={designv,pro,tight,usesf,usetemplates},
+ eforms,graphicxsp={showembeds},aebxmp
+]{aeb_pro}
+\usepackage{yt4pdf}
+
+%\margins{10bp}{10bp}{.5in}{.5in} % left,right,top, bottom
+%\screensize{7.5in}{10in} % height,width dimensions
+
+\textBgColor{lightgray}
+
+\DeclareDocInfo
+{
+ title=The \texorpdfstring{\textsf{yt4pdf} Package\\[3pt]}{yt4pdf Package: }Demo 3 of You Tube API,
+ author=D. P. Story,
+ university=Acro\negthinspace\TeX.Net,
+ email=dpstory@acrotex.net,
+ subject={Live streamed video from YouTube.com},
+ keywords={You Tube, AeB, rmannot},
+ talksite=\url{http://www.acrotex.net},
+ talkdate={\today}
+}\talkdateLabel{Published:}
+
+\def\AcroTeX{Acro\!\TeX}
+
+\makePoster{pdfyt_poster}{pdfyt_poster}
+\makePoster{yt_poster}{graphics/yt_icon_sm}
+
+\parindent=0pt\parskip6pt
+\rheader{}
+
+% dps need to change the catcode of subscript (_) before hyperref gets
+% chance to look at it.
+\declarePlayList{\playList}{%
+ \ytIdTitle{Kung-Fu Fighting {(Bruce Lee version)}} {GZ9e3Dy7obA}
+ \ytIdTitle{Kung-Fu Fighting {(Original, must view on YouTube)}}{jhUkGIsKvn0}
+ \ytIdTitle{RAF Sculthorpe {(Watch for my Mom!)}} {K7H8QghVs9k}
+ \ytIdTitle{Rocket Jump} {7XzdZ4KcI8Y}
+ \ytIdTitle{No Ordinary Love - Sade} {_WcWHZc8s2I}
+}
+
+\begin{document}
+
+\maketitle
+
+\input{config_intacc.def}
+
+\begin{center}\bfseries\Large\color{blue}YT4PDF\end{center}
+
+\ytBtnPresets{\BC{.5 0 0}\W{1}\S{S}\textFont{HeBo}}%
+
+\resizebox{\linewidth}{!}{\ytRmAnnot[play=eNzrn8-JFSE,poster=pdfyt_poster,
+ deactivated=pageclose]{ytPlayOnOpen}{571bp}{330bp}}\\
+{\setlength{\dimen0}{(\linewidth-2bp)/6}\xdef\ytWidth{\the\dimen0}}%
+\ytPlayToggle{\ytWidth}{11bp}\ytStopLoading{\ytWidth}{11bp}%
+\ytMuteToggle{\ytWidth}{11bp}\ytRewind{\ytWidth}{11bp}%
+\ytSelect{eNzrn8-JFSE}{\ytWidth}{11bp}\ytOpenWeb[\textSize{0}]{\ytWidth}{11bp}%
+
+\ytPlayList{GZ9e3Dy7obA}{\playList}
+
+% We have to disable the RMA so the combo box can be seen above it.
+Playlist: \ytComboList[\A{\JS{\thisNamedRMA(ytPlayOnOpen).activated=false;}}]{2.5in}{11bp}\kern1bp\ytComboBtn[\TU{Click to play, shift-click to load thumbnail only}]{33bp}{11bp}
+
+\newpage
+\begin{center}\bfseries\Large\color{blue}YT4PDF\end{center}
+
+\resizebox{\linewidth}{!}{\ytRmAnnot[load=GZ9e3Dy7obA,poster=pdfyt_poster,
+ deactivated=pageclose]{ytLoadOnOpen}{571bp}{330bp}}\\
+\ytBtnPresets{\BC{.5 0 0}\W{1}\S{S}\textFont{HeBo}}%
+{\setlength{\dimen0}{(\linewidth-2bp)/6}\xdef\ytWidth{\the\dimen0}}%
+\ytPlayToggle{\ytWidth}{11bp}\ytStopLoading{\ytWidth}{11bp}%
+\ytMuteToggle{\ytWidth}{11bp}\ytRewind{\ytWidth}{11bp}%
+\ytSelect{eNzrn8-JFSE}{\ytWidth}{11bp}\ytOpenWeb[\textSize{0}]{\ytWidth}{11bp}%
+
+\ytPlayList{GZ9e3Dy7obA}{\playList}
+
+% We have to disable the RMA so the combo box can be seen above it.
+Playlist: \ytComboList[\A{\JS{\thisNamedRMA(ytLoadOnOpen).activated=false;}}]{2.5in}{11bp}\kern1bp\ytComboBtn[\TU{Click to play, shift-click to load thumbnail only}]{33bp}{11bp}
+
+
+\end{document}
diff --git a/obsolete/macros/latex/contrib/yt4pdf/graphics/pdfyt_poster.eps b/obsolete/macros/latex/contrib/yt4pdf/graphics/pdfyt_poster.eps
new file mode 100644
index 0000000000..97c7ecd154
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/graphics/pdfyt_poster.eps
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/swf/pdf_tube_basic.swf b/obsolete/macros/latex/contrib/yt4pdf/swf/pdf_tube_basic.swf
new file mode 100644
index 0000000000..5dde7b7cb5
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/swf/pdf_tube_basic.swf
Binary files differ
diff --git a/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.cfg b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.cfg
new file mode 100644
index 0000000000..7a8e5de800
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.cfg
@@ -0,0 +1,10 @@
+%
+% yt4pdf config file. Delete the \endinput below and replace the path
+% provided with the path to the swf folder of your yt4pdf installation. This
+% path is used to locate the pdf_tube_basic.swf file, used to play YouTube
+% videos.
+%
+\endinput
+\renewcommand{\ytFolder}{C:/Users/Public/Documents/My TeX Files/%
+tex/latex/aeb/aebpro/yt4pdf/swf}
+\endinput
diff --git a/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.dtx b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.dtx
new file mode 100644
index 0000000000..4ca3bcc0b6
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.dtx
@@ -0,0 +1,629 @@
+%\iffalse
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% yt4pdf.sty package, %%
+%% Copyright (C) 2010--2016 D. P. Story %%
+%% dpstory@uakron.edu %%
+%% %%
+%% This program can redistributed and/or modified under %%
+%% the terms of the LaTeX Project Public License %%
+%% Distributed from CTAN archives in directory %%
+%% macros/latex/base/lppl.txt; either version 1 of the %%
+%% License, or (at your option) any later version. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%</copyright>
+%<package>\NeedsTeXFormat{LaTeX2e}[1997/12/01]
+%<package>\ProvidesPackage{yt4pdf}
+%<package> [2016/10/04 v1.1 yt4pdf: Play You Tube videos in PDF, Acrobat Distiller only (dps)]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[colorlinks,hyperindex]{hyperref}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+%\EnableCrossrefs \CodelineIndex
+\begin{document}
+\def\CMD#1{\textbackslash#1}
+ \GetFileInfo{yt4pdf.sty}
+ \title{\textsf{yt4pdf}: Package for playing You Tube Videos}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@uakron.edu}}
+ \date{processed \today}
+ \maketitle
+ \tableofcontents
+ \let\Email\texttt
+ \DocInput{yt4pdf.dtx}
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+% \MakeShortVerb{|}
+% \StopEventually{}
+%
+% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let}
+% \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi}
+% \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup}
+% \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand}
+% \DoNotIndex{\space,\@empty,\special}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+% \begin{macrocode}
+\ProcessOptions
+\RequirePackage{rmannot}
+\RequirePackage{popupmenu}[2010/09/18]
+% \end{macrocode}
+%
+% \section{Introduction}
+%
+% I believe that I was vaguely aware of the \href{http://code.google.com/apis/youtube/flash_api_reference.html}
+%{YouTube ActionScript 3.0 Player}, but never pursued it because of my
+%general lack of interest in You Tube (\url{www.youtube.com}). Recently, I
+%became aware of a very nice demo PDF that used the API, see
+%\href{http://www.uvsar.com/pdftube/}{PDF Tube - YouTube API wrapper for PDF
+%documents}. 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
+%UVSAR (\url{www.uvsar.com}). The UVSAR's sample demo also appeared in the forums of
+%the \href{http://acrobatusers.com/forums/aucbb/viewtopic.php?pid=62134}{Acrobat User
+%Community}.
+%
+% \section{Implementation}
+%
+% \DescribeMacro{\ytFolder} The path to the folder containing
+% the \texttt{pdf\_Tube\_basic.swf} file. This path is set through
+% the \texttt{yt4pdf.cfg} file.
+% \begin{macrocode}
+\newcommand{\ytFolder}{C:/Users/Public/Documents/My TeX Files/%
+tex/latex/aeb/aebpro/yt4pdf/swf}
+% \end{macrocode}
+% \DescribeMacro{ytSWF} The path to \texttt{pdf\_Tube\_basic.swf}, used
+% as an argument for the \cs{rmAnnot} macro.
+% \begin{macrocode}
+\saveNamedPath{ytSWF}{\ytFolder/pdf_tube_basic.swf}
+% \end{macrocode}
+% We input the file \texttt{yt4pdf.cfg} which should contain a re-definition
+% of \cs{ytFolder}, the path to the user's installation containing the
+% \texttt{pdf\_tube\_basic.swf}.
+% \begin{macrocode}
+\InputIfFileExists{yt4pdf.cfg}{}{}
+% \end{macrocode}
+% \subsection{The YouTube RMA}
+% In this section, we define \cs{ytRmAnnot}, a rich media annotation, that is used
+% to play YouTube videos.
+% \begin{macrocode}
+% \end{macrocode}
+% An internal command for getting the rma object based on the current page and the
+% name of the annot.
+% \begin{macrocode}
+\def\yt@namegdef#1{\expandafter\gdef\csname #1\endcsname}
+\def\yt@namexdef#1{\expandafter\xdef\csname #1\endcsname}
+\def\thisNamedRMA(#1){this.getAnnotRichMedia(this.pageNum,"#1")}
+% \end{macrocode}
+% \DescribeMacro{play} This is a key-value pair for the \cs{ytRmAnnot} command.
+% The value of \texttt{play} is a YouTube video ID. When the page the annot is
+% on, the video will be played.
+% \begin{macrocode}
+\define@key{ytRmAnnot}{play}[]{\def\ytrmannot@play{#1}}
+\define@key{ytRmAnnot}{load}[]{\def\ytrmannot@load{#1}}
+\setkeys{ytRmAnnot}{play,load}
+\let\ytCurrRMAName\@empty
+% \end{macrocode}
+% \begin{macro}{\ytRmAnnot}
+% The \cs{ytRmAnnot} creates a rich media annotation using the \textsf{rmannot} package.
+% It uses the SWF file \texttt{pdf\_Tube\_basic.swf} referenced here by the name of
+% \texttt{ytSWF}. The command takes four parametrs:
+% \begin{itemize}
+% \item[\texttt{[\#1]}]: The optional first parameter takes the key-value pairs of the
+% \cs{rmAnnot} command, plus the \texttt{play} key, defined above. The play key is used
+% to set the annot up so it plays automatically when the page is opened.
+% \item[\texttt{\#2}]: The name of this annot, unique to the document. This should be
+% a ``JavaScript variable.'' The name populates the command \cs{ytCurrRMAName}, which is
+% needed for the other commands in this package.
+% \item[\texttt{\#3}]: The width of the annot
+% \item[\texttt{\#4}]: The height of the annot
+% \end{itemize}
+% \begin{macrocode}
+\newcommand{\ytRmAnnot}[4][]{\begingroup
+ \@ifundefined{#2@ytrmname}{\yt@namegdef{#2@ytrmname}{#1}}%
+ {\PackageError{yt2pdf}{The name `#2' is already defined
+ for\MessageBreak this \string\ytRmAnnot}{Choose a unique
+ name for this \string\ytRmAnnot, one different from `#2'.}}%
+ \setkeys*{ytRmAnnot}{#1}\gdef\ytCurrRMAName{#2}%
+ \ifx\ytrmannot@play\@empty\else
+ \makebox[0pt][l]{\pushButton[\BC{}\BG{}\S{S}
+ \AA{\AAPageOpen{aebStartPlayer(\thisNamedRMA(#2),%
+ "\ytrmannot@play",true);}\AAPageClose{aebCancelWait(false);}}
+ ]{btnRmAnnot#2}{1bp}{1bp}}\let\ytrmannot@load\@empty\fi
+ \ifx\ytrmannot@load\@empty
+ \else\makebox[0pt][l]{\pushButton[\BC{}\BG{}\S{S}
+ \AA{\AAPageOpen{aebStartPlayer(\thisNamedRMA(#2),%
+ "\ytrmannot@load",false);}\AAPageClose{aebCancelWait(false);}}
+ ]{btnRmAnnot#2}{1bp}{1bp}}\fi
+ \rmAnnot[\XKV@rm,name=#2,enabled=onclick]{#3}{#4}{ytSWF}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \DescribeMacro{\DeclareYTName} Defines the internal macro
+% \cs{ytCurrRMAName}. This command is needed in the case were links, or
+% control buttons come before the RMA annot. The first parameter is the
+% page on which the target annot resides, the default is the current page.
+% The second argument is the name of the target annot.
+% code passed is
+% \begin{macrocode}
+\newcommand{\DeclareYTName}[2][]{\def\argi{#1}%
+ \ifx\argi\@empty\gdef\ytCurrRMAName{#2}\else
+ \gdef\ytCurrRMAName{[#1]#2}\fi
+}
+% \end{macrocode}
+% \subsection{Button Controls}
+% We present six control buttons for the rm annot
+% \begin{macro}{\ytBtnPresets}
+% The default appearances of the control buttons.
+% \begin{macrocode}
+\newcommand{\ytBtnPresets}[1]{\def\yt@Presets{#1}}
+\ytBtnPresets{\BC{.5 0 0}\S{S}\textFont{HeBo}\autoCenter{n}}
+% \end{macrocode}
+% \end{macro}
+% The following six commands all take three parameters, the first one optional
+%\begin{enumerate}
+% \item[\texttt{\#1}:] Standard key-value pairs for modifying the
+% appearance of an eforms form field.
+% \item[\texttt{\#2}:]
+% \texttt{this.getAnnotRichMedia(this.pageNum+1, "YouTube")}.
+% \item[\texttt{\#3}:] the width of the button
+% \item[\texttt{\#4}:] the height of the button
+%\end{enumerate}
+% \begin{macro}{\ytPlayToggle}
+% This button has several functions: Pause/Play/Buffering.
+% Initially the button label is on Pause (pressing it pauses a playing video);
+% the button label reads Play when the video is loaded and paused (pressing it plays or resumes
+% the video); while the video is loading, the button label is Buffering...
+% \begin{macro}{\ytStopLoading} Pressing this button stops the streaming of the currently playing
+% video. If the video is started again, there will be some buffering before the play begins.
+% \begin{macro}{\ytMuteToggle} This button toggles and sound off and on. Button labels are
+% MUTE and UNMUTE.
+% \begin{macro}{\ytRewind} If the video is playing, this button
+% stops the video, rewinds it to the beginning, and starts play again. If the video
+% is paused, this button rewinds the video to the beginning, the video remains paused.
+% \begin{macro}{\ytSelect} When this button is pressed, a response dialog opens.
+% The user enters a YouTube video ID into the field. On pressing OK, this video is played.
+% \item[] \textbf{Note:} Some YouTube videos are security
+% restricted and cannot be played through an embedded player, such as the one used here.
+% If video ID of a video that does not allow embedded playback, a dialog appears giving
+% the use to view the video on the web.
+% \begin{macro}{\ytOpenWeb} The user has the option of pressing this button to view the
+% currently video on the web at \texttt{www.youtube.com}.
+% \begin{macrocode}
+% \end{macrocode}
+% The \cs{oyt@RMA} command takes the second parameter of each of the six button commands,
+% and expands it into the appropriate JS code.
+% \begin{macrocode}
+\newcommand{\oyt@RMA}[1][this.pageNum]{\oyt@@RMA[#1]}
+\def\oyt@@RMA[#1]#2\@nil{\gdef\yt@CurrRMAName{#2}%
+ \def\yt@rm{this.getAnnotRichMedia(#1,"#2")}}
+% \end{macrocode}
+% We finally define the six control buttons.
+% \begin{macrocode}
+\newcommand{\ytPlayToggle}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrPAUSE}\presets{\yt@Presets}#1
+ \A{\JS{ytPlayToggle(\yt@rm);}}]{playToggle}{#2}{#3}%
+}
+\newcommand{\ytStopLoading}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrStopLoading}\presets{\yt@Presets}#1
+ \A{\JS{\yt@rm.callAS("stopVideo");}}]{vidStop}{#2}{#3}%
+}
+\newcommand{\ytMuteToggle}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrMUTE}\presets{\yt@Presets}#1
+ \A{\JS{ytMuteToggle(\yt@rm);}}]{muteToggle}{#2}{#3}%
+}
+\newcommand{\ytRewind}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrREWIND}\presets{\yt@Presets}#1
+ \A{\JS{ytRewind(\yt@rm);}}]{ytRewind}{#2}{#3}%
+}
+\newcommand{\ytSelect}[4][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrLoadVideo}\presets{\yt@Presets}#1
+ \A{\JS{ytSelect(\yt@rm,"#2");}}]{selectVid}{#3}{#4}%
+}
+\newcommand{\ytOpenWeb}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrWatchOnWeb}\presets{\yt@Presets}#1
+ \A{\JS{ytOpenWeb(\yt@rm);}}]{playOnWeb}{#2}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \subsection{Defining a Video Id}
+% \subsubsection{Using a Link}
+% \begin{macro}{\ytvIdPresets}
+% The options for the \cs{ytvId} link. The default is given below in the definition.
+% \begin{macro}{\ytvId}
+% The \cs{ytvId} is link which when pressed plays the video whose Video Id is passed as
+% its second argument.
+% \begin{itemize}
+% \item[\texttt{[\#1]}:] The name of the annot this video is to play in. When
+% this parameter is not specified, the default
+% is \cs{ytCurrRMAName}, which is defined by the \cs{ytRmAnnot} macro.
+% \item[\texttt{\#2}:] The video Id for the YouTube video to play
+% \item[\texttt{\#3}:] The text that displays the link.
+%\end{itemize}
+% \begin{macrocode}
+\newcommand{\ytvIdPresets}[1]{\def\yt@vIdPresets{#1}}
+\ytvIdPresets{\linktxtcolor{webbrown}}
+\newcommand{\ytvId}{\@ifstar{\def\yt@lnk@play{false}\yt@@vId}
+ {\def\yt@lnk@play{true}\yt@@vId}}
+\newcommand{\yt@@vId}[3][\ytCurrRMAName]{%
+ \oyt@RMA#1\@nil\setLink[\presets{\yt@vIdPresets}
+ \A{\JS{aebStartPlayer(\yt@rm,"#2",\yt@lnk@play);}}]{#3}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \subsubsection{Using a Combobox}
+% \begin{macro}{\ytComboList}
+% The \cs{ytComboList} is a combox box of video Ids and titles. The user selects a
+% video based on its title, then presses the PLAY button. The two commands
+% \cs{ytComboListPresets} and \cs{ytComboBtnPresets} are used to set the appearances
+% of the combo box and the PLAY button.
+%\begin{itemize}
+% \item[\texttt{[\#1]}:] eforms key-value pairs
+% \item[\texttt{\#2}:] The width of the combo box
+% \item[\texttt{\#3}:] The height of the combo box
+%\end{itemize}
+% \begin{macro}{\ytComboBtn}
+% A button to play the selection made in the combo box.
+% \begin{macro}{\ytPlayList}
+% This command is executed before \cs{ytComboBtn} to set the play list,
+% and the default value.
+% \begin{macrocode}
+\newcommand{\ytComboListPresets}[1]{\def\yt@ComboListPresets{#1}}
+\newcommand{\ytComboBtnPresets}[1]{\def\yt@ComboBtnPresets{#1}}
+\let\yt@ComboListPresets\@empty
+\let\yt@ComboBtnPresets\@empty
+% \end{macrocode}
+% Use the \cs{ytPlayList} to pass the play list to the next combo box
+% \begin{macrocode}
+\newcommand{\ytPlayList}{\begingroup\@makeother\_\@makeother\'
+ \ytPlayList@i}
+\def\ytPlayList@i#1#2{\gdef\yt@pl@def{#1}\xdef\yt@pl@pl{#2}\endgroup}
+% \end{macrocode}
+% \begin{macro}{\declarePlayList}
+% A video ID may contain characters {\LaTeX} considers special, so we sanitize these
+% special characters before reading in the video ID. Near as I can determine, a video
+% id consists of 11 characters comprising combinations of letters (A-Z,a-z) numbers
+% (0-9) and special characters underscore and hyphen (\_ and -). We sanitize the last two.
+%\begin{verbatim}
+%\declarePlayList{<\cmd>}{
+% \ytIdTitle{<text>}{<VidID>}
+% ...
+% \ytIdTitle{<text>}{<VidID>}
+% }
+%\end{verbatim}
+%The entries may also be in raw form `|[(<VidID>)(<text>)]|'. Note that the two arguments are
+%enclosed in parentheses, there is a problem with parsing if \texttt{<text>} itself contains
+%parentheses. Within \texttt{<text>} enclose matching parentheses in braces, for example,
+%\begin{flushleft}|\ytIdTitle{Kung-Fu Fighting {(Bruce Lee version)}}{GZ9e3Dy7obA}|\end{flushleft}
+% \changes{v1.1}{2016/10/04}{Added \string\cs{declarePlayList}}
+% \begin{macrocode}
+\newcommand{\declarePlayList}{\bgroup
+ \@makeother\_\@makeother\-
+ \yt@declarePlayList}
+\def\yt@declarePlayList#1#2{%
+ \gdef#1{#2}\egroup}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytIdTitle}
+% A convenience command to lay out the playlist, for example,
+%\begin{verbatim}
+%\declarePlayList{\playListii}{%
+% \ytIdTitle{Elfego Baca}{gRwa0MdeqVs}
+% \ytIdTitle{Texas John Slaughter}{7yrk1BvtLE8}
+% \ytIdTitle{Swamp Fox}{-SBPnw5riLM&NR}
+% \ytIdTitle{Zorro Promo}{cKludhxEoJ0}
+%}
+%\end{verbatim}
+% \begin{macrocode}
+\newcommand{\ytIdTitle}[2]{[(#2)(#1)]}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytNewBaseName}
+% \cs{ytNewBaseName} is a not so perfect attempt to fix the problem of having
+% multiple combo boxes on one page. The field names need to be distinct. We
+% can pass the new field name using this command.
+% \begin{macro}{\ytResetBaseName}
+% This command resets the field name back to its default value.
+% Both of these commands apply to \cs{ytComboList} and to \cs{ytComboBtn}.
+% \changes{v1.0}{2011/08/23}{Added \cs{ytBaseName} to pass a field title to
+% combo box and controlling play button}
+% \begin{macrocode}
+\newcount\ytListCnt \ytListCnt=0
+\newcommand{\ytNewBaseName}[1][]{%
+ \def\yt@argi{#1}\ifx\yt@argi\@empty\global\advance\ytListCnt1\relax
+ \gdef\yt@BaseName{\yt@CurrRMAName\the\ytListCnt}\else
+ \gdef\yt@BaseName{\yt@CurrRMAName#1}\fi
+}
+\newcommand{\ytResetBaseName}{\gdef\yt@BaseName{\yt@CurrRMAName}}
+\ytResetBaseName
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% Now we have the code for \cs{ytComboList}
+% \begin{macrocode}
+\newcommand{\ytComboList}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \comboBox[\DV{\yt@pl@def}\V{\yt@pl@def}
+ \presets{\yt@ComboListPresets}#1]{ytSelect\yt@BaseName}
+ {#2}{#3}{\yt@pl@pl}%
+}
+% \end{macrocode}
+% The parameters for \cs{ytComboBtn} are
+%\begin{itemize}
+% \item[\texttt{[\#1]}:] The the name of the \cs{ytRmAnnot} this selection is to play in
+% the default is \cs{ytCurrRMAName}.
+% \item[\texttt{\#2}:] The width of the combo box
+% \item[\texttt{\#3}:] The height of the combo box
+% the array of values and titles.
+%\end{itemize}
+% \begin{macrocode}
+\newcommand{\ytComboBtn}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrPLAY}\presets{\yt@ComboBtnPresets}#1
+ \A{\JS{var f=this.getField("ytSelect\yt@BaseName");\r
+ aebStartPlayer(\yt@rm,f.value,!event.shift);
+ }}]{ytSelectBtn\yt@BaseName}{#2}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \subsection{Support for the \textsf{popupmenu} package}
+% \begin{macro}{\ytPopupMenuData}
+% A command use to list the popupmenu data. It defines a command
+% \cs{ytPopupData} that is used in the JS support for popup menus.
+% \begin{macrocode}
+\newcommand{\ytPopupMenuData}[1]{{\toks0={// yt4pdf: Begin popup menu data^^J}%
+ \@tfor\yt@menu:=#1\do{%
+ \toks2=\expandafter{\yt@menu}%
+ \edef\@tmp@exp{\the\toks0\the\toks2^^J}%
+ \toks0=\expandafter{\@tmp@exp}%
+ }\xdef\ytPopupData{\the\toks0// End of popup menu data}%
+}}
+\def\ytPopupData{// No popup menu data defined}%
+% \begin{macro}{\puIdTitle}
+% A convenience macro for entering popupmenu data for youtube videos.
+%\begin{verbatim}
+%\puIdTitle{\string\"Sea Hunt\string\" TV serie}{MW-IZ67iADU}
+%\end{verbatim}
+% Note that we must protect the double quote.
+% \begin{macrocode}
+\newcommand{\puIdTitle}[2]{\item{title={#1},return={[\itemindex,'#2']}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Strings that can be localized}
+% The following strings are used on the buttons, and in the document level JS
+% \begin{macrocode}
+\newcommand{\ytStrPLAY}{PLAY}
+\newcommand{\ytStrREPLAY}{REPLAY}
+\newcommand{\ytStrPAUSE}{PAUSE}
+\newcommand{\ytStrBuffering}{Buffering...}
+\newcommand{\ytStrStopLoading}{Stop Loading}
+\newcommand{\ytStrMUTE}{MUTE}
+\newcommand{\ytStrUNMUTE}{UNMUTE}
+\newcommand{\ytStrREWIND}{REWIND}
+\newcommand{\ytStrLoadVideo}{Load Video}
+\newcommand{\ytStrWatchOnWeb}{Watch on YouTube}
+% response dialog box associated with ytSelect()
+\newcommand{\ytRespQues}{Enter the YouTube Video ID}
+\newcommand{\ytRespTitle}{Load a Video}
+\newcommand{\ytRespLabel}{ID:}
+% alert error messages
+\newcommand{\ytStrErrorVideoNotFound}{Error: Video not found}
+\newcommand{\ytStrErrorNoEmbed}{Error: This video does not allow
+ embedded playback \r\r Would you like to view this video
+ on the web?}
+\newcommand{\ytStrConnecTimedOut}{Connection timed out, try again.}
+% \end{macrocode}
+%
+% \subsection{Document level JavaScript}
+% \begin{macrocode}
+\begin{insDLJS*}[ytPlayToggle]{yt}
+\begin{newsegment}{yt4PDF: YouTube for PDF JavaScript}
+/*
+ Document-level script for YouTube player
+ Document-level script for the PDFtube embedded YouTube player
+ ***************************************************************
+ Functions to be called by buttons or links on the PDF
+ in each case, "rm" is the RichMedia annot containing the player
+ All these are optional and can be renamed or edited as required
+ ***********************************************************
+*/
+// toggle play/pause (button labels updated by event functions)
+function ytPlayToggle(rm) {
+ var ps = rm.callAS("getPlayerState");
+ rm.callAS((ps == 1)? "pauseVideo" : "playVideo");
+}
+// toggle mute (have to update button labels ourselves)
+function ytMuteToggle(rm) {
+ var im = rm.callAS("isMuted");
+ if (im) {
+ event.target.buttonSetCaption("\ytStrMUTE");
+ rm.callAS("unMute");
+ } else {
+ event.target.buttonSetCaption("\ytStrUNMUTE");
+ rm.callAS("mute");
+ }
+}
+// Ask the user for the ID number of a new video, and play it
+function ytSelect(rm,vID) {
+ var rsp = app.response({
+ cQuestion: "\ytRespQues",
+ cTitle: "\ytRespTitle",
+ cDefault: vID,
+ cLabel: "\ytRespLabel"});
+ if (rsp !=null && rsp != "")
+ aebStartPlayer(rm,rsp,true); // dps
+}
+// open the video's YouTube page in the web browser
+function ytOpenWeb(rm) {
+ var link = rm.callAS("getVideoUrl");
+ if (link != null) {
+ app.launchURL(link,true);
+ rm.activated = false;
+ }
+}
+// rewind (seek to zero)
+function ytRewind(rm) { rm.callAS("seekTo",0); }
+/*
+ ************************************************************
+ Functions called by the player itself, in response to events
+ as the events are "external", the annot is not the target.
+ These functions must exist and match the names in the SWF.
+ ***********************************************************
+*/
+function ytPlayerReady() {
+
+ // this is the place to load your default video - for example...
+ console.println("<YT> Player loaded and ready");
+ // this.getAnnotsRichMedia(this.pageNum)[0].callAS("loadVideoById",
+ // "eNzrn8-JFSE",0);
+ aebStartPlayer.isPlayerReady=true; // dps
+}
+function ytStateChange(st) {
+ // Possible values are unstarted (-1), ended (0), playing (1),
+ // paused (2), buffering (3), video cued (5)
+ var lbl = "";
+ console.println("<YT> State changed to " + st);
+ if (st == 0) lbl = "\ytStrREPLAY";
+ else if (st == 1) lbl = "\ytStrPAUSE";
+ else if (st == 3) lbl = "\ytStrBuffering";
+ else if (st == 2 || st == 5) lbl = "\ytStrPLAY";
+ if (lbl) this.getField("playToggle").buttonSetCaption(lbl);
+}
+function ytPlaybackQualityChange(str) {
+ // Possible values are "small", "medium", "large" and "hd720"
+ console.println("<YT> Quality changed to " + str);
+}
+function ytProgress(q) {
+ // q has four properties that you can use to update form fields,
+ // such as...
+ //this.getField("currentTime").value = q.CurrentTime;
+ //this.getField("Duration").value = q.Duration;
+ //this.getField("BytesLoaded").value = q.BytesLoaded;
+ //this.getField("BytesTotal").value = q.BytesTotal;
+}
+function ytError(err) {
+ // Video cannot be played
+ console.println("<YT> ERROR code " + err + " received");
+ if (err == 100)
+ app.alert("\ytStrErrorVideoNotFound", 0, 0, "YouTube");
+ else {
+ var resp=app.alert("\ytStrErrorNoEmbed", 1, 3, "YouTube");
+ if (resp==4) {
+ aebCancelWait(false);
+ ytOpenWeb(aebStartPlayer.annot);
+ }
+ }
+}
+/*
+ We start the player if the annot is activated, if not,
+ we set annot.activated=true, and wait for the widget to say it
+ is ready. When ready, ytPlayerReady() sets
+ aebStartPlayer.isPlayerReady=true
+*/
+function aebStartPlayer(rm,Id,bPlay) {
+ aebStartPlayer.annot=rm;
+ if (aebStartPlayer.annot.activated)
+ aebStartPlayer.annot.callAS(%
+(bPlay)?"loadVideoById":"cueVideoById",Id,0);
+ else {
+ aebCancelWait(false);
+ aebStartPlayer.annot.activated=true;
+ aebStartPlayer.isPlayerReady=false;
+ aebStartPlayer.twait=app.setInterval(%
+'aebWait4Ready(\"'+Id+'\",'+bPlay+');',250);
+ aebStartPlayer.to=app.setTimeOut("aebCancelWait(true)", 10000);
+ }
+}
+aebStartPlayer.isPlayerReady=false;
+aebStartPlayer.twait=null;
+aebStartPlayer.to=null;
+/*
+ If the player is ready, we start the video, and clear
+ the setInterval, otherwise, we wait.
+*/
+function aebWait4Ready(Id,bPlay) {
+ if (aebStartPlayer.isPlayerReady) {
+ aebCancelWait(false);
+ aebStartPlayer.annot.callAS(%
+(bPlay)?"loadVideoById":"cueVideoById",Id,0);
+ }
+}
+function aebCancelWait(bNotify) {
+ var twait=aebStartPlayer.twait;
+ if (aebStartPlayer.to!=null)
+ try { app.clearTimeOut(aebStartPlayer.to); } catch(e) {};
+ aebStartPlayer.to=null;
+ if (aebStartPlayer.twait!=null)
+ try { app.clearInterval(aebStartPlayer.twait); } catch(e) {}
+ aebStartPlayer.twait=null;
+ if ( bNotify && twait!=null ) app.alert("\ytStrConnecTimedOut");
+}
+\end{newsegment}
+\begin{newsegment}{Popup Menu Data and JS}
+\ytPopupData
+var aChoice;
+function ytProcessMenu(aMenu) {
+ var cChoice = \popUpMenu(aMenu);
+ if ( cChoice != null ) {
+ aChoice=eval(cChoice);
+ if (aChoice[1]=="") return null;
+ var thisChoice=aChoice[0];
+ if (ytProcessMenu.nChoice==undefined) {
+ ytProcessMenu.nChoice=thisChoice;
+ eval("aMenu"+ytProcessMenu.nChoice).bMarked=true;
+ } else {
+ eval("aMenu"+ytProcessMenu.nChoice).bMarked=false;
+ var oldnChoice=ytProcessMenu.nChoice;
+ ytProcessMenu.nChoice=thisChoice;
+ eval("aMenu"+ytProcessMenu.nChoice).bMarked=(oldnChoice==ytProcessMenu.nChoice)?false:true;
+ }
+ return aChoice;
+ } else return null;
+}
+function ytPopupMenu(rmaName,ytmenu) {
+ var aChoice=ytProcessMenu(ytmenu);
+ var rm=this.getAnnotRichMedia(this.pageNum,rmaName);
+ if (aChoice!=null) {
+ if (ytProcessMenu.lastDescrip==undefined) {
+ aebStartPlayer(rm,aChoice[1],!event.shift);
+ } else {
+ if (ytProcessMenu.lastDescrip!=aChoice[1]) {
+ aebStartPlayer(rm,aChoice[1],!event.shift);
+ }
+ }
+ ytProcessMenu.lastDescrip=aChoice[1];
+ }
+}
+\end{newsegment}
+\end{insDLJS*}
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+\endinput
+
+rm=this.getAnnotRichMedia(this.pageNum,"YouTube1");
+rm.callAS("cueVideoById", "GZ9e3Dy7obA");
diff --git a/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.ins b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.ins
new file mode 100644
index 0000000000..6732fb251c
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.ins
@@ -0,0 +1,60 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright 1999-2006 D. P. Story
+%%
+%% This file is part of the `AcroTeX eDucation Bundle'.
+%% -------------------------------------------
+%%
+%% It may be distributed under the conditions of the LaTeX Project Public
+%% License, either version 1.2 of this license or (at your option) any
+%% later version. The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\filedate{2010/09/10}
+\def\batchfile{yt4pdf.ins}
+
+\input docstrip
+\ifx\generate\undefined
+ \Msg{**********************************************}
+ \Msg{*}
+ \Msg{* This installation requires docstrip}
+ \Msg{* version 2.4 or later.}
+ \Msg{*}
+ \Msg{* An older version of docstrip has been input}
+ \Msg{*}
+ \Msg{**********************************************}
+ \errhelp{Move or rename old docstrip.tex and get a newer one.}
+ \errmessage{Old docstrip in input path}
+ \batchmode
+ \csname @@end\endcsname\end
+\fi
+
+\keepsilent
+\askforoverwritefalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\preamble
+\endpreamble
+
+\generate
+{%
+ \file{yt4pdf.sty}{\from{yt4pdf.dtx}{copyright,package}}
+}
+
+\Msg{***************************************************************}
+\Msg{*}
+\Msg{* \space To finish the installation you have to copy the files }
+\Msg{*}
+\Msg{* \space *.sty, *.cfg and *.def into a directory searched by TeX}
+\Msg{*}
+\Msg{***************************************************************}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
diff --git a/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.sty b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.sty
new file mode 100644
index 0000000000..7bed0d2499
--- /dev/null
+++ b/obsolete/macros/latex/contrib/yt4pdf/yt4pdf.sty
@@ -0,0 +1,346 @@
+%%
+%% This is file `yt4pdf.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% yt4pdf.dtx (with options: `copyright,package')
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% yt4pdf.sty package, 2010-09-10 %%
+%% Copyright (C) 2010 D. P. Story %%
+%% dpstory@uakron.edu %%
+%% %%
+%% This program can redistributed and/or modified under %%
+%% the terms of the LaTeX Project Public License %%
+%% Distributed from CTAN archives in directory %%
+%% macros/latex/base/lppl.txt; either version 1 of the %%
+%% License, or (at your option) any later version. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\NeedsTeXFormat{LaTeX2e}[1997/12/01]
+\ProvidesPackage{yt4pdf}
+ [2016/10/04 v1.1 yt4pdf: Play You Tube videos in PDF, Acrobat Distiller only (dps)]
+\RequirePackage{xkeyval}
+\ProcessOptions
+\RequirePackage{rmannot}
+\RequirePackage{popupmenu}[2010/09/18]
+\newcommand{\ytFolder}{C:/Users/Public/Documents/My TeX Files/%
+tex/latex/aeb/aebpro/yt4pdf/swf}
+\saveNamedPath{ytSWF}{\ytFolder/pdf_tube_basic.swf}
+\InputIfFileExists{yt4pdf.cfg}{}{}
+\def\yt@namegdef#1{\expandafter\gdef\csname #1\endcsname}
+\def\yt@namexdef#1{\expandafter\xdef\csname #1\endcsname}
+\def\thisNamedRMA(#1){this.getAnnotRichMedia(this.pageNum,"#1")}
+\define@key{ytRmAnnot}{play}[]{\def\ytrmannot@play{#1}}
+\define@key{ytRmAnnot}{load}[]{\def\ytrmannot@load{#1}}
+\setkeys{ytRmAnnot}{play,load}
+\let\ytCurrRMAName\@empty
+\newcommand{\ytRmAnnot}[4][]{\begingroup
+ \@ifundefined{#2@ytrmname}{\yt@namegdef{#2@ytrmname}{#1}}%
+ {\PackageError{yt2pdf}{The name `#2' is already defined
+ for\MessageBreak this \string\ytRmAnnot}{Choose a unique
+ name for this \string\ytRmAnnot, one different from `#2'.}}%
+ \setkeys*{ytRmAnnot}{#1}\gdef\ytCurrRMAName{#2}%
+ \ifx\ytrmannot@play\@empty\else
+ \makebox[0pt][l]{\pushButton[\BC{}\BG{}\S{S}
+ \AA{\AAPageOpen{aebStartPlayer(\thisNamedRMA(#2),%
+ "\ytrmannot@play",true);}\AAPageClose{aebCancelWait(false);}}
+ ]{btnRmAnnot#2}{1bp}{1bp}}\let\ytrmannot@load\@empty\fi
+ \ifx\ytrmannot@load\@empty
+ \else\makebox[0pt][l]{\pushButton[\BC{}\BG{}\S{S}
+ \AA{\AAPageOpen{aebStartPlayer(\thisNamedRMA(#2),%
+ "\ytrmannot@load",false);}\AAPageClose{aebCancelWait(false);}}
+ ]{btnRmAnnot#2}{1bp}{1bp}}\fi
+ \rmAnnot[\XKV@rm,name=#2,enabled=onclick]{#3}{#4}{ytSWF}%
+ \endgroup
+}
+\newcommand{\DeclareYTName}[2][]{\def\argi{#1}%
+ \ifx\argi\@empty\gdef\ytCurrRMAName{#2}\else
+ \gdef\ytCurrRMAName{[#1]#2}\fi
+}
+\newcommand{\ytBtnPresets}[1]{\def\yt@Presets{#1}}
+\ytBtnPresets{\BC{.5 0 0}\S{S}\textFont{HeBo}\autoCenter{n}}
+\newcommand{\oyt@RMA}[1][this.pageNum]{\oyt@@RMA[#1]}
+\def\oyt@@RMA[#1]#2\@nil{\gdef\yt@CurrRMAName{#2}%
+ \def\yt@rm{this.getAnnotRichMedia(#1,"#2")}}
+\newcommand{\ytPlayToggle}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrPAUSE}\presets{\yt@Presets}#1
+ \A{\JS{ytPlayToggle(\yt@rm);}}]{playToggle}{#2}{#3}%
+}
+\newcommand{\ytStopLoading}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrStopLoading}\presets{\yt@Presets}#1
+ \A{\JS{\yt@rm.callAS("stopVideo");}}]{vidStop}{#2}{#3}%
+}
+\newcommand{\ytMuteToggle}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrMUTE}\presets{\yt@Presets}#1
+ \A{\JS{ytMuteToggle(\yt@rm);}}]{muteToggle}{#2}{#3}%
+}
+\newcommand{\ytRewind}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrREWIND}\presets{\yt@Presets}#1
+ \A{\JS{ytRewind(\yt@rm);}}]{ytRewind}{#2}{#3}%
+}
+\newcommand{\ytSelect}[4][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrLoadVideo}\presets{\yt@Presets}#1
+ \A{\JS{ytSelect(\yt@rm,"#2");}}]{selectVid}{#3}{#4}%
+}
+\newcommand{\ytOpenWeb}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrWatchOnWeb}\presets{\yt@Presets}#1
+ \A{\JS{ytOpenWeb(\yt@rm);}}]{playOnWeb}{#2}{#3}%
+}
+\newcommand{\ytvIdPresets}[1]{\def\yt@vIdPresets{#1}}
+\ytvIdPresets{\linktxtcolor{webbrown}}
+\newcommand{\ytvId}{\@ifstar{\def\yt@lnk@play{false}\yt@@vId}
+ {\def\yt@lnk@play{true}\yt@@vId}}
+\newcommand{\yt@@vId}[3][\ytCurrRMAName]{%
+ \oyt@RMA#1\@nil\setLink[\presets{\yt@vIdPresets}
+ \A{\JS{aebStartPlayer(\yt@rm,"#2",\yt@lnk@play);}}]{#3}}
+\newcommand{\ytComboListPresets}[1]{\def\yt@ComboListPresets{#1}}
+\newcommand{\ytComboBtnPresets}[1]{\def\yt@ComboBtnPresets{#1}}
+\let\yt@ComboListPresets\@empty
+\let\yt@ComboBtnPresets\@empty
+\newcommand{\ytPlayList}{\begingroup\@makeother\_\@makeother\'
+ \ytPlayList@i}
+\def\ytPlayList@i#1#2{\gdef\yt@pl@def{#1}\xdef\yt@pl@pl{#2}\endgroup}
+\newcommand{\declarePlayList}{\bgroup
+ \@makeother\_\@makeother\-
+ \yt@declarePlayList}
+\def\yt@declarePlayList#1#2{%
+ \gdef#1{#2}\egroup}
+\newcommand{\ytIdTitle}[2]{[(#2)(#1)]}
+\newcount\ytListCnt \ytListCnt=0
+\newcommand{\ytNewBaseName}[1][]{%
+ \def\yt@argi{#1}\ifx\yt@argi\@empty\global\advance\ytListCnt1\relax
+ \gdef\yt@BaseName{\yt@CurrRMAName\the\ytListCnt}\else
+ \gdef\yt@BaseName{\yt@CurrRMAName#1}\fi
+}
+\newcommand{\ytResetBaseName}{\gdef\yt@BaseName{\yt@CurrRMAName}}
+\ytResetBaseName
+\newcommand{\ytComboList}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \comboBox[\DV{\yt@pl@def}\V{\yt@pl@def}
+ \presets{\yt@ComboListPresets}#1]{ytSelect\yt@BaseName}
+ {#2}{#3}{\yt@pl@pl}%
+}
+\newcommand{\ytComboBtn}[3][]{%
+ \expandafter\oyt@RMA\ytCurrRMAName\@nil%
+ \pushButton[\CA{\ytStrPLAY}\presets{\yt@ComboBtnPresets}#1
+ \A{\JS{var f=this.getField("ytSelect\yt@BaseName");\r
+ aebStartPlayer(\yt@rm,f.value,!event.shift);
+ }}]{ytSelectBtn\yt@BaseName}{#2}{#3}%
+}
+\newcommand{\ytPopupMenuData}[1]{{\toks0={// yt4pdf: Begin popup menu data^^J}%
+ \@tfor\yt@menu:=#1\do{%
+ \toks2=\expandafter{\yt@menu}%
+ \edef\@tmp@exp{\the\toks0\the\toks2^^J}%
+ \toks0=\expandafter{\@tmp@exp}%
+ }\xdef\ytPopupData{\the\toks0// End of popup menu data}%
+}}
+\def\ytPopupData{// No popup menu data defined}%
+\newcommand{\puIdTitle}[2]{\item{title={#1},return={[\itemindex,'#2']}}}
+\newcommand{\ytStrPLAY}{PLAY}
+\newcommand{\ytStrREPLAY}{REPLAY}
+\newcommand{\ytStrPAUSE}{PAUSE}
+\newcommand{\ytStrBuffering}{Buffering...}
+\newcommand{\ytStrStopLoading}{Stop Loading}
+\newcommand{\ytStrMUTE}{MUTE}
+\newcommand{\ytStrUNMUTE}{UNMUTE}
+\newcommand{\ytStrREWIND}{REWIND}
+\newcommand{\ytStrLoadVideo}{Load Video}
+\newcommand{\ytStrWatchOnWeb}{Watch on YouTube}
+\newcommand{\ytRespQues}{Enter the YouTube Video ID}
+\newcommand{\ytRespTitle}{Load a Video}
+\newcommand{\ytRespLabel}{ID:}
+\newcommand{\ytStrErrorVideoNotFound}{Error: Video not found}
+\newcommand{\ytStrErrorNoEmbed}{Error: This video does not allow
+ embedded playback \r\r Would you like to view this video
+ on the web?}
+\newcommand{\ytStrConnecTimedOut}{Connection timed out, try again.}
+\begin{insDLJS*}[ytPlayToggle]{yt}
+\begin{newsegment}{yt4PDF: YouTube for PDF JavaScript}
+/*
+ Document-level script for YouTube player
+ Document-level script for the PDFtube embedded YouTube player
+ ***************************************************************
+ Functions to be called by buttons or links on the PDF
+ in each case, "rm" is the RichMedia annot containing the player
+ All these are optional and can be renamed or edited as required
+ ***********************************************************
+*/
+// toggle play/pause (button labels updated by event functions)
+function ytPlayToggle(rm) {
+ var ps = rm.callAS("getPlayerState");
+ rm.callAS((ps == 1)? "pauseVideo" : "playVideo");
+}
+// toggle mute (have to update button labels ourselves)
+function ytMuteToggle(rm) {
+ var im = rm.callAS("isMuted");
+ if (im) {
+ event.target.buttonSetCaption("\ytStrMUTE");
+ rm.callAS("unMute");
+ } else {
+ event.target.buttonSetCaption("\ytStrUNMUTE");
+ rm.callAS("mute");
+ }
+}
+// Ask the user for the ID number of a new video, and play it
+function ytSelect(rm,vID) {
+ var rsp = app.response({
+ cQuestion: "\ytRespQues",
+ cTitle: "\ytRespTitle",
+ cDefault: vID,
+ cLabel: "\ytRespLabel"});
+ if (rsp !=null && rsp != "")
+ aebStartPlayer(rm,rsp,true); // dps
+}
+// open the video's YouTube page in the web browser
+function ytOpenWeb(rm) {
+ var link = rm.callAS("getVideoUrl");
+ if (link != null) {
+ app.launchURL(link,true);
+ rm.activated = false;
+ }
+}
+// rewind (seek to zero)
+function ytRewind(rm) { rm.callAS("seekTo",0); }
+/*
+ ************************************************************
+ Functions called by the player itself, in response to events
+ as the events are "external", the annot is not the target.
+ These functions must exist and match the names in the SWF.
+ ***********************************************************
+*/
+function ytPlayerReady() {
+
+ // this is the place to load your default video - for example...
+ console.println("<YT> Player loaded and ready");
+ // this.getAnnotsRichMedia(this.pageNum)[0].callAS("loadVideoById",
+ // "eNzrn8-JFSE",0);
+ aebStartPlayer.isPlayerReady=true; // dps
+}
+function ytStateChange(st) {
+ // Possible values are unstarted (-1), ended (0), playing (1),
+ // paused (2), buffering (3), video cued (5)
+ var lbl = "";
+ console.println("<YT> State changed to " + st);
+ if (st == 0) lbl = "\ytStrREPLAY";
+ else if (st == 1) lbl = "\ytStrPAUSE";
+ else if (st == 3) lbl = "\ytStrBuffering";
+ else if (st == 2 || st == 5) lbl = "\ytStrPLAY";
+ if (lbl) this.getField("playToggle").buttonSetCaption(lbl);
+}
+function ytPlaybackQualityChange(str) {
+ // Possible values are "small", "medium", "large" and "hd720"
+ console.println("<YT> Quality changed to " + str);
+}
+function ytProgress(q) {
+ // q has four properties that you can use to update form fields,
+ // such as...
+ //this.getField("currentTime").value = q.CurrentTime;
+ //this.getField("Duration").value = q.Duration;
+ //this.getField("BytesLoaded").value = q.BytesLoaded;
+ //this.getField("BytesTotal").value = q.BytesTotal;
+}
+function ytError(err) {
+ // Video cannot be played
+ console.println("<YT> ERROR code " + err + " received");
+ if (err == 100)
+ app.alert("\ytStrErrorVideoNotFound", 0, 0, "YouTube");
+ else {
+ var resp=app.alert("\ytStrErrorNoEmbed", 1, 3, "YouTube");
+ if (resp==4) {
+ aebCancelWait(false);
+ ytOpenWeb(aebStartPlayer.annot);
+ }
+ }
+}
+/*
+ We start the player if the annot is activated, if not,
+ we set annot.activated=true, and wait for the widget to say it
+ is ready. When ready, ytPlayerReady() sets
+ aebStartPlayer.isPlayerReady=true
+*/
+function aebStartPlayer(rm,Id,bPlay) {
+ aebStartPlayer.annot=rm;
+ if (aebStartPlayer.annot.activated)
+ aebStartPlayer.annot.callAS(%
+(bPlay)?"loadVideoById":"cueVideoById",Id,0);
+ else {
+ aebCancelWait(false);
+ aebStartPlayer.annot.activated=true;
+ aebStartPlayer.isPlayerReady=false;
+ aebStartPlayer.twait=app.setInterval(%
+'aebWait4Ready(\"'+Id+'\",'+bPlay+');',250);
+ aebStartPlayer.to=app.setTimeOut("aebCancelWait(true)", 10000);
+ }
+}
+aebStartPlayer.isPlayerReady=false;
+aebStartPlayer.twait=null;
+aebStartPlayer.to=null;
+/*
+ If the player is ready, we start the video, and clear
+ the setInterval, otherwise, we wait.
+*/
+function aebWait4Ready(Id,bPlay) {
+ if (aebStartPlayer.isPlayerReady) {
+ aebCancelWait(false);
+ aebStartPlayer.annot.callAS(%
+(bPlay)?"loadVideoById":"cueVideoById",Id,0);
+ }
+}
+function aebCancelWait(bNotify) {
+ var twait=aebStartPlayer.twait;
+ if (aebStartPlayer.to!=null)
+ try { app.clearTimeOut(aebStartPlayer.to); } catch(e) {};
+ aebStartPlayer.to=null;
+ if (aebStartPlayer.twait!=null)
+ try { app.clearInterval(aebStartPlayer.twait); } catch(e) {}
+ aebStartPlayer.twait=null;
+ if ( bNotify && twait!=null ) app.alert("\ytStrConnecTimedOut");
+}
+\end{newsegment}
+\begin{newsegment}{Popup Menu Data and JS}
+\ytPopupData
+var aChoice;
+function ytProcessMenu(aMenu) {
+ var cChoice = \popUpMenu(aMenu);
+ if ( cChoice != null ) {
+ aChoice=eval(cChoice);
+ if (aChoice[1]=="") return null;
+ var thisChoice=aChoice[0];
+ if (ytProcessMenu.nChoice==undefined) {
+ ytProcessMenu.nChoice=thisChoice;
+ eval("aMenu"+ytProcessMenu.nChoice).bMarked=true;
+ } else {
+ eval("aMenu"+ytProcessMenu.nChoice).bMarked=false;
+ var oldnChoice=ytProcessMenu.nChoice;
+ ytProcessMenu.nChoice=thisChoice;
+ eval("aMenu"+ytProcessMenu.nChoice).bMarked=(oldnChoice==ytProcessMenu.nChoice)?false:true;
+ }
+ return aChoice;
+ } else return null;
+}
+function ytPopupMenu(rmaName,ytmenu) {
+ var aChoice=ytProcessMenu(ytmenu);
+ var rm=this.getAnnotRichMedia(this.pageNum,rmaName);
+ if (aChoice!=null) {
+ if (ytProcessMenu.lastDescrip==undefined) {
+ aebStartPlayer(rm,aChoice[1],!event.shift);
+ } else {
+ if (ytProcessMenu.lastDescrip!=aChoice[1]) {
+ aebStartPlayer(rm,aChoice[1],!event.shift);
+ }
+ }
+ ytProcessMenu.lastDescrip=aChoice[1];
+ }
+}
+\end{newsegment}
+\end{insDLJS*}
+\endinput
+%%
+%% End of file `yt4pdf.sty'.