summaryrefslogtreecommitdiff
path: root/texmf-dist
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-08-03 12:24:04 +0900
committerNorbert Preining <norbert@preining.info>2020-08-03 12:24:04 +0900
commit1bd2e747b7bc84d8bce808fd2f909c10f9d490ce (patch)
treeb42ce56e383e1e3c328e85bd914ee58941332187 /texmf-dist
parentbb8d31ff6214db672aa7b1ae809e8aaa63549504 (diff)
add ltx4yt as replacement for yt4pdf
Diffstat (limited to 'texmf-dist')
-rw-r--r--texmf-dist/doc/latex/ltx4yt/README.md20
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdfbin0 -> 109008 bytes
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.tex74
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdfbin0 -> 114454 bytes
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.tex98
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdfbin0 -> 118148 bytes
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.tex82
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdfbin0 -> 86073 bytes
-rw-r--r--texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.tex110
-rw-r--r--texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdfbin0 -> 242168 bytes
-rw-r--r--texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex675
-rw-r--r--texmf-dist/doc/latex/ltx4yt/ltx4yt.pdfbin0 -> 1838044 bytes
-rw-r--r--texmf-dist/source/latex/ltx4yt/ltx4yt.dtx651
-rw-r--r--texmf-dist/source/latex/ltx4yt/ltx4yt.ins61
-rw-r--r--texmf-dist/tex/latex/ltx4yt/ltx4yt.sty172
-rw-r--r--texmf-dist/tex/latex/ltx4yt/ytpu.def112
16 files changed, 2055 insertions, 0 deletions
diff --git a/texmf-dist/doc/latex/ltx4yt/README.md b/texmf-dist/doc/latex/ltx4yt/README.md
new file mode 100644
index 00000000..63993ec3
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/README.md
@@ -0,0 +1,20 @@
+The ltx4yt package
+Dated: 2020-07-30
+
+What ltx4yt does is to provide some tools for creating links, dropdown lists,
+popup menus for playing selected YouTube videos in the default browser. Perfect
+for personal use and for academic, professional, or classroom presentations
+that refer to YouTube content.
+
+All workflows are supported: pdflatex, lualatex, xelatex, dvips->distiller,
+and dvips->ps2pdf. In the latter case, the document should not use any
+document JavaScripts.
+
+This package replaces yt4pdf, which is being withdrawn from CTAN.
+
+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/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdf b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdf
new file mode 100644
index 00000000..c85e343e
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdf
Binary files differ
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.tex b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.tex
new file mode 100644
index 00000000..2f2a215b
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.tex
@@ -0,0 +1,74 @@
+\documentclass{article}
+\usepackage{ltx4yt}
+\usepackage{multicol}
+
+\hypersetup{%
+ pdfpagemode=UseNone,colorlinks,
+ pdftitle={The \texorpdfstring{\textsf{ltx4yt} Package\\[3pt]}{ltx4yt Package: }Playing YouTube in a Browser using links},
+ pdfauthor=D. P. Story,
+ pdfsubject={Play YouTube videos in the default browser},
+ pdfkeywords={YouTube, AeB}
+}
+
+\title{The \texorpdfstring{\textsf{ltx4yt} Package\\[3pt]}{ltx4yt Package: }Playing YouTube videos in a browser using links}
+\author{D. P. Story}
+
+\addtolength{\textwidth}{.5in}
+
+\parindent0pt \parskip6pt
+
+
+\begin{document}
+
+
+
+\maketitle
+
+\textbf{Favorites to play:} Itemized links below use the \verb~\ytvId~ and \verb~\ytvId*~ commands,
+the only \texttt{*} command is ``Kung-Fu Fighting* (Original),'' this one is played with advertisements
+and related/unrelated content. The links in this document should work across all PDF viewers and across all devices.
+\begin{flushleft}\raggedcolumns
+\begin{multicols}{2}\bfseries
+\begin{itemize}
+
+\item \ytvId{GZ9e3Dy7obA}{Kung-Fu Fighting (Bruce Lee)}
+
+\item \ytvId*{jhUkGIsKvn0}{Kung-Fu Fighting* (Original)}
+
+\item \ytvId{_iUnOpPEg0w}{TegrityGuy}
+
+\item \ytvId{eNzrn8-JFSE}{Open at Adobe}
+
+\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}
+What follows are customized links created by \verb~\ytLink~.
+
+\ytLink{\watchId{5y9-EVmreU4}\params{autoplay=1}}{Lori's Corner: Episode \#1} (\verb~\watchId~ and \verb~\params~)
+
+\ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&modestbranding=1}}{Lori's Corner: Episode \#1} (\verb~\embedId~ and \verb~\params~)
+
+\ytLink{\embed{listType=search&list=Adobe Acrobat DC}}{Search for Adobe Acrobat DC} (\verb~\embed~ custom search)
+
+\ytLink{embed?listType=search&list=table tennis}{Totally custom search link} (surprise topic)
+
+
+\ytLink{\channel{rocketjump}}{The RocketJump Channel} (\verb~\channel~)
+
+\ytLink{\user{freddiew}}{Freddie Diew's channel} (\verb~\user~)
+
+\ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&controls=1&fs=1&modestbranding=1&playlist=T9Yzo_hlwP0,eNzrn8-JFSE}}{A playlist of three videos}
+
+\textbf{PDF viewers:} \textsf{Acrobat}, \textsf{Acrobat Reader DC}, \textsf{PDFX-Change}, \textsf{SumatraPDF}, \textsf{evince}, \textsf{TeXworks}
+
+\textbf{Browsers:} \textsf{Microsoft Edge}, \textsf{Firefox}, \textsf{Google Chrome}
+
+\textbf{Devices:} \textsf{Android} smart phones, \textsf{iPhones}, \textsf{Android} tablets
+
+\end{document}
+
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdf b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdf
new file mode 100644
index 00000000..fc9ec84a
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdf
Binary files differ
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.tex b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.tex
new file mode 100644
index 00000000..83ca7876
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.tex
@@ -0,0 +1,98 @@
+\documentclass{article}
+\usepackage[usepopup]{ltx4yt}
+
+
+\hypersetup{pdfpagemode=UseNone,colorlinks,
+ pdfencoding=auto,
+ pdftitle={The \texorpdfstring{\textsf{ltx4yt} Package\\[3pt]}{ltx4yt Package: }Playing YouTube in a Browser using Forms and JavaScript},
+ pdfauthor=D. P. Story,
+ pdfsubject={Play YouTube videos in the default browser},
+ pdfkeywords={YouTube, AeB}
+}
+\title{The \texorpdfstring{\textsf{ltx4yt} Package\\[3pt]}{ltx4yt Package: }Playing YouTube videos in a browser using Forms and JavaScript}
+\author{D. P. Story}
+
+%\previewOn\pmpvOn
+
+\parindent=0pt\parskip6pt
+
+
+\begin{popupmenu}{YTMenu}
+ \puIdTitle{Select a YouTube Video}{} % A title has no ytId
+ \begin{submenu}{title=Music Videos}
+ \puIdTitle{Kung-Fu Fighting (Bruce Lee)}{GZ9e3Dy7obA}
+ \puIdTitle{Kung-Fu Fighting* (Carl Douglas)}{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}
+
+\begin{popupmenu}{YTSea}
+ \puIdTitle{\Esc"Sea Hunt\Esc" US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}
+ \puIdTitle{Theme Song to Sea Hunt*}{2QxXk6X9GDo}
+ \puIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
+ \puIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+\end{popupmenu}
+
+
+% After defining all menus used with YouTube videos, declare them using \ytUseMenus
+\ytUseMenus{YTMenu,YTSea}
+
+\declarePlayList{\playList}{% note: put parentheses within braces
+ \ytIdTitle{Kung-Fu Fighting {(Bruce Lee)}}{GZ9e3Dy7obA}
+ \ytIdTitle{Kung-Fu Fighting* {(Carl Douglas)}}{jhUkGIsKvn0}
+ \ytIdTitle{RAF Sculthorpe {(Watch for my Mom at 6:22!)}}{K7H8QghVs9k}
+ \ytIdTitle{Rocket Jump}{7XzdZ4KcI8Y}
+ \ytIdTitle{Abdul And Cleopatra* - Jonathan Richman and the Modern Lovers}{mLDF5MBMWHE}
+%
+ \ytIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
+ \ytIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+ \ytIdTitle{"Sea Hunt" US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}
+}
+
+\begin{document}
+
+\maketitle
+
+In this second sample file, the combo box and popup menu are
+demonstrated. Both of these use JavaScript methods that will
+function perfectly on \textsf{Adobe Acrobat}, \textsf{Adobe
+Acrobat Reader DC}, and \textsf{PDFX-Change Editor}. None of the fields
+work within the native PDF viewer of modern browsers.
+
+\textbf{Demo of combo box of favorites.} By convention of this
+package, items with an ``\texttt{*}" in their title is a signal to
+the document consumer that that video cannot be
+embedded and must be played on the YouTube site with
+advertisements and such. \vspace{-\parskip}
+\begin{quote}
+\ytPlayList{\tops{Kung-Fu Fighting {(Bruce Lee version)}}{GZ9e3Dy7obA}}{\playList}
+\ytComboList{YT1}{190bp}{11bp}\olBdry
+ \ytComboBtn[\TU{Click to play}]{YT1}{33bp}{11bp}
+\end{quote}
+
+\ytPopupBtn{YTMenu}{20bp}{5bp}
+\textbf{Demo of a popup menu of favorites.}
+On this page, with your mouse cursor, roll over the push button labeled \textcolor{blue}{\textsf{YT Menu}}, and a popup
+menu appears. Choose a YouTube video based on title.
+
+\ytPopupBtn[\CA{Sea Hunt}]{YTSea}{20bp}{5bp} Yes, you can have multiple popup menus in the document.
+
+\textbf{Demo of an interactive search}\\[3pt]
+\ytInputQuery{1.5in}{11bp}\olBdry
+\ytSearch{}{11bp}\olBdry
+\ytClearQuery{}{11bp}
+
+\end{document}
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdf b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdf
new file mode 100644
index 00000000..7069e972
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdf
Binary files differ
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.tex b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.tex
new file mode 100644
index 00000000..8e554547
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.tex
@@ -0,0 +1,82 @@
+\documentclass{article}
+\usepackage[designv,extended]{web}
+\usepackage{ltx4yt}
+\usepackage{multicol}
+
+\parindent0pt \parskip6pt
+
+
+\textBgColor{lightgray}
+
+\DeclareDocInfo
+{
+ title=The \texorpdfstring{\textsf{ltx4yt} Package\\[3pt]}{ltx4yt Package: }Playing YouTube in a Browser,
+ author=D. P. Story,
+ university=Acro\negthinspace\TeX.Net,
+ email=dpstory@acrotex.net,
+ subject={Play YouTube video in the default browser},
+ keywords={YouTube, AeB},
+ talksite=\url{http://www.acrotex.net},
+ talkdate={\today}
+}
+\talkdateLabel{Published:}
+
+\parindent=0pt\parskip6pt
+\rheader{}
+
+\addtoWebHeight{7\baselineskip}
+
+\begin{document}
+
+\maketitle
+
+\begin{center}\bfseries\Large\color{blue}LTX4YT -- Links\end{center}
+
+\textbf{Favorites to play:} Itemized links below use the \verb~\ytvId~ and \verb~\ytvId*~ commands,
+the only \texttt{*} command is ``Kung-Fu Fighting* (Original),'' this one is played with advertisements
+and related/unrelated content. The links in this document should work across all PDF viewers and across all devices.
+\begin{flushleft}\raggedcolumns
+\begin{multicols}{2}\bfseries
+\begin{itemize}
+
+\item \ytvId{GZ9e3Dy7obA}{Kung-Fu Fighting (Bruce Lee)}
+
+\item \ytvId*{jhUkGIsKvn0}{Kung-Fu Fighting* (Original)}
+
+\item \ytvId{_iUnOpPEg0w}{TegrityGuy}
+
+\item \ytvId{eNzrn8-JFSE}{Open at Adobe}
+
+\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}
+What follows are customized links created by \verb~\ytLink~.
+
+\ytLink{\watchId{5y9-EVmreU4}\params{autoplay=1}}{Lori's Corner: Episode \#1} (\verb~\watchId~ and \verb~\params~)
+
+\ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&modestbranding=1}}{Lori's Corner: Episode \#1} (\verb~\embedId~ and \verb~\params~)
+
+\ytLink{\embed{listType=search&list=Adobe Acrobat DC}}{Search for Adobe Acrobat DC} (\verb~\embed~ custom search)
+
+\ytLink{embed?listType=search&list=table tennis}{Totally custom search link} (surprise topic)
+
+
+\ytLink{\channel{rocketjump}}{The RocketJump Channel} (\verb~\channel~)
+
+\ytLink{\user{freddiew}}{Freddie Diew's channel} (\verb~\user~)
+
+\ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&controls=1&fs=1&modestbranding=1&playlist=T9Yzo_hlwP0,eNzrn8-JFSE}}{A playlist of three videos}
+
+\textbf{PDF viewers:} \textsf{Acrobat}, \textsf{Acrobat Reader DC}, \textsf{PDFX-Change}, \textsf{SumatraPDF}, \textsf{evince}, \textsf{TeXworks}
+
+\textbf{Browsers:} \textsf{Microsoft Edge}, \textsf{Firefox}, \textsf{Google Chrome}
+
+\textbf{Devices:} \textsf{Android} smart phones, \textsf{iPhones}, \textsf{Android} tablets
+
+\end{document}
+
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdf b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdf
new file mode 100644
index 00000000..958c36cb
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdf
Binary files differ
diff --git a/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.tex b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.tex
new file mode 100644
index 00000000..31f3ca49
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.tex
@@ -0,0 +1,110 @@
+\documentclass{article}
+\usepackage[designv,extended]{web}
+\usepackage[usepopup]{ltx4yt}
+
+%\previewOn
+
+\parindent0pt \parskip6pt
+
+
+\textBgColor{lightgray}
+
+\DeclareDocInfo
+{
+ title=The \texorpdfstring{\textsf{ltx4yt} Package\\[3pt]}{ltx4yt Package: }Playing YouTube in a Browser,
+ 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:}
+
+\parindent=0pt\parskip6pt
+\rheader{}
+
+\begin{popupmenu}{YTMenu}
+ \puIdTitle{Select a YouTube Video}{} % A title has no ytId
+ \begin{submenu}{title=Music Videos}
+ \puIdTitle{Kung-Fu Fighting (Bruce Lee)}{GZ9e3Dy7obA}
+ \puIdTitle{Kung-Fu Fighting* (Carl Douglas)}{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}
+
+\begin{popupmenu}{YTSea}
+ \puIdTitle{\Esc"Sea Hunt\Esc" US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}
+ \puIdTitle{Theme Song to Sea Hunt*}{2QxXk6X9GDo}
+ \puIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
+ \puIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+\end{popupmenu}
+
+
+% After defining all menus used with YouTube videos, declare them using \ytUseMenus
+\ytUseMenus{YTMenu,YTSea}
+
+\declarePlayList{\playList}{% note: put parentheses within braces
+ \ytIdTitle{Kung-Fu Fighting {(Bruce Lee)}}{GZ9e3Dy7obA}
+ \ytIdTitle{Kung-Fu Fighting* {(Carl Douglas)}}{jhUkGIsKvn0}
+ \ytIdTitle{RAF Sculthorpe {(Watch for my Mom at 6:22!)}}{K7H8QghVs9k}
+ \ytIdTitle{Rocket Jump}{7XzdZ4KcI8Y}
+ \ytIdTitle{Abdul And Cleopatra* - Jonathan Richman and the Modern Lovers}{mLDF5MBMWHE}
+%
+ \ytIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
+ \ytIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+ \ytIdTitle{"Sea Hunt" US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}
+}
+
+\begin{document}
+
+
+
+%\maketitle
+
+\begin{center}\bfseries\Large\color{blue}LTX4YT -- Forms\end{center}
+
+In this second sample file, the combo box and popup menu are
+demonstrated. Both of these use JavaScript methods that will
+function perfectly on \textsf{Adobe Acrobat}, \textsf{Adobe
+Acrobat Reader DC}, and \textsf{PDFX-Change Editor}. None of the fields
+work within the native PDF viewer of modern browsers.
+
+\textbf{Demo of combo box of favorites.} By convention of this
+package, items with an ``\texttt{*}" in their title is a signal to
+the document consumer that that video cannot be
+embedded and must be played on the YouTube site with
+advertisements and such. \vspace{-\parskip}
+\begin{quote}
+\ytPlayList{\tops{Kung-Fu Fighting {(Bruce Lee version)}}{GZ9e3Dy7obA}}{\playList}
+\ytComboList{YT1}{190bp}{11bp}\olBdry
+ \ytComboBtn[\TU{Click to play}]{YT1}{33bp}{11bp}
+\end{quote}
+
+\ytPopupBtn{YTMenu}{20bp}{5bp}
+\textbf{Demo of a popup menu of favorites.}
+On this page, with your mouse cursor, roll over the push button labeled \textcolor{blue}{\textsf{YT Menu}}, and a popup
+menu appears. Choose a YouTube video based on title.
+
+\ytPopupBtn[\CA{Sea Hunt}]{YTSea}{20bp}{5bp} Yes, you can have multiple popup menus in the document.
+
+\textbf{Demo of an interactive search}\\[3pt]
+\ytInputQuery{1.5in}{11bp}\olBdry
+\ytSearch{}{11bp}\olBdry
+\ytClearQuery{}{11bp}
+
+\end{document}
diff --git a/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdf b/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdf
new file mode 100644
index 00000000..672b8292
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdf
Binary files differ
diff --git a/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex b/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex
new file mode 100644
index 00000000..aa98bee5
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex
@@ -0,0 +1,675 @@
+% makeindex < aebpro_man.idx > aebpro_man.ind
+\documentclass{article}
+\usepackage[fleqn]{amsmath}
+\usepackage[
+ web={centertitlepage,designv,tight*,usetemplates,
+ forcolorpaper,latextoc,pro},%usesf,
+ eforms,aebxmp
+]{aeb_pro}
+%\usepackage{multicol}
+\usepackage{aeb_mlink}
+\usepackage[usepopup]{ltx4yt}
+\usepackage{array}
+\usepackage[altbullet]{lucidbry}
+
+\usepackage{makeidx}
+\makeindex
+\usepackage{acroman}
+
+\leftmargini\parindent
+
+
+\usepackage[active]{srcltx}
+
+\urlstyle{rm}
+\let\tops\texorpdfstring
+\let\pkg\textsf
+\let\app\textsf
+\let\opt\texttt
+\let\uif\textsf
+\let\env\texttt
+\def\meta#1{\textit{\texttt{#1}}}
+\def\ameta#1{$\langle\textit{\texttt{#1}}\rangle$}
+\newdimen\aebdimen \aebdimen6pt %\partopsep \advance\aebdimen\partopsep
+\newcommand\bVerb[1][]{\begingroup#1\vskip\aebdimen\parindent0pt}%
+\def\eVerb{\vskip\aebdimen\endgroup\noindent}
+\def\SUB#1{\ensuremath{{}_{\text{#1}}}}
+\def\darg#1{\texttt{\{#1\}}}
+\def\takeMeasure{\bgroup\obeyspaces\takeMeasurei}
+\def\takeMeasurei#1{\global\setbox\webtempboxi\hbox{\ttfamily#1}\egroup}
+\def\bxSize{\wd\webtempboxi+2\fboxsep+2\fboxrule}
+\let\amtIndent\leftmargini
+\makeatletter
+\def\setDisplayNumber#1#2{\kern0pt
+ \setlength\abovedisplayshortskip{0pt}%
+ \setlength\belowdisplayshortskip{0pt}%
+ \setlength\abovedisplayskip{0pt}%
+ \setlength\belowdisplayskip{0pt}%
+ \begin{equation}\label{#2}\end{equation}\kern0pt
+}
+\renewenvironment{quote}[1][]
+ {\def\@rgi{#1}\ifx\@rgi\@empty
+ \let\rghtm\@empty\else\def\rghtm{\rightmargin\leftmargin}\fi
+ \list{}{\rghtm} %{\rightmargin\leftmargin}%
+ \item\relax}
+ {\endlist}
+\renewcommand*\descriptionlabel[1]{\hspace\labelsep
+ \normalfont #1}
+\setcounter{secnumdepth}{4}
+\setcounter{tocdepth}{5}
+\renewcommand*{\theparagraph}{\texorpdfstring{\protect\P\protect\ }{\textparagraph}}
+\renewcommand{\paragraph}
+ {\renewcommand{\@seccntformat}[1]{\theparagraph}%
+ \@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}} %\color{\aeb@subsubsectioncolor}
+\renewcommand*\l@paragraph{\@dottedtocline{4}{5.0em}{1em}} %{7.0em}{4.1em}}
+\def\chgCurrLblName#1{\def\@currentlabelname{#1}}
+\def\echgCurrLblName#1{\edef\@currentlabelname{#1}}
+\makeatother
+
+\reversemarginpar
+\def\FmtMP#1{\marginpar{\slshape\raggedleft\small#1}}
+
+
+\newcommand{\YT}{\textsf{YouTube}}
+
+
+%\def\tutpath{doc/tutorial}
+%\def\tutpathi{tutorial}
+
+\DeclareDocInfo
+{
+ university={\AcroTeX.Net},
+ title={The \texorpdfstring{\textsf{ltx4yt} Package\\[1em]}{: }
+ Playing \texorpdfstring{\YT}{YouTube} Videos in the default browser},
+ author={D. P. Story},
+ email={dpstory@acrotex.net},
+ subject={Playing YouTube Videos in PDF},
+ talksite={\url{www.acrotex.net}},
+ version={0.7, 2020/07/30},
+ keywords={AcroTeX, PDF, YouTube, Browser},
+ copyrightStatus=True,
+ copyrightNotice={Copyright (C) \the\year, D. P. Story},
+ copyrightInfoURL={http://www.acrotex.net}
+}
+
+\def\dps{$\hbox{$\mathfrak D$\kern-.3em\hbox{$\mathfrak P$}%
+ \kern-.6em \hbox{$\mathcal S$}}$}
+
+\universityLayout{fontsize=Large}
+\titleLayout{fontsize=LARGE}
+\authorLayout{fontsize=Large}
+\tocLayout{fontsize=Large,color=aeb}
+\sectionLayout{indent=-40pt,fontsize=large,color=aeb} %,afterskip=1sp}
+\subsectionLayout{indent=-20pt,color=aeb} %,afterskip=1sp}
+\subsubsectionLayout{indent=0pt,color=aeb} %,afterskip=1sp}
+\subsubDefaultDing{\texorpdfstring{$\bullet$}{\textrm\textbullet}}
+
+\newenvironment{eqComments}[1][\strut]{\smallskip\leftskip-\labelwidth
+\item[]\textbf{\textcolor{blue}{#1}}}{\par\smallskip}
+
+\begin{popupmenu}{YTSea}
+ \puIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
+ \puIdTitle{\Esc"Sea Hunt\Esc" US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}
+ \puIdTitle{Theme Song to Sea Hunt*}{2QxXk6X9GDo}
+ \puIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+\end{popupmenu}
+\ytUseMenus{YTSea}
+
+%\pagestyle{empty}
+%\parindent0pt\parskip\medskipamount
+
+\chngDocObjectTo{\newDO}{doc}
+\begin{docassembly}
+var titleOfManual="The ltx4yt MANUAL";
+var manualfilename="Manual_BG_Print_ltx4yt.pdf";
+var manualtemplate="Manual_BG_Brown.pdf"; // Blue, Green, Brown
+var _pathToBlank="C:/Users/Public/Documents/ManualBGs/"+manualtemplate;
+var doc;
+var buildIt=false;
+if ( buildIt ) {
+ console.println("Creating new " + manualfilename + " file.");
+ doc = \appopenDoc({cPath: _pathToBlank, bHidden: true});
+ var _path=this.path;
+ var pos=_path.lastIndexOf("/");
+ _path=_path.substring(0,pos)+"/"+manualfilename;
+ \docSaveAs\newDO ({ cPath: _path });
+ doc.closeDoc();
+ doc = \appopenDoc({cPath: manualfilename, oDoc:this, bHidden: true});
+ f=doc.getField("ManualTitle");
+ f.value=titleOfManual;
+ doc.flattenPages();
+ \docSaveAs\newDO({ cPath: manualfilename });
+ doc.closeDoc();
+} else {
+ console.println("Using the current "+manualfilename+" file.");
+}
+var _path=this.path;
+var pos=_path.lastIndexOf("/");
+_path=_path.substring(0,pos)+"/"+manualfilename;
+\addWatermarkFromFile({
+ bOnTop:false,
+ bOnPrint:false,
+ cDIPath:_path
+});
+\executeSave();
+\end{docassembly}
+
+\begin{document}
+
+\maketitle
+
+\selectColors{linkColor=black}
+\tableofcontents
+\selectColors{linkColor=webgreen}
+
+\section{Introduction}\label{s:intro}
+
+My beautiful package \pkg{yt4pdf} is gone, time has caught up with it: The
+Flash player is no longer in use, anywhere;\footnote{Adobe will formally
+abandon Flash Player in December 2020} \app{Google} discontinued its
+ActionScript 3.0 Player several years ago. It was \app{Acrobat} and
+\app{Google} technologies that were the foundation of the \pkg{yt4pdf}
+package.
+
+We turn over a new leaf by writing and publishing the \pkg{ltx4yt} package:
+{\LaTeX} for \YT. What \pkg{ltx4yt} does is to provide some tools for
+creating links, dropdown lists, popup menus for playing selected {\YT}
+videos in the default browser. Perfect for personal use and for academic,
+professional, or classroom presentations that refer to {\YT} content.
+
+% I believe that I was vaguely aware of the \href{http://code.google.com/apis/youtube/flash_api_reference.html}
+%{{\YT} ActionScript 3.0 Player},\footnote{The YouTube AcrionScript 2.0 Player API
+% has been deprecated as of January 27, 2015; however, it is still supported, for now.} but never pursued it because of my
+%general lack of interest in {\YT} (\url{www.youtube.com}). Recently, I
+%came across a very nice demo PDF that used the API, see
+%%\mlhref{http://www.uvsar.com/pdftube/}{PDF Tube - {\YT} API wrapper for PDF documents}.
+%``PDF Tube - {\YT} API wrapper for PDF documents'' (the page has
+%since been removed).
+%The SWF file and JavaScript are made freely available, so I
+%downloaded it, and was sufficiently impressed to port the example to
+%{\LaTeX} using various members of the {Acro\negthinspace\TeX} Fine Family of Software
+%\verb!:-{)!. The SWF file and JavaScript are due to the good folks at
+%\textbf{UVSAR} (\url{www.uvsar.com}). The \textbf{UVSAR}'s sample demo also appeared in the forums of
+%the \href{http://acrobatusers.com/forum/javascript/embed-youtube-video-pdf}{Acrobat User
+%Community}.
+
+%The \textsf{ltx4yt} package uses the \textsf{rmannot} to embed the \textsf{SWF}
+%file that plays the {\YT} videos. There is a complete set of buttons
+%that come with the package to control the video: play, pause, stop
+%loading, rewind, load a video by its {\YT} video ID, and a button to
+%view a video on the {\YT} web site.\footnote{Some videos do not allow
+%embedded playback, and must be viewed on the {\YT} web site.}
+
+% http://acrobatusers.com/news/youtube-widget-acrobat
+
+\subsection{Sample files}
+
+The following are the sample files shipped with \textsf{ltx4yt}:
+\begin{itemize}
+ \item \texttt{ltx4yt-1.tex} demonstrates links created by \cs{ytvId}
+ and \cs{ytLink}. Such links created in a PDF are pretty much
+ functional for all PDF viewers, including the native PDF viewers of
+ all the modern browsers, and PDF viewers on other devices such as
+ \app{Android} and \app{iPhones}.
+
+ \item \texttt{ltx4yt-2.tex} demonstrates the PDF forms controls related
+ methods of selecting a video to watch. The command pair
+ \cs{ytComboList} and \cs{ytComboBtn} provide support for creating a
+ dropdown list (combo box) for selecting a video by title, the push
+ button takes the selection and passes it to {\YT} for display
+ in the default browser. The sample also includes a popup menu for
+ selecting video by title. Finally, there is a query field in enter
+ query text and to search {\YT} for all related titles.
+
+ This file (\texttt{ltx4yt-2.pdf}) performs as designed in
+ \app{Acrobat}, \app{Adobe Reader DC}, and \app{PDFX-Change Editor},
+ and \emph{will not} be functional in native PDF viewers of
+ browsers. \texttt{ltx4yt-2.pdf} will have no functionality in PDF
+ viewers on hand-held devices such as smart phones or tablets.
+\end{itemize}
+% Advanced examples \href{http://www.math.uakron.edu/~dpstory/aebblog.html}{AeB Blog site}.
+
+\section{Options, Requirements, and Workflows}
+
+\paragraph*{Options.} Currently, this package has two options: \opt{usepopup}\FmtMP{\opt{usepopup}
+option} and \opt{!usepopup}. When \opt{usepopup} is taken, additional
+commands are defined and supporting document Java\-Script is embedded in the
+PDF. See \hyperref[upu]{Section~\ref*{upu}} on page~\pageref*{upu} for details on using popups in the document. The
+\opt{!usepopup} is a convenience option that turns off the \opt{usepopup}
+option. The default is to not use popups in the document (\opt{!usepopup}).
+
+\paragraph*{Requirements.}
+This package requires the \pkg{eforms} package, which is part of \pkg{acrotex}.\footnote{\url{http://www.ctan/pkg/acrotex}}
+If the option \opt{usepopup}, the package \opt{popupmenu} is also input.\footnote{\url{http://www.ctan/pkg/popupmenu}}
+
+\paragraph*{Workflows.} This is a general {\LaTeX} package, any workflows can be used to build
+a \pkg{ltx4yt} document: \app{pdflatex}, \app{lualatex}, \app{xelatex}, or
+\app{dvips\,->\,distiller}.\footnote {\app{dvips\,->\,ps2pdf} can be used if
+only links are used to reference {\YT} videos and the \opt{!usepopup} option
+is in force (no document JavaScript).}
+
+\section{Basic Methods: Playing a {\YT} video using its Video ID}
+
+There are three methods of playing a {\YT} video based on its video ID:
+\begin{itemize}
+ \item \textbf{Using links}
+ \item \textbf{Using dropdown lists}
+ \item \textbf{Using a popup menu}
+\end{itemize}
+In each of the subsequent sections, we discuss each of these methods in turn.
+
+\subsection{Basic Methods: Links with \tops{\protect\cs}{\textbackslash}{ytvId}}
+
+\textbf{Demo files.} The techniques of this section are illustrated by the two files
+\texttt{examples/\allowbreak ltx4yt-1.tex} and \texttt{examples/web-pkg/ltx4yt-w1.tex}.
+
+\newtopic\noindent
+The underlying command that creates links is the \pkg{eforms} command \cs{setLink},
+this command is not seen, but is part of all link commands in this section.
+
+To create a link that references a {\YT} video from its video ID, use the \cs{ytvId} command.
+\bVerb\takeMeasure{\string\ytvId*[\ameta{KV-pairs}]\darg{\ameta{ytvID}}\darg{\ameta{text}}}%
+\begin{minipage}{\linewidth}
+\begin{minipage}{\bxSize}
+\xdef\panelWidth{\the\linewidth}% *[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytvId*[!ameta(KV-pairs)]{!ameta(ytvID)}{!ameta(text)}
+\ytvIdPresets{!ameta(KV-pairs)}
+\end{Verbatim}
+\end{minipage}\hfill
+\begin{minipage}{\linewidth-\panelWidth}
+\setDisplayNumber\label{display:ytvId}
+\end{minipage}\end{minipage}\endgroup
+\PD Use the optional asterisk (\texttt*) when the referenced video
+\emph{cannot be embedded}; \emph{not specifying} the asterisk means the video
+\emph{can be embedded}. \textbf{Embedding is the best way of viewing a video.} The \ameta{KV-pairs} are key-value pairs recognized by the
+underlying \cs{setLinks} command. The \ameta{ytvID} is the {\YT} video ID of
+the video to be played in the default browser. Finally, \ameta{text} is the
+text around of which the link is constructed.
+
+\paragraph*{The \cs{ytvIdPresets} command}
+is a convenient way of setting the link options \emph{uniformly} for all
+links created by \cs{ytvId}. Individual \ameta{KV-pairs} passed though the
+optional argument of \cs{ytvId} will override the preset values. Its default
+definition is,
+\begin{Verbatim}[xleftmargin=\amtIndent]
+\ytvIdPresets{\linktxtcolor{webbrown}}
+\end{Verbatim}
+This sets the color of the link to a brown color, which is why the links of
+this document are brown.
+
+\paragraph*{An example.} There are two ``Kung-Fu Fighting'' videos of interest: \texttt{GZ9e3Dy7obA} and
+\texttt{jhUkGIsKvn0}; we set up likes for the first and twice for the second:
+\begin{quote}
+ \ytvId{GZ9e3Dy7obA}{Kung-Fu Fighting (Bruce Lee)}\\
+ \verb~\ytvId{GZ9e3Dy7obA}{Kung-Fu Fighting (Bruce Lee)}~\\[3pt]
+ \ytvId{jhUkGIsKvn0}{Kung-Fu Fighting (Carl Douglas)}\\
+ \verb~\ytvId{jhUkGIsKvn0}{Kung-Fu Fighting (Carl Douglas)}~\\[3pt]
+ \ytvId*{jhUkGIsKvn0}{Kung-Fu Fighting* (Carl Douglas)}\\
+ \verb~\ytvId*{jhUkGIsKvn0}{Kung-Fu Fighting* (Carl Douglas)}~
+\end{quote}
+The first link works fine, just the video and nothing else. The second one
+does not, the video poster is loaded, but when you play the video, the
+response is \textsf{Video unavailable}. The third link works fine now. The
+problem here is that the second video cannot be embedded; we have to use the
+\texttt*-option to create a different link, one that goes to the full {\YT}
+web site to see one or more advertisements before the video is allowed to be
+played, additionally, there are numerous extraneous content everywhere on the
+page. When a video \emph{can be embedded}, you get a very clean video
+experience, free of advertisements and extraneous content; \emph{this is the
+best case}. Try using the first link again to enjoy the experience.
+
+There is a multi-line version of \cs{ytvId},
+\bVerb\takeMeasure{\string\ytvIdML*[\ameta{KV-pairs}]\darg{\ameta{ytvID}}\darg{\ameta{text}}}%
+\begin{minipage}{\linewidth}
+\begin{minipage}{\bxSize}
+\xdef\panelWidth{\the\linewidth}% *[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytvIdML*[!ameta(KV-pairs)]{!ameta(ytvID)}{!ameta(text)}
+\ytvIdPresets{!ameta(KV-pairs)}
+\end{Verbatim}
+\end{minipage}\hfill
+\begin{minipage}{\linewidth-\panelWidth}
+\setDisplayNumber\label{display:ytvIdML}
+\end{minipage}\end{minipage}\eVerb This form, which requires \pkg{aeb\_mlink} package and the
+\app{dvips\,->distiller}, creates true multi-line links. Here is an example:
+\ytvIdML{5y9-EVmreU4}{Lori's Corner: Episode \#1, I met her back in the year
+2000, though she probably does not remember.} The applications
+\app{pdflatex}, \app{lualatex}, and \app{xelatex} will break this link cross
+lines, but does so by creating two links. This link is a single link that
+inverts across both lines when clicked. \cs{ytvIdML} uses the same presets
+command \cs{ytIdPresets}.
+
+\subsubsection{How to get the {\YT} video ID}
+
+Go to the {\YT} web site and search for a video of interest. Once found, play, then pause
+the video. Go the browser's URL address bar and you'll see something like this:
+\begin{equation*}
+ \texttt{https://www.youtube.com/watch?v=$\underset{\text{ytvId}}{\underbrace{\texttt{dAgfnK528RA}}}$}
+\end{equation*}
+Copy the ytvId into the first argument of \cs{ytvId} and supply a title: %https://youtu.be/dAgfnK528RA
+\begin{quote}
+ \ytvId{dAgfnK528RA}{Math Antics - Order of Operations}\\
+ \verb~\ytvId{dAgfnK528RA}{Math Antics - Order of Operations}~
+\end{quote}
+Cool! You can also get the video ID by right clicking on the paused video and
+exploring the context menu presented.
+
+\subsubsection{Can the video be embedded?}
+
+I've done a little research on this question, the answer is that there is no
+way of knowing in advance. You need to test each link. In the case of video
+ID \texttt{dAgfnK528RA}, we found it, we created the link with \cs{ytvId},
+we tested it, and it worked! Had it not worked (the dreaded \textsf{Video
+unavailable} appears when you try to play the video), we simply use the
+\texttt*-option. It's just that simple.
+
+\subsection{Basic Methods: dropdown list}
+
+\textbf{Demo files.} The techniques of this section are illustrated by the two files
+\texttt{examples/\allowbreak ltx4yt-2.tex} and \texttt{examples/web-pkg/ltx4yt-w2.tex}.
+
+\newtopic\noindent A dropdown list, a combobox in Adobe's original terminology, is an Adobe form field
+that drops down to display a list of menu items. It takes up less page space,
+and may be a good choice rather than listing a number of links on the page.
+
+\paragraph*{To create a dropdown list}
+
+\begin{enumerate}
+\item
+\textbf{Create a play list.} At any point prior to the dropdown list, declare your play list:
+\bVerb\takeMeasure{\quad\string\ytIdTitle\darg{\ameta{title\SUB{n}}}\darg{\ameta{ytvId\SUB{n}}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\declarePlayList{!ameta(\plCmd)}{%
+!quad\ytIdTitle{!ameta(title!SUB1)}{!ameta(ytvId!SUB1)}
+!quad...
+!quad\ytIdTitle{!ameta(title!SUB(n))}{!ameta(ytvId!SUB(n))}
+}
+\end{Verbatim}
+\end{minipage}\eVerb If the video referenced by \ameta{ytvId} \emph{cannot be
+embedded}, then place an \FmtMP{use \texttt* in title}\texttt* in the
+\ameta{title} as a single to the underlying JavaScript that the video cannot
+be embedded.
+
+\item \textbf{Set the initial value and playlist} At any point prior to the dropdown list, set the require
+dropdown list information:
+\bVerb\takeMeasure{\string\ytPlayList\darg{\ameta{ytvId}}\darg{\ameta{\string\plCmd}}}%\plCmd
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytPlayList{!ameta(ytvId)}{!ameta(\plCmd)}
+\end{Verbatim}
+\end{minipage}\eVerb
+where \ameta{ytvId} is the video ID of the title initially displayed in the
+dropdown list, and \ameta{\string\plCmd} is a command defined earlier in a
+\cs{declarePlayList} command.
+
+\item \textbf{Place the dropdown list and accompanying \textsf{Play} button.}
+\bVerb\takeMeasure{\string\ytComboList[\ameta{KV-pairs}]\darg{\ameta{name}}\darg{\ameta{wd}}\darg{\ameta{ht}}}%\plCmd
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytComboList[!ameta(KV-pairs)]{!ameta(name)}{!ameta(wd)}{!ameta(ht)}
+\ytComboBtn[!ameta(KV-pairs)]{!ameta(name)}{!ameta(wd)}{!ameta(ht)}
+\end{Verbatim}
+\end{minipage}\eVerb where \ameta{name} is a text string of ASCII letters and numbers. The \ameta{name} is appended
+on to the field names of these two field; The pair \cs{ytComboList} and
+\cs{ytComboBtn} must be passed the same \ameta{name} value. The common
+\ameta{name} ties them together.
+\end{enumerate}
+Below is an abbreviated example, more extensive examples are found in the demo files sited at the beginning of this section.
+
+\declarePlayList{\playList}{% note: put parentheses within braces
+ \ytIdTitle{Kung-Fu Fighting {(Bruce Lee)}}{GZ9e3Dy7obA}
+ \ytIdTitle{Kung-Fu Fighting* {(Carl Douglas)}}{jhUkGIsKvn0}
+ \ytIdTitle{J\"{u}rgen's "favorite" song*}{mLDF5MBMWHE}
+ \ytIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+}
+\ytPlayList{GZ9e3Dy7obA}{\playList}
+
+\paragraph*{Example} A four-item dropdown list: \ytComboList{YT1}{144bp}{11bp}\olBdry\ytComboBtn{YT1}{33bp}{11bp}
+
+\newtopic\noindent The verbatim listing is,\bVerb
+\def\1{\llap{\rlap{\ding{182}}\hskip\amtIndent\relax}}\relax
+\def\2{\llap{\rlap{\ding{183}}\hskip\amtIndent\relax}}\relax
+\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small,commandchars={!~@}]
+\declarePlayList{\playList}{% note: put parentheses within braces
+!quad\ytIdTitle{Kung-Fu Fighting {(Bruce Lee)}}{GZ9e3Dy7obA}
+!quad\ytIdTitle{Kung-Fu Fighting* {(Carl Douglas)}}{jhUkGIsKvn0}
+!1!quad\ytIdTitle{J\"{u}rgen's "favorite" song*}{mLDF5MBMWHE}
+!2!quad\ytIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+}
+\ytPlayList{GZ9e3Dy7obA}{\playList}
+\paragraph*{Example} A two-item dropdown list:
+ \ytComboList{YT1}{144bp}{11bp}\olBdry\ytComboBtn{YT1}{33bp}{11bp}
+\end{Verbatim}
+\endgroup\noindent There are a several observations to make in this markup: line~\ding{182}
+uses standard {\LaTeX} markup to describe the u-umlaut, the double quote
+requires no special attention; line~\ding{183} the backslash can be expressed
+as \cs{cs\darg{\ameta{text}}}. Also note that two of the titles have an
+\texttt* in them, this signals that these videos cannot be embedded.
+
+\subsection{Basic Methods: popup menus}\label{upu}
+
+\textbf{Demo files.} The techniques of this section are illustrated by the two files
+\texttt{examples/\allowbreak ltx4yt-2.tex} and \texttt{examples/web-pkg/ltx4yt-w2.tex}.
+
+\newtopic\noindent A pop-up menu is a menu list that appears on top of the content of the page, it is generated
+by the JavaScript method \texttt{app.popUpMenuEx()}. The advantage of this
+method is that it take up no space on the page, it is displayed on top of the
+page and is dismissed when an item from the menu list is chosen.
+
+\goodbreak
+\newtopic\noindent\textbf{To create a pop-up menu}
+\begin{enumerate}
+ \item \textbf{Build a menu listing.} Use the \env{popupmenu} environment of
+ the \pkg{popumemnu} package to build/design your menu.
+\bVerb\takeMeasure{\string\begin\darg{submenu}\darg{title=\ameta{submenu-name\SUB{1}}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\begin{popupmenu}{!ameta(menu-name)}
+\puIdTitle{!ameta(title!SUB1)}{!ameta(ytvId!SUB1)}
+...
+\puIdTitle{!ameta(title!SUB(m))}{!ameta(ytvId!SUB(m))}
+\begin{submenu}{title=!ameta(submenu-name!SUB1)}
+!quad\puIdTitle{!ameta(title!SUB(m+1))}{!ameta(ytvId!SUB(m+1))}
+!quad..
+!quad\puIdTitle{!ameta(title!SUB(m+n))}{!ameta(ytvId!SUB(m+n))}
+\end{submenu}
+...
+\end{popupmenu}
+\end{Verbatim}
+\end{minipage}\eVerb
+You need not have a \env{submenu} structure, but \env{submenu}s are useful for organizing the links.
+The first argument of \cs{puIdTitle} is passed through \cs{pdfstringdef}, this enables you to use
+{\LaTeX} markups for accents, for example. If the second argument (\ameta{ytvId}) is empty, then
+that entry has no action associated with it, and can be used as a menu heading.
+
+\item \textbf{Create the menu data.} Following all \env{popupmenu}
+ environments, yet still in the preamble\FmtMP{preamble}, insert the
+ following command:
+\bVerb\takeMeasure{\string\ytUseMenus\darg{\ameta{menu-name\SUB{1}},...,\ameta{menu-name\SUB{k}}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytUseMenus{!ameta(menu-name!SUB1),...,!ameta(menu-name!SUB(k))}
+...
+!color(gray)\begin{document}
+\end{Verbatim}
+\end{minipage}\eVerb The argument of \cs{ytUseMenus} is a comma-delimited list
+of \ameta{menu-name}s declared as the first argument of \env{popupmenu}
+environments.
+
+\item \textbf{Place the \cs{ytPopupBtn} command.}
+\bVerb\takeMeasure{\string\ytPopupBtn[\ameta{KV-pairs}]\darg{\ameta{menu-name}\darg{\ameta{wd}}\darg{\ameta{ht}}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytPopupPresets{!ameta(KV-pairs)}
+\ytPopupBtn[!ameta(KV-pairs)]{!ameta(menu-name)}{!ameta(wd)}{!ameta(ht)}
+\end{Verbatim}
+\end{minipage}\eVerb Employ \cs{ytPopupPresets} as a way to pass \ameta{KV-pairs} to all
+\cs{ytPopupBtn} commands in the document. For an individual \cs{ytPopupBtn}
+command, its \ameta{KV-pairs} argument passes key-values to that
+\cs{ytPopupBtn}, these \ameta{KV-pairs} will override the ones of
+\cs{ytPopupPresets}. The second argument, \ameta{menu-name}, is name of the
+pop-up menu data you want to use. This menu data is created earlier in the
+preamble by the \env{popumenu} environment and referenced again in the argument
+of \cs{ytUseMenus}.
+\end{enumerate}
+
+\paragraph*{Example.} \ytPopupBtn[\CA{Sea Hunt}]{YTSea}{20bp}{5bp}
+Let's create a short pop-up menu, more extensive examples are found
+in \texttt{examples/\allowbreak ltx4yt-2.tex} and \texttt{examples/web-pkg/ltx4yt-w2.tex}.
+\bVerb\def\1{\llap{\rlap{\ding{182}}\hskip\amtIndent\relax}}\relax
+\def\2{\llap{\rlap{\ding{183}}\hskip\amtIndent\relax}}\relax
+\def\3{\llap{\rlap{\ding{184}}\hskip\amtIndent\relax}}\relax
+\def\4{\llap{\rlap{\ding{185}}\hskip\amtIndent\relax}}\relax
+\begin{Verbatim}[xleftmargin=\amtIndent,fontsize=\small,commandchars={!~@}]
+\begin{popupmenu}{YTSea}
+!1!quad\puIdTitle{J\"{u}rgen's favorite song*}{mLDF5MBMWHE}
+!2!quad\puIdTitle{\Esc"Sea Hunt\Esc"
+!qquad~US TV series {(1958-61)} lead-in}{Lz0aMoWh8Q4}@
+!quad\puIdTitle{Theme Song to Sea Hunt*}{2QxXk6X9GDo}
+!3!quad\puIdTitle{Learn \cs{LaTeX} in one video}{VhmkLrOjLsw}
+\end{popupmenu}
+!4\ytUseMenus{YTSea}
+...
+\begin{document}
+...
+...
+\paragraph*{Example.}
+\ytPopupBtn[\CA{Sea Hunt}]{YTSea}{20bp}{5bp} Let's ...
+\end{Verbatim}
+\eVerb The first argument of \cs{puIdTitle} is passed through
+\cs{pdfstringdef}, this enables you to use {\LaTeX} markup on accents, as in
+\ding{182}. In line \ding{183}, a special locally defined command \cs{Esc} is
+used to ``escape'' the double quotes so that we \verb~\"~ to appear in the
+document JavaScript, which is where the menu items appear within the PDF. In
+line~\ding{184} a special locally defined command \cs{cs} is used to create a
+backslash, in a manner similar to {\LaTeX} markup. Note the presence of the
+\FmtMP{\texttt{*} noted}\texttt{*} in the title of two of the menu items;
+this is used to signal to the underlying JavaScript that the title cannot be
+embedded. Finally, we the \env{popupmenu} environment, we declare, in line~\ding{185},
+that we are using the menu named \texttt{YTSea}.
+
+\newlength\ytlength
+
+\section{Advanced Methods: Playing video with \tops{\protect\cs}{\textbackslash}{ytLink}}
+
+The link earlier discussed is \cs{ytvId}, which takes as its first argument
+the video ID of the targeted video. It then constructs a URL one way or
+another, depending on the presence of the \texttt*-option. This method is
+pretty rigid, one size fits all, if you will. A more flexible method of
+constructing links is to use the \cs{ytLink} command.
+\bVerb\takeMeasure{\string\ytLink\darg{\string\embedId\darg{\ameta{ytvId}}\string\params\darg{\ameta{params}}\darg{\ameta{text}}}}%
+\setlength\ytlength{\bxSize}%
+\def\1{\rlap{\hskip\ytlength\relax\ding{182}}}%
+\def\2{\rlap{\hskip\ytlength\relax\ding{183}}}%
+\def\3{\rlap{\hskip\ytlength\relax\ding{184}}}%
+\def\4{\rlap{\hskip\ytlength\relax\ding{185}}}%
+\def\5{\rlap{\hskip\ytlength\relax\ding{186}}}%
+\def\6{\rlap{\hskip\ytlength\relax\llap{\sffamily(presets for \cs{ytvId})\hskip2\fboxsep\hskip2\fboxrule}}}%
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+!1\ytLink{\embedId{!ameta(ytvId)}\params{!ameta(params)}}{!ameta(text)}
+!2\ytLink{\watchId{!ameta(ytvId)}\params{!ameta(params)}}{!ameta(text)}
+!3\ytLink{\embed{!ameta(spec)}}{!ameta(text)}
+!4\ytLink{!ameta(spec)}{!ameta(text)}
+!5\ytLink{\channel{!ameta(name)}}{!ameta(text)}
+!5\ytLink{\user{!ameta(name)}}{!ameta(text)}
+!6\ytvIdPresets{!ameta(KV-pairs)}
+\end{Verbatim}
+\end{minipage}\eVerb Each of these has an optional first argument \ameta{KV-pairs} that is not shown above.
+Let's take a look at each of these in turn and illustrate with examples. Yes,
+{\YT} has a number of parameter is recognizes in its urls, see
+\href{https://developers.google.com/youtube/player_parameters#Parameters}{here}
+for a discussion.
+\begin{enumerate}
+ \item[\ding{182}] Use this form \emph{when you can embed} a video
+ \ameta{ytvId} with additional parameters. (this best type of video).
+ The \cs{params} argument \emph{must follow} the \cs{embedId}, its
+ arguments are any parameters you want to append to the URL. The use
+ of \cs{params} is optional; however, without \cs{params} you
+ should use \verb|\ytvId*{|\ameta{ytvID}\verb|}{|\ameta{text}\verb|}|.
+ For example, we auto play a video with modest branding:\\[3pt]
+ \ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&modestbranding=1}}{Lori's Corner: Episode \#1}\\\small
+ \verb!\ytLink{\embedId{5y9-EVmreU4}!\\
+ \null\qquad\verb!\params{autoplay=1&modestbranding=1}}{Lori's Corner: Episode \#1}!
+
+ The demo file \texttt{ltx4yt-1.tex} contains an example of this type
+ of link that sets up a small play list of three videos.
+
+ \item[\ding{183}] Use this form \emph{when you \emph{cannot} embed} (or
+ you want to play the video on the main {\YT} site) \ameta{ytvId} with
+ additional parameters. The \cs{params} argument must follow the
+ \cs{watchId}, its argument are any parameters you want to append to
+ the URL. The use of \cs{params} is optional; however, without the
+ \cs{params} you may as well use
+ \verb|\ytvId*{|\ameta{ytvID}\verb|}{|\ameta{text}\verb|}|.
+ \\[3pt]
+ \ytLink{\watchId{5y9-EVmreU4}\params{autoplay=1}}{Lori's Corner: Episode \#1}\\
+ \verb!\ytLink{\watchId{5y9-EVmreU4}!\\
+ \null\qquad\verb!\params{autoplay=1}}{Lori's Corner: Episode \#1}!
+
+ \item[\ding{184}] A more general form that allows you to formulate general URLs. For example, we \emph{search}
+ for {\YT} videos on \app{Adobe Acrobat DC}:\\[3pt]
+ \ytLink{\embed{listType=search&list=Adobe Acrobat DC}}{Search for Adobe Acrobat DC}\\
+ \verb!\ytLink{\embed{listType=search&list=Adobe Acrobat DC}}!\\
+ \null\qquad\verb!{Search for Adobe Acrobat DC}!
+ \item[\ding{185}] The most general form, \ameta{spec} is simply appended, ie,
+ \texttt{https://www.youtube.com/\ameta{spec}}\\[3pt]
+ \ytLink{embed?listType=search&list=LaTeX typesetting}{Totally custom search link}\\
+ \verb|\ytLink{embed?listType=search&list=LaTeX typesetting}|\\
+ \null\qquad\verb|{Totally custom search link}|
+ \item[\ding{186}] There are a couple of URLs for displaying a channel on \YT, at least there are a couple
+ that I have discovered.
+ Use this form to see channel of a particular contributor to {\YT}. For example,\\[3pt]
+ \ytLink{\channel{rocketjump}}{The RocketJump Channel}\\
+ \verb|\ytLink{\channel{rocketjump}}{The RocketJump Channel}|\\[3pt]
+ \ytLink{\user{freddiew}}{Freddie Diew's Channel}\\
+ \verb|\ytLink{\user{freddiew}}{Freddie Diew's channel}|
+
+ To get the true \ameta{name} of a channel, go to {\YT} and search for that channel. For example,
+ search for \textsf{RocketJump}. On the resulting page, click on a RocketJump link and look at the
+ location bar in the browser to see the path, it may come up \texttt{c/rocketjump} or \texttt{user/freddiew}.
+\end{enumerate}
+
+\newtopic\noindent There is a multi-line version of \cs{ytLink}.
+\bVerb\takeMeasure{\string\ytLinkML*[\ameta{KV-pairs}]\darg{\ameta{spec}}\darg{\ameta{text}}}%
+\begin{minipage}{\linewidth}
+\begin{minipage}{\bxSize}
+\xdef\panelWidth{\the\linewidth}% *[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytLinkML*[!ameta(KV-pairs)]{!ameta(spec)}{!ameta(text)}
+\ytvIdPresets{!ameta(KV-pairs)}
+\end{Verbatim}
+\end{minipage}\hfill
+\begin{minipage}{\linewidth-\panelWidth}
+\setDisplayNumber\label{display:ytLinkML}
+\end{minipage}\end{minipage}\eVerb This form, which requires \pkg{aeb\_mlink} package and the
+\app{dvips\,->distiller}, creates true multi-line links. \cs{ytLinkML} has the same variations
+of \cs{ytLink} (lines \ding{182}--\ding{186}) described earlier
+
+\section{Searching {\YT}} %\previewOn
+
+Want to interactively search {\YT} for your favorate video? Search using the commands \cs{ytInputQuery}
+and \cs{ytSearch}:
+\bVerb\takeMeasure{\string\ytInputQuery[\ameta{KV-pairs}]\darg{\ameta{wd}}\darg{\ameta{ht}}}%
+\begin{minipage}{\linewidth}
+\begin{minipage}{\bxSize}
+\begin{Verbatim}[frame=single,commandchars=!(),rulecolor=\color{red}]
+\ytInputQuery[!ameta(KV-pairs)]{!ameta(wd)}{!ameta(ht)}
+\ytSearch[!ameta(KV-pairs)]{!ameta(wd)}{!ameta(ht)}
+\ytClearQuery[!ameta(KV-pairs)]{!ameta(wd)}{!ameta(ht)}
+\end{Verbatim}
+\end{minipage}
+\quad\ytInputQuery{1.5in}{11bp}\olBdry
+\ytSearch{}{11bp}\olBdry
+\ytClearQuery{}{11bp}
+\end{minipage}
+\eVerb \cs{ytInputQuery} is an input box to enter query text; \cs{ytSearch} is a push button that searchs
+{\YT} for the text entered into \cs{ytInputQuery}; and finally, \cs{ytClear} clears \cs{ytInputQuery}.
+
+
+\newtopic\noindent
+That's all for now, I simply must get back to my retirement. {\dps}
+
+\end{document}
diff --git a/texmf-dist/doc/latex/ltx4yt/ltx4yt.pdf b/texmf-dist/doc/latex/ltx4yt/ltx4yt.pdf
new file mode 100644
index 00000000..19dc2f61
--- /dev/null
+++ b/texmf-dist/doc/latex/ltx4yt/ltx4yt.pdf
Binary files differ
diff --git a/texmf-dist/source/latex/ltx4yt/ltx4yt.dtx b/texmf-dist/source/latex/ltx4yt/ltx4yt.dtx
new file mode 100644
index 00000000..ef6356d9
--- /dev/null
+++ b/texmf-dist/source/latex/ltx4yt/ltx4yt.dtx
@@ -0,0 +1,651 @@
+%\iffalse
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ltx4yt.sty package, %%
+%% Copyright (C) 2020 %%
+%% 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{ltx4yt}
+%<package> [2020/07/30 v0.7 ltx4yt: Play YouTube videos in the default browser (dps)]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[colorlinks,hyperindex=false]{hyperref}
+\hypersetup{pdfpagemode=useNone}
+\usepackage{fancyvrb}
+%\def\texorpdfstring#1#2{#1}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+\OnlyDescription % comment out for implementation details
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\InputIfFileExists{aebdocfmt.def}{\PackageInfo{ltx4yt}{Inputting aebdocfmt.def}}
+ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
+ \PackageInfo{ltx4yt}{aebdocfmt.def cannot be found}}
+\EnableCrossrefs \CodelineIndex \RecordChanges
+\makeatletter
+\renewcommand{\paragraph}
+ {\@startsection{paragraph}{4}{0pt}{6pt}{-3pt}
+ {\normalfont\normalsize\bfseries}}
+\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}
+\makeatother
+\bgroup\ttfamily
+\gdef\brpr#1{\char123\relax#1\char125\relax}\egroup
+\let\darg\brpr
+\let\env\texttt
+\let\opt\texttt
+\let\app\textsf
+\let\tops\texorpdfstring
+\def\nmpsep#1{\hskip-\marginparsep\texttt{#1}}
+\def\visispace{\symbol{32}}
+\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
+\def\meta#1{\textsl{\texttt{#1}}}
+\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
+\def\ltag{<}\def\rtag{>}
+\def\EXCL{!}
+\let\app\textsf\let\pkg\textsf
+\begin{document}
+ \GetFileInfo{ltx4yt.sty}
+ \title{The \textsf{ltx4yt} Package}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@acrotex.net}}
+ \date{processed \today}
+ \maketitle
+ \tableofcontents
+ \let\Email\texttt
+ \DocInput{ltx4yt.dtx}
+\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute
+ \texttt{makeindex -s gind.ist -o ltx4yt.ind ltx4yt.idx} on the command line and recompile
+ \texttt{ltx4yt.dtx}.}
+\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute
+ \texttt{makeindex -s gglo.ist -o ltx4yt.gls ltx4yt.glo} on the command line and recompile
+ \texttt{ltx4yt.dtx}.}
+\end{document}
+%</driver>
+% \fi
+% \MakeShortVerb{|}
+% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{ltx4yt}{Inputting aebdonotindex.def}}
+% {\PackageInfo{ltx4yt}{cannot find aebdonotindex.def}}
+% \DoNotIndex{\g@addto@macro,\divide,\box,\setbox,\x,\y,\z}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \section{Introduction}
+%
+% It is July 2020 and Adobe's support for Flash will vanish in December. Google stopped
+% supporting Flash several years ago, so the package \pkg{yt4pdf} is no longer functional
+% and will be withdrawn from CTAN. If we cannot play videos within PDF anymore, the next best
+% course is to develop some basic commands for playing YouTube videos in the default browser, preferably
+% without any annoying advertisements. This can be done for some videos, but for others it cannot be done.
+%
+%\changes{v0.1}{2020/07/17}{Begin new package \string\pkg{ltx4yt}}
+%\changes{v0.2}{2020/07/17}{Commands to pass arguments to urls}
+%\changes{v0.6}{2020/07/25}{Final version before first publication}
+%\changes{v0.7}{2020/07/30}{Corrected upload}
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+% \leavevmode\IndexOpt{usepopup} When this option is taken, additional code to support
+% the use of popup menus is input. We also support \IndexOpt[\protect\EXCL]{!usepopup}\opt{!popup},
+% which is a convenience option for not using \opt{usepopup}.
+% \begin{macrocode}
+\DeclareOption{usepopup}{\def\lo@dpu{\InputIfFileExists{ytpu.def}
+ {\PackageInfo{ltx4yt}{Loading ytpu.def}}
+ {\PackageInfo{ltx4yt}{Can't find ytpu.def}}}}
+\DeclareOption{!usepopup}{}
+\let\lo@dpu\relax
+\AtEndOfPackage{\lo@dpu}
+\ProcessOptions
+\RequirePackage{xcolor}
+\RequirePackage{eforms}
+% \end{macrocode}
+% If the \opt{usepopup} option is taken, we load the \pkg{popupmenu} package.
+% \begin{macrocode}
+\ifx\lo@dpu\relax\else
+\def\YT@rpPU{\RequirePackage{popupmenu}[2020/07/26]}\expandafter
+\YT@rpPU\fi
+% \end{macrocode}
+%
+% \section{Implementation}
+%
+% The JavaScript method \texttt{app.launchURL\darg{\ameta{URL}}} is used to open the default browser
+% on the page determined by \ameta{URL}. The links created use \cs{URI} (\texttt{/S/URI/URI}), this action type
+% allows links to be functional in all PDF viewers, even on hand held devices.
+%
+% We have three implementations of this plan: (1)~links (\cs{ytvId} and \cs{ytLink}) for all devices;
+% (2)~dropdown menus (combo boxes) (\cs{ytComboList} (uses JavaScript);
+% and (3)~pop-up menus using the \env{popupmenu} environment of the \pkg{popupmenu} package (uses JavaScript).
+% The methods that use JavaScript will not function in the near future on hand held devices.
+%
+% \subsection{Playing a YouTube video from its Video ID}
+%
+% In this section, we create several ways of calling for a YouTube video to play
+% in the default browser.
+%
+% \subsubsection{Using a Link}
+% \begin{macro}{\ytvIdPresets}\nmpsep{\darg{\ameta{KV-pairs}}}
+% The options for the \cs{ytvId} link. The default is given below in the definition.
+% Initially, the preset is to produce \texttt{webbrown} colored links.
+% \begin{macrocode}
+\newcommand{\ytvIdPresets}[1]{\def\yt@vIdPresets{#1}}
+\definecolor{webbrown}{rgb}{.6,0,0} % from the web package
+\ytvIdPresets{\linktxtcolor{webbrown}}
+% \end{macrocode}
+% \end{macro}
+% Here is a convenience command. This definition has since been made
+% in \pkg{insdljs}.
+% \begin{macrocode}
+\providecommand{\URI}[1]{/S/URI/URI(#1)}
+% \end{macrocode}
+% Define \DescribeMacro\ytURL\cs{ytURL} to expand to the YouTube web site.
+% \begin{macrocode}
+\def\ytNF{false}
+\def\ytURL{https://www.youtube.com}
+% \end{macrocode}
+% \begin{macro}{\ytvId}\nmpsep{*[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}}
+% The \cs{ytvId} is link which when pressed plays the video whose Video Id is \ameta{ytvID})
+% in the default browser.
+% \begin{quote}
+% \begin{itemize}
+% \item[\texttt*] If the \texttt*-option is taken, you have determined that this
+% video cannot be embedded (which is the ideal) and must be played normally on YouTube
+% with all advertisements and other extraneous information.
+% \item[{\ameta{opts}}:] link optional KV-pairs to modify the appearance of the link.
+% \item[{\ameta{ytvID}}:] The video Id for the YouTube video to play
+% \item[{\ameta{text}}:] The text that displays the link.
+%\end{itemize}
+%\end{quote}
+% \begin{macrocode}
+\newcommand{\ytvId}{\@ifstar{\def\yt@ask{*}\yt@@vId}
+ {\let\yt@ask\@empty\yt@@vId}}
+\newcommand{\yt@@vId}[3][]{%
+ \ifx\yt@ask\@empty
+ \def\yt@lnk@hash{embed/#2}\else
+ \def\yt@lnk@hash{watch?v=#2}\fi
+ \setLink[\presets{\yt@vIdPresets}#1
+ \A{\URI{\ytURL/\yt@lnk@hash}}]{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytvIdML}\nmpsep{*[\ameta{opts}]\darg{\ameta{ytvID}}\darg{\ameta{text}}}
+% The \cs{ytvId} is link which when pressed plays the video whose Video Id is \ameta{ytvID})
+% in the default browser. This is a multi-line link, it requires the \pkg{aeb\_mlink} package
+% and the \app{dvips\,\texttt{->}\,distiller} workflow.
+% \begin{macrocode}
+\newcommand{\ytvIdML}{\@ifstar{\def\yt@ask{*}\yt@@vIdML}
+ {\let\yt@ask\@empty\yt@@vIdML}}
+\newcommand{\yt@@vIdML}[3][]{%
+ \ifx\yt@ask\@empty
+ \def\yt@lnk@hash{embed/#2}\else
+ \def\yt@lnk@hash{watch?v=#2}\fi
+ \mlsetLink[\presets{\yt@vIdPresets}#1
+ \A{\URI{\ytURL/\yt@lnk@hash}}]{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytLink}\nmpsep{[\ameta{opts}]\darg{\ameta{spec}}\darg{\ameta{text}}}
+% We create a custom link for youtube videos. The \ameta{spec} (specification) argument has several
+% forms for maximum convenience and flexibility.
+% \begin{itemize}
+% \item |\ytLink{\embedId{|\ameta{ytvID}|}\params{|\ameta{parameters}|}}{|\ameta{text}|}|\\[3pt] This is the form
+% for playing a video with \ameta{ytvID} that \emph{can be embedded} (this best type of video). The \cs{params}
+% argument must follow the \cs{embedId}, its argument are any parameters you want to append to the URL.
+% The use of \cs{params} is optional; however, without the \cs{params} you may as well use
+% |\ytvId{|\ameta{ytvID}|}{|\ameta{text}|}|.
+%
+% \item |\ytLink{\watchId{|\ameta{ytvID}|}\params{|\ameta{parameters}|}}{|\ameta{text}|}|\\[3pt] This is the form
+% for playing a video with \ameta{ytvID} that \emph{cannot be embedded} (advertisements and other information
+% appears). The \cs{params} argument must follow the \cs{watchId}, its argument are any parameters you want to append to the URL.
+% The use of \cs{params} is optional; however, without the \cs{params} you may as well use
+% |\ytvId*{|\ameta{ytvID}|}{|\ameta{text}|}|.
+%
+% \item |\ytLink{\embed{|\ameta{spec}|}}{|\ameta{text}|}|\\[3pt]
+% A form that does not specify a video ID. It is useful for more general actions, such as
+% searches, for example,
+% \begin{flushleft}
+% |\ytLink{\embed{listType=search&list=Adobe Acrobat DC}}|\\
+% \qquad|{Search for Adobe Acrobat DC}|
+% \end{flushleft}
+% This form does not have a \cs{params} optional argument as all the parameters are built into the
+% argument of \cs{embed}.
+%
+% \item |\ytLink{|\ameta{spec}|}{|\ameta{text}|}|\\[3pt] The most general form. The action of this
+% link is |\URI{\ytURL/|\ameta{spec}|}|; for example,
+% \begin{flushleft}
+% |\ytLink{embed?listType=search&list=Adobe Acrobat DC}|\\
+% \qquad|{Search for Adobe Acrobat DC}|
+% \end{flushleft}
+% Here you are free to build whatever URL you can imagine.
+%
+% \item |\ytLink{\channel{|\ameta{name}|}}{|\ameta{text}|}|\\[3pt]
+% Such a link displays the channel \ameta{name}. For example,
+% \begin{flushleft}
+% |\ytLink{\channel{rocketjump}}{The RocketJump Channel}|
+% \end{flushleft}
+% This link opens the YouTube channel named \texttt{rocketjump}.
+% \end{itemize}
+% \paragraph*{Passing Player Parameters.}
+% As was illustrated above, the custom link \cs{ytLink} can pass various recognizable
+% parameters to YouTube. After reviewing,
+% \begin{flushleft}
+% \url{https://developers.google.com/youtube/player_parameters#Parameters}
+% \end{flushleft}
+% the following parameters are recommended, some of them are illustrated in the
+% sample document \texttt{ltx4yt-1.tex}:
+% \begin{itemize}
+% \item \texttt{autoplay=\ameta{\upshape{0\string|1}}} (default \texttt{0})
+% \item \texttt{controls=\ameta{\upshape{0\string|1}}} (default \texttt{1})
+% \item \texttt{fs=\ameta{\upshape{0\string|1}}} (default \texttt{1})
+% \item \texttt{modestbranding=\ameta{\upshape{0\string|0}}}
+% \item \texttt{playlist=\ameta{list}}
+% \item \texttt{listType=search\&list=\ameta{query}}
+% \end{itemize}
+% The specialized needs of the document author is most easily accommodated through the use
+% of the \cs{ytLink} command, for example,
+% \begin{flushleft}\obeylines
+% |\ytLink{\embedId{5y9-EVmreU4}\params{autoplay=1&modestbranding=1}}|
+% \qquad|{Lori's Corner: Episode \#1}|
+% \end{flushleft}
+% \begin{macrocode}
+\newif\ifytwatch \ytwatchfalse
+% \end{macrocode}
+% \paragraph*{The \cs{ytLink} command.} Before getting to \cs{ytLink} an d\cs{ytLinkML},
+% there is a long stream of commands to parse the \ameta{spec} argument of \cs{ytLink}.
+% It goes through looking for \cs{watchId}, \cs{embedId}, \cs{embed}, and \cs{params}.
+% As it progresses, it adds code to the macro \cs{ytspec}, which at the end of things
+% will hold the fully formed \ameta{spec} for insertion into the URL.
+% \begin{macrocode}
+\def\yt@@parse{\let\ytspec\@empty\yt@parse}
+\def\yt@parse{\@ifnextchar\@nil{\@gobble}{\yt@parsei}}
+\def\yt@parsei{\@ifnextchar\watchId{% check for \watchId
+ \ytwatchtrue\yt@parse@watch}{\yt@parseii}}
+\def\yt@parse@watch\watchId#1{\g@addto@macro
+ \ytspec{\watchId{#1}}\yt@parse}
+\def\yt@parseii{\@ifnextchar\embedId{% check for \embedId
+ \yt@parse@embedId}{\yt@parseiii}}
+\def\yt@parse@embedId\embedId#1{\g@addto@macro
+ \ytspec{\embedId{#1}}\yt@parse}
+\def\yt@parseiii{\@ifnextchar\embed{% check for \embed
+ \yt@parse@embed}{\yt@parseiv}}
+\def\yt@parse@embed\embed#1{\g@addto@macro
+ \ytspec{\embed{#1}}\yt@parse}
+\def\yt@parseiv{\@ifnextchar\params{% check for \params
+ \yt@parse@params}{\yt@parsev}}
+\def\yt@parse@params\params#1{\ifytwatch
+ \g@addto@macro\ytspec{&#1}\else
+ \g@addto@macro\ytspec{?#1}\fi
+ \yt@parse}
+% \end{macrocode}
+% If we get this far, \ameta{spec} is raw, has none
+% of the helper commands. So we just insert the
+% entire argument into \cs{ytspec}.
+% \begin{macrocode}
+\def\yt@parsev#1\@nil{\g@addto@macro\ytspec{#1}}
+% \end{macrocode}
+% All preliminaries done, we define \cs{ytLink}
+% \begin{macrocode}
+\newcommand{\ytLink}[3][]{\begingroup
+ \def\embedId##1{embed/##1}%
+ \def\params##1{##1}\def\embed##1{embed?##1}%
+ \def\watchId##1{watch?v=##1}\def\channel##1{c/##1}%
+ \def\user##1{user/##1}%
+ \yt@@parse#2\@nil % returns arg in \ytspec
+ \def\URLArg{\ytURL/\ytspec}%
+ \setLink[\presets{\yt@vIdPresets}#1\A{\URI{\URLArg}}
+ ]{#3}\endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytLinkML}\nmpsep{[\ameta{opts}]\darg{\ameta{spec}}\darg{\ameta{text}}}
+% is the multi-line version of \cs{ytLink}. It requires a \app{dvips\,\texttt{->}\,distiller} workflow
+% as well as the \pkg{aeb\_mlink} package.
+% \begin{macrocode}
+\newcommand{\ytLinkML}[3][]{\begingroup
+ \def\embedId##1{embed/##1}%
+ \def\params##1{##1}\def\embed##1{embed?##1}%
+ \def\watchId##1{watch?v=##1}\def\channel##1{c/##1}%
+ \def\user##1{user/##1}%
+ \yt@@parse#2\@nil % returns arg in \ytspec
+ \def\URLArg{\ytURL/\ytspec}%
+ \mlsetLink[\presets{\yt@vIdPresets}#1
+ \A{\URI{\URLArg}}
+ ]{#3}\endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \subsubsection{Using a Combobox}
+% All commands associate with a combo box play list.
+% \begin{macro}{\ytComboList}\nmpsep{[\ameta{opts}]\darg{\ameta{name}}\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% The \cs{ytComboList} command produces a combo box (dropdown menu) 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{quote}
+%\begin{itemize}
+% \item[\ameta{opts}:] eforms key-value pairs
+% \item[\ameta{name}:] A unique name (ASCII letters and numbers)
+% \item[\ameta{wd}:] The width of the combo box
+% \item[\ameta{ht}:] The height of the combo box
+%\end{itemize}
+%\end{quote}
+% Now we have the code for \cs{ytComboList}
+% \begin{macrocode}
+\newcommand{\ytComboList}[4][]{%
+ \comboBox[\Ff{\FfCommitOnSelChange}\DV{\yt@pl@def}\V{\yt@pl@def}
+ \presets{\yt@ComboListPresets}#1]{ytSelect#2}
+ {#3}{#4}{*\yt@pl@pl}% 2020/07/22 v0.4
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytComboBtn}\nmpsep{[\ameta{opts}]\darg{\ameta{name}}\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% A button to play the selection made in the combo box. The caption of the push button
+% is determined by the command \DescribeMacro\ytStrPLAY\cs{ytStrPlay}.
+% The parameters for \cs{ytComboBtn} are,
+% \begin{quote}
+%\begin{itemize}
+% \item[\ameta{opts}:] The KV-pairs to pass to the underlying push button.
+% \item[\ameta{name}:] A unique name (ASCII letters and numbers)
+% \item[\ameta{wd}:] The width of the combo box
+% \item[\ameta{ht}:] The height of the combo box
+%\end{itemize}
+%\end{quote}
+% \begin{macrocode}
+\newcommand{\ytStrPLAY}{PLAY}
+\newcommand{\ytComboBtn}[4][]{%
+ \pushButton[\TU{Click to play}\CA{\ytStrPLAY}
+ \presets{\yt@ComboBtnPresets}#1
+ \A{\JS{var f=this.getField("ytSelect#2");\r
+ var ytID=f.value;\r
+ var i=f.currentValueIndices;\r
+ var ytFV=f.getItemAt(i,false);\r
+ var i=ytFV.indexOf("*");\r
+ if ( i == -1 )\r\t
+ app.launchURL("\ytURL/embed/"+ytID,\ytNF);\r
+ else\r\t
+ app.launchURL("\ytURL/watch?v="+ytID,\ytNF);
+ }}]{ytSelectBtn#2}{#3}{#4}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytPlayList}\nmpsep{\darg{\ameta{ytvID}}\darg{\ameta{\cs{cmd}}}}
+% This command is executed before \cs{ytComboList} to set the initial/default value (\ameta{ytvID}) of the
+% combo box and the play list (\ameta{\cs{cmd}}). Here \ameta{\cs{cmd}} is a command defined by the
+% \cs{declarePlayList} command. 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}
+% \end{macro}
+% \begin{macro}{\ytComboListPresets}\nmpsep{\darg{\ameta{opts}}} The KV-pairs
+% for \cs{ytComboList}.
+% \begin{macrocode}
+\newcommand{\ytComboListPresets}[1]{\def\yt@ComboListPresets{#1}}
+\let\yt@ComboListPresets\@empty
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytComboBtnPresets}\nmpsep{\darg{\ameta{opts}}} The KV-pairs
+% for \cs{ytComboBtn}.
+% \begin{macrocode}
+\newcommand{\ytComboBtnPresets}[1]{\def\yt@ComboBtnPresets{#1}}
+\let\yt@ComboBtnPresets\@empty
+% \end{macrocode}
+% \end{macro}
+% \leavevmode\DescribeMacro{\ytIdTitle}\nmpsep{\darg{\ameta{text}}\darg{\ameta{VidID}}}
+% A convenience command to lay out the playlist.
+% \begin{macrocode}
+\newcommand{\ytIdTitle}[2]{[(#2)(#1)]}
+% \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}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars={!()}]
+%\declarePlayList{!ameta(\cmd)}{
+% \ytIdTitle{!ameta(text)}{!ameta(VidID)}
+% ...
+% \ytIdTitle{!ameta(text)}{!ameta(VidID)}
+% }
+%\end{Verbatim}
+%The entries may also be in raw form `|[(\ameta{VidID})(\ameta{text})]|'. Note that the two arguments are
+%enclosed in parentheses, there is a problem with parsing if \ameta{text} itself contains
+%parentheses. Within \ameta{text} enclose matching parentheses in braces, for example,
+%\begin{flushleft}|\ytIdTitle{Kung-Fu Fighting {(Bruce Lee version)}}{GZ9e3Dy7obA}|\end{flushleft}
+%\paragraph*{The role of \texttt* in the title.} If an \texttt{*} appears in the title, this means
+%that the video cannot be embedded. Viewing the video will come with advertisements and other information
+%that YouTube generates.
+%\begin{flushleft}|\ytIdTitle{Kung-Fu Fighting* {(Original version)}}{jhUkGIsKvn0}|\end{flushleft}
+%\changes{v0.4}{2020/07/22}{Changed parsing of \string\cs{declarePlayList} to accomodate
+%\string\cs{pdfstringdef}}
+% \begin{macrocode}
+\newcommand{\declarePlayList}[1]{\bgroup
+ \Hy@unicodefalse
+ \let\pl@yList\@empty
+ \ifpdfmarkup
+ \def\Esc{\eqbs}\else\def\Esc{}\fi
+ \def\cs##1{\eqbs\eqbs##1}\relax
+ \@makeother\_\@makeother\-
+ \yt@declarePlayList{#1}%
+}
+\def\yt@declarePlayList#1#2{%
+ \yt@declarePlayList@i#2\@nil\relax\relax
+ \toks@=\expandafter{\pl@yList}\relax
+ \xdef#1{\pl@yList}\egroup
+}
+\def\yt@declarePlayList@i{\@ifnextchar\@nil
+ {\expandafter\@gobbletwo\@gobble}
+ {\yt@declarePlayList@ii}%
+}
+\def\yt@declarePlayList@ii\ytIdTitle#1#2{%
+ \pdfstringdef\yt@PLTitle{#1}%
+ \edef\y{[(#2)(\yt@PLTitle)]}%
+ \expandafter\g@addto@macro\expandafter
+ \pl@yList\expandafter{\y}%
+ \yt@declarePlayList@i
+}
+% \end{macrocode}
+% \end{macro}
+%An example of use of \cs{declarePlayList}:
+%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars={!()}]
+%\declarePlayList{\playListii}{%
+% \ytIdTitle{Elfego Baca}{gRwa0MdeqVs}
+% \ytIdTitle{Texas John Slaughter}{7yrk1BvtLE8}
+% \ytIdTitle{Swamp Fox}{-SBPnw5riLM&NR}
+% \ytIdTitle{Zorro Promo}{cKludhxEoJ0}
+%}
+%\end{Verbatim}
+% \begin{macrocode}
+%</package>
+%<*pujs>
+% \end{macrocode}
+% \subsubsection{Using a popup menu}
+% These code lines (including the document JavaScript) are only included
+% when the \opt{usepopup} option is taken.
+% \begin{macro}{\ytUseMenus}\nmpsep{\darg{\ameta{menu-names}}}
+% A command used to list popupmenu data. It defines a command
+% \cs{ytPopupData} that is used in the JS support for popup menus. The argument
+% \ameta{menu-names} is a comma-delimited list of menu names defined by a \env{popupmenu} environment. The command
+% needs to be in the preamble.
+% \begin{macrocode}
+\def\ytPopupAllMenuData{// ltx4yt: Begin popup menu data^^J}%
+\let\ytMenuNames\@gobble
+\newcommand{\ytUseMenus}[1]{\bgroup
+ \@for\yt@menu:=#1\do{%
+ \edef\x{\noexpand\g@addto@macro\noexpand
+ \ytMenuNames{,"\yt@menu"}}\x
+ \edef\x{\expandafter\noexpand\@nameuse{\yt@menu}}%
+ \toks@=\expandafter{\x^^J}%
+ \expandafter\g@addto@macro\expandafter
+ \ytPopupAllMenuData\expandafter{\the\toks@}%
+ }\g@addto@macro\ytPopupAllMenuData
+ {// ltx4yt: End of popup menu data}%
+ \egroup
+}
+\@onlypreamble\ytUseMenus
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\puIdTitle}
+% A convenience macro for entering popupmenu data for youtube videos.
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,codes={\catcode`\%=9},commandchars={!()}]
+%\begin{popupmenu}{YTMenu}
+% \puIdTitle{Select a YouTube Video}{} % A title has no yt Id
+% \begin{submenu}{title=Music Videos}
+% \puIdTitle{Kung-Fu Fighting (Bruce Lee version)}{GZ9e3Dy7obA}
+% \puIdTitle{\string\"Sea Hunt\string\" TV serie}{MW-IZ67iADU}
+% ...
+% \end{submenu}
+%\end{popupmenu}
+%\end{Verbatim}
+% Note that we must protect the double quote.
+% \begin{macrocode}
+%\newcommand{\puIdTitle}[2]{\item{title={#1},%
+% return={[\itemindex,'#2']}}}
+\newcommand{\puIdTitle}[2]{\Hy@unicodefalse\pdfstringdef\x@YT{#1}%
+ \edef\y@YT{\noexpand\item{title={\x@YT},%
+ return={[\noexpand\itemindex,'#2']}}}\y@YT}
+% \end{macrocode}
+% \end{macro}
+% Some convenience commands for setting up a push button to display the popupmenu
+% on rollover.
+% \begin{macrocode}
+\def\ytpubtnCnt{0}
+\newcommand{\ytPopupBtn}[4][]{\bgroup
+ \@tempcnta\ytpubtnCnt\relax
+ \advance\@tempcnta\@ne
+ \xdef\ytpubtnCnt{\the\@tempcnta}%
+ \pushButton[\cmd{\pmpvCAOff}\CA{YT Menu}
+ \textColor{0 0 1}\W1\BC{}\textSize{0}
+ \H{N}\S{S}\presets{\yt@PopupPresets}#1
+ \AAmouseenter{ytPopupMenu("#2");} % dps
+ ]{ytPopup\ytpubtnCnt}{#3}{#4}\egroup
+}
+\newcommand{\ytPopupPresets}[1]{\def\yt@PopupPresets{#1}}
+\let\yt@PopupPresets\@empty
+% \end{macrocode}
+% \begin{macrocode}
+%</pujs>
+%<*package>
+% \end{macrocode}
+% \subsection{Search YouTube interactively}
+% \begin{macro}{\ytInputQuery}\nmpsep{[\ameta{opts}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% Provides a text field to enter a query string.
+% \begin{macrocode}
+\newcommand{\ytInputQuery}[3][]{%
+ \textField[\TU{Enter a query text string}#1]{ytSearchTxt}{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytSearch}\nmpsep{[\ameta{opts}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% A push button what will search YouTube based on the query string.
+% \begin{macrocode}
+\newcommand{\ytSearch}[3][]{%
+ \pushButton[\CA{Search}#1\AAmouseup{%
+ var f=this.getField("ytSearchTxt");\r
+ var v=f.value;\r
+ if ( v.replace(/\string\s/g,"") != "" )\r\t
+ app.launchURL("\ytURL/embed?listType=search&list="+v);}
+ ]{ytSearchBtn}{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ytClearQuery}\nmpsep{[\ameta{opts}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
+% A button to clear the query string.
+% \begin{macrocode}
+\newcommand{\ytClearQuery}[3][]{%
+ \pushButton[\CA{Clear}#1
+ \AAmouseup{this.resetForm("ytSearchTxt");}
+ ]{ytSearchClr}{#2}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</package>
+%<*pujs>
+% \end{macrocode}
+%\subsection{Document JavaScript}
+% Some JavaScript to process the user's choice and to launch the browser
+% to view the selected video.
+% \changes{v0.5}{2020/07/24}{Manage multiple menus}
+% \begin{macrocode}
+\begin{insDLJS*}{yt}
+\begin{newsegment}{ltx4yt: %
+Popup Menu Data and JavaScript support functions}
+var YTdebug=false;
+var aYTLastChoice=new Array;
+var bYTLastChoice=false;
+\ytPopupAllMenuData
+var aChoice; // make local
+function ytProcessMenu(cMenu) { // aMenu->cMenu now a string
+ var aMenu=eval(cMenu);
+ var cChoice = app.popUpMenuEx.apply( app, aMenu );
+ ytProcessMenu.cChoice=cChoice;
+ if ( cChoice != null ) {
+ aChoice=eval(cChoice);
+ if (aChoice[1]=="") return null;
+ var thisChoice=aChoice[0];
+ eval(cMenu+thisChoice).bMarked=true;
+ if (!bYTLastChoice) {
+ eval(cMenu+aChoice[0]).bMarked=true;
+ } else {
+ var structLoc=eval(aYTLastChoice[1])[0]
+ eval(aYTLastChoice[0]+structLoc).bMarked=false;
+ eval(cMenu+aChoice[0]).bMarked=true;
+ }
+ return aChoice;
+ } else return null;
+}
+function ytPopupMenu(cMenu) { // cMenu now a string
+ var aChoice=ytProcessMenu(cMenu);
+ var cChoice=ytProcessMenu.cChoice;
+ var aMenu=eval(cMenu);
+ if (aChoice!=null) {
+ var title=eval(cMenu+aChoice[0]).cName;
+ var i=title.indexOf("*");
+ var _hash=(i == -1)?"embed/"+aChoice[1]:"watch?v="+aChoice[1];
+ if (!bYTLastChoice) {
+ if(YTdebug) %
+console.println("launching url https://www.youtube.com/"+_hash);
+ else app.launchURL("https://www.youtube.com/"+_hash,false);
+ aYTLastChoice=[cMenu,cChoice];
+ bYTLastChoice=true;
+ } else {
+ var cLastMenu=eval(aYTLastChoice[1])[0]
+ aYTLastChoice=[cMenu,cChoice];
+ if (cLastMenu!=aChoice[0]) {
+ if (YTdebug) %
+console.println("will launch url: https://www.youtube.com/"+_hash);
+ else app.launchURL("https://www.youtube.com/"+_hash,false);
+ } else {
+ if (YTdebug) console.println("will NOT launch url");
+ // choice is the same, uncheck this item
+ eval(cMenu+aChoice[0]).bMarked=false;
+ bYTLastChoice=false;
+ }
+ }
+ }
+}
+\end{newsegment}
+\end{insDLJS*}
+% \end{macrocode}
+% \begin{macrocode}
+%<*pujs>
+%<*package>
+%</package>
+% \end{macrocode}
+% \Finale
+\endinput
+
+https://developers.google.com/youtube/iframe_api_reference?csw=1
diff --git a/texmf-dist/source/latex/ltx4yt/ltx4yt.ins b/texmf-dist/source/latex/ltx4yt/ltx4yt.ins
new file mode 100644
index 00000000..f9535bae
--- /dev/null
+++ b/texmf-dist/source/latex/ltx4yt/ltx4yt.ins
@@ -0,0 +1,61 @@
+%%
+%% 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{2020/07/17}
+\def\batchfile{ltx4yt.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{ltx4yt.sty}{\from{ltx4yt.dtx}{copyright,package}}
+ \file{ytpu.def}{\from{ltx4yt.dtx}{copyright,pujs}}
+}
+
+\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/texmf-dist/tex/latex/ltx4yt/ltx4yt.sty b/texmf-dist/tex/latex/ltx4yt/ltx4yt.sty
new file mode 100644
index 00000000..685ed1dc
--- /dev/null
+++ b/texmf-dist/tex/latex/ltx4yt/ltx4yt.sty
@@ -0,0 +1,172 @@
+%%
+%% This is file `ltx4yt.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ltx4yt.dtx (with options: `copyright,package')
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ltx4yt.sty package, %%
+%% Copyright (C) 2020 %%
+%% 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{ltx4yt}
+ [2020/07/30 v0.7 ltx4yt: Play YouTube videos in the default browser (dps)]
+\RequirePackage{xkeyval}
+\DeclareOption{usepopup}{\def\lo@dpu{\InputIfFileExists{ytpu.def}
+ {\PackageInfo{ltx4yt}{Loading ytpu.def}}
+ {\PackageInfo{ltx4yt}{Can't find ytpu.def}}}}
+\DeclareOption{!usepopup}{}
+\let\lo@dpu\relax
+\AtEndOfPackage{\lo@dpu}
+\ProcessOptions
+\RequirePackage{xcolor}
+\RequirePackage{eforms}
+\ifx\lo@dpu\relax\else
+\def\YT@rpPU{\RequirePackage{popupmenu}[2020/07/26]}\expandafter
+\YT@rpPU\fi
+\newcommand{\ytvIdPresets}[1]{\def\yt@vIdPresets{#1}}
+\definecolor{webbrown}{rgb}{.6,0,0} % from the web package
+\ytvIdPresets{\linktxtcolor{webbrown}}
+\providecommand{\URI}[1]{/S/URI/URI(#1)}
+\def\ytNF{false}
+\def\ytURL{https://www.youtube.com}
+\newcommand{\ytvId}{\@ifstar{\def\yt@ask{*}\yt@@vId}
+ {\let\yt@ask\@empty\yt@@vId}}
+\newcommand{\yt@@vId}[3][]{%
+ \ifx\yt@ask\@empty
+ \def\yt@lnk@hash{embed/#2}\else
+ \def\yt@lnk@hash{watch?v=#2}\fi
+ \setLink[\presets{\yt@vIdPresets}#1
+ \A{\URI{\ytURL/\yt@lnk@hash}}]{#3}%
+}
+\newcommand{\ytvIdML}{\@ifstar{\def\yt@ask{*}\yt@@vIdML}
+ {\let\yt@ask\@empty\yt@@vIdML}}
+\newcommand{\yt@@vIdML}[3][]{%
+ \ifx\yt@ask\@empty
+ \def\yt@lnk@hash{embed/#2}\else
+ \def\yt@lnk@hash{watch?v=#2}\fi
+ \mlsetLink[\presets{\yt@vIdPresets}#1
+ \A{\URI{\ytURL/\yt@lnk@hash}}]{#3}%
+}
+\newif\ifytwatch \ytwatchfalse
+\def\yt@@parse{\let\ytspec\@empty\yt@parse}
+\def\yt@parse{\@ifnextchar\@nil{\@gobble}{\yt@parsei}}
+\def\yt@parsei{\@ifnextchar\watchId{% check for \watchId
+ \ytwatchtrue\yt@parse@watch}{\yt@parseii}}
+\def\yt@parse@watch\watchId#1{\g@addto@macro
+ \ytspec{\watchId{#1}}\yt@parse}
+\def\yt@parseii{\@ifnextchar\embedId{% check for \embedId
+ \yt@parse@embedId}{\yt@parseiii}}
+\def\yt@parse@embedId\embedId#1{\g@addto@macro
+ \ytspec{\embedId{#1}}\yt@parse}
+\def\yt@parseiii{\@ifnextchar\embed{% check for \embed
+ \yt@parse@embed}{\yt@parseiv}}
+\def\yt@parse@embed\embed#1{\g@addto@macro
+ \ytspec{\embed{#1}}\yt@parse}
+\def\yt@parseiv{\@ifnextchar\params{% check for \params
+ \yt@parse@params}{\yt@parsev}}
+\def\yt@parse@params\params#1{\ifytwatch
+ \g@addto@macro\ytspec{&#1}\else
+ \g@addto@macro\ytspec{?#1}\fi
+ \yt@parse}
+\def\yt@parsev#1\@nil{\g@addto@macro\ytspec{#1}}
+\newcommand{\ytLink}[3][]{\begingroup
+ \def\embedId##1{embed/##1}%
+ \def\params##1{##1}\def\embed##1{embed?##1}%
+ \def\watchId##1{watch?v=##1}\def\channel##1{c/##1}%
+ \def\user##1{user/##1}%
+ \yt@@parse#2\@nil % returns arg in \ytspec
+ \def\URLArg{\ytURL/\ytspec}%
+ \setLink[\presets{\yt@vIdPresets}#1\A{\URI{\URLArg}}
+ ]{#3}\endgroup
+}
+\newcommand{\ytLinkML}[3][]{\begingroup
+ \def\embedId##1{embed/##1}%
+ \def\params##1{##1}\def\embed##1{embed?##1}%
+ \def\watchId##1{watch?v=##1}\def\channel##1{c/##1}%
+ \def\user##1{user/##1}%
+ \yt@@parse#2\@nil % returns arg in \ytspec
+ \def\URLArg{\ytURL/\ytspec}%
+ \mlsetLink[\presets{\yt@vIdPresets}#1
+ \A{\URI{\URLArg}}
+ ]{#3}\endgroup
+}
+\newcommand{\ytComboList}[4][]{%
+ \comboBox[\Ff{\FfCommitOnSelChange}\DV{\yt@pl@def}\V{\yt@pl@def}
+ \presets{\yt@ComboListPresets}#1]{ytSelect#2}
+ {#3}{#4}{*\yt@pl@pl}% 2020/07/22 v0.4
+}
+\newcommand{\ytStrPLAY}{PLAY}
+\newcommand{\ytComboBtn}[4][]{%
+ \pushButton[\TU{Click to play}\CA{\ytStrPLAY}
+ \presets{\yt@ComboBtnPresets}#1
+ \A{\JS{var f=this.getField("ytSelect#2");\r
+ var ytID=f.value;\r
+ var i=f.currentValueIndices;\r
+ var ytFV=f.getItemAt(i,false);\r
+ var i=ytFV.indexOf("*");\r
+ if ( i == -1 )\r\t
+ app.launchURL("\ytURL/embed/"+ytID,\ytNF);\r
+ else\r\t
+ app.launchURL("\ytURL/watch?v="+ytID,\ytNF);
+ }}]{ytSelectBtn#2}{#3}{#4}%
+}
+\newcommand{\ytPlayList}{\begingroup\@makeother\_\@makeother\'
+ \ytPlayList@i}
+\def\ytPlayList@i#1#2{\gdef\yt@pl@def{#1}\xdef\yt@pl@pl{#2}\endgroup}
+\newcommand{\ytComboListPresets}[1]{\def\yt@ComboListPresets{#1}}
+\let\yt@ComboListPresets\@empty
+\newcommand{\ytComboBtnPresets}[1]{\def\yt@ComboBtnPresets{#1}}
+\let\yt@ComboBtnPresets\@empty
+\newcommand{\ytIdTitle}[2]{[(#2)(#1)]}
+\newcommand{\declarePlayList}[1]{\bgroup
+ \Hy@unicodefalse
+ \let\pl@yList\@empty
+ \ifpdfmarkup
+ \def\Esc{\eqbs}\else\def\Esc{}\fi
+ \def\cs##1{\eqbs\eqbs##1}\relax
+ \@makeother\_\@makeother\-
+ \yt@declarePlayList{#1}%
+}
+\def\yt@declarePlayList#1#2{%
+ \yt@declarePlayList@i#2\@nil\relax\relax
+ \toks@=\expandafter{\pl@yList}\relax
+ \xdef#1{\pl@yList}\egroup
+}
+\def\yt@declarePlayList@i{\@ifnextchar\@nil
+ {\expandafter\@gobbletwo\@gobble}
+ {\yt@declarePlayList@ii}%
+}
+\def\yt@declarePlayList@ii\ytIdTitle#1#2{%
+ \pdfstringdef\yt@PLTitle{#1}%
+ \edef\y{[(#2)(\yt@PLTitle)]}%
+ \expandafter\g@addto@macro\expandafter
+ \pl@yList\expandafter{\y}%
+ \yt@declarePlayList@i
+}
+\newcommand{\ytInputQuery}[3][]{%
+ \textField[\TU{Enter a query text string}#1]{ytSearchTxt}{#2}{#3}}
+\newcommand{\ytSearch}[3][]{%
+ \pushButton[\CA{Search}#1\AAmouseup{%
+ var f=this.getField("ytSearchTxt");\r
+ var v=f.value;\r
+ if ( v.replace(/\string\s/g,"") != "" )\r\t
+ app.launchURL("\ytURL/embed?listType=search&list="+v);}
+ ]{ytSearchBtn}{#2}{#3}}
+\newcommand{\ytClearQuery}[3][]{%
+ \pushButton[\CA{Clear}#1
+ \AAmouseup{this.resetForm("ytSearchTxt");}
+ ]{ytSearchClr}{#2}{#3}%
+}
+\endinput
+%%
+%% End of file `ltx4yt.sty'.
diff --git a/texmf-dist/tex/latex/ltx4yt/ytpu.def b/texmf-dist/tex/latex/ltx4yt/ytpu.def
new file mode 100644
index 00000000..496e80a6
--- /dev/null
+++ b/texmf-dist/tex/latex/ltx4yt/ytpu.def
@@ -0,0 +1,112 @@
+%%
+%% This is file `ytpu.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ltx4yt.dtx (with options: `copyright,pujs')
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% ltx4yt.sty package, %%
+%% Copyright (C) 2020 %%
+%% 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. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\ytPopupAllMenuData{// ltx4yt: Begin popup menu data^^J}%
+\let\ytMenuNames\@gobble
+\newcommand{\ytUseMenus}[1]{\bgroup
+ \@for\yt@menu:=#1\do{%
+ \edef\x{\noexpand\g@addto@macro\noexpand
+ \ytMenuNames{,"\yt@menu"}}\x
+ \edef\x{\expandafter\noexpand\@nameuse{\yt@menu}}%
+ \toks@=\expandafter{\x^^J}%
+ \expandafter\g@addto@macro\expandafter
+ \ytPopupAllMenuData\expandafter{\the\toks@}%
+ }\g@addto@macro\ytPopupAllMenuData
+ {// ltx4yt: End of popup menu data}%
+ \egroup
+}
+\@onlypreamble\ytUseMenus
+\newcommand{\puIdTitle}[2]{\Hy@unicodefalse\pdfstringdef\x@YT{#1}%
+ \edef\y@YT{\noexpand\item{title={\x@YT},%
+ return={[\noexpand\itemindex,'#2']}}}\y@YT}
+\def\ytpubtnCnt{0}
+\newcommand{\ytPopupBtn}[4][]{\bgroup
+ \@tempcnta\ytpubtnCnt\relax
+ \advance\@tempcnta\@ne
+ \xdef\ytpubtnCnt{\the\@tempcnta}%
+ \pushButton[\cmd{\pmpvCAOff}\CA{YT Menu}
+ \textColor{0 0 1}\W1\BC{}\textSize{0}
+ \H{N}\S{S}\presets{\yt@PopupPresets}#1
+ \AAmouseenter{ytPopupMenu("#2");} % dps
+ ]{ytPopup\ytpubtnCnt}{#3}{#4}\egroup
+}
+\newcommand{\ytPopupPresets}[1]{\def\yt@PopupPresets{#1}}
+\let\yt@PopupPresets\@empty
+\begin{insDLJS*}{yt}
+\begin{newsegment}{ltx4yt: %
+Popup Menu Data and JavaScript support functions}
+var YTdebug=false;
+var aYTLastChoice=new Array;
+var bYTLastChoice=false;
+\ytPopupAllMenuData
+var aChoice; // make local
+function ytProcessMenu(cMenu) { // aMenu->cMenu now a string
+ var aMenu=eval(cMenu);
+ var cChoice = app.popUpMenuEx.apply( app, aMenu );
+ ytProcessMenu.cChoice=cChoice;
+ if ( cChoice != null ) {
+ aChoice=eval(cChoice);
+ if (aChoice[1]=="") return null;
+ var thisChoice=aChoice[0];
+ eval(cMenu+thisChoice).bMarked=true;
+ if (!bYTLastChoice) {
+ eval(cMenu+aChoice[0]).bMarked=true;
+ } else {
+ var structLoc=eval(aYTLastChoice[1])[0]
+ eval(aYTLastChoice[0]+structLoc).bMarked=false;
+ eval(cMenu+aChoice[0]).bMarked=true;
+ }
+ return aChoice;
+ } else return null;
+}
+function ytPopupMenu(cMenu) { // cMenu now a string
+ var aChoice=ytProcessMenu(cMenu);
+ var cChoice=ytProcessMenu.cChoice;
+ var aMenu=eval(cMenu);
+ if (aChoice!=null) {
+ var title=eval(cMenu+aChoice[0]).cName;
+ var i=title.indexOf("*");
+ var _hash=(i == -1)?"embed/"+aChoice[1]:"watch?v="+aChoice[1];
+ if (!bYTLastChoice) {
+ if(YTdebug) %
+console.println("launching url https://www.youtube.com/"+_hash);
+ else app.launchURL("https://www.youtube.com/"+_hash,false);
+ aYTLastChoice=[cMenu,cChoice];
+ bYTLastChoice=true;
+ } else {
+var cLastMenu=eval(aYTLastChoice[1])[0]
+ aYTLastChoice=[cMenu,cChoice];
+ if (cLastMenu!=aChoice[0]) {
+ if (YTdebug) %
+console.println("will launch url: https://www.youtube.com/"+_hash);
+ else app.launchURL("https://www.youtube.com/"+_hash,false);
+ } else {
+ if (YTdebug) console.println("will NOT launch url");
+ // choice is the same, uncheck this item
+ eval(cMenu+aChoice[0]).bMarked=false;
+ bYTLastChoice=false;
+ }
+ }
+ }
+}
+\end{newsegment}
+\end{insDLJS*}
+\endinput
+%%
+%% End of file `ytpu.def'.