From 1bd2e747b7bc84d8bce808fd2f909c10f9d490ce Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 3 Aug 2020 12:24:04 +0900 Subject: add ltx4yt as replacement for yt4pdf --- texmf-dist/doc/latex/ltx4yt/README.md | 20 + texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdf | Bin 0 -> 109008 bytes texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.tex | 74 +++ texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdf | Bin 0 -> 114454 bytes texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.tex | 98 +++ .../latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdf | Bin 0 -> 118148 bytes .../latex/ltx4yt/examples/web-pkg/ltx4yt-w1.tex | 82 +++ .../latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdf | Bin 0 -> 86073 bytes .../latex/ltx4yt/examples/web-pkg/ltx4yt-w2.tex | 110 ++++ texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdf | Bin 0 -> 242168 bytes texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex | 675 +++++++++++++++++++++ texmf-dist/doc/latex/ltx4yt/ltx4yt.pdf | Bin 0 -> 1838044 bytes texmf-dist/source/latex/ltx4yt/ltx4yt.dtx | 651 ++++++++++++++++++++ texmf-dist/source/latex/ltx4yt/ltx4yt.ins | 61 ++ texmf-dist/tex/latex/ltx4yt/ltx4yt.sty | 172 ++++++ texmf-dist/tex/latex/ltx4yt/ytpu.def | 112 ++++ tlpkg/tlpsrc/ltx4yt.tlpsrc | 0 17 files changed, 2055 insertions(+) create mode 100644 texmf-dist/doc/latex/ltx4yt/README.md create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdf create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.tex create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdf create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.tex create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdf create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.tex create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdf create mode 100644 texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.tex create mode 100644 texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdf create mode 100644 texmf-dist/doc/latex/ltx4yt/ltx4yt-man.tex create mode 100644 texmf-dist/doc/latex/ltx4yt/ltx4yt.pdf create mode 100644 texmf-dist/source/latex/ltx4yt/ltx4yt.dtx create mode 100644 texmf-dist/source/latex/ltx4yt/ltx4yt.ins create mode 100644 texmf-dist/tex/latex/ltx4yt/ltx4yt.sty create mode 100644 texmf-dist/tex/latex/ltx4yt/ytpu.def create mode 100644 tlpkg/tlpsrc/ltx4yt.tlpsrc 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 Binary files /dev/null and b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-1.pdf 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 Binary files /dev/null and b/texmf-dist/doc/latex/ltx4yt/examples/ltx4yt-2.pdf 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 Binary files /dev/null and b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w1.pdf 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 Binary files /dev/null and b/texmf-dist/doc/latex/ltx4yt/examples/web-pkg/ltx4yt-w2.pdf 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 Binary files /dev/null and b/texmf-dist/doc/latex/ltx4yt/ltx4yt-man.pdf 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 Binary files /dev/null and b/texmf-dist/doc/latex/ltx4yt/ltx4yt.pdf 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. %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +%\NeedsTeXFormat{LaTeX2e}[1997/12/01] +%\ProvidesPackage{ltx4yt} +% [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} +% +% \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{}\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} +% +%<*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} +% +%<*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} +% +%<*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> +% +% \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{}\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'. diff --git a/tlpkg/tlpsrc/ltx4yt.tlpsrc b/tlpkg/tlpsrc/ltx4yt.tlpsrc new file mode 100644 index 00000000..e69de29b -- cgit v1.2.3