diff options
author | Karl Berry <karl@freefriends.org> | 2023-01-02 21:24:31 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-01-02 21:24:31 +0000 |
commit | 2d76687317021d30c5f447f1a72aa66bbc5890e7 (patch) | |
tree | 58251b34184213b576a5ce6168bec6bd5a8af6ad /Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls | |
parent | 2feb1f2ef0deb880ed2f399e072fedf92ea05c0c (diff) |
beamer-rl (2jan23)
git-svn-id: svn://tug.org/texlive/trunk@65438 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls | 442 |
1 files changed, 287 insertions, 155 deletions
diff --git a/Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls b/Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls index d9c790969ef..d68f56f5913 100644 --- a/Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls +++ b/Master/texmf-dist/tex/lualatex/beamer-rl/beamer-rl.cls @@ -1,32 +1,62 @@ \NeedsTeXFormat{LaTeX2e} \ProvidesClass{beamer-rl} -[2022/06/19 v1.6 LaTeX class to patch beamer for right to left presentation with babel] - -\RequirePackage{kvoptions} -\RequirePackage{kvsetkeys} - -\SetupKeyvalOptions{ - family=beamer-rl, - prefix=beamer-rl@, - setkeys=\kvsetkeys, -} - -% babel options: -\define@key{beamer-rl}{babel}{% - \PassOptionsToPackage{#1}{babel}% -} - -\DeclareVoidOption{arabic}{% - \@expandtwoargs\@removeelement\CurrentOption\@classoptionslist\@classoptionslist % remove arabic option from global list - % \PassOptionsToPackage{arabic}{translator}% - \AtBeginDocument{\uselanguage{Arabic}\languagealias{arabic}{Arabic}} -} - -\DeclareDefaultOption{% - \PassOptionsToClass{\CurrentOption}{beamer}% -} - -\ProcessKeyvalOptions*\relax +[2023/01/02 v1.7 LaTeX class to patch beamer for right to left presentation with babel] + +\DeclareKeys + { + layout .code:n = \PassOptionsToPackage{layout=#1}{babel} + ,unknown .code:n = \PassOptionsToClass{\CurrentOption}{beamer} + } + +\DeclareKeys + { + arabic .code:n = + \PassOptionsToPackage{arabic,provide=*}{babel} + \AddToHook{env/document/before}{ + \babelprovide[#1]{arabic} + \uselanguage{Arabic}\languagealias{arabic}{Arabic} + %\PassOptionsToPackage{arabic}{translator} + }, + arabic .default:n = + } + +\DeclareKeys + { + hebrew .code:n = + \PassOptionsToPackage{hebrew,provide=*}{babel} + \AddToHook{env/document/before}{ + \babelprovide[#1]{hebrew} + %\PassOptionsToPackage{hebrew}{translator} + }, + hebrew .default:n = + } + + +\ExplSyntaxOn +\clist_map_inline:nn {arabic-ma,arabic-tn,arabic-dz,arabic-eg,arabic-sa,arabic-iq,arabic-sy,arabic-lb,arabic-ps,arabic-jo} + { + \DeclareKeys + { + #1 .code:n = + \AddToHook{env/document/before}{\babelprovide[import,##1,main]{#1} + \uselanguage{Arabic}\languagealias{arabic}{Arabic}}, + %\PassOptionsToPackage{arabic}{translator}, + #1 .default:n = + } + } + +\clist_map_inline:nn {syriac,persian,urdu,centralkurdish,kashmiri,mazanderani,northernkurdish-arab,malayalam,pashto,punjabi-arab,uyghur,uzbek-arab,yiddish} + { + \DeclareKeys + { + #1 .code:n = + \AddToHook{env/document/before}{\babelprovide[import,##1,main]{#1}}, + #1 .default:n = + } + } +\ExplSyntaxOff + +\ProcessKeyOptions \RequirePackage{ifluatex} @@ -39,9 +69,10 @@ \RequirePackage[nil,bidi=basic]{babel} -\def\reset@temp#1#2{\expandafter\let\csname beamer@@tmpop@#1@#2\endcsname\relax} -\def\@@defbeamertemplate#1#2{\reset@temp{#1}{#2}\defbeamertemplate{#1}{#2}} -\def\@defbeamertemplate#1#2{\reset@temp{#1}{#2}\defbeamertemplate*{#1}{#2}} +\let\oldpgfpicture\pgfpicture +\let\endoldpgfpicture\endpgfpicture + +\let\oldpgfsys@beginpicture\pgfsys@beginpicture \def\redefbeamertemplate{% \@ifstar{\@defbeamertemplate}{\@@defbeamertemplate}% @@ -51,19 +82,115 @@ \let\old@blacktriangleleft\blacktriangleleft \def\blacktriangleright{% - \ifcase\bbl@thepardir \old@blacktriangleright\else\old@blacktriangleleft\fi} + \ifcase\bbl@thepardir\old@blacktriangleright\else\old@blacktriangleleft\fi} \def\blacktriangleleft{% - \ifcase\bbl@thepardir \old@blacktriangleleft\else\old@blacktriangleright\fi} + \ifcase\bbl@thepardir\old@blacktriangleleft\else\old@blacktriangleright\fi} +\let\oldpgfuseshading\pgfuseshading +\def\pgfuseshading#1{\babelsublr{\oldpgfuseshading{#1}}} -\let\oldpgfpicture\pgfpicture -\let\endoldpgfpicture\endpgfpicture +% add graphics layout by default + +\let\bbl@pictresetdir\relax + \def\bbl@pictsetdir#1{% + \ifcase\bbl@thetextdir + \let\bbl@pictresetdir\relax + \else + \ifcase#1\bodydir TLT % Remember this sets the inner boxes + \or\textdir TLT + \else\bodydir TLT \textdir TLT + \fi + % \(text|par)dir required in pgf: + \def\bbl@pictresetdir{\bodydir TRT\pardir TRT\textdir TRT\relax}% + \fi}% + \AddToHook{env/picture/begin}{\bbl@pictsetdir\tw@}% + \directlua{ + Babel.get_picture_dir = true + Babel.picture_has_bidi = 0 + % + function Babel.picture_dir (head) + if not Babel.get_picture_dir then return head end + if Babel.hlist_has_bidi(head) then + Babel.picture_has_bidi = 1 + end + return head + end + luatexbase.add_to_callback("hpack_filter", Babel.picture_dir, + "Babel.picture_dir") + }% + \AtBeginDocument{% + \def\LS@rot{% + \setbox\@outputbox\vbox{% + \hbox dir TLT{\rotatebox{90}{\box\@outputbox}}}}% + \long\def\put(#1,#2)#3{% + \@killglue + % Try: + \ifx\bbl@pictresetdir\relax + \def\bbl@tempc{0}% + \else + \directlua{ + Babel.get_picture_dir = true + Babel.picture_has_bidi = 0 + }% + \setbox\z@\hb@xt@\z@{% + \@defaultunitsset\@tempdimc{#1}\unitlength + \kern\@tempdimc + #3\hss}% TODO: #3 executed twice (below). That’s bad. + \edef\bbl@tempc{\directlua{tex.print(Babel.picture_has_bidi)}}% + \fi + % Do: + \@defaultunitsset\@tempdimc{#2}\unitlength + \raise\@tempdimc\hb@xt@\z@{% + \@defaultunitsset\@tempdimc{#1}\unitlength + \kern\@tempdimc + {\ifnum\bbl@tempc>\z@\bbl@pictresetdir\fi#3}\hss}% + \ignorespaces}% + \MakeRobust\put}% + \AtBeginDocument + {\AddToHook{cmd/diagbox@pict/before}{\let\bbl@pictsetdir\@gobble}% + \AddToHook{env/pgfpicture/begin}{\bbl@pictsetdir\@ne}% + \bbl@add\pgfinterruptpicture{\bbl@pictresetdir}% + \bbl@add\pgfsys@beginpicture{\bbl@pictsetdir\@ne}% + \ifx\tikzpicture\@undefined\else + \AddToHook{env/tikzpicture/begin}{\bbl@pictsetdir\tw@}% + \bbl@add\tikz@atbegin@node{\bbl@pictresetdir}% + \bbl@sreplace\tikz{\begingroup}{\begingroup\bbl@pictsetdir\tw@}% + \fi + \ifx\tcolorbox\@undefined\else + \def\tcb@drawing@env@begin{% + \csname tcb@before@\tcb@split@state\endcsname + \bbl@pictsetdir\tw@ + \begin{\kvtcb@graphenv}% + \tcb@bbdraw% + \tcb@apply@graph@patches + }% + \def\tcb@drawing@env@end{% + \end{\kvtcb@graphenv}% + \bbl@pictresetdir + \csname tcb@after@\tcb@split@state\endcsname + }% + \fi + } + +\def\reset@temp#1#2{\expandafter\let\csname beamer@@tmpop@#1@#2\endcsname\relax} +\def\@@defbeamertemplate#1#2{\reset@temp{#1}{#2}\defbeamertemplate{#1}{#2}} +\def\@defbeamertemplate#1#2{\reset@temp{#1}{#2}\defbeamertemplate*{#1}{#2}} -\def\pgfpicture{\babelsublr\bgroup\oldpgfpicture} -\def\endpgfpicture{\endoldpgfpicture\egroup} +%% beamerbasenotes -\let\oldpgfuseshading\pgfuseshading -\def\pgfuseshading#1{\babelsublr{\oldpgfuseshading{#1}}} +\defbeameroption{show notes on second screen}[right]% +{ + \ifx\@onlypreamble\@notprerr + \ltx@ifpackageloaded{pgfpages}{}{% + \ClassError{beamer}{`pgfpages' package necessary for this option}{}% + }% + \else% + \RequirePackage{pgfpages-rl} + \fi% + \pgfpagesuselayout{two screens with optional second}[second #1] + \beamer@twoscreensnotestrue + \beamer@notestrue +} %% beamerbasebox @@ -95,10 +222,10 @@ #2% \end{minipage}}% \ifdim\wd\bmb@box=0pt% - \ifcase\bbl@thetextdir\relax - \else% - \bmb@dimc=\bmb@width% - \fi% <-- + \ifnum\textdirection=\z@ + \else% + \bmb@dimc=\bmb@width% + \fi% <-- \setbox\bmb@box=\hbox{}% \ht\bmb@box=1.5pt% \bmb@prevheight=-4.5pt% @@ -162,10 +289,115 @@ %\color{.}% } -\bbl@sreplace\endbeamerboxesrounded{\begin{pgfpicture}}% - {\textdir TLT\begin{pgfpicture}}% - - +\newdimen\bmb@dimd + +\def\endbeamerboxesrounded{% + \end{minipage}\egroup% + \bmb@temp=\dp\bmb@box% + \advance\bmb@temp by.5pt% + \setbox\bmb@box=\hbox{\raise\bmb@temp\hbox{\box\bmb@box}}% + \dp\bmb@box=0pt% + \bmb@boxwidth=\bmb@width% + \bmb@boxheight=\ht\bmb@box% + \advance\bmb@boxheight by4bp% + \advance\bmb@boxheight by\bmb@prevheight% + \ifbmb@shadow% + \xdef\beamer@storecolorhook{\beamer@colorhook} + \xdef\beamer@colorhook{} + \pgfdeclareradialshading{bmb@shadowball}{\pgfpointorigin} + {% + color(0bp)=(pgftransparent!50); + color(4bp)=(pgftransparent!100) + }% + \pgfdeclareradialshading{bmb@shadowballlarge}{\pgfpointorigin} + {% + color(0bp)=(pgftransparent!0); + color(8bp)=(pgftransparent!100) + }% + \pgfdeclarehorizontalshading{bmb@shadowhorz\the\bmb@boxheight}{\bmb@boxheight-5.5bp} + {% + color(0bp)=(pgftransparent!0); + color(8bp)=(pgftransparent!100) + }% + \pgfdeclareverticalshading{bmb@shadowvert\the\bmb@boxwidth}{\bmb@boxwidth-4bp} + {% + color(0bp)=(pgftransparent!100); + color(8bp)=(pgftransparent!0) + }% + \begingroup% + \selectcolormodel{gray} + \pgfdeclarefading{bmb@shadowmask\the\bmb@boxwidth\the\bmb@boxheight} + {% + \textdir TLT + \begin{pgfpicture} + \pgftext[at=\pgfpoint{4bp}{4bp}]{\pgfuseshading{bmb@shadowball}}% bottom left shadow + \ifdim\bmb@boxheight>9.5bp% + \pgftext[at=\pgfpoint{\bmb@boxwidth}{8bp}]{\pgfuseshading{bmb@shadowballlarge}}% bottom right shadow + \pgftext[at=\pgfpoint{\bmb@boxwidth+4bp}{\bmb@boxheight+2bp}]{\pgfuseshading{bmb@shadowball}}% top right shadow + \pgftext[base, at=\pgfpoint{\bmb@boxwidth+4bp}{7.5bp}]{\pgfuseshading{bmb@shadowhorz\the\bmb@boxheight}}% right edge shadow + \else% + \pgftext[at=\pgfpoint{\bmb@boxwidth}{4bp}]{\pgfuseshading{bmb@shadowball}}% right shadow + \fi% + \pgftext[left, at=\pgfpoint{4bp}{4bp}]{\pgfuseshading{bmb@shadowvert\the\bmb@boxwidth}}% bottom edge + % + % clipping is needed because shadow is typeset on top of box + \begin{pgfscope} + \pgfsetcolor{beamer@safeblack} + \pgfpathrectangle{\pgfpoint{4bp}{8.1bp}}{\pgfpoint{\bmb@boxwidth}{\bmb@boxheight-2bp}} + \pgfusepath{fill} + \end{pgfscope} + \end{pgfpicture}% + \hskip4bp% + }% + \endgroup% + \fi% + \bmb@temp=\bmb@width% + \bmb@dima=\bmb@temp\advance\bmb@dima by2.2bp% + \bmb@dimb=\bmb@temp\advance\bmb@dimb by4bp% + \ifdim\wd\bmb@box=0pt% + \ifnum\textdirection=\z@ + \else + \bmb@dimd=\bmb@width% + \fi% + \fi% + \hbox{\textdir TLT% + \begin{pgfpicture}{0bp}{0bp}{\bmb@dimd}{0bp} + \ifbmb@shadow% + \begin{pgfscope} + \pgfpathrectangle{\pgfpoint{0bp}{-7bp}} + {\pgfpoint{\bmb@boxwidth+8bp}{\bmb@boxheight+6bp}} + \pgfsetfading{bmb@shadowmask\the\bmb@boxwidth\the\bmb@boxheight}{% + \pgftransformshift{\pgfpoint{0.5\bmb@boxwidth+6bp}{0.5\bmb@boxheight-4bp}}} + \pgfusepath{fill} + \end{pgfscope} + \fi% + \unhbox\bmb@colorbox% + \pgfpathqmoveto{-4bp}{1bp} + \pgfpathqcurveto{-4bp}{-1.2bp}{-2.2bp}{-3bp}{0bp}{-3bp} + \pgfpathlineto{\pgfpoint{\the\bmb@temp}{-3bp}} + \pgfpathcurveto% + {\pgfpoint{\the\bmb@dima}{-3bp}}% + {\pgfpoint{\the\bmb@dimb}{-1.2bp}}% + {\pgfpoint{\the\bmb@dimb}{1bp}}% + { + \bmb@dima=\ht\bmb@box% + \pgfpathlineto{\pgfpoint{\bmb@dimb}{\bmb@dima}} + \pgfpathlineto{\pgfpoint{-4bp}{\bmb@dima}} + \pgfusepath{fill} + } + \end{pgfpicture}% + \box\bmb@box% + }% + \ifbmb@shadow% + \vskip4bp minus 2bp% + \else% + \vskip2bp% + \fi% + \egroup% of \vbox\bgroup + \ifbmb@shadow% + \xdef\beamer@colorhook{\beamer@storecolorhook} + \fi +} %% beamerbaseauxtemplates @@ -173,7 +405,7 @@ % (sub-)section in toc: subsections numbered \redefbeamertemplate{subsection in toc}{subsections numbered} -{\leavevmode\leftskip=2em\rlap{\hskip-2em \inserttocsectionnumber\hbox{.}\inserttocsubsectionnumber}\inserttocsubsection\par} +{\leavevmode\leftskip=2em\rlap{\hskip-2em \babelsublr{\inserttocsectionnumber}.\babelsublr{\inserttocsubsectionnumber}}\inserttocsubsection\par} %% beamerinnerthemedefault @@ -293,124 +525,25 @@ % % Zoom stuff % +% The patch need improvement to cover all cases -\def\beamer@framezoom<#1><#2>[#3](#4,#5)(#6,#7){% - \par\nointerlineskip% - \global\beamer@slidehaszoomtrue% - \advance\beamer@zoomcount by1\relax% - \def\beamer@zoomborderwidth{0}% - \edef\beamer@labelzoomed{beamer@labelzoomed@\the\beamer@zoomframecount @\the\beamer@zoomcount}% - \setkeys{beamerzoom}{#3}% - \only<#1>{% - {\hypersetup{pdfhighlight={/P},pdfborder={0 0 \beamer@zoomborderwidth}}% - \global\setbox\@tempboxa=\vbox{\hyperlink{\beamer@labelzoomed}{\vbox to #7{\hbox - to#6{\hfil}\vfil}}}}% - \ht\@tempboxa=0pt% - \wd\@tempboxa=0pt% - \dp\@tempboxa=0pt% - \setbox\@tempboxa=\vbox{\moveright#4\hbox{\lower#5\vbox{\box\@tempboxa}}}% - \ht\@tempboxa=0pt% - \wd\@tempboxa=0pt% - \dp\@tempboxa=0pt% - \global\setbox\beamer@zoombox=\vbox to0pt{\unvbox\beamer@zoombox\box\@tempboxa}% - }% - \only<#2>{% - \@ifundefined{\beamer@labelzoomed}% - {% - \hypertarget{\beamer@labelzoomed}{}% - \expandafter\gdef\csname\beamer@labelzoomed\endcsname{}% - }{}% - \gdef\beamer@zoomer{% - % compute zoom factor - \@tempdima=\beamer@frametextheight% - \@tempdimb=#7\relax% - \@tempcnta=\@tempdimb% - \divide\@tempcnta by4096\relax% - \multiply\@tempdima by16\relax% - \divide\@tempdima by\@tempcnta% - \@tempdimb=\paperwidth% - \ifbeamer@plainframe% - \else% - \advance\@tempdimb by-\beamer@leftsidebar% - \advance\@tempdimb by-\beamer@rightsidebar\relax% - \fi% - \@tempdimc=#6\relax% - \@tempcntb=\@tempdimc% - \divide\@tempcntb by4096\relax% - \multiply\@tempdimb by16\relax% - \divide\@tempdimb by\@tempcntb% - \ifdim\@tempdimb<\@tempdima% - \@tempdima=\@tempdimb% - \fi% - \edef\beamer@temp{\strip@pt\@tempdima}% - \@tempdimc=\beamer@frametextheight% - \advance\@tempdimc by4pt% - \@tempdimb=\paperwidth% - \ifbeamer@plainframe% - \else% - \advance\@tempdimb by-\beamer@leftsidebar% - \advance\@tempdimb by-\beamer@rightsidebar\relax% - \fi% - \setbox\@tempboxa=\vbox{\hsize=\@tempdimb\Acrobatmenu{GoBack}{\vbox to - \beamer@frametextheight{\hbox to\@tempdimb{\hfil}\vfil}}}% - \ht\@tempboxa=0pt% - \wd\@tempboxa=0pt% - \dp\@tempboxa=0pt% - \setbox\beamer@framebox=\vbox to\beamer@frametextheight{{% - \ifbeamer@plainframe\beamer@leftmargin=\Gm@lmargin\fi% - \ifcase\bbl@thepardir \else\multiply\@tempdimb by -1\relax\fi% - \begin{oldpgfpicture}{\beamer@leftmargin}{-\beamer@frametextheight}{\beamer@leftmargin}{0pt} - \pgftext[left,top]{\box\@tempboxa} - \pgfpathrectangle{\pgfpoint{0pt}{-\@tempdimc}}{\pgfpoint{\@tempdimb}{\@tempdimc}}% - \pgfusepath{clip} - \begingroup - \pgftransformscale{\beamer@temp} - \@tempdima=#4\relax% - \@tempdimb=#5\relax% - {\pgftransformshift{\pgfpoint{-\@tempdima}{\@tempdimb}}% - \pgftext[left,top]{\vbox{\vbox{}\nointerlineskip\unvbox\beamer@framebox }}} - \endgroup - \end{oldpgfpicture}% - }}% - \setbox\beamer@framebox=\vbox{% - \nobreak\vbox{}\nobreak\par\nobreak\beamer@entrycode\nobreak% - \nointerlineskip\unvbox\beamer@frametitlebox% - \nobreak% - \box\beamer@framebox% - \nobreak% - \vss% - \beamer@exitcode% - }% - \global\setbox\beamer@footins=\box\voidb@x% no footnotes in zoomed slides - }% - }% -} - +\bbl@sreplace\beamer@framezoom{\begin{pgfpicture}}% +{\ifcase\bbl@thepardir \else\multiply\@tempdimb by\m@ne\relax +\let\pgfsys@beginpicture\oldpgfsys@beginpicture\fi% +\begin{pgfpicture}}% % % Shrink stuff % - - \bbl@sreplace\beamer@shrinkframebox{\vbox}% +\bbl@sreplace\beamer@shrinkframebox{\vbox}% {\vbox dir TLT}% -% Temporary workaround for issue of \shapemode bug +% issue of \shapemode bug % https://github.com/latex3/babel/issues/13 -% this work fine with lists inside frame, if they are included within \vbox -% may be we need to insert \shapemode=2 or \shapemode=0 manualy at beginning of list +% we need to insert \shapemode=2 or \shapemode=0 manualy at beginning of list % \begin{enumerate} \shapemode=.. & \begin{itemize} \shapemode=.. -\newcounter{beginframepardir} - -\let\oldframe\frame -\def\frame{\setcounter{beginframepardir}{\bbl@getluadir{par}} -% 0 for TLT 1 for TRT -\oldframe} - -\redefbeamertemplate*{itemize/enumerate body begin}{default}{\ifnum\value{beginframepardir}=\bbl@getluadir{par} \else\shapemode=2\fi} - -\redefbeamertemplate*{description body begin}{default}{\ifnum\value{beginframepardir}=\bbl@getluadir{par} \else\shapemode \tw@\fi} % Use Amiri as default sans serif font @@ -420,5 +553,4 @@ \babelfont{sf}{Amiri} \fi - \endinput
\ No newline at end of file |