diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/epsdice/epsdice.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/epsdice/epsdice.dtx | 402 |
1 files changed, 402 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/epsdice/epsdice.dtx b/Master/texmf-dist/source/latex/epsdice/epsdice.dtx new file mode 100644 index 00000000000..e0060567d5c --- /dev/null +++ b/Master/texmf-dist/source/latex/epsdice/epsdice.dtx @@ -0,0 +1,402 @@ +% \iffalse +% +% EPSDICE.DTX by Thomas Heim (thomas.heim@unibas.ch) +% +% LICENSE: LPPL +% +% a small package to include dice faces in .eps format +% +% provides the command \epsdice{#1} +% taking one mandatory argument, an integer from 1 to 6 +% and one optional argument: 'black' (for black background, with white dots); +% default is white background with black dots) +% +% HISTORY: +% ======== +% +% 2001/02/11 -- first release, for dvips only +% +% 2001/02/13 -- now works under pdfLaTeX, too +% (with Rolf Niepraschk's help) +% +% 2001/09/04 -- "program encapsulated" by introducing "@" in counter name +% -- distributed as .dtx and .ins files, plus binary .pdf file +% -- some modifications in documentation +% -- NO CHANGES IN USER INTERFACE (tah) +% +% 2007/02/11 -- added OPTIONAL argument [black] to user interface, for +% reversed colors (extension suggested and drawings provided +% by Christoph Zurnieden, czurnieden@gmx.de) +% +% 2007/02/15 -- removed spurious comment line from generated EPS file +% (thanks to Christoph for spotting the bug) +% \fi +%<*sampledoc> +\documentclass[11pt]{article} +\usepackage{epsdice} +% +\title{Package `epsdice' --- a scalable dice font} +\author{2007/02/15 -- Version 2.1 \\[.5ex] Thomas Heim \\[.5ex] + (thomas.heim@unibas.ch)} +\date{} +\begin{document} +\maketitle +\section{Introduction} +Dice fonts are already available in \textsc{metafont} format. +(I should know, I wrote one myself: \texttt{dice3d.mf}.) +For some applications it seems preferable, however, to have the fonts +in scalable form. The package \texttt{epsdice} fills this gap. + +\texttt{epsdice.sty} provides a single command, +\verb+\epsdice{#1}+, taking one mandatory argument, an integer from 1 to 6, +and recognising one optional argument, namely \verb+[black]+ +for a black die with white dots.\footnote{Thanks to Chrisoph Zurnieden for +suggesting the extension with reversed colors, and for adjusting the drawings +to this purpose.} The default behavior (i.e., with \emph{no} optional argument +or with \emph{any optional argument other} than \verb+[black]+) results in +a white die with black dots. + +The mandatory argument may also be the value of a counter. Thus +automatic representation of (generated or input) data is possible as well. +Of course, values outside the range 1--6 will not be represented as die faces. + +Depending on the value of the argument, \verb+\epsdice+ includes the +appropriately clipped region from a file containing simple drawings +of die faces. The drawings scale with the current font because the +height of the included graphics file is set in terms of `ex' units. +% +\section{Requirements and limitations} +\texttt{epsdice} relies on the \texttt{graphicx} package to include +the drawings. +It also uses the \texttt{ifthen} package to validate the arguments +(error checking). + +The package has been tested with two widely used package drivers +for \texttt{graphicx}: \verb+[dvips]+ and \verb+[pdftex]+. By +default, the command \verb+\epsdice+ includes +\texttt{epsdice.eps} under \LaTeXe, and \texttt{epsdice.pdf} +under pdf\LaTeX, respectively\footnote{Many thanks to Rolf +Niepraschk for his help with the latter!} +(unless your \texttt{graphics.cfg} file specifies non-standard +settings). + +Clipping is supported only in pdf\TeX\ versions +$\ge 0.14$. You will also need an up-to-date version of +\texttt{pdftex.def}: Clipping is not supported in versions +\texttt{v0.03c} \texttt{[2000/09/04]} or earlier. +If your pdf\TeX\ is up-to-date but +you still receive error messages about clipping not being +supported, get the latest \texttt{pdftex.def} +here: \\[.5ex] +\verb+http://www.tug.org/applications/pdftex/pdftex.def+ +\\[.5ex] +I tested the package successfully with pdf\TeX\ 0.14e +and \texttt{pdftex.def} v0.03f \texttt{[2000/11/10]}. +% +\section{Configuring this package} +To finish the installation of the package, +simply move the following files somewhere in your ``local texmf tree'': +\begin{verbatim} + epsdice.sty, epsdice.cfg, dice.eps, dice.pdf +\end{verbatim} +e.g.\ to a new subdirectory +\verb+/tex/latex/epsdice/+. Refresh the +\TeX-system's file name database, and that's it, you're all set! +The remainder of this section applies only if you want to change +the default settings. + +The command \verb+\epsdice+ works by including an +external file, so this file must be found by \LaTeXe. The package comes with +a configuration file \texttt{epsdice.cfg} containing the file name in the +variable \verb+\dicefile+. By default, this variable points to the file +\verb+dice.{eps|pdf}+ (without file name extension). If you don't like my +drawings and would like to ``roll your own'', a look at section~\ref{pscode} +may give some hints. +It contains the same PostScript code as \texttt{dice.eps}, +with some comments about what's going on. Conversion to \textsc{pdf} +format has been accomplished with \texttt{epstopdf} (using +GhostScript), see pdf\TeX's web page. + +If you intend to keep the external file with the dice drawings in a +different place or if you want to use your own version you have to +edit the configuration file \texttt{epsdice.cfg} accordingly, +by adding the path to the file name, or by changing the file name in the +variable \verb+\dicefile+. +If a configuration file does not exist, the external file +is assumed to be located in the present working directory. +% +\section{Examples} +Die faces in an 11pt environment: The pictures fit into the surrounding +text, as in \epsdice{1} \epsdice[black]{2} \epsdice[black]{3} +\epsdice[red]{4} \epsdice[black]{5} \epsdice[white]{6}. The code used to set +these die faces was: +\begin{verbatim} +\epsdice{1} \epsdice[black]{2} \epsdice[black]{3} +\epsdice[red]{4} \epsdice[black]{5} \epsdice[white]{6} +\end{verbatim} +The only effective option to the command \verb+\epsdice+ is \verb+[black]+. +Anything else results in the default behavior with white background. + +\medskip +{\Large +Here is some \verb+\Large+ text. The die pictures scale accordingly:% +\footnote{\ldots as they do in footnotes, \epsdice{\value{footnote}}, +like this.} \epsdice{3} \epsdice[black]{5}. See?} + +\medskip +Finally, note that the package works with +standard counters, too: Here's the result of \verb+\epsdice{\value{section}}+ +\epsdice{\value{section}}. +% +\section{Drawing dice in PostScript} +\label{pscode} +Something as simple as a ``square with dots +on it'' is rather straightforward to draw in PostScript. The first line +\begin{flushleft} +\verb+%!PS-Adobe-2.0 EPSF-1.2+ +\end{flushleft} +is just a standard header. Next comes the bounding box: Each face measures +$32\times 32$~pt, centered in a $43\times43$~pt box. For six faces in a row, +this gives a bounding box of $258\times43$~pt. We have two rows of dice, +the lower row containing the white dice with black dots, the upper one the +black dice with white dots. So the total bounding box is $258\times86$~pt. +The background color will be stored in the variable $bw=0$ or 1. +\begin{verbatim} +%%BoundingBox: 0 0 258 86 +\end{verbatim} +The \verb+/frame+ macro defines a simple box with rounded corners. It takes +one argument, the face index $n$, and calculates a corresponding $x$-offset: +$x_{\mathrm{off}}=43 (n-1)$. The point $(x_{\mathrm{off}},y_{\mathrm{off}})$ +then becomes the origin of the coordinate system for this particular face. +This macro uses the variable $bw$ to calculate the vertical offset +$y_{\mathrm{off}}=43 bw$. +The frame consists of straight lines separated by 5~pt from the outer margin, +and of four quarter circles with radius $r$ ($r=5$~pt for black on white and +$r=6$~pt for white on black) centered at $(10,10),\,(32,10),\,(10,32)$, and $(32,32)$. +\begin{verbatim} +/frame { + /n exch def % take n off the stack, store it + /xoffset n 1 sub 43 mul def % xoffset = 43*(n-1) + gsave % save the graphics state + newpath % start a new path + xoffset yoffset translate % move origin to (xoffset,yoffset) + 32 5 bw sub moveto % go to (32,5) or (32,4) in this system + 32 10 r -90 0 arc % SE quarter circle around (32,10) + 37 bw add 32 lineto % right line + 32 32 r 0 90 arc % NE quarter circle around (32,32) + 10 37 bw add lineto % top line + 10 32 r 90 180 arc % NW quarter circle around (10,32) + 5 bw add 10 lineto % left line + 10 10 r 180 270 arc % SW quarter circle around (10,10) + closepath % bottom line (closes the path) + bw 0 eq { stroke } % either paint (lower row, bw=0) + { fill } ifelse % or fill (upper row, bw=1) the path + grestore % restore graphics state +} def +\end{verbatim} +The dot positions are labelled within a face by $(x,y)$-coordinates +running from $(1,1)$ +for bottom left to $(3,3)$ for top right. The dot itself is +a filled circle with radius $3.5$~pt. Change the dots' positions +within the frame, or their radius, as you like. The \verb+/dot+ macro +takes three arguments off the stack: (i) the face index, to determine +the $x$-offset, (ii) the $x$-coordinate (1, 2, or 3) on the face, and +(iii) the $y$-coordinate (1, 2, or 3) on the face. +\begin{verbatim} +/dot { + /y exch def % take y-coordinate off the stack + /x exch def % take x-coordinate off the stack + /n exch def % take face index n off the stack + /xoffset n 1 sub 43 mul def % xoffset = 43*(n-1) + gsave % save the graphics state + newpath % start a new path + xoffset yoffset translate % move origin to (xoffset,yoffset) + x 8 mul 5 add % the dot's x-position: 8*x+5 + y 8 mul 5 add % the dot's y-position: 8*y+5 + 3.5 0 360 arc % a circle with radius 3.5 pt + closepath % close the circle + bw setgray % set the appropriate color + fill % fill the circle + grestore % restore graphics state +} def +\end{verbatim} +Now choose a linewidth (2~pt) +\begin{verbatim} +2 setlinewidth +\end{verbatim} +and loop over the background color (and hence the rows) from 0 to 1. +The color counter is stored in $bw$ and used +to determine $y_{\mathrm{off}}$ as well as the radius of the circles, +$r=5+bw$~pt. +\begin{verbatim} +0 1 1 { % set up loop from 0 to 1 + /bw exch def % store loop index in bw + /yoffset bw 43 mul def % yoffset = 43*bw + /r 5 bw add def % radius r = 5+bw + 0 setgray % set color to black for all frames +\end{verbatim} +All we have to do now is draw the six faces +\begin{verbatim} + 1 1 6 { frame } for % call /frame macro for n=1..6 +\end{verbatim} +and fill in the appropriate dots. +The bottom left and top right dots appear on faces 2, 3, 4, 5, and 6. +Thus there is an outer loop from 2 to 6 in steps of 1. For each of these +face indices, we call the dot macro with $(x,y)$-argument equal to +$(1,1)$ and $(3,3)$. This can be achieved with an inner loop running +from 1 to 3 in steps of 2. Because the $x$- and $y$-coordinates coincide +for these particular points, we obtain them by duplicating the inner +loop index. The \verb+/dot+ macro gobbles not only the $x$- and +$y$-coordinates but the face index as well. In order to draw \emph{two} +dots on the same face, we thus have to duplicate the outer loop index, too. +\begin{verbatim} + 2 1 6 { % start loop 2 to 6 in steps of 1 + dup % duplicate index (two dots on each face) + 1 2 3 { % start loop 1 to 3 in steps of 2 + dup % duplicate loop index -> 1 1 and 3 3 + dot % call /dot macro, using three arguments + } for % inner loop (dot positions) + } for % outer loop (face index) +\end{verbatim} +The center dot appears on faces 1, 3, and 5. We get it in a simple loop +from 1 to 5 in steps of 2, calling the \verb+/dot+ macro for each index +together with the coordinate set $(2,2)$ corresponding to the center. +\begin{verbatim} + 1 2 5 { 2 2 dot } for % (2,2) dot on 1, 3, 5 +\end{verbatim} +The top left and the bottom right dots appear on faces 4, 5, and 6. Again, +in order to draw \emph{two} dots on each face, we have to duplicate the +loop index, i.e., the face index: +\begin{verbatim} + 4 1 6 { % start loop 4 to 6 in steps of 1 + dup % duplicate index (two dots on each face) + 1 3 dot % call /dot macro for (1,3) dot on this face + 3 1 dot % call /dot macro for (3,1) dot on this face + } for % loop over face index +\end{verbatim} +Finally, on face 6 we have two dots in positions $(1,2)$ and $(3,2)$. We can +use a loop, but then we have to swap the loop index, i.e., the dot's +$x$-coordinate, with the (constant) face index 6 inside the loop. +\begin{verbatim} + 1 2 3 { % start loop 1 to 3 in steps of 2 + 6 exch % swap loop index and constant face index + 2 % push constant y-coordinate on stack + dot % call /dot macro for (x,2) dot on face 6 + } for % loop over x-coordinates 1 and 3 +\end{verbatim} +And this closes the loop over background colors: +\begin{verbatim} +} for % loop over bw 0 and 1 +\end{verbatim} +That's it! +\begin{verbatim} +%%EOF +\end{verbatim} +\section{Errors} +Of course it doesn't make sense to ask for die faces with arguments +other than 1, 2, 3, 4, 5, or 6. The package generates error +messages and simply prints the offending argument in the \TeX\ output. +% +% This generates `benign' errors: \epsdice{99} and \epsdice{-3}. +% The following is more serious, generating two different errors: +% \epsdice{epsfoo}. Nevertheless, output continues with a fall-back +% solution. +\end{document} +% +%</sampledoc> +% +%<*package> +% +% I don't think the package code needs much of an explanation; +% it's really very simple\ldots +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{epsdice}[2007/02/15 by Thomas Heim (v. 2.1)] +\RequirePackage{graphicx} +\RequirePackage{ifthen} +\InputIfFileExists{epsdice.cfg}{}{\def\dicefile{dice}} +% +\newcounter{eps@face} +\newcommand*\epsdice[2][white]{% +\setcounter{eps@face}{\number #2}% +\ifthenelse{\value{eps@face}>6}{\theeps@face\setcounter{eps@face}{0}}{}% +\ifthenelse{\value{eps@face}<0}{\theeps@face\setcounter{eps@face}{0}}{}% +\ifthenelse {\equal{#1}{black}} {\addtocounter{eps@face}{6}} {}% +\eps@dice{\value{eps@face}}} +\newcommand*\eps@dice[1]{% +\setcounter{eps@face}{\number #1}% +\ifcase\value{eps@face}% + \PackageError{EPSDICE}{% +Argument is not a number, or its value\MessageBreak +lies outside the allowed range for dice}{% +Make sure the argument is either 1, 2, 3, 4, 5, or 6.\MessageBreak +-- Just go on and I'll write whatever you typed;\MessageBreak + the output may not make much sense, though}% +\or + \includegraphics[height=1.75ex,viewport= 3 4 38 39,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 46 4 81 39,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 89 4 124 39,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 132 4 167 39,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 175 4 210 39,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 218 4 253 39,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 3 47 38 82,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 46 47 81 82,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 89 47 124 82,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 132 47 167 82,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 175 47 210 82,% + clip=true]{\dicefile}% +\or + \includegraphics[height=1.75ex,viewport= 218 47 253 82,% + clip=true]{\dicefile}% +\fi} +% +%</package> +% +%<config>\def\dicefile{dice} +% +%<*epsfile> +% +% Here's the PostScript code for the drawings: +% +%<<PSFILE +%!PS-Adobe-2.0 EPSF-1.2 +%%BoundingBox: 0 0 258 86 +/frame { /n exch def /xoffset n 1 sub 43 mul def gsave newpath +xoffset yoffset translate 32 5 bw sub moveto 32 10 r -90 0 arc +37 bw add 32 lineto 32 32 r 0 90 arc 10 37 bw add lineto +10 32 r 90 180 arc 5 bw sub 10 lineto 10 10 r 180 270 arc closepath +bw 0 eq { stroke } { fill } ifelse grestore } def +/dot { /y exch def /x exch def /n exch def /xoffset n 1 sub 43 +mul def gsave newpath xoffset yoffset translate x 8 mul 5 add y 8 mul +5 add 3.5 0 360 arc closepath bw setgray fill grestore } def +2 setlinewidth 0 1 1 { /bw exch def /yoffset bw 43 mul def /r 5 bw +add def 0 setgray 1 1 6 { frame } for 2 1 6 { dup 1 2 3 { dup dot } +for } for 1 2 5 { 2 2 dot } for 4 1 6 { dup 1 3 dot 3 1 dot } for +1 2 3 { 6 exch 2 dot } for } for +%%EOF +%PSFILE +% +%</epsfile> +\endinput + + |