% \iffalse % +AMDG This document was begun on 3 August 11EE, the eve % of the Feast of St. Dominic, C, and it is humbly % dedicated to him and to the Immaculate Heart of Mary, for % their prayers, and to the Sacred Heart of Jesus, for His % mercy. % % This document is copyright 2015 by Donald P. Goodman, and is % released publicly under the LaTeX Project Public License. The % distribution and modification of this work is constrained by the % conditions of that license. See % http://www.latex-project.org/lppl.txt % for the text of the license. This document is released % under version 1.3 of that license, and this work may be distributed % or modified under the terms of that license or, at your option, any % later version. % % This work has the LPPL maintenance status 'maintained'. % % The Current Maintainer of this work is Donald P. Goodman % (dgoodmaniii@gmail.com). % % This work consists of the files lroundrect.dtx and % lroundrect.ins, along with the generated file lroundrect.sty % and lroundrect.pdf, and the README. % \fi % \iffalse %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{lroundrect}[2015/09/01 v1.0 LaTeX macros utilizing the Metapost roundrect code] %<*driver> \documentclass{ltxdoc} \usepackage{url} \usepackage[typeone]{dozenal} \usepackage{verbatim} \usepackage{mflogo} \usepackage[everymp={input roundrect;},latex]{gmp} \usempxpackage{color} \usepackage{color} \usepackage{makeidx} \usepackage{lroundrect} \makeindex \long\def\demonstrate#1#2{% \bigskip% \hrule% \hbox to\linewidth{% \hbox to0.5\linewidth{% \vbox to2in{\vfil#1\vfil}% }\hbox to0.5\linewidth{% \vbox to2in{\vfil#2\vfil}% }% }% \hrule% \bigskip% } \begin{document} \DocInput{lroundrect.dtx} \end{document} % % \fi % \title{The \texttt{lroundrect} Package, v1.0} % \author{Donald P.\ Goodman III} % \date{\today} % % \maketitle % \begin{abstract}\noindent % The |lroundrect| package is the \LaTeX\ companion for the % |roundrect| macros for \MP; they provide an easy interface % for a few specific formats, and a good example for how to % write your own rounded-rectangle macros for use in \LaTeX\ % documents or elsewhere. The idea with this package and % with the \MP\ |roundrect| macros was to % provide a \MP-based replacement for the incredibly % versatile |tcolorbox| package; this package is far from % achieving that goal. But it is nevertheless extremely % useful. % \end{abstract} % % \tableofcontents % % \section{Introduction} % % While Ti\textit{k}Z and its many accompanying packages, % particularly |tcolorbox|, are wonderful and powerful % tools, whenever using them I inevitably feel completely % lost, and I exert great effort doing comparatively simple % things. Contrariwise, thanks to my experience with the % |drm| and |dozenal| packages, writing in \MP\ is quite % straightforward for me. So I decided to try to write some % generalized macros to provide functionality similar to % that of |tcolorbox|. This package (along with % |roundrect|, its accompanying \MP\ package) is not even % close to that kind of flexibility or power, but it's still % quite useful and versatile, so I make it available for % anyone who might be interested. % % This document was typeset in accordance with the % |docstrip| utility, which allows the automatic extraction % of code and documentation from the same document. % % \section{Prerequisites and Conventions} % % Some prerequesites for using this package are \MP\ itself % (obviously). If you're using the package with \LaTeX, the % |gmp| package would probably be helpful; be sure to use % the |latex| package option. Finally, the % package internally calls |TEX.mp|, so that is also % required. All of these should be packaged in any % reasonably modern \LaTeX\ system, such as \TeX Live or % Mik\TeX. % % This documentation assumes nothing about your personal % \TeX\ or \MP\ environment. Con\TeX t and the various % forms of Lua\TeX\ have \MP\ built-in; with pdf\LaTeX, the % author's choice, one can use the |gmp| package to % include the source directly in one's document (that's % what's been done in this documentation) or develop a % simple script to compile them afterwards and include them % in the source via |\includegraphics| (probably the % quickest option, since compilation is done in advance). % Here, we simply post the plain vanilla \MP\ code, and let % you work out those details however you prefer. % % \section{Basic Usage} % % |lroundrect| utilizes the \MP\ |roundrect| macros to % perform typesetting within a \LaTeX\ document. To do % this, it has a number of predefined styles which can be % selected. These styles consist of different names and, % often, different numbers of arguments. Here is the % simplest, \DescribeMacro{\rralertbox}|\rralertbox|: % % \begin{quote} % |\rralertbox{\unexpanded{\Huge This is an rralertbox!}}| % \end{quote} % % \noindent yields the following: % % \hbox to\linewidth{% % \hfil% % \rralertbox{\unexpanded{\Huge This is an rralertbox!}}% % \hfil% % } % % The |\unexpanded| is simply to protect the font commands % when they are used with the |gmp| package in pdf\LaTeX; % it is not necessary otherwise. |\rralertbox| is produced % with the following code: % % \begin{macrocode} \def\rralertbox#1{% \begin{mpost} rrborderpen(pencircle scaled 3); rrbodytext := "#1"; rrbordercolor(0.8red); rrtextcolor := 0.8red; rrinnercolor := 0.5[red,white]; roundrect(1in,2in)(alertbox); draw alertbox; \end{mpost} }% % \end{macrocode} % % \noindent % It's not claimed that this particularly good style; it % serves merely as an example of what we can do. % % Another simple example (and likely equally ugly % color-wise) is % \DescribeMacro{\rrorangebluebox}|\rrorangebluebox| (using % the |mpcolornames| package for color names): % % \hbox to\linewidth{% % \hfil% % \rrorangebluebox{Title}{This is the body of the box, and % has lots of very interesting text in it. Enough, in % fact, that it wraps, so we can see how the box expands % based on the size of its argument.} % \hfil% % }% % % This is the sort of macro that might be useful for, say, % chapter headings: % % \hbox to\linewidth{% % \hfil% % \rrorangebluebox{Chapter 5}{The Very Interesting Chapter Title} % \hfil% % } % % \noindent % This provides an interesting way to display things, % particularly items like headings and definitions. Both % the title and the body will expand to fit their contents % as necessary, though if the title is too long its % positioning won't work well. (By ``title'' I mean the % orange box.) The code producing these boxes is below. % % \begin{macrocode} \newlength{\rrorangewid} \newdimen\rrblueht \newdimen\rrorangeht \newbox\rrbluebox \newbox\rrorangebox \def\rrorangebluebox#1#2{% \settowidth{\rrorangewid}{\ \scshape #1\ } \savebox\rrbluebox{\parbox{\linewidth}{#2}} \advance\rrorangewid by6pt \savebox\rrorangebox{\parbox{\rrorangewid}{#1}} \rrorangeht=\ht\rrorangebox \advance\rrorangeht by\dp\rrorangebox \advance\rrorangeht by\baselineskip \rrblueht=\ht\rrbluebox \advance\rrblueht by\dp\rrbluebox \advance\rrblueht by\baselineskip \begin{mpost} input mpcolornames; rrborderrad(10pt); rrbotlftborderrad := 0pt; rrbotrtborderrad := 0pt; rrbordercolor(DarkGoldenrod1); rrinnercolor := DarkGoldenrod1; rrtextalign := "\unexpanded{\raggedright}"; rrtextfont := "\unexpanded{\scshape}"; rrbodytext := "#1"; roundrect(\mpdim{\rrorangeht})(\mpdim{\rrorangewid})(orangebluebox); rrrestorevals; rrborderrad(10pt); rrbordercolor(blue); rrinnercolor := blue; rrbodytext := "#2"; rrtextcolor := white; rrtextfont := "\unexpanded{\bfseries}"; rrtextalign := ""; roundrect(\mpdim{\rrblueht})(\mpdim{\linewidth})(mainbox); draw orangebluebox shifted (-\mpdim{0.3\linewidth},0); draw mainbox shifted (0,-\mpdim{\rrblueht}/2-\mpdim{\rrorangeht}/2); \end{mpost} }% % \end{macrocode} % % As we can see, the hardest thing about this macro is % ensuring that the heights and widths are correct; that % done, all is really rather simple. % % We can also imitate the sort of boxes that |tcolorbox| % produces by default with \DescribeMacro{\rrdefaultbox} % |\rrdefaultbox|: % % \noindent % \rrdefaultbox{Title}{This is the body of the box, and has % lots of very interesting text in it; so much, in fact, % that it will have to be wrapped, thus displaying the way % that this macro produces boxes % which \unexpanded{\special{1 0 0 setrgbcolor}}will expand % appropriately according to their contents. Even more, % we'll \unexpanded{\emph{put in some font changes}} to show that we can % \unexpanded{\textsc{style our text}} without % causing trouble.} % % The code producing these boxes is here: % % \begin{macrocode} \newlength{\rrtitlewid} \newlength{\rrtitleht} \newlength{\rrmainht} \newbox\rrtitlebox\newbox\rrmainbox \def\rrdefaultbox#1#2{% \settowidth{\rrtitlewid}{\ \scshape #1\ } \savebox\rrmainbox{\parbox{\linewidth}{#2}} \advance\rrtitlewid by6pt \savebox\rrtitlebox{\parbox{\rrtitlewid}{#1}} \rrtitleht=\ht\rrtitlebox \advance\rrtitleht by\dp\rrtitlebox \advance\rrtitleht by\baselineskip \rrmainht=\ht\rrmainbox \advance\rrmainht by\dp\rrmainbox \advance\rrmainht by\baselineskip \begin{mpost} input mpcolornames; rrborderrad(10pt); rrbotlftborderrad := 0pt; rrbotrtborderrad := 0pt; rrbodytext := "#1"; roundrect(\mpdim{\rrtitleht})(\mpdim{\linewidth})(titlebox); rrrestorevals; rrborderrad(10pt); rrtoplftborderrad := 0pt; rrtoprtborderrad := 0pt; rrtopborderpen := pencircle scaled 1; rrbodytext := "#2"; rrtextalign := ""; roundrect(\mpdim{\rrmainht})(\mpdim{\linewidth})(mainbox); draw titlebox; draw mainbox shifted (0,-\mpdim{\rrmainht}/2-\mpdim{\rrtitleht}/2); \end{mpost} } % \end{macrocode} % % Remember, if you are including these in a (pdf)\LaTeX\ % document using |gmp|, you need to wrap your font changing % commands in |\unexpanded|, or \LaTeX\ will give \MP\ a % bunch of gobbledygook that it can't understand. % |\unexpanded| ensures that \MP\ gets something it can work % with. With other methods of inclusion, however, % |\unexpanded| is not necessary. % % |lroundrect| also provides a box similar to that used in % the |tcolorbox| documentation for examples: % % \begin{quote} % |\rrtcolorex{\texttt{$\backslash$tcbuselibrary{listings,theorems}}}| % \end{quote} % % \noindent % \rrtcolorex{\unexpanded{\texttt{$\backslash$tcbuselibrary{listings,theorems}}}} % % The following code produces these boxes (and assumes that % the contents will be only one line): % % \begin{macrocode} \def\rrtcolorex#1{% \begin{mpost} rrborderrad(10pt); rrbordercolor(blue); rrtopbordercolor := 0.5[green,black]; rrinnercolor := 0.8[blue,white]; rrbodytext := "#1"; roundrect(2\mpdim{\baselineskip},\mpdim{\linewidth})(rrexampbox); draw rrexampbox; \end{mpost} }% % \end{macrocode} % % The tags from the |tcolorbox| documentation can also be % closely reproduced using the % \DescribeMacro{\rrtcoltag}|\rrtcoltag| macro: % % \begin{quote} % |\rrtcoltag{LIB}{skins}| \\ % |\rrtcoltag{ALT}{rasterized}| \\ % |\rrtcoltag{DEF}{wow, this one is really long}| \\ % \end{quote} % % \rrtcoltag{LIB}{skins} % \rrtcoltag{ALT}{rasterized} % \rrtcoltag{DEF}{wow, this one is really long} % % \noindent This is one of the more complicated definitions % in this little package; but it works well when the first % argument is short and the second is limited to one line. % % \begin{macrocode} \newdimen\rrtcoltagwd \newbox\rrtcoltagbox \def\rrtcoltag#1#2{% \settowidth{\rrtcoltagwd}{#2} \advance\rrtcoltagwd by12pt \begin{mpost} input mpcolornames; rrborderrad(5pt); rrbotlftborderrad := 0pt; rrbotrtborderrad := 0pt; rrnobot := true; rrinnercolor := 0.5[green,white]; rrbodytext := "#1"; rrtextfont := "\unexpanded{\sffamily}"; rrtextcolor := Khaki1; roundrect(\mpdim{1.5em},2.5\mpdim{\baselineskip})(rrtaglabel); rrrestorevals; rrborderrad(5pt); rrtoplftborderrad := 0pt; rrbotlftborderrad := 0pt; rrinnercolor := 0.7[green,white]; rrnolft := true; rrbodytext := "#2"; roundrect(2.5\mpdim{\baselineskip},\mpdim{\rrtcoltagwd})(rrtextlabel); draw rrtaglabel rotatedaround((0,0),90); draw rrtextlabel shifted (\mpdim{\rrtcoltagwd}/2+0.625\mpdim{\baselineskip},0); \end{mpost} }% % \end{macrocode} % % \section{Using metafun Extensions} % % We can also create interesting effects with drop shadows % and transparency, if we're willing to use |metafun| % macros. Note that these won't work with |gmp| by default, which % includes Metapost |.mps| files rather than |.pdf|; % transparency effects require conversion to |pdf| first. % However, |gmp| does perform conversion to |pdf| when the % engine is Xe\TeX, so it's certainly possible; we simply % need to redefine |\gmp@innermpost| to run |mptopdf| and % include the |pdf| rather than the |mps|. |lroundrect| % provides the \DescribeMacro{\rrincludepdf}|\rrincludepdf| % macro, which does all this for you. Just issue: % % \begin{quote} % |\rrincludepdf| % \end{quote} % % After doing this, you can use all the |metafun| tricks you % want, including transparency, and the resulting |pdf| will % be included rather than the |mps|. % \DescribeMacro{\rrtransbox}|\rrtransbox| takes a single % argument, the text you want included, and it contains % oddly-colored transparent |rrinnercolor| and % |rrshadowcolor|s: % % \rrincludepdf % \begin{quote} % |\rrtransbox{Some text}| % \end{quote} % % \rrtransbox{Some text} % % The code which produces this is: % % \begin{macrocode} \def\rrtransbox#1{% \begin{mpost}[mpmem=metafun] rrbodytext := "#1"; rrdropshadow := true; rrborderrad(20pt); rrinnercolor := transparent(0.5,0.5,0.5red); rrshadowcolor := transparent(0.5,0.5,0.625blue); rrshadowx := rrbotlftborderrad/4; rrshadowy := -rrbotlftborderrad/4; roundrect(1in,2in)(rectangle); draw rectangle; \end{mpost} }% % \end{macrocode} % % The transparency here is interesting, if oddly colored; % and this serves as a good example of what can be done with % judicious use of shadows and transparency. % % To turn off the inclusion of |pdf|s (including them rather % than |mps| does slow down compilation, since |mptopdf| % needs to be run), issue % \DescribeMacro{\rrincludemps}|\rrincludemps|, and |mps| % files will be included as before. % % Using transparency from |metafun| enables us to do some % really impressive things. For example, the logo from the % cover of the |tcolorbox| manual, modified to encompass % |roundrect| (almost the same, anyway; |roundrect| still % doesn't really support gradients, and I picked different % colors): % % \begin{mpost} % input mpcolornames; % rrinnercolor := DarkOliveGreen4; % rrborderrad(0pt); % rrtoplftborderrad := 20pt; % rrtextfont := "\unexpanded{\bfseries}"; % rrtextcolor := white; % rrbodytext := "roundrect 2.2"; % rrborderpen(pencircle scaled 0); % roundrect(\mpdim{\baselineskip},0.3\mpdim{\linewidth})(toplftwingtitle); % roundrect(\mpdim{\baselineskip},0.25\mpdim{\linewidth})(botlftwingtitle); % rrborderrad(0pt); % rrtoprtborderrad := 20pt; % roundrect(\mpdim{\baselineskip},0.3\mpdim{\linewidth})(toprtwingtitle); % roundrect(\mpdim{\baselineskip},0.25\mpdim{\linewidth})(botrtwingtitle); % rrrestorevals; % rrborderrad(0pt); % rrbotlftborderrad := 20pt; % rrbodytext := "roundrect"; % rrborderpen(pencircle scaled 0); % rrinnercolor := DarkOliveGreen1; % roundrect(1in,0.3\mpdim{\linewidth})(toplftwing); % rrbodytext := ""; % rrbotrtborderrad := 20pt; % roundrect(1in,0.25\mpdim{\linewidth})(botlftwing); % rrbodytext := "Manual for version 2.2 (2016/02/19)"; % rrborderrad(0pt); % rrbotrtborderrad := 20pt; % roundrect(1in,0.3\mpdim{\linewidth})(toprtwing); % rrtextwd := 0.2\mpdim{\linewidth}; % rrbodytext := "Donald P.\ Goodman"; % rrbotlftborderrad := 20pt; % roundrect(1in,0.25\mpdim{\linewidth})(botrtwing); % rrrestorevals; % rrinnercolor := (0.5,0.5,0.5); % rrborderpen(pencircle scaled 0); % rrbordercolor((0.5,0.5,0.5)); % rrborderrad(10pt); % roundrect(1in+\mpdim{\baselineskip},0.25in)(topmid); % roundrect(0.25in,0.25in)(head); % draw toplftwingtitle; % draw toprtwingtitle shifted (0.3\mpdim{\linewidth}+0.5in,0); % draw botlftwingtitle shifted (0.025\mpdim{\linewidth}, % -1in-1.5\mpdim{\baselineskip}); % draw botrtwingtitle shifted % (0.3\mpdim{\linewidth}+0.5in- % 0.025\mpdim{\linewidth},-1in-1.5\mpdim{\baselineskip}); % draw toplftwing shifted (0,-0.5in-0.5\mpdim{\baselineskip}); % draw toprtwing shifted % (0.3\mpdim{\linewidth}+0.5in,-0.5in-0.5\mpdim{\baselineskip}); % draw botlftwing shifted (0.025\mpdim{\linewidth}, % -1in-5\mpdim{\baselineskip}); % draw botrtwing shifted (0.3\mpdim{\linewidth}+0.5in- % 0.025\mpdim{\linewidth},-1in-5\mpdim{\baselineskip}); % draw topmid shifted (0.15\mpdim{\linewidth}+0.25in,-0.5in); % draw topmid yscaled 1.2 shifted % (0.15\mpdim{\linewidth}+0.25in,-1.5in-1.6\mpdim{\baselineskip}); % draw head shifted (0.15\mpdim{\linewidth}+0.25in,0.2in); % pickup pencircle scaled 2; % path p; p = (0,0){up}..{dir -200}(-0.175in,0.35in); % draw p shifted (0.15\mpdim{\linewidth}+0.25in,0.25in) % withcolor (0.5,0.5,0.5); % draw p reflectedabout ((0,0),(0,0.5in)) shifted % (0.15\mpdim{\linewidth}+0.25in,0.25in) % withcolor (0.5,0.5,0.5); % \end{mpost} % % This ``butterfly'' logo is quite similar (again, but for % different colors and the lack of gradients), and it's got % the advantage that the antennae are actually curved, since % nicely curved lines are so much easier to do in \MP\ than % in Ti\emph{k}Z. This is a nice demonstration of the power % that |roundrect| puts at your fingertips. % % \rrincludemps % % \begin{macrocode} \def\rrincludepdf{% \long\def\gmp@innermpost##1\end##2{% \ifgmp@nowrite\else \gmp@write\gmp@out{% ##1^^Jendfig;^^Jend.% \gmp@doiflatex{^^Jverbatimtex^^J\string\end{document}^^Jetex}}% \gmp@closeout\gmp@out \count@=\gmp@runs \loop\ifnum\count@>\z@ \gmp@shellcommand{\gmp@command\space -tex=\gmp@mpxprogram\space\gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}}% \advance\count@\m@ne \repeat \ifxetex \gmp@shellcommand{epstopdf --hires \gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}.mps}% \fi \gmp@shellcommand{mptopdf --result=\gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}.pdf \gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}.mps}% \gmp@shellcommand{mv \gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}-mps.pdf \gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}.pdf}% \egroup \end{##2}\ifgmp@use \gmp@usempost{\thegmp@count}\fi} \def\gmp@usempost##1{% \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{##1}}% \IfFileExists{\gmp@thempsfile.pdf}% {\includegraphics{\gmp@thempsfile.pdf}}% {\gmp@nemessage\gmp@box}} \renewcommand\usempost[2][]{% \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig##2\endcsname.pdf}% {\includegraphics[##1] {\gmp@jobname\gmp@ext\csname gmp@fig##2\endcsname.pdf}}% {\gmp@nemessage\gmp@box}} }% \def\rrincludemps{% \long\def\gmp@innermpost##1\end##2{% \ifgmp@nowrite\else \gmp@write\gmp@out{% ##1^^Jendfig;^^Jend.% \gmp@doiflatex{^^Jverbatimtex^^J\string\end{document}^^Jetex}}% \gmp@closeout\gmp@out \count@=\gmp@runs \loop\ifnum\count@>\z@ \gmp@shellcommand{\gmp@command\space -tex=\gmp@mpxprogram\space\gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}}% \advance\count@\m@ne \repeat \ifxetex \gmp@shellcommand{epstopdf --hires \gmp@jobname\gmp@ext \gmp@fourdigits{\gmp@number}.mps}% \fi \fi \egroup \end{##2}\ifgmp@use \gmp@usempost{\thegmp@count}\fi} \ifxetex \def\gmp@usempost##1{% \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{##1}}% \IfFileExists{\gmp@thempsfile.pdf}% {\includegraphics{\gmp@thempsfile.pdf}}% {\gmp@nemessage\gmp@box}} \renewcommand\usempost[2][]{% \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig##2\endcsname.pdf}% {\includegraphics[##1] {\gmp@jobname\gmp@ext\csname gmp@fig##2\endcsname.pdf}}% {\gmp@nemessage\gmp@box}} \else \def\gmp@usempost##1{% \edef\gmp@thempsfile{\gmp@jobname\gmp@ext\gmp@fourdigits{##1}}% \IfFileExists{\gmp@thempsfile.mps}% {\includegraphics[hiresbb]{\gmp@thempsfile.mps}}% {\gmp@nemessage\gmp@box}} \renewcommand\usempost[2][]{% \IfFileExists{\gmp@jobname\gmp@ext\csname gmp@fig##2\endcsname.mps}% {\includegraphics[hiresbb,##1] {\gmp@jobname\gmp@ext\csname gmp@fig##2\endcsname.mps}}% {\gmp@nemessage\gmp@box}} \fi }% % \end{macrocode} % \end{document}