Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- \documentclass{beamer}
- \usepackage{soulutf8}
- \usepackage{atbegshi}
- \usepackage{etoolbox}
- \usepackage{tikz}
- \usetikzlibrary{tikzmark,calc,decorations.pathmorphing}
- \colorlet{tdcolor}{gray!50}
- \newlength{\LineWidth}
- \setlength{\LineWidth}{0.7pt}
- \newlength{\CornerRadius}
- \setlength{\CornerRadius}{5pt}
- \newlength{\BorderDispl}
- \setlength{\BorderDispl}{2pt}
- \makeatletter
- \newlength{\txtdec@depth}
- \setlength{\txtdec@depth}{.45ex}
- \newlength{\txtdec@height}
- \setlength{\txtdec@height}{\f@size pt} % sensible default
- \newcounter{txtdec@hyphmark}
- \newcounter{txtdec@decormark}
- \newcounter{txtdec@hyphdraw}
- \setcounter{txtdec@hyphdraw}{1}
- \newcounter{txtdec@decordraw}
- \setcounter{txtdec@decordraw}{1}
- \newcounter{txtdec@thenextpage}
- \newtoggle{txtdec@unfinisheddecor}
- \newtoggle{txtdec@stayonpage}
- \newtoggle{txtdec@stayondecor}
- \newtoggle{txtdec@stayonline}
- % from https://tex.stackexchange.com/a/33765/105447
- \newcommand{\gettikzxy}[3]{%
- \tikz@scan@one@point\pgfutil@firstofone#1\relax
- \edef#2{\the\pgf@x}%
- \edef#3{\the\pgf@y}%
- }
- % the drawing macros
- \newcommand{\txtdec@draw@all}{%
- \draw[tdcolor, line width=\LineWidth, rounded corners=\CornerRadius] ($(\Xbegin,\Ybegin)+(-\BorderDispl,-\txtdec@depth)$) rectangle ($(\Xend,\Yend)+(\BorderDispl,\txtdec@height-\txtdec@depth)$) ;
- }
- \newcommand{\txtdec@draw@begin}{%
- \draw[tdcolor, line width=\LineWidth, rounded corners=\CornerRadius]
- ($(\Xlineend,\Ylineend)+(0,\txtdec@height-\txtdec@depth)$) --
- ($(\Xbegin,\Ybegin)+(-\BorderDispl,\txtdec@height-\txtdec@depth)$) --
- ($(\Xbegin,\Ybegin)+(-\BorderDispl,-\txtdec@depth)$) --
- ($(\Xlineend,\Ylineend)+(0,-\txtdec@depth)$) ;
- }
- \newcommand{\txtdec@draw@middle}{%
- \draw[tdcolor, line width=\LineWidth] ($(\Xlinebegin,\Ylinebegin)+(0,-\txtdec@depth)$) -- ($(\Xlineend,\Ylineend)+(0,-\txtdec@depth)$) ;
- \draw[tdcolor, line width=\LineWidth] ($(\Xlinebegin,\Ylinebegin)+(0,\txtdec@height-\txtdec@depth)$) -- ($(\Xlineend,\Ylineend)+(0,\txtdec@height-\txtdec@depth)$) ;
- }
- \newcommand{\txtdec@draw@end}{%
- \draw[tdcolor, line width=\LineWidth, rounded corners=\CornerRadius]
- ($(\Xlinebegin,\Ylinebegin)+(0,\txtdec@height-\txtdec@depth)$) --
- ($(\Xend,\Yend)+(\BorderDispl,\txtdec@height-\txtdec@depth)$) --
- ($(\Xend,\Yend)+(\BorderDispl,-\txtdec@depth)$) --
- ($(\Xlinebegin,\Ylinebegin)+(0,-\txtdec@depth)$) ;
- }
- % using soul to set tikzmarks
- \def\SOUL@tdleaders{%
- \stepcounter{txtdec@hyphmark}%
- \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
- \leaders\hrule\@depth\z@\@height\z@\relax
- }
- \def\SOUL@tdunderline#1{{%
- \setbox\z@\hbox{#1}%
- \dimen@=\wd\z@
- \dimen@i=\SOUL@uloverlap
- \advance\dimen@2\dimen@i
- \rlap{%
- \null
- \kern-\dimen@i
- \SOUL@ulcolor{\SOUL@tdleaders\hskip\dimen@}%
- \hskip\dimen@
- }%
- \unhcopy\z@
- }}
- \def\SOUL@tdpreamble{%
- \spaceskip\SOUL@spaceskip
- \stepcounter{txtdec@decormark}%
- \setcounter{txtdec@hyphmark}{0}%
- \tikzmark{p\thepage.d\arabic{txtdec@decormark}.begin}%
- }
- \def\SOUL@tdeverysyllable{%
- \SOUL@tdunderline{%
- \the\SOUL@syllable
- \SOUL@setkern\SOUL@charkern
- }%
- \stepcounter{txtdec@hyphmark}%
- \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
- }
- \def\SOUL@tdeveryhyphen{%
- \discretionary{%
- \unkern
- \SOUL@tdunderline{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@sethyphenchar
- }%
- \stepcounter{txtdec@hyphmark}%
- \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
- }{}{}%
- }
- \def\SOUL@tdeveryexhyphen#1{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@tdunderline{#1}%
- \stepcounter{txtdec@hyphmark}%
- \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
- \discretionary{}{}{%
- \SOUL@setkern\SOUL@charkern
- }%
- }
- \def\SOUL@tdpostamble{%
- % create an extra mark, vertically displaced, to create an exit condition for the last line
- \stepcounter{txtdec@hyphmark}%
- \raisebox{-5pt}{\tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}}%
- \tikzmark{p\thepage.d\arabic{txtdec@decormark}.end}%
- }
- \def\SOUL@tdsetup{%
- \SOUL@setup
- \let\SOUL@preamble\SOUL@tdpreamble
- \let\SOUL@everysyllable\SOUL@tdeverysyllable
- \let\SOUL@everyhyphen\SOUL@tdeveryhyphen
- \let\SOUL@everyexhyphen\SOUL@tdeveryexhyphen
- \let\SOUL@postamble\SOUL@tdpostamble
- }
- \DeclareRobustCommand*\textdecor{\SOUL@tdsetup\SOUL@}
- % get the drawing done AtBeginShipout
- \AtBeginShipout{%
- \AtBeginShipoutUpperLeft{%
- % getting the number of the next page
- \setcounter{txtdec@thenextpage}{\thepage}%
- \stepcounter{txtdec@thenextpage}%
- % if the current decoration occurs on this page, stay on it
- \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
- \toggletrue{txtdec@stayonpage}}{}%
- \whileboolexpr{togl {txtdec@stayonpage}}{%
- \begin{tikzpicture}[remember picture, overlay]
- \setlength{\txtdec@height}{\f@size pt}%
- \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.begin}{%
- % if current decor begins in current page, get coordinates
- \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.begin)}{\Xbegin}{\Ybegin}}{%
- % if current decor begins in previous page, set to top left of the page
- \gettikzxy{(current page.north west)}{\Xbegin}{\Ybegin}}%
- \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.end}{%
- % if current decor ends in current page, get coordinates
- \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.end)}{\Xend}{\Yend}}{%
- % if current decor ends in future page, set to bottom right of the page
- \gettikzxy{(current page.south east)}{\Xend}{\Yend}}%
- \ifdim\Ybegin=\Yend % the simplest case, a single line
- \txtdec@draw@all
- \stepcounter{txtdec@decordraw}%
- \else % current textdecor has a line break
- \toggletrue{txtdec@stayondecor}%
- \whileboolexpr{togl {txtdec@stayondecor}}{%
- \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw})}{\Xlinebegin}{\Ylinebegin}%
- \edef\Xcurrent{\Xlinebegin}%
- \edef\Ycurrent{\Ylinebegin}%
- \edef\Xnext{\Xcurrent}%
- \edef\Ynext{\Ycurrent}%
- \toggletrue{txtdec@stayonline}%
- \whileboolexpr{togl {txtdec@stayonline}}{%
- \ifdim\Ycurrent=\Ynext
- \stepcounter{txtdec@hyphdraw}%
- % if the following tikzmark exists, we are at a page break
- \iftikzmark{p\arabic{txtdec@thenextpage}.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
- \edef\Xcurrent{\Xnext}%
- \edef\Ycurrent{\Ynext}%
- \gettikzxy{(current page.south east)}{\Xnext}{\Ynext}
- \togglefalse{txtdec@stayondecor}%
- }{% else, we remain on the same page
- \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
- \edef\Xcurrent{\Xnext}%
- \edef\Ycurrent{\Ynext}%
- \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw})}{\Xnext}{\Ynext}}{}%
- }%
- \else
- \edef\Xlineend{\Xcurrent}%
- \edef\Ylineend{\Ycurrent}%
- % if we are on the first line of the current decoration
- \ifdim\Ylinebegin=\Ybegin
- \txtdec@draw@begin
- \else
- % if we are on the last line of the current decoration
- \ifdim\Ycurrent=\Yend
- \txtdec@draw@end
- \stepcounter{txtdec@decordraw}%
- \setcounter{txtdec@hyphdraw}{1}%
- \togglefalse{txtdec@stayondecor}%
- % if we are in a middle line of the decoration
- \else
- \txtdec@draw@middle
- \fi
- \fi
- \togglefalse{txtdec@stayonline}%
- \fi
- }%
- }%
- \fi
- \end{tikzpicture}%
- % if the beginning of the next decor does not exist in this page, leave this page
- \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.begin}{}{%
- \togglefalse{txtdec@stayonpage}}%
- % if the continuation of the current decor exists in the next page, leave this page
- \iftikzmark{p\arabic{txtdec@thenextpage}.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
- \togglefalse{txtdec@stayonpage}}{}%
- }%
- }%
- }
- \makeatother
- \begin{document}
- \begin{frame}[fragile]{x}
- Lorem ipsum \textdecor{dolor sit amet, consectetuer adipiscing}
- elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae.\newline
- Beamer version: 3.69, Ti\textit{k}Z version 3.1.10
- \end{frame}
- \end{document}
Advertisement
Add Comment
Please, Sign In to add comment