%%%%% %% %% gametex.sty is the core of of the (La)TeX code that makes it all %% work. If you are being a production GM and/or doing major %% customization for your game, you will get to know this file well. %% %% This file begins with blocks of code which define the macros %% central to GameTeX. Each of these blocks of code is preceeded by %% comments that document its use. They are grouped roughly by %% functionality, in the order given below. %% %% Setup: %% %% \gamerun %% \run\choice\or\or...\or\endchoice %% %% \GAMERUN %% %% \Draft %% \Final %% %% Generally useful (La)TeX macros: %% %% \TODO{} %% %% \multi{}{} %% \makemultilong %% \makemultishort %% %% \begin{itemz}[] %% \end{itemz} %% \begin{enum}[<title>] %% \end{enum} %% \begin{desc}[<title>] %% \end{desc} %% %% \rm, \sf, \tt, \bf, \sl, \sc, \it, \mediumseries, \normalshape %% %% \gametex %% \laTeX %% %% Macros using (La)TeX etc. packages %% %% \usemap{<mapsource>}{<mapcommands>}(<x>,<y>)[<scaling>] %% \defaultimage %% \portraitmap %% \clippedmap %% \landscapemap %% %% \mapgrid %% \clabel(<x>,<y>){<rotation>}{<scaling>}{<text>} %% \llabel(<x>,<y>){<rotation>}{<scaling>}{<text>} %% \rlabel(<x>,<y>){<rotation>}{<scaling>}{<text>} %% %% GameTeX-specific useful commands %% %% \ignore{<stuff>} %% \note{<text>} %% \unlist{<stuff>} %% %% \wrap[<num>]{<stuff>} %% %% \mytype %% \myowner %% \mytitle %% \me{} %% %% General GameTeX commands based on the .sty files %% %% \newinstance{<typestring>}{\command[<num>]}{<contents>} %% %% \uniquemark %% \unique %% %% \punt{<typestring>}{<list of <typestring> macros>} %% \unpunt{<typestring>}{<list of <typestring> macros>} %% \puntme %% \unpuntme %% \beginpunt <puntable stuff> \endpunt %% %% \owner %% \notowner %% \ownerdefault %% \suite %% \notsuite %% \transowner %% \nottransowner %% %% \raw{<stuff>} %% %% \iftags %% %% \gettags %% \tagged<field>{<tagstring>} %% %% \num{<number>} %% %% \updatemacro{<datatype macro>}{<new updates>} %% \updateplayer{<Char macro>}{<new player>} %% \updateplayeremail{<Char macro>}{<new player>}{<new email>} %% \updatePEG{<Char macro>}{<new player>}{<new email>}{<new gender>} %% %% \charsbycharacter %% \charsbyplayer %% \charsasis %% %% \production %% \compendium %% %% Character etc. commands %% %% \changeplayer{<playername>} %% \unknownplayer %% \deceased %% \changename{<name>} %% \unknownname %% %% \blankid %% \introid{<id>} %% \usualid{<id>} %% \contactid{<id>} %% \allid{<id>} %% %% \idreal %% \idnick %% \idmaiden %% \idnormal %% %% \intromap{<mapping>} %% \usualmap{<mapping>} %% \contactmap{<mapping>} %% \allmap{<mapping>} %% \titlemap{<mapping>} %% %% \mapformal %% \mapformalplain %% \mapinformal %% %% \mapnickinformal %% \maptrueformal %% \maplessformal %% %% GameTeX options handling: %% %% \DeclareGameOption[<earlycode>]{<string>}{<code>} %% \DeclareGameSubOption[<earlycode>]{<string>}{<superstring>}{<code>} %% %% GameTeX document handling, etc.: %% %% \SingleSiding %% \DoubleSiding %% %% \cleardocument %% %% \PDFPart %% %% A group of internal commands are declared, then packages, .sty %% files, and -LIST.tex files are set up. %% %% Char datatype %% Player datatype %% %% Stat datatype %% \stat{<name>}{<abbrev>}{<value>} %% \newstat{<field>}{<name>}{<abbrev>}{<default>} %% \resolvestats %% %% Identity datatype %% \listcharstuff %% \newid{<command>}{<mods>} %% <command>[<mods>]{<arg>} %% \identity{<mods>} %% %% \realname[<mods>]{<name>} %% \real[<mods>]{<arg>} %% \nickname[<mods>]{<name>} %% \nick[<mods>]{<arg>} %% \maidenname[<mods>]{<name>} %% \maiden[<mods>]{<arg>} %% %% \intro %% \usual %% \contactmapping %% \titlemapping %% %% \extrabadge{<name>}{<number>}{<desc>} %% \same %% \boxlabel{<label>} %% %% A few options-wide commands are declared. %% %% \basequote{<text>}{<author>} %% \bigquote{<text>}{<author>} %% \cenquote{<text>}{<author>} %% %% \begin{contacts} %% \contact{<character>} %% \end{contacts} %% %% \begin{members} %% \member{<character>} %% \end{members} %% %% \pageof{<card>} %% %% After the blocks of code, the various GameTeX options are defined. %% Each option contains its own blocks of code and comments. %% %% Options: %% %% sheet --- generic sheet %% char --- charsheet %% blue --- bluesheet %% green --- greensheet %% listchar --- producing charsheets %% listblue --- producing bluesheets %% listgreen --- producing greensheets %% white --- whitesheet %% listwhite --- producing whitesheets %% fullsheet --- generic document that uses a maximum of pagespace %% playerlist --- playerlists %% landscapeplayerlist --- landscape playerlists %% portraitplayerlist --- portrait playerlists %% cardsheet --- base for all cards %% abils --- ability cards %% alignment --- base for cinematic combat cards and similar %% combat --- cinematic combat cards %% packet --- base for memory packets and items %% mems --- memory packets %% items --- items %% carditems --- subset of items for cardstock %% paperitems --- subset of items for normal paper %% notebook --- choose-your-own-adventure research notebooks %% money --- money %% signs --- signs and labels %% badges --- namebadges %% statcards --- statcards %% skilllists --- skilllists %% boxlabels --- box labels %% cheatsheet --- GM cheatsheet %% %%%%% \ifx\eTeXversion\@undefined \typeout{% ^^J! You are not using e-TeX. Expect errors. Try elatex instead of latex.^^J% } \fi %%%%% %% default values overridden by the .cls file \def\@makedefault#1#2{\unless\ifdefined#1\def#1{#2}\fi} \@makedefault\gamerun{1} \@makedefault\gamename{Test Game} \@makedefault\gamedate{Test Date} \@makedefault\gamedraft{\Final} \@makedefault\gamenameabbrev{\gamename} \@makedefault\gamedateabbrev{\gamedate} \@makedefault\signdate{\gamedateabbrev} \@makedefault\takedownby{Testember Nth, 2001} \@makedefault\defaultnamemappings{ \titlemap{\full} \mapnickinformal } \@makedefault\badgemap{{\MYname}{\MYnumber}{\MYplayer}{\MYdesc}} \@makedefault\badgedagger{\nobadgedagger} \@makedefault\playerlistproduction{\longgameplayers} \@makedefault\playerlistcompendium{\longgamechars} \@makedefault\playergrouping{ \mark{GMs}\allgms \mark{Players}\allplayers } \@makedefault\charactergrouping{ \mark{GMs}\allgms \mark{Characters}\allchars } \@makedefault\theboxpref{\boxbyplayer} \@makedefault\charsproduction{\charsbycharacter} \@makedefault\usetags{\tagstrue} \@makedefault\charsheetlists{% %% listed mempackets \begin{tlist}{Memory/Event Packets} \MYmems \end{tlist} %% listed bluesheets \begin{tlist}{Bluesheets} \MYblues \end{tlist} %% listed greensheets \begin{tlist}{Greensheets} \MYgreens \end{tlist} %% listed abilities \begin{tlist}{Abilities} \MYabils \MYskills \end{tlist} %% listed items, etc \begin{tlist}{Items} \MYitems \MYwhites \MYcash \end{tlist} %% listed stats \begin{tlist}{Stats} \MYstats \end{tlist} } %%%%% %% \gamerun (defined in the .cls file) %% \run\choice<choice-1>\or<choice-2>\or...\or<choice-n>\endchoice %% %% These commands are useful if the game will have multiple runs. %% \gamerun is the number of the run currently being produced. It %% must be a positive, non-zero integer. \run\choice...\endchoice, %% based on TeX's \ifcase switch, is a command for giving a list of %% choices, each for a given run. If \gamerun is set to something %% beyond the number of choices given, \run\choice will give a %% warning. %% %% \run\choice (actually two commands which should always go together) %% is followed by a list of choices separated by \or and terminated by %% \endchoice. <choice-1> will be given if \gamerun is 1, <choice-2> %% will be given if \gamerun is 2, etc. Realistically, there is no %% limit to the number of choices you can give \run\choice. However, %% if you give \run\choice five choices, but only ever set \gamerun to %% 1, 2, or 3, the last two choices will never happen. %% %% So, if the game has multiple runs, you write run-conditional %% information using \run\choice. When you want to produce the first %% run, you set \gamerun to 1, when you want to produce the second %% run, you set \gamerun to 2, and so on. %% %% If you are running multiple times, you may want to include \gamerun %% in \gamedate. You may also want to define \takedownby using %% \run\choice. \long\def\run\choice#1\endchoice{% \ifcase\gamerun% \@gamerun@error% \or#1% \else% \@gamerun@error% \fi% } \let\choice\ifcase \let\endchoice\fi \def\@gamerun@error{\typeout{! no entry for run \gamerun}} %%%%% %% \GAMERUN %% %% When defined before \documentclass, \GAMERUN can override %% \gamerun. \ifdefined\GAMERUN \def\gamerun{\GAMERUN} \fi %%%%% %% \Draft %% \Final \newif\ifdraft \def\Draft{\drafttrue} \@onlypreamble\Draft \def\Final{\draftfalse} \@onlypreamble\Final %% execute default \gamedraft %%%%% %% Here this file is set up as a LaTeX2e class file. See %% /usr/athena/share/texmf/doc/latex/base/clsguide.dvi for a %% description of how that works. Also, some custom screen %% output is set up. \NeedsTeXFormat{LaTeX2e} \ProvidesClass{\gameclassname} \typeout{\space\space--- \gamename\space--- \gamedate\space---} %%%%% %% %% These are generally useful (La)TeX macros. They are provided for %% utility. GameTeX relies on some of them, though they do not rely %% on other parts of GameTeX or anything other than basic (La)TeX. %% %%%%% %%%%% %% \TODO{<string>} \long\def\TODO#1{\typeout{\space\space TODO: \unexpanded{#1}}} \AtBeginDocument{% \ifdraft% \long\def\TODO#1{% \typeout{\space\space TODO: \unexpanded{#1}}% \textbf{TODO: \unexpanded{#1} :TODO}% }% \fi% } %%%%% %% \multi{<num>}{<stuff>} %% \makemultilong %% \makemultishort %% %% \makemultilong and \makemultishort change the meaning of \multi. %% If \makemultilong is in effect, \multi{<num>}{<stuff>} will do %% <stuff> <num> times, e.g. \multi{5}{Foo} generates FooFooFooFooFoo, %% and \multi{3}{Bar } generates Bar Bar Bar . %% %% If \makemultishort is in effect, \multi{<num>}{<stuff>} will do %% <stuff> once, with a "x<num>" label. If <num>==1, it will just do %% <stuff> once. For example, \multi{5}{Foo} generates Foo(x5). %% %% \makemultilong is in effect by default. %% these are useful in many places \long\def\@append#1#2{% \expandafter\edef\expandafter#1\expandafter{% \expandafter\unexpanded\expandafter{#1#2}% }% } \long\def\@global@append#1#2{% \expandafter\xdef\expandafter#1\expandafter{% \expandafter\unexpanded\expandafter{#1#2}% }% } \long\def\@prepend#1#2{% \edef\@@prep{\unexpanded{#2}}% \expandafter\@append\expandafter\@@prep\expandafter{#1}% \let#1\@@prep\let\@@prep\empty% } \long\def\@global@prepend#1#2{\@prepend#1{#2}\global\let#1#1} \newcount\@multicount \long\def\@multilong#1#2{% \ifnum#1>0% \let\@tmp\empty% \@@multilong{#1}{#2}% \fi% \@tmp% } \long\def\@@multilong#1#2{% \let\@nxt\relax% \ifnum#1>0% \@append\@tmp{#2}% \@multicount=#1\relax% \advance\@multicount by-1\relax% \expandafter\def\expandafter\@nxt\expandafter{\expandafter% \@@multilong\expandafter{\the\@multicount}{#2}% }% \fi% \@nxt% } \long\def\@multishort#1#2{% \let\@tmp\empty% \ifnum#1>0% \def\@tmp{\unexpanded{#2}}% \fi% \ifnum#1>1% \edef\@tmp{\@tmp\unexpanded{\ensuremath{\mathbf{(\times#1)}}}}% \fi% \@tmp% } \def\makemultilong{\def\multi{\@multilong}} \def\makemultishort{\def\multi{\@multishort}} \makemultilong %%%%% %% \begin{itemz}[<title>] %% \end{itemz} %% %% \begin{enum}[<title>] %% \end{enum} %% %% \begin{desc}[<title>] %% \end{desc} %% %% These environments are analogous to LaTeX's itemize, enumerate, and %% description environments. They typeset material much more %% compactly. They also take an optional <title> argument which, when %% present, will be typeset in bold at the head of the list. The %% itemz environment is used (via the tlist environment) for the %% automated lists at the end of character sheets. \let\real@item\item \def\dummy@param{\dummy@param} \newcommand\tlist@item[1][\dummy@param]{% \def\@tmp{#1}% \ifx\@tmp\dummy@param% \def\@tmp{\real@item}% \else% \def\@tmp{\real@item[#1]}% \fi% \@tmp% \mbox{}% } \def\@tlistmods{% \topsep0pt% \partopsep\parskip% \itemsep0pt% \parsep0pt% \parskip0pt% \ifdim\parindent=0pt% \leftmargin2em% \else% \leftmargin\parindent% \fi% \def\item{\tlist@item}% \rightmargin0pt% \itemindent0pt% \parindent0pt% } \long\def\@tlisttitle#1{% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \par\noindent{\bfseries#1}\nopagebreak\@beginparpenalty\@M% \fi% } \newcommand{\itemz}[1][]{% \ifnum\@itemdepth>3% \@toodeep% \else% \advance\@itemdepth1% \@tlisttitle{#1}% \list{-}{% \@tlistmods% \def\makelabel##1{\hss\llap{##1}}% }% \fi% } \def\enditemz{\@topsepadd0pt\endlist} \newcommand{\enum}[1][]{% \ifnum\@enumdepth>3% \@toodeep% \else% \advance\@enumdepth1% \edef\@enumctr{enum\romannumeral\the\@enumdepth}% \@tlisttitle{#1}% \expandafter\list\csname label\@enumctr\endcsname{% \@tlistmods% \usecounter\@enumctr% \def\makelabel##1{\hss\llap{##1}}% }% \fi% } \def\endenum{\@topsepadd0pt\endlist} \newcommand{\desc}[1][]{% \@tlisttitle{#1}% \list{}{% \@tlistmods% \itemindent-\leftmargin% \labelwidth0pt% \let\makelabel\descriptionlabel% }% } \def\enddesc{\@topsepadd0pt\endlist} %%%%% %% \rm, \sf, \tt, \bf, \sl, \sc, \it, \mediumseries, \normalshape %% %% These grandfathered LaTeX209 commands are redefined to work like %% their resepctive LaTeX2e counterparts. Basically, they can be %% combined usefully. This is exactly what the first portion of the %% newlfonts package does. %% %% This is done at the end of the class, to ensure that the base class %% has already been loaded (LaTeX classes tend to manipulate such %% commands.) \AtEndOfClass{% \let\rm\rmfamily% \let\sf\sffamily% \let\tt\ttfamily% \let\bf\bfseries% \let\sl\slshape% \let\sc\scshape% \let\it\itshape% \let\mediumseries\mdseries% \let\normalshape\upshape% } %%%%% %% \gametex %% \laTeX %% %% \gametex is this package's logo. \laTeX produces a (La)TeX logo, %% based very much on the \LaTeX macro. \def\gametex{\mbox{Game\kern-.15em\TeX}} \def\laTeX{% (\kern-.1em L\kern-.36em% \begingroup% \sbox\z@ T% \vbox to\ht0{% \hbox{% $\m@th$\csname S@\f@size\endcsname\fontsize\sf@size\z@% \math@fontsfalse\selectfont A% }% \vss% }% \endgroup% \kern-.2em)\kern-.15em% \TeX% } %%%%% %% %% These macros rely on certain LaTeX packages, but do not strictly %% rely on the rest of GameTeX. %% %%%%% %%%%% %% \usemap{<mapsource>}{<mapcommands>}(<x>,<y>)[<scaling>] %% \defaultimage %% \portraitmap %% \clippedmap %% \landscapemap %% %% These are for displaying an eps image with translation and scaling. %% They are usually used for displaying a game map. \usemap takes two %% required arguments, <mapsource> and <mapcommands>, followed by an %% optional pair of translation coordinates, (<x>,<y>), and an %% optional scaling argument, [<scaling>]. %% %% These commands use the pstricks and graphicx packages. %% %% <mapsource> should be some valid typesetting construct, probably an %% \includegraphics command. If it is blank, \defaultimage will be %% used. \usemap will produce an image of the dimensions of %% <mapsource>, regardless of translation and scaling. %% %% The image is placed as part of a pspicture environment (similar to %% LaTeX's picture environment), which uses a coordinate system. The %% original picture is 1 horizontal unit wide and 1 vertical unit %% high, so (.5,.5) is the middle of the original image. The image %% (including the coordinate system and anything placed within it in %% <mapcommands>) can be translated and scaled, but will always be %% viewed through a "window" that is the size of the original %% <mapsource> image. %% %% <x> and <y> (which default to 0,0) specify the bottom-left corner %% of the translation in relation to the original image. <scaling> %% specifies the scaling, e.g. [2] would display the image at double %% magnification. It uses the scaling interface from pstricks, which %% can use a split value. E.g. [2,3] will use scale the image double %% horizontally and triple vertically. %% %% <mapcommands> is for labels and similar that will be displayed over %% the image. See the section below. %% %% \portraitmap is the basic campus map (from \postscript/map.ps) in %% portrait orientation, scaled to the full \textheight and \textwidth %% of the page. %% %% \landscapemap is the basic campus map in landscape orientation %% (which uses the page more efficiently if you use no scaling to get %% the whole map), scaled to the full \textheight and \textwidth of %% the page. %% %% \clippedmap is scaled to \textwidth but not to \textheight. The %% map is in portrait orientation, but will not fill the whole page %% vertically. \long\def\usemap#1#2{% \begingroup% \def\@map{#1}% \ifx\@map\empty\let\@map\defaultimage\fi% \setbox\@mapbox\hbox{\@map}% \setbox\@mapbox\hbox{\raise\dp\@mapbox\box\@mapbox}% \psset{xunit=\wd\@mapbox,yunit=\ht\@mapbox}% \def\@mapcommands{#2}% \@ifnextchar({\@usemap}{\@usemap(0,0)}% } \def\@usemap(#1,#2){% \def\@xtrans{#1}\def\@ytrans{#2}% \@ifnextchar[{\@@usemap}{\@@usemap[1]}% } \def\@@usemap[#1]{% \noindent% \pspicture*(1,1)% \psscalebox{#1}{% \rput[bl](-\@xtrans,-\@ytrans){% \rput[bl](0,0){\copy\@mapbox}% \@mapcommands% }% }% \endpspicture% \endgroup% } \def\defaultimage{\clippedmap} \def\portraitmap{% \includegraphics[% bb=0 0 8in 10.5in,% clip, totalheight=.999\textheight,% width=.999\textwidth,% keepaspectratio% ]{\postscript/map.ps}% } \def\clippedmap{% \includegraphics[% totalheight=.999\textheight,% width=\textwidth,% keepaspectratio% ]{\postscript/map.ps}% } \def\landscapemap{% \includegraphics[% clip,angle=90, totalheight=.999\textheight,% width=.999\textwidth,% keepaspectratio% ]{\postscript/map.ps}% } %%%%% %% \mapgrid %% \clabel(<x>,<y>){<rotation>}{<scaling>}{<text>} %% \llabel(<x>,<y>){<rotation>}{<scaling>}{<text>} %% \rlabel(<x>,<y>){<rotation>}{<scaling>}{<text>} %% %% These commands go inside <mapcommands>. All are compatible with %% the pspicture environment. %% %% \mapgrid displays a grid of the coordinate system over the image. %% Use it to find the coordinates you want for various labels, and to %% see how the image is scaled. %% %% \clabel, \llabel, and \rlabel all create labels. (<x>,<y>) %% specifies the coordinates, <rotation> specifies the rotation (in %% degrees), and <scaling> specifies the scaling in relation to the %% base image. It uses the scaling interface from pstricks, which can %% use a split value. E.g. [2,3] will use scale the label double %% horizontally and triple vertically. %% %% \clabel centers the label on the given coordinates. \llabel puts %% the label to the left and \rlabel puts it to the right. %% %% <text> will be inside a simplified, single-column tabular %% environment, so \\ will create a new line, e.g. {The Bar\\ 37-212}. %% To make scoped declarations (like \bf) apply to all lines of a %% label, put the declaration outside the label, %% e.g. {\bf\clabel(...){...}{...}{The Bar\\ 37-212}. \def\mapgrid{% \psgrid[xunit=.1\wd\@mapbox,yunit=.1\ht\@mapbox,gridwidth=.5pt](15,15)% \multido{\n@=0+.1}{15}{\rput[bl](\@xtrans,\n@){\n@}}% \multido{\n@=0+.1}{15}{\rput[br]{-90}(\n@,\@ytrans){\n@}}% }% \def\clabel(#1)#2#3#4{% \@maplabel{c}(#1){#2}{#3}{\@labelstack{c}{#4}}% } \def\llabel(#1)#2#3#4{% \@maplabel{r}(#1){#2}{#3}{% \makebox(0,0)[rc]{\@labelstack{r}{#4}}% \rule{1em}{.25ex}% }% } \def\rlabel(#1)#2#3#4{% \@maplabel{l}(#1){#2}{#3}{% \rule{1em}{.25ex}% \makebox(0,0)[lc]{\@labelstack{l}{#4}}% }% } \newbox\@mapbox \long\def\@maplabel#1(#2)#3#4#5{% \begingroup% \def\@labelrot{#3}% \ifx\@labelrot\empty\def\@labelrot{0}\fi% \def\@labelscal{#4}% \ifx\@labelscal\empty\def\@labelscal{1}\fi% \rput[#1]{\@labelrot}(#2){\psscalebox{\@labelscal}{#5}}% \endgroup% } \def\@labelstack#1#2{% \begingroup% \tabcolsep0pt% \def\arraystretch{.5}% \tabular{#1}#2 \\ \endtabular% \endgroup% } %%%%% %% %% These macros are specific to GameTeX but do not rely on other %% packages or .sty files. They can be used in a variety of places. %% %%%%% %%%%% %% \ignore{<stuff>} %% \note{<text>} %% \unlist{<stuff>} %% %% \ignore causes <stuff> to be ignored. %% %% \note is a wrapper around \ignore. %% %% \unlist appends <stuff> to a list that is executed and cleared by %% \dounlisteds. %% %% Both \ignore and \unlist behave differently in certain lists in %% sheets (see the sheet option below). In char-LIST.tex, if you give %% a character something wrapped inside \ignore, it will be shown in %% the lists at the end of the character sheet, but will not be %% printed elsewhere. This is useful for giving a character a note in %% their charsheet (\note is written with this specifically in mind). %% If you give a character something wrapped inside \unlist, it won't %% be shown in the charsheet lists, but will be printed elsewhere, %% probably marked as ``UNLISTED.'' This is useful for giving a %% character something they don't know about at the beginning of game, %% possibly included with a memory packet or received from a GM at a %% later time. \long\def\ignore#1{} \long\def\note#1{\ignore{{\BRANCHTYPES{Owner}{\REMAP{\TYPE}}\em\ \ #1}}} \long\def\unlist#1{#1} %%%%% %% \wrap[<num>]{<stuff>} %% if <num> is 0 or greater, acts just like \multi{<num>}{<stuff>} %% else generates \unlist{\multi{-<num>}{<stuff>}} \newcommand{\wrap}[2][]{% \begingroup% \def\@tmp{#1}% \ifx\@tmp\empty% \def\@tmp{1}% \fi% \expandafter\ifnum\@tmp<0% \count0=\@tmp% \multiply\count0by-1% \edef\@tmp{\the\count0}% \etoss{\unlist{\multi{\?\@tmp}{\X{#2}}}}% \else% \etoss{\multi{\?\@tmp}{\X{#2}}}% \fi% \endgroup% } %%%%% %% \mytype %% \myowner %% \mysubowner %% \mytitle %% \me{} %% %% These macros are initialized as blank here. They are used by %% various options, noteably sheet, to store bits of information about %% the given document. %% %% \me{} always has required braces. \def\mytype{} \def\myowner{} \def\mysubowner{} \gdef\mytitle{} \long\gdef\@me#1{} \def\me#{\@me} %%%%% %% %% These macros are built on top of commands from the .sty files or %% are used directly with such macros. %% %%%%% %%%%% %% \newinstance{<datatype>}{\command[<num>]}{<contents>} %% %% This creates a macro \command that takes <num> arguments and is a %% wrapper around \INSTANCE. See ../Lists/README and datatypes.sty. \long\def\newinstance#1#2#3{\newcommand#2{\INSTANCE{#1}{#3}{}}} %%%%% %% \unique %% \uniquemark %% %% \unique, when used as the option to a datatype macro, makes the %% macro perform its mapping if it hasn't already been marked as %% having been done before (in the same scope). \uniquemark, probably %% used as part of a mapping, marks a datatype macro as having been %% used. \newcount\@@@unique \@@@unique=0 \def\uniquemark{\ADD{\advance\@@@unique1\relax}}% \newcommand*{\unique}[1][1]{\ifnum\@@@unique<#1\relax\MYMAP\fi} %%%%% %% \punt{<typestring>}{<list of <typestring> macros>} %% \unpunt{<typestring>}{<list of <typestring> macros>} %% \beginpunt <puntable stuff> \endpunt %% \puntme %% \unpuntme \def\punt#1#2{% \begingroup% \BRANCHTYPES{#1}{\MAP{\TYPE}{\etoss{\stoss{\?\ME{\puntme}}}}}#2% \endgroup% } \def\unpunt#1#2{% \begingroup% \EVERY{#1}{\ifx\@unpunted\empty\etoss{\stoss{\?\ME{\puntme}}}\fi}% \BRANCHTYPES{#1}{\MAP{\TYPE}{\etoss{\stoss{\?\ME{\unpuntme}}}}}#2% \endgroup% } \def\puntme{\ADD{\@puntme}} \def\unpuntme{\ADD{\@unpuntme}} \def\@puntme{\let\@punted\relax} \def\@unpuntme{\let\@punted\empty\let\@unpunted\relax} \let\@punted\empty \let\@unpunted\empty \long\def\beginpunt#1\endpunt{\ifx\@punted\empty#1\fi} \def\endpunt{% \typeout{! \noexpand\endpunt without a matching \string\beginpunt.}% } %%%%% %% \owner %% \notowner %% \ownerdefault %% \suite %% \notsuite %% \transowner %% \nottransowner %% flat element vs. subowner/suite \def\owner{\let\@owner\relax\let\@notowner\empty} \def\notowner{\let\@owner\empty\let\@notowner\relax} \def\ownerdefault{\let\@owner\empty\let\@notowner\empty} %% subowner vs. suite \def\suite{\let\@suite\relax} \def\notsuite{\let\@suite\empty} \let\@transowner\empty \def\transowner{\let\@thistransowner\relax} \def\nottransowner{\let\@thistransowner\empty} %%%%% %% \raw{<stuff>} \long\def\raw#1{#1} %%%%% %% \iftags \newif\iftags \usetags %% either \tagstrue or \tagsfalse %%%%% %% \gettags %% \tagged<field>{<tagstring>} \iftags \def\gettags{% \unless\ifx\MYfile\empty% \unless\ifx\@myfile\MYfile% \procextracts{\starttag}{\endtag}{\chars/\MYfile}{% \csname @tagadd\endcsname}{\endtagadd% }{% \csname @dotag\endcsname}{\endtag% }% \fi% \fi% } \else \let\gettags\relax \fi \long\def\@tagadd#1\endtagadd{\ADD{\let\@myfile\MYfile\let\@tmp\empty#1\@tmp}} \long\def\@dotag#1#2\endtag{% \ifcsname tag@#1\endcsname% \csname tag@#1\endcsname{#2}% \fi% } \def\tagged#1#2{% \expandafter\long\expandafter\def\csname tag@#2\endcsname##1{% \@prepend\@tmp{\prepend#1{##1}}% }% } %%%%% %% \num{<number>} \def\num#1{\rs\MYnumber{#1}} %%%%% %% \updatemacro{<datatype macro>}{<new updates>} %% \updateplayer{<Char macro>}{<new player>} %% \updateplayeremail{<Char macro>}{<new player>}{<new email>} %% \updatePEG{<Char macro>}{<new player>}{<new email>}{<new gender>} \def\updatemacro{\EXTEND} \def\updateplayer#1#2{\updatemacro{#1}{\rs\MYplayer{#2}}} \def\updateplayeremail#1#2#3{% \updatemacro{#1}{\rs\MYplayer{#2}\rs\MYemail{#3}}% } \def\updatePEG#1#2#3#4{% \updatemacro{#1}{% \rs\MYplayer{#2}% \rs\MYemail{#3}% \def\@test{#4}% \unless\ifx\@test\empty% \rs\MYgender{#4}% \fi% } } %%%%% %% \charsbycharacter %% \charsbyplayer %% \charsasis %% %% These are wrappers around basic uses of \SORT{Char}... that list %% Char macros alphabetically by either name or player. See %% datatypes.sty. \def\charsbycharacter{\SORT{Char}{alpha<}{\alphabetical}{\EVERY{Char}{}}{}} \def\charsbyplayer{\SORT{Char}{alpha<}{\playeralphabetical}{\EVERY{Char}{}}{}} \def\charsasis{\EVERY{Char}{}} %%%%% %% \production %% \compendium \def\@production{\charsproduction\EVERY{Place}{}} \let\@compendium\relax \def\production{\@production} \def\compendium{\@compendium} %%%%% %% %% These macros are built on top of the parsing of character names, %% and control how character names are typeset in sheets. %% %%%%% %%%%% %% \changeplayer{<playername>} %% \unknownplayer %% \deceased %% \changename{<name>} %% \unknownname \def\changeplayer{\rs\MYplayer} \def\unknownplayer{\changeplayer{unknown}} \def\deceased{\changeplayer{deceased}} \def\changename{\rs\MYname} \def\unknownname{\changename{unknown}} %%%%% %% \blankid %% \introid{<id>} %% \usualid{<id>} %% \contactid{<id>} %% \allid{<id>} \long\def\blankid#1{#1} \long\def\introid#1{\def\@iid{#1}} \long\def\usualid#1{\def\@uid{#1}} \long\def\contactid#1{\def\@cid{#1}} \long\def\allid#1{\introid{#1}\usualid{#1}\contactid{#1}} %%%%% %% \idreal %% \idnick %% \idmaiden %% \idnormal \def\idreal{\allid{\real}} \def\idnick{\allid{\nick}} \def\idnick{\allid{\maiden}} \def\idnormal{\allid{\blankid}} %%%%% %% \intromap{<mapping>} %% \usualmap{<mapping>} %% \contactmap{<mapping>} %% \allmap{<mapping>} %% \titlemap{<mapping>} \long\def\intromap#1{\def\@imap{#1}} \long\def\usualmap#1{\def\@umap{#1}} \long\def\contactmap#1{\def\@cmap{#1}} \long\def\allmap#1{\intromap{#1}\usualmap{#1}\contactmap{#1}} \long\def\titlemap#1{\def\@tmap{#1}} %%%%% %% \mapformal %% \mapformalplain %% \mapinformal \def\mapformal{\allmap{\full}\usualmap{\formal}} \def\mapformalplain{\titlemap{\fullplain}\allmap{\fullplain}\usualmap{\formal}} \def\mapinformal{\allmap{\full}\usualmap{\informal}} %%%%% %% \mapnickinformal %% \maptrueformal %% \maplessformal \def\mapnickinformal{\idnormal\usualid{\nick}\mapinformal} \def\maptrueformal{\idnormal\mapformal} \def\maplessformal{\idnormal\mapformalplain} %%%%% %% %% These macros are for declaring GameTeX options and for %% document-control within GameTeX documents and options. %% %%%%% %%%%% %% \DeclareGameOption[<earlycode>]{<string>}{<code>} %% \DeclareGameSubOption[<earlycode>]{<string>}{<superstring>}{<code>} %% %% \DeclareGameOption creates a GameTeX option with consists of %% <code>, accessible via \documentclass[<string>]. It is, in part, a %% wrapper around LaTeX2e's \DeclareOption. %% %% <code> will be executed as a GameTeX option after the base class %% has been loaded with its options. Therefore, you can't usefully %% change which base class is loaded or which options it is loaded %% with within <code>. %% %% <earlycode>, an optional argument, will be executed during %% LaTeX2e's normal options processing, before the base class is %% loaded with its options. To change which base class is loaded and %% which options it is loaded with for a given GameTeX option, define %% \BASECLASS and/or \BASEOPTIONS within <earlycode>, e.g. %% \DeclareGameOption[\def\BASEOPTIONS{12pt}]. %% %% \DeclareGameSubOption creates a GameTeX option that inherits the %% <code> from the GameTeX option specified by <superstring>. The new %% option will also inherit the <earlycode> from <superstring>. %% %% Both \DeclareGameOption and \DeclareGameSubOption may not be used %% after \begin{document}. See ../README for how GameTeX options are %% used. \newcommand\DeclareGameOption[2][]{\DeclareGameSubOption[#1]{#2}{}} \newcommand\DeclareGameSubOption[4][]{% \expandafter\edef\csname o,#2\endcsname{% \expandafter\unexpanded\expandafter{% \expandafter\gdef\csname o,#2\endcsname{% \typeout{! \gameclassname\space option "#2" reload ignored}% }% \message{--> #2}% \Exec@pt{#3}% \do@pt% #4% }% }% \expandafter\edef\csname p,#2\endcsname{% \noexpand\let\expandafter\noexpand\csname p,#2\endcsname\relax% \expandafter\noexpand\csname p,#3\endcsname\unexpanded{#1}% }% \expandafter\edef\expandafter\do@pt\expandafter{% \expandafter\unexpanded\expandafter{\do@pt}% \noexpand\let\expandafter\noexpand\csname p,#2\endcsname\relax% \noexpand\let\expandafter\noexpand\csname o,#2\endcsname\relax% }% \DeclareOption{#2}{\once@exec@pt{#2}}% } \expandafter\let\csname p,\endcsname\relax \let\game@pt\empty% \def\once@exec@pt#1{% \def\once@exec@pt##1{% \AtEndOfClass{% \typeout{! extra \gameclassname\space option "##1" ignored}% }% }% \def\game@pt{#1}% } \def\ProcessGameOptions{% %% input inputs only after blanking out option code, to greatly reduce %% peak memory usage. \expandafter\def\expandafter\do@pt\expandafter{\do@pt\@inputinputs}% \ifx\game@pt\empty% \do@pt% \else% \ifcsname o,\game@pt\endcsname% \csname p,\game@pt\endcsname% \fi% \AtEndOfClass{\message{^^J\space\space Options:}\Exec@pt{\game@pt}}% \fi% } \def\Exec@pt#1{% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \expandafter\ifx\csname o,#1\endcsname\relax% \typeout{! option "#1" not defined for class "\gameclassname"}% \else% \expandafter\def\expandafter\@tmp\expandafter{\expandafter% \let\expandafter\@tmp\expandafter\empty\csname o,#1\endcsname}% \fi% \fi% \@tmp% } \@onlypreamble\DeclareGameOption \@onlypreamble\DeclareGameSubOption \@onlypreamble\Exec@pt %% non-GameTeX options get passed to the base class \DeclareOption*{\PassOptionsToClass{\CurrentOption}{\BASECLASS}} %% \do@pt, built up by uses of \DeclareGameOption, blanks out %% option code after options are loaded to save memory. \def\do@pt{\let\do@pt\relax\message{^^J}} %%%%% %% \SingleSiding %% \DoubleSiding %% %% \SingleSiding makes generated files include the simplex postscript %% header file, which forces postscript output to be single-sided. %% \DoubleSiding makes generated files include the duplex postscript %% header file, which forces postscript output to be double-sided. %% Neither of these commands may be used after the \begin{document} %% command. The appropriate header file is set at the %% \begin{document}, so the most recent of \SingleSiding or %% \DoubleSiding has precedent. \def\SingleSiding{\let\game@doublesiding\empty} \@onlypreamble\SingleSiding \def\DoubleSiding{\let\game@doublesiding\relax} \@onlypreamble\DoubleSiding \AtBeginDocument{% \ifx\game@doublesiding\empty% \special{header=\postscript/simplex}% \else% \special{header=\postscript/duplex}% \fi% } \DoubleSiding %% default is \DoubleSiding %%%%% %% %% \def\@LandscapeMode{% \dimen0=\textwidth\relax% \textwidth=\textheight\relax% \textheight=\dimen0\relax% \AtBeginDvi{\special{papersize=11in,8.5in}}% \AtBeginDvi{\special{! /landplus90 true store}}% \pdfpageheight=8.5in \pdfpagewidth=11in \paperheight=\pdfpageheight \paperwidth=\pdfpagewidth } \@onlypreamble\@LandscapeMode %%%%% %% \cleardocument %% %% This starts a new page, resetting the page number, footnote number, %% table and figure numbers, and all sectioning etc. numbers such that %% they start over. If \DoubleSiding is in effect, it also makes sure %% the next page is odd (such that it would print on the front side of %% a new piece of paper). If this requires a blank page, the blank %% page will have no headers or footers. \def\cleardocument{% \unless\ifnum\lastpenalty=19 \clearpage% \unless\ifx\game@doublesiding\empty% \ifodd\c@page% \relax% \else% \null% \thispagestyle{empty}% \clearpage% \fi% \fi% \cycle@job \setcounter{page}{1}% \setcounter{part}{0}% \setcounter{section}{0}% \setcounter{subsection}{0}% \setcounter{subsubsection}{0}% \setcounter{paragraph}{0}% \setcounter{subparagraph}{0}% \setcounter{figure}{0}% \setcounter{table}{0}% \setcounter{footnote}{0}% \penalty19% \fi% } \global\let\realjobname\jobname \newcount\@jobcnt \global\@jobcnt=0 \def\cycle@job{% \if@filesw% \begingroup% %% mimic \end{document}'s treatment of .aux \begingroup% \immediate\closeout\@mainaux% \let\@setckpt\@gobbletwo% \let\@@newl@bel\@testdef% \@tempswafalse% \makeatletter\input\jobname.aux\relax% \endgroup% %% test to see if old .aux was used \openin0=\jobname.aux\relax% \read0to\@tmp\read0to\@tmp\let\@tmp\empty% \ifeof0\relax\else\let\@tmp\relax\fi% \closein0% \ifx\@tmp\relax% %% advance counter \global\advance\@jobcnt by1% \xdef\jobname{\realjobname\the\@jobcnt}% %% read old .aux \begingroup% \makeatletter\let\@writefile\@gobbletwo% \global\let\@multiplelabels\relax% \@input{\jobname.aux}\relax% \endgroup% \fi% %% mimic \begin{document}'s treatment of .aux \immediate\openout\@mainaux\jobname.aux% \immediate\write\@mainaux{\relax}% \endgroup% \fi% } %% (slightly) new implementation of \label, \ref, and \pageref \def\label#1{\@bsphack% \protected@write\@auxout{}{% \string\@newlabel{#1}{{\@currentlabel}{\thepage}}}% \@esphack% } \def\@newlabel{\@@newl@bel{r\the\@jobcnt}} \def\@@newl@bel#1#2#3{% \@ifundefined{#1@#2}{% \relax }{% \gdef\@multiplelabels{% \@latex@warning@no@line{There were multiply-defined labels}% }% \@latex@warning@no@line{Label `#2' multiply defined}% }% \global\@namedef{#1@#2}{#3}% } \def\ref#1{% \expandafter\@setref\csname r\the\@jobcnt @#1\endcsname% \@firstoftwo{#1}% } \def\pageref#1{% \expandafter\@setref\csname r\the\@jobcnt @#1\endcsname% \@secondoftwo{#1}% } %%%%% %% \PDFPart \@onlypreamble\PDFPart \def\PDFPart{% \long\def\@setsubowner##1##2{}% \long\def\@transownersetsubowner##1##2{}% } %%%%% %% %% These macros are internal GameTeX commands used within the GameTeX %% options. They cover the handling of Owners, SubOwners, and %% Elements. %% %%%%% %%%%% %% \@setsubowner{<subowner>}{<elements>} %% \@transownersetsubowner{<subowner>}{<elements>} \global\let\mysubowner\empty \long\def\@setsubowner#1#2{% \def\@tmp{#2}% \unless\ifx\@tmp\empty% \let\@prevowner\myowner% \let\@prevsubowner\mysubowner% \begingroup% #1{% \etoss{% \@setowner{\?\myowner\ - \?\@ownerstring}% \gdef\mysubowner{\?\MYname}% }% }% \unless\ifx\@prevsubowner\empty% \expandafter\@global@prepend\expandafter% \mysubowner\expandafter{\@prevsubowner\ - }% \fi% #1{\BRANCHTYPES{Owner}{\RESURFACEMAP{\TYPE}}#2}% \endgroup% \expandafter\@setowner\expandafter{\@prevowner}% \global\let\mysubowner\@prevsubowner% \fi% } \long\def\@transownersetsubowner#1#2{% \def\@tmp{#2}% \unless\ifx\@tmp\empty% \let\@prevowner\myowner% \let\@prevsubowner\mysubowner% \begingroup% #1{% \etoss{% \@setowner{\?\myowner\ - \?\@ownerstring}% \gdef\mysubowner{\?\MYname}% }% }% \let\@transowner\relax% #1{\BRANCHTYPES{Owner}{\RESURFACEMAP{\TYPE}}#2}% \endgroup% \expandafter\@setowner\expandafter{\@prevowner}% \global\let\mysubowner\@prevsubowner% \fi% } %%%%% %% \def\@testfields{% \ifx\@notowner\empty% \def\@i##1##2{% \unless\ifx##1\empty% \owner\def\@i####1####2{}% \fi% }% \def\@ii##1##2{}% \@ownedfields% \def\@i##1##2{}% \def\@ii##1##2{% \unless\ifx##1\empty% \ifx\@owner\empty% \suite% \fi% \owner\def\@ii####1####2{}% \fi% }% \@ownedfields% \def\@ii{\@i}% \fi% } %%%%% %% \def\@inunlist{% \let\@inside@unlist\relax% \long\def\unlist##1{##1}% \def\@aplist{\@global@append\@uflist}% } \def\@outunlist{% \let\@inside@unlist\empty% \long\def\unlist##1{\@inunlist##1\@outunlist}% \def\@aplist{\@global@append\@flist}% } \long\def\@@aplist#1{\@aplist{\unexpanded{#1}}} \def\@ob{{\iffalse}\fi} \def\@cb{\iffalse{\fi}} \def\@apob{\@aplist{\@ob}} \def\@apcb{\@aplist{\@cb}} \let\@@infield\empty% \def\@infield{% \let\@@infield\relax% \def\@elementfmap{% \uniquemark% \expandafter\def\expandafter\@doelement\expandafter{% \expandafter\@@aplist\expandafter{\ME{}}% }% \@sofmap% \ifx\@owner\empty% \@doelement% \fi% }% \long\def\raw##1{\@@aplist{\raw{##1}}}% \long\def\pageof##1{\@@aplist{\pageof{##1}}}% } \def\@outfield{% \let\@@infield\empty% \def\@elementfmap{\@subownerfmap}% \long\def\raw##1{}% \def\pageof{\raw}% } \def\@sofmap{% \ifx\@owner\empty% \@testfields% \fi% \ifx\@owner\relax% %% owns things \ifx\@suite\empty% %% not a suite \ifx\@thistransowner\empty% \expandafter\def\expandafter\@fsso\expandafter{% \expandafter\@@aplist\expandafter{% \expandafter\@setsubowner\expandafter{\ME}% }% \@apob% }% \else% \expandafter\def\expandafter\@fsso\expandafter{% \expandafter\@@aplist\expandafter{% \expandafter\@transownersetsubowner\expandafter{\ME}% }% \@apob% }% \fi% \ifx\@inside@unlist\relax% \etoss{% \stoss{% \@inunlist% \?\@fsso% \?\@doelement\?\ME{}% \@apcb\@outunlist% }% }% \else% \etoss{% \stoss{% \?\@fsso% \?\@doelement% \?\ME{}% \@apcb% }% }% \fi% \else% %% is suite \@doelement% \ifx\@@infield\empty% \aftergroup\@infield% \fi% \expandafter\expandafter\expandafter\stoss% \expandafter\expandafter\expandafter{\@thisfield}% \aftergroup\@outfield% \def\@i##1##2{% \unless\ifx##1\empty% \expandafter\stoss\expandafter{##1}% \fi% }% \@otherfields% \ifx\@@infield\relax% \aftergroup\@infield% \fi% \fi% \fi% } \def\@flatten@field#1#2{% \setbox0=\hbox{% \long\def\doid##1{##1}% \let\@otherfields\empty% \def\@i##1##2{% \def\@chosen{##1}% \unless\ifx\@thisfield\@chosen% \@append\@otherfields{\@i{##1}{}}% \fi% }% \def\@thisfield{#2}\@ownedfields% \global\def\@flist{\unexpanded{\global\let\@flist\empty}}% \global\def\@uflist{\unexpanded{\global\let\@uflist\empty}}% \def\@aplist{\@global@append\@flist}% \def\@doelement{}% \BRANCHTYPES{Owner}{\MAP{\TYPE}{\@ownerfmap}}% \BRANCHTYPES{SubOwner}{\MAP{\TYPE}{\@subownerfmap}}% \BRANCHTYPES{#1}{\MAP{\TYPE}{\@elementfmap}}% \def\@subownerfmap{\@ownerfmap}% \def\@elementfmap{\@subownerfmap}% \def\@ownerfmap{% \ifx\@flat@mark\ME% \typeout{% ! \expandafter\unexpanded\expandafter{\ME{}} % repeated within itself (ignored)% }% \else% \expandafter\stoss\expandafter{% \expandafter\EXTEND\expandafter{\ME}{\let\@flat@mark\ME}% }% %% if a subowner, add \@setsubowner %% go through all fields (#2 first). if member is an element in #2 %% or a suite anywhere, add it. if suite, recurse. if subowner, %% throw it. \ifx\@notowner\empty% \def\@ownerfmap{}% \def\@subownerfmap{\uniquemark\@sofmap}% \@outunlist% \@infield#2% \def\@i####1####2{####1}% \@outfield\@otherfields% \fi% \expandafter\stoss\expandafter{% \expandafter\EXTEND\expandafter{\ME}{\let\@flat@mark\relax}% }% \fi% }% \ME{}% }% \let\@flattened\relax% \xdef\@flist{\@flist}% \xdef\@uflist{\@uflist}% \@flist\unlist{\@uflist}% } %%%%% %% \def\@flatten@lists{% \def\@i##1##2{\let##1\empty}\@ownedfields% \setbox0=\hbox{% \long\def\raw##1{}% \def\pageof{\raw}% \long\def\doid##1{##1}% \BRANCHTYPES{Owner}{% \MAP{\TYPE}{% \ifx\@flat@mark\ME% \typeout{% ! \expandafter\unexpanded\expandafter{\ME{}} % repeated within itself (ignored)% }% \else% \uniquemark% \ifx\@owner\empty% \@testfields% \fi% \ifx\@owner\relax% \expandafter\stoss\expandafter{% \expandafter\EXTEND\expandafter{\ME}{\let\@flat@mark\ME}% }% \ifx\@suite\relax% \let\@i\relax\@ownedfields% \def\@i##1##2{\etoss{\@append##1{\?##1}}}\@ownedfields% \fi% \expandafter\stoss\expandafter{% \expandafter\EXTEND\expandafter{\ME}{\let\@flat@mark\relax}% }% \fi% \fi% }% }% \ME{}% \def\@i##1##2{\etoss{\def##1{\?##1}}}% \@ownedfields% }% } \let\@flattened\empty \let\@do@element\empty %%%%% %% \@ownermappings{<type>}{<field>} \def\@ownermappings#1#2{% \BRANCHTYPES{Char}{% \SURFACEMAP{\TYPE}{% \beginpunt% \gettags% \long\def\unlist##1{% \let\@listedowner\myowner \expandafter\@setowner\expandafter{\myowner\ UNLISTED}% ##1% \expandafter\@setowner\expandafter{\@listedowner}% }% \expandafter\@setowner\expandafter{\@ownerstring}% \BRANCHTYPES{Element}{\RESURFACEMAP{\TYPE}}% \let\@myidchar\relax% \@flatten@field{#1}#2% \@setowner{}% \endpunt% }% }% \BRANCHTYPES{Place}{% \SURFACEMAP{\TYPE}{% \beginpunt% \expandafter\@setowner\expandafter{\@ownerstring}% \BRANCHTYPES{Element}{\RESURFACEMAP{\TYPE}}% \@flatten@field{#1}#2% \@setowner{}% \endpunt% }% }% \def\@subownermap##1{% \beginpunt% \expandafter\@setowner\expandafter{\@ownerstring}% ##1% \BRANCHTYPES{Element}{\RESURFACEMAP{\TYPE}}% \@flatten@field{#1}#2% \@setowner{}% \endpunt% }% \BRANCHTYPES{SubOwner}{\SURFACEMAP{\TYPE}{\@subownermap{}}}% } %%%%% %% \@elementmapping{<type>}{<mapping>} \def\@elementmapping#1#2{% \BRANCHTYPES{#1}{% \SURFACEMAP{\TYPE}{% \ifx\@flattened\relax% \ownerdefault% \else% \ifx\@owner\empty% \@testfields% \fi% \fi% \ifx\@owner\empty% \beginpunt% #2% \endpunt% \else% \@subownermap{#2}% \fi% }% }% } %%%%% %% \@bycharmappings{<mapping>} \def\@bycharmappings#1{% \def\@charmap{% \beginpunt% \gettags% \BRANCHTYPES{SubOwner}{\REMAP{\TYPE}}% \expandafter\@setowner\expandafter{\@ownerstring}% \let\@myidchar\relax% #1% \BRANCHTYPES{Identity}{\SURFACEMAP{\TYPE}{#1}}% \let\@myidchar\ME% \@flatten@field{Identity}\MYids% \@setowner{}% \endpunt}% \BRANCHTYPES{Char}{\SURFACEMAP{\TYPE}{\@charmap}}% \BRANCHTYPES{Place}{\SURFACEMAP{\TYPE}{% \beginpunt% \expandafter\@setowner\expandafter{\@ownerstring}% \BRANCHTYPES{SubOwner}{\REMAP{\TYPE}}% \BRANCHTYPES{Identity}{\SURFACEMAP{\TYPE}{#1}}% \@flatten@field{Identity}\MYids% \@setowner{}% \endpunt}}% \def\@subownermap{% \beginpunt% \expandafter\@setowner\expandafter{\@ownerstring}% \BRANCHTYPES{Identity}{\SURFACEMAP{\TYPE}{#1}}% \@flatten@field{Identity}\MYids% \@setowner{}% \endpunt}% \BRANCHTYPES{SubOwner}{\SURFACEMAP{\TYPE}{\@subownermap}}% \BRANCHTYPES{Identity}{\SURFACEMAP{\TYPE}{\@charmap}}% } %%%%% %% \def\@preprocids#1{% \begingroup% \global\let\@charids\empty% \global\let\@degenerateids\empty% \@bycharmappings{% \ifx\@degenerate\relax% \expandafter\@global@append\expandafter\@charids\expandafter{\ME{}}% \else% \expandafter\@global@append\expandafter\@degenerateids% \expandafter{\ME{}}% \fi% }% #1% \endgroup% } %%%%% %% \def\@givennoplayer#1{\ifx\@noplayer\relax\unless\ifx\MYplayer\empty#1\fi\fi} \def\@fakeplayer{% \iflist% \def\@tmp{\listtrue}% \else% \def\@tmp{\listfalse}% \fi% \iflabel% \@append\@tmp{\labeltrue}% \else% \@append\@tmp{\labelfalse}% \fi% \def\@i##1{% \expandafter\@append\expandafter\@tmp\expandafter{% \expandafter\s\expandafter##1\expandafter{##1}% }% }% \@playerfields% \etoss{\INSTANCE{Char}{\let\@fakedplayer\empty\s\MYname{}\?\@tmp}{}}% } %%%%% %% %% Here LaTeX packages are loaded, the .sty files are loaded, %% datatypes are created, related code is created, and the -LIST.tex %% files are loaded. %% %% All of this occurs between \STARTINPUTS and \FINISHINPUTS, which %% store the contents (rather than execute them) for later use once %% the given GameTeX option has been loaded (this reduces peak memory %% usage). %% %%%%% \long\def\STARTINPUTS#1\FINISHINPUTS{% \edef\@inputinputs{\let\noexpand\@inputinputs\relax\unexpanded{#1}}% } \STARTINPUTS %%%%% %% Packages are loaded, with compressed output. \message{\space\space Packages: verbatim multicol comma multido alltt ulem} \message{\space\space Graphics Packages: pstricks graphicx lscape} \message{\space\space Symbol Packages: latexsym amssymb textcomp} \batchmode \usepackage{pslatex,verbatim,multicol,comma,multido,alltt} \usepackage[normalem]{ulem} \usepackage{pstricks,graphicx,lscape} \usepackage{latexsym,amssymb,textcomp} \errorstopmode %%%%% %% extraction.sty is loaded, which allows for useful extraction tricks %% to be done on files. See extraction.sty. \input \latex/extraction.sty %%%%% %% parsename.sty is loaded, for useful parsing of proper english names %% into various components, e.g. first and last names, and for %% alphabetizing. See parsename.sty for documentation. \input \latex/parsename.sty %%%%% %% datatypes.sty is loaded. Datatypes are used to create a database %% of game elements. See ../Lists/README and datatypes.sty. \input \latex/datatypes.sty %%%%% %% Owner datatype %% SubOwner datatype %% Element datatype %% TransElement datatype \DECLARETYPE{Owner} \PRESETS{Owner}{ \F\MYname \FD\MYnumber {} \FD\MYlistmap {\item\MYname} \FD\MYjson {} \@@declaredfields %% \relax -> true, \empty -> false \owner \suite \nottransowner } \POSTSETS{Owner}{ \protected@edef\@ownerstring{\MYname} } \DECLARESUBTYPE{SubOwner}{Owner} \PRESETS{SubOwner}{ \notsuite \@@@unique=0\relax } \DECLARESUBTYPE{Element}{SubOwner} \PRESETS{Element}{ \ownerdefault } \DECLARESUBTYPE{TransElement}{Element} \PRESETS{TransElement}{ \transowner } \MAP{Owner}{\MYname} %%%%% %% \@ownedfields \def\@ownedfields{% \@i\MYblues {blues}%% blue macros \@i\MYgreens {greens}%% green macros \@i\MYabils {abils}%% abil macros \@i\MYmems {mems}%% mem macros \@i\MYitems {items}%% item macros \@i\MYwhites {whites}%% whitesheets \@i\MYcash {cash}%% \cash{<type>}{<num>} (see money-LIST.tex) \@i\MYsigns {signs}%% signs \@i\MYids {ids}%% identities \@ii\MYskills {skills}%% abil macros \@ii\MYstats {stats}%% stat macros } \def\@ii{\@i} \let\@@declaredfields\empty \def\@i#1#2{\@append\@@declaredfields{\FD#1{}}} \@ownedfields %%%%% %% \long\def\jsonkeyval#1#2{% \protected@edef\@valcontents{#2} \begingroup% \gdef\@sanitizedjson{}% \catcode`\\12% \catcode`\{12% \catcode`\}12% \catcode`\ 12% \everyeof{\@endsanitize}% \expandafter\expandafter\expandafter\@iteratesanitize\expandafter% \scantokens\expandafter{\@valcontents}% \endgroup% \append\MYjson{"#1":"}% \expandafter\append\expandafter\MYjson\expandafter{\@sanitizedjson}% \append\MYjson{",}% } \def\@iteratesanitize{\@sanitizeforjson} \def\@endsanitize{\@@endsanitize} \def\@@endsanitize{\relax} \def\@appendbackslash{\expandafter\@global@append\expandafter\@sanitizedjson% \expandafter{\string\\}% } \def\@appenddoublequote{\expandafter\@global@append\expandafter\@sanitizedjson% \expandafter{\string\"}% } \long\def\@sanitizeforjson#1{% \def\@@next{\@sanitizeforjson}% \ifx#1"% \@appenddoublequote% \else% \expandafter\ifx\expandafter#1\@backslashchar% \@appendbackslash% \else% \ifx#1\@endsanitize% \def\@@next{}% \else% \@global@append\@sanitizedjson{#1}% \fi% \fi% \fi% \@@next% } %%%%% %% Char datatype \DECLARESUBTYPE{Char}{Owner} \newif\ifbadge \newif\ifstats \newif\ifskills \newif\ifsheet \newif\iflist \newif\iflabel \def\@playerfields{% \@i\MYplayer %% player name \@i\MYemail %% player email address \@i\MYaddress %% player address \@i\MYphone %% player phone number \@i\MYnote %% playerlist note \@i\MYplayerparse %% playername's parse type } \let\@@declaredplayer\empty \def\@i#1{\@append\@@declaredplayer{\FD#1{}}} \@playerfields \PRESETS{Char}{ \@@declaredplayer \let\@myidchar\ME \let\@degenerate\relax \let\@fakedplayer\relax \newid\real{} \newid\nick{} \newid\maiden{} \let\@myfile\empty \def\@contact{\contactmapping\ifx\MYplayer\empty\else\ (\MYplayer)\fi} \FS\MYcontact{\@contact} \idnormal \allmap{\full} \titlemap{\full} \defaultnamemappings \def\@i{\tagged}\@ownedfields } \def\@procplayer{% \setbox0=\hbox{% \MAP{Player}{% \def\@tmp{\let\@noplayer\empty}% \def\@i##1{\@append\@tmp{\rs##1{\?##1}}}% \@playerfields% \expandafter\etoss\expandafter{\expandafter\stoss\expandafter{\@tmp}}% }% \MAP{GM}{% \def\@tmp{\let\@noplayer\empty}% \def\@i##1{\@append\@tmp{\rs##1{\?##1}}}% \@playerfields% \expandafter\etoss\expandafter{\expandafter\stoss\expandafter{\@tmp}}% }% \tiny %% shut up the log complaint about \nullfont \MYplayer% }% } \POSTSETS{Char}{ \parsename{\MYname} %% parse the character name \let\@noplayer\relax\@procplayer \begingroup \western \MYplayerparse \parsename{\MYplayer} %% parse the player name \etoss{\def\playeralphabetical{\?\alphabetical}} \endgroup \protected@edef\@ownerstring{% \MYname% \unless\ifx\MYplayer\empty% \ (\MYplayer)% \fi% } \jsonkeyval{player}{\MYplayer} \jsonkeyval{email}{\MYemail} \jsonkeyval{address}{\MYaddress} \jsonkeyval{phone}{\MYphone} \jsonkeyval{note}{\MYnote} } %%%%% %% Player datatype \DECLARETYPE{Player} \PRESETS{Player}{ \@@declaredplayer \listtrue \labeltrue } \MAP{Player}{\MYplayer} %%%%% %% Stat datatype \DECLARESUBTYPE{Stat}{Element} \PRESETS{Stat}{ \FD\MYabbrev {\MYname} \FD\MYvalue {} \rs\MYlistmap{\item\makebox[2in]{\MYname: \hfill}\MYvalue} } %%%%% %% \stat{<name>}{<abbrev>}{<value>} %% %% \stat is a wrapper around \INSTANCE. \stat commands are generated %% \newstat. \newinstance{Stat}{\stat[3]}{ \s\MYname{#1}% \s\MYabbrev{#2}% \s\MYvalue{#3}% } %%%%% %% \newstat{<field>}{<name>}{<abbrev>}{<default>} %% %% \newstat declares a new field for a stat, gives it a default value, %% and adds a \stat command to \MYstats that uses that field as its\ %% value. \newstat is usually called from \PRESETS. \newcommand{\newstat}[4]{% \FD#1{#4}% \append\MYstats{\stat{#2}{#3}{#1}}% } %%%%% %% \resolvestats %% %% \resolvestats makes each Stat inside \MYstats base its value on the %% current expansion of its value field, e.g. the current value of %% \MYhp instead of the macro \MYhp. This allows the Stats to carry %% their actual value into other scopes. %% %% \resolvestats is usually called in \POSTSETS when \newstat was used %% in \PRESETS. \newcommand{\resolvestats}{% \begingroup% \BRANCHTYPES{Stat}{% \MAP{\TYPE}{% \edef\@tmpname{\MYname}% \edef\@tmpvalue{\MYvalue}% \etoss{\stoss{\append\MYstats{\?\ME[\rs\MYvalue{\?\@tmpvalue}]{}}}}% \etoss{\stoss{\jsonkeyval{\?\@tmpname}{\?\@tmpvalue}}}% }% } \stoss{\rs\MYstats{}}% \MYstats% \endgroup% } %%%%% %% Identity datatype %% \listcharstuff %% \newid{<command>}{<mods>} %% <command>[<mods>]{<arg>} %% \identity{<mods>} \DECLARESUBTYPE{Identity}{Element} \PRESETS{Identity}{ \FD\MYmods {} %% modifications to surrounding Char \def\OPTIONHOOK{\doid} \let\@listcharstuff\empty% } \def\listcharstuff{\let\@listcharstuff\relax} \long\def\newid#1#2{% \let#1\empty% \renewcommand#1[1][]{% \INSTANCE{Identity}{% \s\MYname{\string#1}% \s\MYmods{#2##1}% }% }% } \newinstance{Identity}{\identity[1]}{\s\MYname{identity}\s\MYmods{#1}} \MAP{Identity}{} \let\@myidchar\relax \def\@@idmap{\MYMAP} \long\def\doid#1{% \begingroup% \let\@tmp\empty% \def\@idarg{#1}% \ifx\@transowner\relax% \let\@tmp\relax% \fi% \ifx\@myidchar\relax% \let\@tmp\relax% \fi% \ifx\@listcharstuff\empty% \def\@i##1##2{% \expandafter\@prepend\expandafter\MYmods\expandafter{% \expandafter\rs\expandafter##1\expandafter{##1}% }% }% \@ownedfields% \fi% \@prepend\MYmods{% \badgefalse% \statsfalse% \skillsfalse% \sheetfalse% \listfalse% \labelfalse% }% \ifx\@tmp\relax% \preprocess{% \@prepend\MYmods{% \rs\MYname{\?\MYname}% \rs\MYnumber{\?\MYnumber}% }% }% \etoss{\INSTANCE{Char}{\s\MYname{}\?\MYmods}{\?\@idarg}}% \else% \etoss{\@myidchar[\?\MYmods]{\?\@idarg}}% \fi% \endgroup% } %%%%% %% \realname[<mods>]{<name>} %% \real[<mods>]{<arg>} %% \nickname[<mods>]{<name>} %% \nick[<mods>]{<arg>} %% \maidenname[<mods>]{<name>} %% \maiden[<mods>]{<arg>} \newcommand\realname[2][]{\newid\real{\rs\MYname{#2}#1}} \newid\real{} \newcommand\nickname[2][]{\newid\nick{\rs\MYname{#2}#1}} \newid\nick{} \newcommand\maidenname[2][]{\newid\maiden{\rs\MYname{#2}#1}} \newid\maiden{} %%%%% %% \intro %% \usual %% \contactmapping %% \titlemapping \PRESETS{Char}{% \def\intro{\@iid{\@imap}}% \def\usual{\@uid{\@umap}}% \def\contactmapping{\@cid{\@cmap}}% \def\titlemapping{\@tmap}% } \PRESETS{Identity}{% \def\intro{\@imap}% \def\usual{\@umap}% \def\contactmapping{\@cmap}% } \MAP{Char}{\usual} %%%%% %% \extrabadge{<name>}{<number>}{<desc>} %% \same %% \boxlabel{<label>} \def\@same{\same} \def\same{\relax} \newinstance{Identity}{\extrabadge[3]}{% \s\MYname {extra badge} \s\MYmods {\badgetrue} \def\@tmp{#2}% \unless\ifx\@tmp\@same% \s\MYnumber {#2}% \rs\MYname {#2}% \append\MYmods{\rs\MYnumber{#2}}% \fi% \def\@tmp{#3}% \unless\ifx\@tmp\@same% \rs\MYname {#3}% \append\MYmods{\rs\MYdesc{#3}}% \fi% \def\@tmp{#1}% \unless\ifx\@tmp\@same% \rs\MYname {#1}% \append\MYmods{\rs\MYname{#1}}% \fi% } \newinstance{Identity}{\boxlabel[1]}{% \s\MYname {#1} \s\MYmods {\let\@degenerate\empty% \labeltrue% \rs\MYname {#1}% \rs\MYplayer {#1}% } } %%%%% %% -LIST.tex files, input here, create datatypes and datatype macros. %% The default mappings are also set here. \input \lists/blue-LIST.tex \input \lists/green-LIST.tex \input \lists/abil-LIST.tex \DECLARESUBTYPE{Align}{Abil} \PRESETS{Align}{ \F\MYoffense \F\MYdefense } \input \lists/combat-LIST.tex \input \lists/mem-LIST.tex \MAP{Mem}{(Memory/Event Packet for \MYname)} \input \lists/item-LIST.tex \MAP{Item}{\MYname\ifx\MYnumber\empty\else\ (\MYnumber)\fi} \input \lists/white-LIST.tex \input \lists/notebook-LIST.tex \input \lists/money-LIST.tex \input \lists/sign-LIST.tex \input \lists/subowner-LIST.tex \newif\ifcredit \DECLARETYPE{GM} \PRESETS{GM}{ \FD\MYname {GM} %% "title" for playerlist, badge \@@declaredplayer \credittrue \listtrue } \POSTSETS{GM}{ \parsename{\MYname} \begingroup \western \MYplayerparse \parsename{\MYplayer} \etoss{\def\playeralphabetical{\?\alphabetical}} \endgroup } \input \lists/gm-LIST.tex \MAP{GM}{\MYname} \input \lists/char-LIST.tex \input \lists/place-LIST.tex \ifnum\gamerun>0 %% \@input gives a message but no error if file not found \@input{\lists/run\gamerun-LIST.tex} \fi \FINISHINPUTS %%%%% %% %% Here are some options-wide macros %% %%%%% %%%%% %% \basequote{<text>}{<author>} %% %% \basequote is the basis for the other quote macros below. It %% typesets <text> and then, if <author> isn't empty, typesets %% <author>. \long\def\basequote#1#2{% \begingroup% \vbox{% \vskip\parskip% \baselineskip0pt% \def\baselinestretch{1}% \hbox to\textwidth{% \hsize\textwidth% \advance\hsize-1in% \hfill% \parbox[b]{\hsize}{#1} \hfill% }% \setbox0=\hbox{\parbox[b]{2.5in}{#2}}% \par% \ifdim\wd0>0sp% \vskip-.5\baselineskip% \noindent\makebox[\textwidth][r]{\box0}% \fi% }% \endgroup% } %%%%% %% \bigquote{<text>}{<author>} %% %% Based on \basequote. It typesets <text> in a paragraph, suitable %% for larger quotes. \long\def\bigquote#1#2{% \basequote{\em #1}{\raggedright\scriptsize\em #2}% } %%%%% %% \cenquote{<text>}{<author>} %% %% Based on \basequote. It typesets <text> centered, suitable for %% smaller quotes, song lyrics, and the like. \long\def\cenquote#1#2{% \basequote{\centering\em #1}{\raggedright\scriptsize\em #2}% } %%%%% %% \begin{contacts} %% \contact{<character>} %% \end{contacts} \newcommand*{\contacts}[1][Contacts]{\itemz[#1]} \def\endcontacts{\enditemz} \def\contact#1{\item\relax{\MAP{Char}{\@contact}#1:}} %%%%% %% \begin{members} %% \member{<character>} %% \end{members} \newcommand*{\members}[1][Members]{\itemz[#1]} \def\endmembers{\enditemz} \def\member#1{\item\relax{\MAP{Char}{\@contact}#1:}} %%%%% %% \def\skilllist{\itemz% \BRANCHTYPES{Abil}{\SURFACEMAP{\TYPE}{\item\MYname:\MYtext}}} \def\endskilllist{\enditemz} %%%%% %% \pageof{<card>} \def\pageof#1{#1\ensuremath{\mathbf{(\times\mbox{page})}}} %%%%% %% %% Here all of the GameTeX options are declared. %% %%%%% \DeclareGameOption{sheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% The sheet option is the basis for other options, such as char, %% blue, and green. It defines how such sheets are typeset, and it %% creates various hooks and commands they use. It is also useful for %% generic sheets, such as the rules or scenario. %% %% Commands provided: %% %% \@setowner{<owner>} %% \title@display{<text>} %% \sheettitle{<title>} %% \name{<title>} %% %% \begin{tlist}[<cols>]{<title>} %% \unlist{<stuff>} %% \ignore{<stuff>} %% \note{<text>} %% \end{tlist} %% %% \EmailPart %% %%%%% %%%%% %% sheet uses the fancyhdr package, for headers and footers, and the %% setspace package, for line spacing. \usepackage{fancyhdr,setspace} %%%%% %% margins, spacing, paragraph settings, etc. \setstretch{1.2} \parindent.25in \parskip5pt \headheight24pt \headsep24pt \topmargin-48pt \oddsidemargin-.3in \evensidemargin-.3in \marginparwidth0in \textheight9in \textwidth7.1in %%%%% %% headers and footers: %% %% The left header displays \gamename and \gamedate. The right header %% displays \mytype. If \myowner isn't blank, it displays \myowner. %% %% The left footer shows \mytitle in a \parbox. The center footer %% shows the page number, and the right footer shows ``Not %% Transferable.'' \pagestyle{fancy} \fancyhf{} \def\headrulewidth{0pt} \def\footrulewidth{0pt} \lhead{\em\scriptsize\gamename\ / \gamedate} \rhead{% \begingroup% \em\scriptsize% \setbox0\hbox{% \bfseries% \footnotesize% \ifx\@transowner\relax% \mysubowner% \else% \myowner% \fi% }% \ifdim\wd0>0sp% \mbox{\box0} / % \fi% \mytype% \endgroup% } \lfoot{\parbox{2.5in}{\em\scriptsize\mytitle}} \cfoot{\em\scriptsize\thepage} \rfoot{\em\scriptsize Not Transferable} %%%%% %% \@setowner{<owner>} %% %% This globally sets \myowner to <owner>. It also calls %% \cleardocument. Used by other options when printing multiple %% sheets as part of a single document, for production. \long\def\@setowner#1{% \cleardocument% \gdef\myowner{#1}% \gdef\mysubowner{}% } %%%%% %% \title@display{<text>} %% %% To change how the titles of sheets are typeset, change this macro. \long\def\title@display#1{% \begingroup% \baselineskip0pt% \lineskip3pt% \parskip3pt% \def\baselinestretch{0}% \let\\\par% \parindent0pt% \centering% \hbox to\textwidth{% \hfill% \vbox{% \hsize\textwidth% \advance\hsize-1in% \hrulefill% \vskip\lineskip% \begingroup% \bfseries#1% \par% \endgroup% \vskip\lineskip% \hrulefill}% \hfill% }% \vskip5pt% \vskip\parskip% \endgroup% } %%%%% %% \template@title@display %% \useicon[<width>]{<icon file>} %% %% \template@title@display produces a title bar similar to the kind %% used in Template (~jemorris/Template/) sheets. %% %% \useicon specifies the icon graphic that will be used, and %% optionally specifies the width at which the graphic will be %% displayed. The file, which you will need to supply, should be a %% suitable icon graphic for sheets. %% %% To use, simply add "\def\title@display{\template@title@display}" %% here. \newcommand\useicon[2][7em]{% \def\icon@width{#1}% \ifdim\icon@width>0pt% \def\icon@file{#2}% \else% \def\icon@file{}% \fi% } \useicon{\postscript/icon} \def\line@across{\mbox{}\leaders\hrule height.6ex depth-.55ex\hfill\null} \long\def\template@title@display#1{ \begingroup% \noindent% \valign{% \centering \vfil##\vfil% \cr% \unless\ifx\icon@file\empty% \hsize=\icon@width% \includegraphics[width=\hsize]{\icon@file}% \cr% \advance\hsize-\icon@width% \fi% \parindent5pt% \begingroup% \line@across% \endgroup% \break\vfil% \begingroup% \Large#1% \endgroup% \break\vfil% \begingroup% \line@across \endgroup% \cr% }% \vskip5pt% \vskip\parskip% \endgroup% } %%%%% %% \sheettitle{<title>} %% %% Globally sets \mytitle to <title>, and globally sets \me{} to %% \mytitle (\me still requires braces). \sheettitle then typesets %% <title> using \title@display. \long\def\sheettitle#1{% \gdef\mytitle{#1}% \gdef\me##{#1\@me}% \begingroup% \title@display{#1}% \endgroup% } %%%%% %% \name{<title>} %% %% In generic sheets, \name is an alias for \sheettitle, that also %% adds the number if it isn't empty. \long\def\name#1{% \begingroup% \MAP{Owner}{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }% \sheettitle{#1}% \endgroup% } %%%%% %% \begin{tlist}[<cols>]{<title>} %% \unlist{<stuff>} %% \ignore{<stuff>} %% \note{<text>} %% \end{tlist} %% %% The tlist envirment is a list environment. The lists at the end of %% charsheets are based on it. It typesets <title> as the header for %% the list. The list is spaced tighter than the average LaTeX list, %% and if there are no \item's, it does ``\item none'' rather than %% give an error. %% %% tlist also uses the multicols environment (from the multicol %% package). It defaults to typsetting in 2 columns. Use the %% optional <cols> argument to change this, i.e. %% \begin{tlist}[3]{Blah} will make the tlist use 3 columns. Specify %% <cols> to be 1 to turn off multiple columns. %% %% A tlist environment will not be broken across pages. If a tlist is %% long enough that no matter how many columns you use, it cannot fit %% on one page, you lose. %% %% \makemultishort is in effect within the list, so \multi commands %% give shortened output. %% %% <stuff> wrapped inside \unlist is ignored rather than displayed, %% because it's unlisted. <stuff> wrapped inside \note is displayed %% as a note to the reader. \global\let\@itemzhere\empty \global\let\@feetstore\empty \newcommand{\tlist}[2][2]{% %% defaults to 2 columns \null\par% \vbox\bgroup% \itemz[#2]% %% don't nest tlist \def\tlist##1{% \ClassError{\gameclassname}{% Nested tlist environment. \space Attempting to ignore% }{% You shouldn't nest the tlist environment.\MessageBreak% Nesting the itemz environment might do what you want.% }% \expandafter\def\expandafter\endtlist\expandafter{% \expandafter\def\expandafter\endtlist\expandafter{\endtlist}% }% }% %% if no \items, produce \item none \global\let\@itemzhere\empty% \let\@normitem\item% \def\item{% \global\let\@itemzhere\relax% \@normitem\relax% }% %% hack to fix \footnotes inside tlist \gdef\@feetstore{\global\let\@feetstore\empty}% \renewcommand{\footnote}[2][\@feet]{% \begingroup% \footnotemark% \def\@feet{\@feet}% \def\@tmp{##1}% \ifx\@tmp\@feet% \@global@append\@feetstore{\footnotetext{##2}} \else% \@global@append\@feetstore{\footnotetext[##1]{##2}} \fi% \endgroup% }% %% list functionality \makemultishort% \long\def\unlist##1{}% \long\def\ignore##1{##1}% \long\def\raw##1{}% \def\pageof{\raw}% \interlinepenalty10000% %% using mulicols env, with some tweaking \def\@colz{#1}% \unless\ifnum\@colz<2\relax% \multicolsep=0pt% \c@collectmore=-1% \c@unbalance=0% \begin{multicols}{#1}% \raggedcolumns% \raggedright% \fi% } \def\endtlist{% \let\item\@normitem% \ifx\@itemzhere\empty% \item none% \fi% \unless\ifnum\@colz=1\relax% \end{multicols}% \fi% \enditemz% \egroup% \@feetstore% \par% } %%%%% %% \PDFPart \@append\PDFPart{\SingleSiding} %%%%% %% \EmailPart %% %% This is a kludge. It changes various commands and settings such %% that when dvi2tty is run on the resulting .dvi file, the outcome %% can be easily cut and pasted into an email, without need of %% excessive text-editing. \EmailPart may only be used before %% \begin{document}. \def\EmailPart{% \pagestyle{empty}% \raggedright% \def\baselinestretch{1}% \global\textwidth4.2in% \global\textheight20\textheight% \parskip5pt% \parindent0pt% \def\title@display##1{% \begingroup% \parskip0pt% \par-{}-{}-{}-{}-{}-{}-{}-{}-% \par##1% \par-{}-{}-{}-{}-{}-{}-{}-{}-% \par% \endgroup% }% \def\basequote##1##2{% \par##1% \par\hskip.25in\relax% ##2% }% \let\bigquote\basequote% \let\cenquote\basequote% \let\cleardocument\relax% } \@onlypreamble\EmailPart %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{char}{sheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% %%%%% \gdef\mytype{Character Sheet} %%%%% %% setting up \@namehook, that prints out the present character's %% lists at the end of each charsheet. \gdef\@namehook{} \AtEndDocument{\@namehook} %%%%% %% \name{} \long\def\name#1{% \begingroup% \@namehook% \begingroup% \gdef\@tmp{}% \MAP{Char}{% \global\let\@tmp\relax% \stoss{\MAP{Char}{\gdef\@tmp{}}}% }% \setbox0=\hbox{#1}% \ifdim\wd0>0sp% \gdef\@tmp{}% \fi% \endgroup% \ifx\@tmp\empty% \sheettitle{#1}% \else% \MAP{Char}{% \expandafter\sheettitle\expandafter{\ME{\titlemapping}}% \expandafter\gdef\expandafter\me\expandafter{\ME}% \expandafter\gdef\expandafter\@namehook\expandafter{\expandafter{% \me{% \gettags% \@flatten@lists% \BRANCHTYPES{Owner}{% \SURFACEMAP{\TYPE}{\MYlistmap\uniquemark}}% \charsheetlists% }% \gdef\@namehook{}}% }% }% #1% \fi% \endgroup% } \iftags \long\def\starttag#1#2\endtag{} \else \long\def\starttag#1#2\endtag{% \typeout{\unexpanded{! don't use \starttag ... \endtag with \tagsfalse}}% } \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{blue}{sheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: sheet option %% %% Commands provided: %% %%%%% \gdef\mytype{Bluesheet} %%%%% %% \PDFPart \@append\PDFPart{% \usepackage{color}% \pagecolor[rgb]{0.5, 0.8, 1.0}% \special{% ps:[/DataSource (gsave 1 setgray clippath fill grestore)% /Level1 (gsave 1 setgray clippath fill grestore) /PS pdfmark % }% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{green}{sheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: sheet option %% %% Commands Provided: %% %%%%% \gdef\mytype{Greensheet} %%%%% %% \publicgreensheet \def\publicgreensheet{\gdef\mytype{Public Greensheet}} %%%%% %% \PDFPart \@append\PDFPart{% \usepackage{color}% \pagecolor[rgb]{0.5, 1.0, 0.8}% \special{% ps:[/DataSource (gsave 1 setgray clippath fill grestore)% /Level1 (gsave 1 setgray clippath fill grestore) /PS pdfmark % }% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{listchar}{char}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \@bycharmappings{\ifsheet\MYtext\@namehook\cleardocument\fi} \def\@compendium{\@production} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{listblue}{blue}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \@ownermappings{Blue}{\MYblues} \@elementmapping{Blue}{\MYtext\cleardocument} \def\@compendium{\EVERY{Blue}{}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{listgreen}{green}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \@ownermappings{Green}{\MYgreens} \@elementmapping{Green}{\MYtext\cleardocument} \def\@compendium{\EVERY{Green}{}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameOption{white}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: fancyhdr package (LaTeX2e), doublespace package %% %% This is a template for whitesheets. Useful for ingame documents. %% Basically a glorified, fullpagesized item card. Makes some useful %% headers and margin settings. %% %%%%% \usepackage{fancyhdr,setspace} \parindent.25in \parskip5pt \headheight24pt \headsep12pt \topmargin-36pt \oddsidemargin-.25in \evensidemargin-.25in \marginparwidth0in \textheight9in \textwidth7in \setstretch{1.2} \pagestyle{fancy} \fancyhf{} \def\headrulewidth{0pt} \def\footrulewidth{0pt} \lhead{\em\scriptsize\gamename/\gamedateabbrev} \rhead{\em\scriptsize Game Item/Freely Transferable} \gdef\mytype{In-Game Document} \global\let\@zeroth\empty %%%%% %% \name{} %% may print number \long\def\name#1{% \ifx\@zeroth\relax% \thispagestyle{empty}% \noindent \begingroup% \bf\myowner\ / Whitesheets% \endgroup% \cleardocument% \fi% \rhead{\em\scriptsize Game Item/Freely Transferable}% \gdef\mytitle{#1}% \gdef\me##{#1\@me}% \global\let\@zeroth\empty% %% test for single single Whitesheet macro \begingroup% \gdef\@tmp{}% \MAP{White}{% \global\let\@tmp\relax% \stoss{\MAP{White}{\gdef\@tmp{}}}% }% \setbox0=\hbox{#1}% \ifdim\wd0>0sp% \gdef\@tmp{}% \fi% \endgroup% \unless\ifx\@tmp\empty% %% typeset number \MAP{White}{% \unless\ifx\MYnumber\empty% \emph{[item number \MYnumber]}% \fi% }% #1% \fi } %%%%% %% \@setowner{<Char macro>} \long\def\@setowner#1{% \gdef\myowner{#1}% \ifx\myowner\empty% \gdef\myowner{UNOWNED}% \fi% \gdef\mysubowner{}% \global\let\@zeroth\relax% } %%%%% %% \oog{<meta text>} %% %% Since whitesheets are in-game documents, it's nice to wrap any meta %% text (like 'this triggers any alpha mempackets') inside \oog. \long\def\oog#1{\emph{[out-of-game: #1]}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{listwhite}{white}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \@ownermappings{White}{\MYwhites} \@elementmapping{White}{\MYtext\cleardocument} \def\@compendium{\EVERY{White}{}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameOption{fullsheet}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% sets all the margins to .25in, for a 8in x 10.5in text area. %% %%%%% \oddsidemargin-.75in \evensidemargin-.75in \topmargin-.75in \headheight0in \headsep0in \marginparwidth0in \textwidth8in \textheight10.5in \pagestyle{empty} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption[\let\@landscapeplayerlist\relax]% {playerlist}{fullsheet}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: fullsheet option, newcent, fancyhdr, and graphicx packages %% %% Commands Provided: %% %%%%% \def\dagger@image{% \ifx\@landscapeplayerlist\relax% \raisebox{\baselineskip}{% \raisebox{-\totalheight}[0pt][0pt]{% \includegraphics[% trim= .4in 0 0 0, angle=-90, origin=c% ]{% \postscript/bigdagger% }% }% }% \else% \raisebox{-\totalheight}[0pt][0pt]{% \includegraphics[% trim=1.5in 3in 0 3in, angle=-77, origin=c% ]{% \postscript/bigdagger% }% }% \fi% } \ifx\@landscapeplayerlist\relax \@LandscapeMode% \fi \advance\headheight.6in% \advance\headsep-.2in% \advance\textheight-.4in% \parindent0pt% \parskip0pt% \def\baselinestretch{1}% \usepackage{fancyhdr,graphicx}% \pagestyle{fancy}% \fancyhf{}% \def\headrulewidth{0pt}% \gdef\mytype{Playerlist} \newbox\@entrybox %%%%% %% \long\def\@setowner#1{} %%%%% %% \column -> internal command for parts of entries %% A "column" of an entry is, by default, as wide as \@columnwidth. %% \column[.75]{text} makes a column that is .75\@columnwidth wide. \newdimen\@columnwidth \global\@columnwidth=0pt \newcount\@colnum \newcommand{\@column}[2][]{% \raisebox{-.5\height}{% \parbox[b]{#1\@columnwidth}{% \leftskip5pt% \rightskip0pt plus1fill% \hskip-5pt\relax% #2% }% }% \hfill% \ignorespaces% } \let\column\empty \def\@colheader{\renewcommand{\column}[3][]{\@column[##1]{##2}}} \def\@colchar{\renewcommand{\column}[3][]{\@column[##1]{##3}}} \def\@colcount{\renewcommand{\column}[3][]{\advance\@colnum1}} %%%%% %% \def\@entry{} \def\@testentry{} \newcommand{\playerlist}[2][]{\cleardocument% \@preprocids{\EVERY{Char}{}\EVERY{Player}{\@fakeplayer}\EVERY{Place}{}}% \def\@tmp{#1}% \ifx\@tmp\empty% \setbox0=\hbox{% \@colnum=0\relax% \@colcount% \ignorespaces% #2% \@columnwidth=\textwidth% \divide\@columnwidth by\@colnum\relax% \global\@columnwidth\@columnwidth% } \else% \global\@columnwidth=#1% \fi% \def\@entry{% \vspace{.2\baselineskip}% \hbox to\textwidth{% \leftskip0pt% \rightskip0pt% \ignorespaces% #2% \hskip0pt minus1fill\relax% }% \par% }% \setbox0=\hbox{% \leftskip0pt% \rightskip0pt% \@colheader% \ignorespaces% #2% }% \dimen0=\wd0\relax% \ifdim\dimen0>\textwidth% \advance\dimen0-\textwidth% \typeout{^^J! Entries are wider than the page (by \the\dimen0).^^J}% \fi% \rhead{% \sffamily% \small% \makebox[\textwidth]{\hfill\gamename\hfill\gamedate\hfill}\\ \begingroup% \sffamily% \bfseries% \upshape% \@colheader% \@entry% \endgroup% }% \chead{\dagger@image}% \let\blank\@blank% \let\mark\@mark% \def\@playerlistmap{% \iflist% \@colchar% \@entry% \fi}% \@bycharmappings{\@playerlistmap}% \SURFACEMAP{GM}{% \iflist% \@colchar% \@entry% \fi% }% } \def\endplayerlist{\clearpage% \global\@columnwidth=0pt\relax% \global\let\entry\@undefined% \fancyhf{}% } %%%%% %% \blank -> a "blank" entry. \def\@blank{\par\vskip\baselineskip\relax} %%%%% %% \mark{text} -> a label for "groups" of entries. Automatically %% preceded by \blank. \long\def\@mark#1{% \blank% \begingroup% \@columnwidth\textwidth% \@column{% \sffamily% \upshape% \bfseries% \relax% #1% }% \endgroup% \par% \nopagebreak% } %%%%% %% \allchars %% \allplayers %% \allgms \def\allchars{% \SORT{Char}{alpha<}{\alphabetical\divider\playeralphabetical}{\@charids}{% \ifx\@fakedplayer\relax% \@playerlistmap% \fi% }% \@degenerateids% } \def\allplayers{% \SORT{Char}{alpha<}{\playeralphabetical}{\@charids}{% \@givennoplayer{\@playerlistmap}% }% \@degenerateids% } \def\allgms{% \SORT{GM}{alpha<}{\playeralphabetical}{\EVERY{GM}{}}{}% } %%%%% %% \group{groupstring} -> alphabetize lists of Char macros in given %% group as determined by "groupstring" (see char-LIST.tex). %% Alphabetizing by first character name then player name. \newcommand{\group}[1]{% \SORT{Char}{alpha<}{\alphabetical\divider\playeralphabetical}{% \SIFT{Char}{=}{\MYgroupstr}{#1}{\@charids}{}% }{\@playerlistmap}% } \newcommand{\groupasis}[1]{% \SIFT{Char}{=}{\MYgroupstr}{#1}{\@charids}{\@playerlistmap}% } %%%%% %% \def\longgameplayers{% \begin{playerlist}{% \column{Player}{\MYplayer}% \column{Email}{\MYemail}% \column{Address}{\MYaddress}% \column{Phone}{\MYphone}% \column{Notes}{\MYnote}% }% \ifx\@landscapeplayerlist\relax% \footnotesize% \else% \tiny% \fi% \sffamily% \slshape% \playergrouping% \end{playerlist}% } \def\longgamechars{% \begin{playerlist}{% \column{Character}{\MYname}% \column{Player}{\MYplayer}% \column{Email}{\MYemail}% \column{Address}{\MYaddress}% \column{Phone}{\MYphone}% \column{Notes}{\MYnote}% }% \ifx\@landscapeplayerlist\relax% \footnotesize% \else% \tiny% \fi% \sffamily% \slshape% \charactergrouping% \end{playerlist}% } \def\shortgameplayers{% \begin{playerlist}{% \column{Player}{\MYplayer}% \column{Email}{\MYemail}% \column{Notes}{\MYnote}% }% \small% \sffamily% \slshape% \playergrouping% \end{playerlist}% } \def\shortgamechars{% \begin{playerlist}{% \column{Character}{\MYname}% \column{Player}{\MYplayer}% \column{Email}{\MYemail}% \column{Notes}{\MYnote}% }% \small% \sffamily% \slshape% \charactergrouping% \end{playerlist}% } \def\@production{\playerlistproduction} \def\@compendium{\playerlistcompendium} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption[\let\@landscapeplayerlist\relax]% {landscapeplayerlist}{playerlist}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption[\let\@landscapeplayerlist\empty]% {portraitplayerlist}{playerlist}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{cardsheet}{fullsheet}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: fullsheet option, fancyhdr package (LaTeX2e); %% and cards.sty %% %% Commands Provided: %% \@setowner{owner} %% \name{owner} %% \me{} %% %%%%% %%%%% %% making room for headers \advance\headheight.2in \advance\textheight-.2in %%%%% %% fancyhdr package \usepackage{fancyhdr} \pagestyle{fancy} \fancyhf{} \def\headrulewidth{0pt} %%%%% %% put \myowner as left header. %% put \mytype as right header \lhead{\raisebox{.1in}[0pt][0pt]{\bfseries\small\myowner}} \rhead{\raisebox{.1in}[0pt][0pt]{\small\mytype}} %%%%% %% inputting cards.sty, making wrapper macros for using it well. %% Calls \flushpage at the end of the document. %% Calls \cleardocument everytime a pending page of cards is printed, %% so that when \DoubleSiding and \DoubleCards are used, each 2-page %% card set will start on an "odd" page. %% Set \SingleCards and \DoubleCards to only be used in the preamble. \input \latex/cards.sty \AtEndDocument{\flushpage} \Atflushpage{\cleardocument} \@onlypreamble\SingleCards \@onlypreamble\DoubleCards %%%%% %% \@setowner{foo} changes \myowner to "foo" calls \flushpage (hence %% also calls \cleardocument). \long\def\@setowner#1{% \flushpage% \gdef\myowner{#1}% \gdef\mysubowner{}% } %%%%% %% \def\compactcards{% \flushpage% \lhead{}% \long\def\@setowner##1{% \gdef\myowner{##1}% \gdef\mysubowner{}% }% } %%%%% %% \def\@numopt#1{% \ifx\MYnumber\empty% \def\@tmp{#1}% \else% \def\@tmp{#1[\MYnumber]}% \fi% \@tmp% } %%%%% %% \def\name{\@setowner} %%%%% %% calls \makemultilong, so that "\multi{num}{foobar}" will produce %% "foobar" "num" times. \makemultilong %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{abils}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% Commands provided: %% \AbilityCard{ability name}{ability text}{effect text} %% %%%%% \DoubleCards\DoubleSiding \MarginsXY{15pt}{15pt}\NoFill \gdef\mytype{Ability Cards} %%%%% %% List Charmacros to produce those characters' ability cards. \@ownermappings{Abil}{\MYabils} %%%%% %% Abilmacros are mapped to produce the card. \@elementmapping{Abil}{\@numopt\AbilityCard{\MYname}{\MYtext}{\MYeffect}} %%%%% %% Combat macros shouldn't produce normal ability cards \@elementmapping{Combat}{} \def\@compendium{\EVERY{Abil}{}} %%%%% %% dimensions for ability cards %% Notes: \abilheight and \abilwidth are the total height and width, %% including the frame. \effectframe should be no more than %% \abiltxtmarg %% \whitespace is the spacing around the inside of the frame, and %% the minimum vertical spacing between the text fields. \newdimen\abilheight \abilheight = 3.1in \newdimen\abilwidth \abilwidth = 3.6in \newdimen\whitespace \whitespace = 15pt \newdimen\abiltxtmarg \abiltxtmarg = .25in \newdimen\effectframe \effectframe = 3pt \def\familydefault{\sfdefault} %%%%% %% macros for standard parts of ability cards \def\abil@type{Ability Card} \def\abil@trans{Not Transferable} \def\effecthead{Ability Effect} \def\abil@owner{\ifx\@transowner\empty\myowner\else\mysubowner\fi} %%%%% %% \AbilityCard, the actual command for a 2-sided ability card. %% Defined using \doublecard. %% %% Takes 3 arguments. #1 is the name of the Ability, #2 is the %% text describing the ability to its owner (may include a ref. %% to a related greensheet), #3 is the ability text shown to others %% when the ability is used. %% \newbox\abil@front \newbox\abil@back \newdimen\abtxt@wd \newdimen\temp@dimen \newcommand{\AbilityCard}[4][]{% \begingroup% \let\orig@height\abilheight% \fboxsep=0pt% \fboxrule=.3pt% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \abtxt@wd=\abilwidth% \advance\abtxt@wd by-2\abiltxtmarg% \advance\abtxt@wd by-2\whitespace% \setbox\abil@front=\vbox{% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\abilwidth% \vskip\whitespace \begingroup% \small% \abil@type% \hfill% \abil@owner% \endgroup% \break \vskip\whitespace\vfil \begingroup% \bfseries% \Large% #2% \endgroup% \break \vskip\whitespace\vfil \parbox{\abtxt@wd}{\raggedright{#3}}% \break \vskip\whitespace\vfil \begingroup% \small% \gamenameabbrev/\gamedateabbrev\hfill\abil@trans% \endgroup% \vskip\whitespace% }% \temp@dimen\ht\abil@front% \advance\temp@dimen\dp\abil@front% \ifdim\temp@dimen>\abilheight% \abilheight\temp@dimen% \fi% \setbox\abil@back=\vbox{% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\abilwidth% \vskip\whitespace {\small\abil@type\hfill\abil@trans}\break \vskip\whitespace\vfil {\bfseries\Large\effecthead}\break \vskip\whitespace\vfil \begingroup% \fboxsep=\effectframe% \fbox{% \parbox{\abtxt@wd}{% \centering% \def\@tmp{#1}% \unless\ifx\@tmp\empty% #1\\% \fi% #4% }% }% \endgroup% \break \vskip\whitespace\vfil \begingroup% \small% \gamenameabbrev\hfill\gamedateabbrev% \endgroup% \vskip\whitespace% }% \temp@dimen\ht\abil@back% \advance\temp@dimen\dp\abil@back% \ifdim\temp@dimen>\abilheight% \abilheight\temp@dimen% \fi% \ifdim\abilheight>\orig@height% \typeout{! ability card oversized}% \fi% \doublecard{% \fbox{\vbox to\abilheight{\unvbox\abil@front}}% }{% \mbox{\vbox to\abilheight{\unvbox\abil@back}}% }% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{alignment}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% %%%%% \DoubleCards\DoubleSiding \MarginsXY{10pt}{10pt} \NoFill \usepackage{color,graphicx} %%%%% %% \def\lefthanded{\let\lefty@cards\relax} \def\righthanded{\let\lefty@cards\empty} %% set me \righthanded %%%%% %% \def\offensedefense#1#2{\def\@offense{#1}\def\@defense{#2}} %% set me %% use \offensedefense{}{} to turn off warnings. \offensedefense{5}{5} %%%%% %% dimensions for alignment cards %% \whitespace is the spacing around the inside of the frame, and %% the minimum vertical spacing between the text fields. \newdimen\alignheight \alignheight = 2in \newdimen\alignwidth \alignwidth = 3.25in \newdimen\whitespace \whitespace = 10pt \newdimen\separatorwidth \separatorwidth = 3pt %%%%% %% macros for standard parts of alignment cards \def\lefttop{Alignment Card} \def\righttop{Not Transferable} \def\leftbottom{\gamenameabbrev} \def\rightbottom{\gamedateabbrev} \def\effecthead{Effect} \definecolor{separator}{gray}{0.8} %%%%% %% \AlignmentCard{<name>}{<text>}{<effect>}{<offense>}{<defense>} \newbox\align@front \newbox\align@back \newbox\vector@front \newbox\vector@back \newdimen\temp@dimen \newdimen\vector@width \newdimen\rest@width \newdimen\element@height \newcount\element@count \def\vgrayline{\textcolor{separator}{\rule{\separatorwidth}{\vsize}}} \def\topgrayline{% \textcolor{separator}{% \raisebox{-\totalheight}{% \rule{\hsize}{.5\separatorwidth}% }% }% } \def\bottomgrayline{\textcolor{separator}{\rule{\hsize}{.5\separatorwidth}}} \def\@slottest#1#2{% \unless\ifx#2\empty% \begingroup% \advance\element@count-#2\relax% \ifnum\element@count>0% \typeout{! \the\element@count\space too many #1 slots}% \else% \ifnum\element@count<0% \element@count-\element@count% \typeout{! \the\element@count\space too few #1 slots}% \fi% \fi% \endgroup% \fi% } \newcommand\AlignmentCard[6][]{ \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \lineskip=0pt% \baselineskip=0pt% \parindent=0pt% \def\baselinestretch{0}% \vector@width=.25\alignwidth% \rest@width=.75\alignwidth% \global\element@count=0% \setbox\align@front=\hbox{% \def\element##1{\global\advance\element@count1\relax}% #6% }% \@slottest{defense}{\@defense}% \global\element@height\alignheight% \global\advance\element@height-\separatorwidth% \global\setbox\vector@front=\vbox{}% \unless\ifnum\element@count=0% \global\divide\element@height by\element@count% \global\setbox\vector@front=\vbox{% \hsize=\vector@width% \smash{\bottomgrayline}% }% \setbox\align@front=\hbox{% \def\element##1{% \global\setbox\vector@front=\vbox{% \hsize=\vector@width% \box\vector@front% \vbox to\element@height{% \vsize=\element@height% \ifx\lefty@cards\empty% \leftskip=.5\whitespace minus.5\whitespace% \rightskip=0pt plus1fil% \else% \leftskip=0pt plus1fil% \rightskip=.5\whitespace minus.5\whitespace% \fi% \smash{\topgrayline}% \vskip0pt plus1fill minus1fill% \mbox{\footnotesize\sffamily\bfseries{##1}}\break% \vskip0pt plus1fill minus1fill% \smash{\bottomgrayline}% }% }% }% #6% }% \global\setbox\vector@front=\vbox{% \box\vector@front% \hsize=\vector@width% \smash{\topgrayline}% }% \fi% \global\element@count=0% \setbox\align@front=\hbox{% \def\element##1{\global\advance\element@count1\relax}% #5% }% \@slottest{offense}{\@offense}% \global\element@height\alignheight% \global\advance\element@height-\separatorwidth% \global\setbox\vector@back=\vbox{}% \unless\ifnum\element@count=0% \global\divide\element@height by\element@count% \global\setbox\vector@back=\vbox{% \hsize=\vector@width% \smash{\bottomgrayline}% }% \setbox\align@front=\hbox{% \def\element##1{% \global\setbox\vector@back=\vbox{% \hsize=\vector@width% \box\vector@back% \vbox to\element@height{% \vsize=\element@height% \ifx\lefty@cards\empty% \leftskip=0pt plus1fil% \rightskip=.5\whitespace minus.5\whitespace% \else% \leftskip=.5\whitespace minus.5\whitespace% \rightskip=0pt plus1fil% \fi% \smash{\topgrayline}% \vskip0pt plus1fill minus1fill% \mbox{\footnotesize\sffamily\bfseries{##1}}\break% \vskip0pt plus1fill minus1fill% \smash{\bottomgrayline}% }% }% }% #5% }% \global\setbox\vector@back=\vbox{% \box\vector@back% \hsize=\vector@width% \smash{\topgrayline}% }% \fi% \setbox\align@front=\vbox{% \ifx\lefty@cards\empty% \leftskip=1.5\whitespace plus1fil% \rightskip=\whitespace% \else% \leftskip=\whitespace% \rightskip=1.5\whitespace plus1fil% \fi% \hsize=\rest@width% \vskip\whitespace% \begingroup% \scriptsize% \lefttop/\righttop% \endgroup% \break% \vskip\whitespace\vfil% \temp@dimen\hsize% \advance\temp@dimen-\leftskip% \advance\temp@dimen-\rightskip% \parbox{\temp@dimen}{% \ifx\lefty@cards\empty% \raggedright% \else% \raggedleft% \fi% \bfseries% \small% #2% }% \break% \vskip\whitespace\vfil% \parbox{\temp@dimen}{% \ifx\lefty@cards\empty% \raggedright% \else% \raggedleft% \fi% \small #3% }% \break% \vskip\whitespace\vfil% \begingroup% \scriptsize% \leftbottom/\rightbottom% \endgroup% \break% \vskip\whitespace% }% \temp@dimen\ht\align@front% \advance\temp@dimen\dp\align@front% \ifdim\temp@dimen>\alignheight% \alignheight\temp@dimen% \fi% \setbox\align@back=\vbox{% \ifx\lefty@cards\empty% \leftskip=\whitespace% \rightskip=1.5\whitespace plus1fil% \else% \leftskip=1.5\whitespace plus1fil% \rightskip=\whitespace% \fi% \hsize=\rest@width% \vskip\whitespace% \begingroup% \scriptsize% \lefttop/\righttop% \endgroup% \break% \vskip\whitespace\vfil% \temp@dimen\hsize% \advance\temp@dimen-\leftskip% \advance\temp@dimen-\rightskip% \parbox{\temp@dimen}{% \ifx\lefty@cards\empty% \raggedleft% \else% \raggedright% \fi% \bfseries% \small Effect% }% \break% \vskip\whitespace\vfil% \parbox{\temp@dimen}{% \ifx\lefty@cards\empty% \raggedleft% \else% \raggedright% \fi% \relax% \small% \def\@tmp{#1}% \unless\ifx\@tmp\empty% #1\\% \fi% #4% }% \break% \vskip\whitespace\vfil% \begingroup% \scriptsize% \leftbottom/\rightbottom% \endgroup% \break% \vskip\whitespace% }% \temp@dimen\ht\align@back% \advance\temp@dimen\dp\align@back% \ifdim\temp@dimen>\alignheight% \alignheight\temp@dimen% \fi% \doublecard{% \fbox{% \hbox to\alignwidth{% \vsize=\alignheight% \ifx\lefty@cards\empty% \vbox to\alignheight{\vfill\box\vector@front\vfill}% \hbox to 0pt{% \vgrayline% \raisebox{.5\alignheight}{% \rotatebox[origin=c]{90}{\tiny\sffamily THIS SIDE TOWARDS YOU}}% \hskip0pt minus1fill% }% \vbox to\alignheight{\unvbox\align@front}% \hfill% \else% \hfill% \vbox to\alignheight{\unvbox\align@front}% \hbox to 0pt{% \hskip0pt minus1fill% \raisebox{.5\alignheight}{% \rotatebox[origin=c]{270}{% \tiny% \sffamily% THIS SIDE TOWARDS YOU% }% }% \vgrayline}% \vbox to\alignheight{\vfill\box\vector@front\vfill}% \fi% }% }% }{% \mbox{% \hbox to\alignwidth{% \vsize=\alignheight% \ifx\lefty@cards\empty% \hfill% \vbox to\alignheight{\unvbox\align@back}% \hbox to 0pt{\vgrayline\hskip0pt minus1fill}% \vbox to\alignheight{\vfill\box\vector@back\vfill}% \else% \vbox to\alignheight{\vfill\box\vector@back\vfill}% \hbox to 0pt{\hskip0pt minus1fill\vgrayline}% \vbox to\alignheight{\unvbox\align@back}% \hfill% \fi% }% }% }% \endgroup% } %%%%% %% \hit[<num>] %% \block[<num>] %% \none \newcommand\hit[1][\unskip]{\element{HIT #1}} \newcommand\none{\element{none}} \newcommand\block[1][\unskip]{\element{BLOCK #1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{combat}{alignment}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% %% %%%%% \righthanded \offensedefense{5}{5} \gdef\mytype{Combat Cards} \def\lefttop{Combat Card} \@ownermappings{Combat}{\MYabils} \@elementmapping{Abil}{} \@elementmapping{Combat}{% \@numopt\AlignmentCard{\MYname}{\MYtext}{\MYeffect}{\MYoffense}{\MYdefense}% } \def\@compendium{\EVERY{Combat}{}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{packet}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% %%%%% \DoubleCards\DoubleSiding\NoFill \MarginsXY{5pt}{5pt} %%%%% \newdimen\packetspace \packetspace = 15pt \newdimen\packetwidth \packetwidth = 3.5in %%%%% %% internal typesetting \newbox\text@box \newbox\trig@box \newdimen\text@ht \newdimen\trig@ht \newdimen\tot@ht \newdimen\par@wd \def\vdotfill{% \vbox to\vsize{% \hsize0pt% \leaders\vbox to2pt{\vfil\tiny\makebox[0pt]{.}\vfil}\vfil% }% } \def\hdotfill{% \hbox to\hsize{% \leaders\hbox to2pt{\tiny\smash.\hfil}\hfil% }% } \def\fold@one{% \makebox[0pt][r]{% \hbox{% \leftskip=0pt plus1fil% \rightskip=0pt% \def\baselinstretch{0}% \vsize=\tot@ht% \vbox to\tot@ht{% \lineskip=1pt% \vfill% \tiny\textbf{1.}\break fold\break back\break here\break% \vfill% }% \vdotfill% }% }% } \def\fold@two{% \vbox to0pt{% \leftskip=0pt plus1fil% \rightskip=0pt plus1fil% \lineskip=1pt% \def\baselinstretch{0}% \hsize=.5\packetwidth% \tiny\hdotfill\break% \textbf{2.} fold back here\break% \vskip0pt minus1fil% }% } \def\@staple{% \smash{\hbox to\par@wd{\hfil\tiny\textbf{3.} staple here\hfil}}% } %%%%% %% \FoldingPacket{owner}{trigger}{text} \long\def\FoldingPacket#1#2#3#4#5{% \begingroup% \fboxsep=0pt% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \setbox\trig@box=\vbox{% \leftskip=\packetspace% \rightskip=\packetspace% \hsize=.5\packetwidth% \par@wd=\hsize% \advance\par@wd-2\packetspace% \vskip\packetspace% \@staple% \vskip\packetspace% \parbox{\par@wd}{#1\hfil}% \vskip\packetspace \vfill% \parbox{\par@wd}{#2\hfil}% \vskip\packetspace \vfill% }% \setbox\text@box=\vbox{% \leftskip=\packetspace% \rightskip=\packetspace% \hsize=\packetwidth% \par@wd=\hsize% \advance\par@wd-2\packetspace% \vskip2\packetspace% \parbox{\par@wd}{#3\hfill}% \vskip\packetspace \vfill% \parbox{\par@wd}{#4\hfil}% \vskip\packetspace \vfill% \parbox{\par@wd}{#5\hfil}% \vskip2\packetspace\vfill% }% \text@ht=\ht\text@box% \advance\text@ht by\dp\text@box% \trig@ht=\ht\trig@box% \advance\trig@ht by\dp\trig@box% \tot@ht=\text@ht% \ifdim\tot@ht<2\trig@ht\relax% \tot@ht=2\trig@ht% \fi% \doublecard{% \framebox[\packetwidth]{% \hfill\fold@one% \vbox to\tot@ht{\unvbox\trig@box\fold@two\vskip.5\tot@ht}% }% }{% \makebox[\packetwidth]{% \vbox to\tot@ht{\unvbox\text@box}% }% }% \endgroup% } %%%%% %% \EnvelopePacket{owner}{trigger}{text} \long\def\EnvelopePacket#1#2#3#4#5{% \begingroup% \packetspace.5\packetspace% \fboxsep=-\fboxrule% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \card{% \vbox{% \hsize=\packetwidth% \centering% \fbox{% \vbox{% \advance\hsize-.5in% \leftskip=\packetspace% \rightskip=\packetspace% \par@wd=\hsize% \advance\par@wd-2\packetspace% \vskip\packetspace% \parbox{\par@wd}{#1\hfill}% \vskip\packetspace% \parbox{\par@wd}{#2\hfil}% \vskip\packetspace% }% }% \vskip.5\packetspace \hdotfill \vskip.5\packetspace \fbox{% \vbox{% \leftskip=\packetspace% \rightskip=\packetspace% \par@wd=\hsize% \advance\par@wd-2\packetspace% \vskip\packetspace% \parbox{\par@wd}{#3\hfill}% \vskip\packetspace% \parbox{\par@wd}{#4\hfil}% \vskip\packetspace% \parbox{\par@wd}{#5\hfil}% \vskip\packetspace% }% }% }% }% \endgroup% } %%%%% %% internal typesetting \newdimen\bookwidth \bookwidth = \textwidth \newdimen\bookheight \bookheight = 3in \newdimen\bookspace \bookspace = 15pt \newdimen\temp@dimen \newbox\temp@box \def\fold@back{% \makebox[0pt][r]{% \hbox{% \leftskip=0pt plus1fil% \rightskip=0pt% \lineskip=1pt% \def\baselinstretch{0}% \vbox to\vsize{% \vfill% \tiny\break fold\break back\break here\break% \vfill% }% \vdotfill% }% }% } %%%%% %% \Cover{<name>}{<text>} \newcommand{\Cover}[2]{% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \advance\bookwidth-2\bookspace% \divide\bookwidth2% \setbox\temp@box=\vbox{% \hsize\bookwidth% \leftskip\bookspace plus1fil% \rightskip\bookspace plus1fil% \vskip\bookspace% \mbox{\gamenameabbrev}\hfill\mbox{\signdate}\break\vfill \begingroup% \advance\bookwidth-6\bookspace% \fboxsep\bookspace% \fbox{% \parbox{\bookwidth}{% \centering\bfseries\baselineskip=0pt\relax#1% }% }% \endgroup% \break\vfill \advance\bookwidth-2\bookspace% \begin{minipage}{\bookwidth}% \parindent0pt% \parskip.5\baselineskip% \small#2% \end{minipage}% \vskip\bookspace\vfill\vfill% }% \temp@dimen\ht\temp@box% \ifdim\bookheight<\ht\temp@box% \bookheight\ht\temp@box% \fi% \advance\bookwidth2\bookspace% \card{% \fbox{% \hbox to\bookwidth{% \vsize\bookheight\relax% \hfill \raisebox{.5\vsize}{% \rotatebox[origin=c]{90}{\tiny staple binding along here}% }% \hfill \vbox to\vsize{\unvbox\temp@box}% }% }% }% \endgroup% } %%%%% %% \Page{<label>}{<text>} \newcommand{\Page}[2]{% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \setbox\temp@box=\vbox{% \hsize\bookwidth% \advance\hsize-2\bookspace% \leftskip\bookspace plus1fil% \rightskip\bookspace plus1fil% \vskip.5\bookspace% \mbox{\gamenameabbrev}/\mbox{\signdate}\hfill\mbox{#1}\break% \vskip.5\bookspace\vfill% \begin{minipage}{.7\bookwidth}% \parindent0pt% \parskip.5\baselineskip% \relax\small% #2% \relax% \end{minipage}% \vskip\bookspace\vfill% }% \ifdim\bookheight<\ht\temp@box% \bookheight\ht\temp@box% \fi% \doublecard{% \fbox{% \hbox to\bookwidth{% \vsize\bookheight\relax% \hfill \raisebox{.5\vsize}{% \rotatebox[origin=c]{90}{\tiny staple binding along here}}% \hfill \vbox to\vsize{\unvbox\temp@box}% }% }% }{% \mbox{% \hbox to\bookwidth{% \vsize\bookheight\relax% \vbox to\vsize{ \hsize\bookwidth% \advance\hsize-2\bookspace% \divide\hsize2% \leftskip\bookspace plus1fil% \rightskip\bookspace plus1fil% \vskip\bookspace \begingroup% \tiny staple along here% \endgroup% \break \vfill \parbox{.3\hsize}{% \centering% \textbf{#1}%\\[.5\bookspace]% %\tiny Do not open this page until you are directed to do so.% }% \break \vfill }% \fold@back \hfill }% }% }% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{mems}{packet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: packet option %% %% Commands Provided: %% \FoldingMempacket{owner}{trigger}{text} %% \EnvelopeMempacket{owner}{trigger}{text} %% %%%%% \DoubleCards\DoubleSiding\NoFill \MarginsXY{5pt}{5pt} \gdef\mytype{Memory/Event Packets} %%%%% %% List Charmacros to produce those characters' mempackets. \@ownermappings{Mem}{\MYmems} %%%%% %% Mem macros mapped to produce the mempacket. \@elementmapping{Mem}{\@numopt\FoldingMempacket{\mem@owner}{\MYname}{\MYtext}} \@elementmapping{MemEnvelope}{% \@numopt\EnvelopeMempacket{\mem@owner}{\MYname}{\MYtext}% } \@elementmapping{MemCover}{% \@numopt\CoverMempacket{\mem@owner}{\MYtext}% } \@elementmapping{MemPage}{% \@numopt\PageMempacket{\MYname}{\MYtext}% } \def\@compendium{\EVERY{Mem}{}} \newdimen\whitespace \whitespace = 15pt \newdimen\memwidth \memwidth = 3.5in \def\familydefault{\sfdefault} \def\mem@owner{\ifx\@transowner\empty\myowner\else\mysubowner\fi} %%%%% %% \FoldingMempacket{owner}{trigger}{text} \newcommand{\FoldingMempacket}[4][]{% \begingroup% \packetspace\whitespace% \packetwidth\memwidth% \FoldingPacket{% \centering% \scriptsize% \mbox{\gamenameabbrev} / \mbox{\gamedateabbrev}\\% \bfseries% \mbox{}#2% }{% \raggedright\small Trigger: \em#3% }{% \em% \tiny% \mbox{\gamenameabbrev} / \mbox{\gamedateabbrev}% \hfill% \bfseries% #2% }{% \scriptsize% \bfseries% \em #3:% }{% \small\parindent=10pt\relax% \begingroup% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \emph{\@tmp}\\% \fi% #4% \endgroup% }% \endgroup% } %%%%% %% \EnvelopeMempacket{owner}{trigger}{text} \newcommand{\EnvelopeMempacket}[4][]{% \begingroup% \packetspace\whitespace% \packetwidth\memwidth% \EnvelopePacket{% \scriptsize% \mbox{\gamenameabbrev} / \mbox{\gamedateabbrev}\\% \bfseries\mbox{}#2% }{% \raggedright% \small% Trigger: \em#3% }{% \em% \tiny% \mbox{\gamenameabbrev} / \mbox{\gamedateabbrev}% \hfill% \bfseries#2% }{% \scriptsize% \bfseries% \em#3:% }{% \small% \parindent=10pt\relax% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \emph{\@tmp}\\% \fi% #4% }% \endgroup% } %%%%% %% \CoverMempacket{owner}{name}{text} \newcommand{\CoverMempacket}[3][]{% \Cover{% #2% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \\\emph{\@tmp}% \fi% }{#3}% } %%%%% %% \PageMempacket{trigger}{text} \newcommand{\PageMempacket}[3][]{% \Page{#2}{% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \emph{\@tmp}\\% \fi#3% }% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{items}{packet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: packet option, color package %% %% Commands provided: %% \ItemCard{item number}{name}{long description}{shaded mark text} %% \ContentsStrip{name}{text} %% \FoldingItem{name}{number}{text} %% \EnvelopeItem{name}{number}{text} %% %%%%% \DoubleCards\DoubleSiding \MarginsXY{10pt}{4pt} \NoFill \usepackage{color} \gdef\mytype{Item Cards} %%%%% %% List Charmacros to produce those characters' item cards. \@ownermappings{Item}{\MYitems} \def\@compendium{\EVERY{Item}{}} %%%%% %% Item macros are mapped to produce the card \@elementmapping{Item}{\@numopt\ItemCard{\MYname}{\MYtext}{\MYmark}} \@elementmapping{ItemPacket}{% \@numopt\ItemCard{\MYname}{\MYtext}{\MYmark}% \ContentsStrip{\MYname}{\MYcontents}% } \@elementmapping{ItemFold}{% \FoldingItem{\MYname}{\MYnumber}{\MYtext}{\MYcontents}% } \@elementmapping{ItemEnvelope}{% \EnvelopeItem{\MYname}{\MYnumber}{\MYtext}{\MYcontents}% } \@elementmapping{ItemLabel}{\LabelItem{\MYname}{\MYnumber}{\MYtext}} %%%%% %% \itemheight and \itemwidth are the height and width of cards, %% respectively (including the frame). %% \whitespace is the space around the inside of the frame. %% \shadesep is the "extra space" of shaded area around the text %% in the shaded mark box. \newdimen\itemheight \itemheight = 2in \newdimen\itemwidth \itemwidth = 3.25in \newdimen\whitespace \whitespace = 10pt \newdimen\shadesep \shadesep = 5pt %%%%% %% parts of item cards \def\transfer{Freely Transferable} \def\lefttop{Item Card} \def\righttop{\transfer} \def\leftbottom{\gamenameabbrev} \def\rightbottom{\gamedateabbrev} \definecolor{lightgray}{gray}{.75} \def\familydefault{\sfdefault} %%%%% %% \ItemCard{item number}{name}{long description}{shaded mark text} %% Takes 4 arguments. #1 is the item number, #2 is the name and/or %% short description, #3 is the longer description %% (if needed/wanted), #4 is text to go in a shaded mark box. %% (if #4 typesets to nothing, no shaded box is used) %% %% The back side of item cards is a .5\itemheight x .5\itemwidth %% descriptive text area. \newdimen\temp@dimen \newbox\temp@box \newcommand{\ItemCard}[4][]{% \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \setbox\temp@box=\hbox{#4}% \ifdim\wd\temp@box>0sp% \setbox\temp@box=\hbox{% \temp@dimen\itemwidth% \advance\temp@dimen-2\whitespace% \advance\temp@dimen-2\shadesep% \fboxrule=0pt% \fboxsep=\shadesep% \colorbox{lightgray}{% \parbox{\temp@dimen}{\centering\bfseries\footnotesize#4}% }% }% \fi% \setbox\temp@box=\vbox{% \centering% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\itemwidth% \vskip\whitespace% \begingroup% \small\lefttop\hfill\righttop% \endgroup% \vskip\whitespace\vfil% \textbf{\large#2}% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \vskip\whitespace\vfil% \textbf{\large#1}% \fi% \vskip\whitespace\vfil% \temp@dimen\itemwidth% \advance\temp@dimen-2\whitespace% \parbox{\temp@dimen}{\footnotesize\raggedright#3}% \vfil% \vskip\whitespace\vfil% \ifdim\ht\temp@box>0sp% \unhbox\temp@box% \vskip\whitespace \fi% \begingroup% \small\leftbottom\hfill\rightbottom% \endgroup% \vskip\whitespace }% \temp@dimen\ht\temp@box% \advance\temp@dimen\dp\temp@box% \ifdim\temp@dimen>\itemheight% \itemheight\temp@dimen% \typeout{! item card oversized}% \fi% \doublecard{% \fbox{\vbox to\itemheight{\unvbox\temp@box}}% }{% \vbox to\itemheight{% \hsize=\itemwidth% \centering% \vfill \fboxsep=5pt% \fbox{% \fbox{% \parbox{.6\itemwidth}{% \centering% \large% \bfseries% \mbox{\gamenameabbrev}\par% \mbox{\gamedateabbrev}\par \large item card\par\vskip5pt \normalsize(turn to other side) }% }% }% \vfill% }% }% \endgroup% } %%%%% %% \ContentsStrip{name}{text} \newcommand{\ContentsStrip}[2]{% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \card{% \fbox{% \vbox{% \hsize=\itemwidth% \leftskip\whitespace% \rightskip\whitespace% \vskip\whitespace \begingroup% \scriptsize% \mbox{\gamenameabbrev}/\mbox{\gamedateabbrev}% \hfill% \textbf{#1}% \endgroup \vskip\whitespace \temp@dimen\hsize% \advance\temp@dimen-2\whitespace% \parbox{\temp@dimen}{\scriptsize\parindent10pt{#2}}% \vskip\whitespace% }% }% }% \endgroup% } %%%%% %% \FoldingItem{name}{number}{desc}{text} \newcommand{\FoldingItem}[4]{% \begingroup% \packetwidth\itemwidth% \FoldingPacket{% \centering% \scriptsize% \mbox{\gamenameabbrev} / \mbox{\gamedateabbrev}% \par\transfer% }{% \centering% \scriptsize% \textbf{#1\\#2}\vskip.5\whitespace #3% }{% \scriptsize\mbox{\gamenameabbrev}\hfill\mbox{\gamedateabbrev}% }{% \scriptsize\centering{#1}\par\relax{#2}% }{% \scriptsize\parindent10pt\relax{#4}% }% \endgroup% } %%%%% %% \EnvelopeItem{name}{number}{desc}{text} \newcommand{\EnvelopeItem}[4]{% \begingroup% \packetwidth\itemwidth% \EnvelopePacket{% \scriptsize% \mbox{\gamenameabbrev/\gamedateabbrev}\hfill\transfer% }{% \centering% \scriptsize% \textbf{#1\\#2}\vskip.5\whitespace{#3}% }{% \scriptsize\mbox{\gamenameabbrev}\hfill\mbox{\gamedateabbrev}% }{% \scriptsize\centering{#1}\par\relax{#2}% }{% \scriptsize\parindent10pt\relax{#4}% }% \endgroup% } %%%%% %% \LabelItem{name}{number}{desc} \newcommand{\LabelItem}[3]{% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \card{% \fbox{% \vbox{% \hsize=.7\itemwidth% \leftskip.5\whitespace% \rightskip.5\whitespace% \vskip.5\whitespace% \begingroup% \tiny% \mbox{\gamenameabbrev}/\mbox{\gamedateabbrev}\hfill\transfer% \endgroup% \vskip.5\whitespace% \temp@dimen\hsize% \advance\temp@dimen-\whitespace% \parbox{\temp@dimen}{% \raggedright% \footnotesize% \textbf{#1 \ #2}\\#3% }% \vskip.5\whitespace% }% }% }% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{carditems}{items}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \gdef\mytype{Cardstock Item Cards} %% ItemPacket and all its children do nothing \@elementmapping{ItemPacket}{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{paperitems}{items}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \gdef\mytype{Paper Item Cards} %% Item and ItemLabel do nothing \@elementmapping{Item}{} \@elementmapping{ItemPacket}{% \@numopt\ItemCard{\MYname}{\MYtext}{\MYmark}% \ContentsStrip{\MYname}{\MYcontents}% } \@elementmapping{ItemFold}{% \FoldingItem{\MYname}{\MYnumber}{\MYtext}{\MYcontents}% } \@elementmapping{ItemEnvelope}{% \EnvelopeItem{\MYname}{\MYnumber}{\MYtext}{\MYcontents}% } \@elementmapping{ItemLabel}{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{notebook}{cardsheet}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \DoubleCards\DoubleSiding\NoFill \MarginsXY{0pt}{.25in} \usepackage{graphicx} \gdef\mytype{In-Game Notebooks} %%%%% %% List Charmacros to produce those characters' notebooks. \@ownermappings{Notebook}{\MYitems} \@elementmapping{Notebook}{\MYtext} \def\@compendium{\EVERY{Notebook}{}} %%%%% \newdimen\whitespace \whitespace = 15pt \newdimen\bookwidth \bookwidth = \textwidth \newdimen\bookheight \bookheight = 3in \def\transfer{Freely Transferable} \def\notebooktext{% A Notebook. Opened pages are in-game items; un-opened pages are not. You may start with the first page open. You may only open pages when directed to.% } \def\familydefault{\sfdefault} %%%%% %% internal typesetting \newdimen\temp@dimen \newbox\temp@box \def\vdotfill{\vbox to\vsize{\leaders\vbox to2pt{\tiny\smash.\vfil}\vfil}} \def\hdotfill{\hbox to\hsize{\leaders\hbox to2pt{\tiny\smash.\hfil}\hfil}} \def\fold@back{% \makebox[0pt][r]{% \hbox{% \leftskip=0pt plus1fil% \rightskip=0pt% \lineskip=1pt% \def\baselinstretch{0}% \vbox to\vsize{% \vfill% \tiny\break fold\break back\break here\break% \vfill}% \vdotfill% }% }% } %%%%% %% \begin{page}{<string>} <contents> \end{page} \newcommand\page[2][]{% \begingroup% \def\identifier{\@nbref{#2}}% \fboxsep=-\fboxrule% \baselineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \setbox\temp@box=\vbox\bgroup% \hsize\bookwidth% \advance\hsize-2\whitespace% \leftskip\whitespace plus1fil% \rightskip\whitespace plus1fil% \vskip2\whitespace% \begingroup% \footnotesize% \mbox{\gamenameabbrev}/\mbox{\gamedateabbrev}\hfill\transfer% \endgroup% \vskip\whitespace\vfill% \temp@dimen\hsize% \advance\temp@dimen-\leftskip% \advance\temp@dimen-\rightskip% \begin{minipage}{\temp@dimen}% \parindent0pt% \parskip.5\baselineskip% \relax\small% } \def\endpage{% \relax% \end{minipage}% \vskip\whitespace\vfill% \egroup% \temp@dimen\ht\temp@box% \advance\temp@dimen\dp\temp@box% \ifdim\temp@dimen>\bookheight% \bookheight\temp@dimen% \typeout{! notebook page oversized} \fi% \doublecard{% \fbox{% \hbox to\bookwidth{% \vsize\bookheight\relax% \hfill \raisebox{.5\vsize}{% \rotatebox[origin=c]{90}{\tiny staple binding along here}% }% \hfill \vbox to\vsize{\unvbox\temp@box}% }% }% }{% \mbox{% \hbox to\bookwidth{% \vsize\bookheight\relax% \vbox to\vsize{ \hsize\bookwidth% \advance\hsize-2\whitespace% \divide\hsize2% \leftskip\whitespace plus1fil% \rightskip\whitespace plus1fil% \vskip.5\whitespace \begingroup% \tiny staple along here% \endgroup% \break \vfill \parbox{.3\hsize}{% \centering% \textbf{\Large\identifier}\\[.5\whitespace]% \tiny Do not open this page until you are directed to do so.% }% \break \vfill }% \fold@back \hfill }% }% }% \endgroup% } %%%%% %% \startnotebook{<title>} <pages> \endnotebook \long\def\startnotebook#1#2\endnotebook{% \BRANCHTYPES{Owner}{\REMAP{\TYPE}}% \begingroup% \gdef\@nbpagecount{0}% \def\@nbref##1{}% \renewcommand\page[2][]{% \begingroup% \def\@tmp{##1}% \ifx\@tmp\empty% \count0=\@nbpagecount % \advance\count0by1% \xdef\@nbpagecount{\the\count0}% \xdef\@nbid{\@nbpagecount}% \else% \gdef\@nbid{##1}% \fi% \endgroup% \etoss{% \toss[2]{% \expandafter\def\csname nb.##2\endcsname{\?\@nbid}% }% }% \setbox\temp@box=\vbox\bgroup% }% \def\endpage{\egroup}% \setbox\temp@box=\vbox{#2}% \endgroup% \flushpage% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \advance\bookwidth-2\whitespace% \divide\bookwidth2% \setbox\temp@box=\vbox{% \hsize\bookwidth% \leftskip\whitespace plus1fil% \rightskip\whitespace plus1fil% \vskip2\whitespace% {\footnotesize\mbox{\gamenameabbrev}/\mbox{\gamedateabbrev}% \hfill\transfer} \vskip\whitespace\vfill% \begingroup% \BRANCHTYPES{Notebook}{% \MAP{\TYPE}{% \MYname% \unless\ifx\MYnumber\empty% \break\vskip\whitespace% \MYnumber% \fi% }% }% \bfseries#1% \endgroup% \break \vskip\whitespace\vfill% \temp@dimen\hsize% \advance\temp@dimen-\leftskip% \advance\temp@dimen-\rightskip% \begin{minipage}{\temp@dimen}% \parindent0pt% \parskip.5\baselineskip% \begingroup% \small\notebooktext% \endgroup% \end{minipage}% \vskip\whitespace\vfill% }% \temp@dimen\ht\temp@box% \advance\temp@dimen\dp\temp@box% \ifdim\temp@dimen>\bookheight% \bookheight\temp@dimen% \typeout{! notebook cover oversized} \fi% \advance\bookwidth2\whitespace% \card{% \fbox{% \hbox to\bookwidth{% \vsize\bookheight\relax% \hfill \raisebox{.5\vsize}{% \rotatebox[origin=c]{90}{\tiny staple binding along here}% }% \hfill \vbox to\vsize{\unvbox\temp@box}% }% }% }% \endgroup% #2% } %%%%% %% \gdef\@nbpagecount{0} \def\nbref#1{\textbf{\@nbref{#1}}} \def\@nbref#1{% \ifcsname nb.#1\endcsname% \csname nb.#1\endcsname% \else% \typeout{! Notebook reference string #1 does not exist in this notebook}% \fi% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{greennotebook}{notebook}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \gdef\mytype{Out-of-Game Notebooks} %%%%% %% List Charmacros to produce those characters' notebooks. \@ownermappings{GreenNotebook}{\MYgreens} \@elementmapping{GreenNotebook}{\MYtext} \def\@compendium{\EVERY{GreenNotebook}{}} %%%%% %% make them non-transferable \def\transfer{Not Transferable} \def\notebooktext{% This notebook is out-of-game. You may start with the first page open. You may only open pages when directed to.% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{money}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% Commands Provided: %% \MoneyBill{}{}{} %%%%% \DoubleCards\DoubleSiding \GridCardsXY{2}{8} \gdef\mytype{Money} %%%%% %% List Charmacros to produce those characters' cash. \@ownermappings{Money}{\MYcash} %%%%% %% Money macros are mapped to produce the card %% Uses of \cash are set to \makemorechange (after it is changed %% to Money macros for actual bills, it prints the bill). \@elementmapping{Money}{% \@numopt\MoneyBill{\MYshortprint}{\MYlongprint}{\MYbillprint}% } \makemorechange %%%%% %% \moneyheight and \moneywidth are the height and width of bills, %% respectively (including the frame). %% \whitespace is the space around the inside of the frame and the %% minimum vertical spacing between parts. \newdimen\moneyheight \moneyheight = 1.1in \newdimen\moneywidth \moneywidth = 3.75in \newdimen\whitespace \whitespace = 5pt %%%%% %% \MoneyBill{}{}{} %% Takes 3 arguments; #1 (usually the number, i.e. $100) goes at %% the top right and bottom left corners, and is displayed %% \Huge-ly in the center. #2 (usually the text, i.e. One Hundred %% Dollars) goes under the \Huge number in the center. #3 %% (usually the description, i.e. One Hundred Dollar Bill) goes in %% the center of the back label. %% %% The label that is the backside of a bill is .5\moneywidth wide %% by .5\moneyheight high. \newcommand{\MoneyBill}[4][]{% \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \parindent=0pt% \baselineskip=0pt% \lineskip=0pt% \def\baselinestretch{0}% \doublecard{% \framebox{% \vbox to\moneyheight{% \hsize=\moneywidth% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \vskip\whitespace% \large% \mbox{\gamenameabbrev}\hfill% \begingroup% #2% \endgroup% \break\vfill% \textbf{\Huge#2}\break\vskip\whitespace \begingroup% #3% \def\@tmp{#1}% \unless\ifx\@tmp\empty% \ \ \ #1% \fi% \endgroup% \break\vfill% \begingroup% #2% \endgroup% \hfill% \mbox{\gamedateabbrev}\break% \vskip\whitespace% }% }% }{% \vbox to\moneyheight{% \hsize=\moneywidth% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \vskip\whitespace\vfill \mbox{\gamenameabbrev} / \mbox{\gamedateabbrev}\break\vfill \begingroup% \Large #4% \endgroup% \break\vfill% Freely Transferable\break\vfill% \vskip\whitespace% }% }% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{signs}{packet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %%%%% \DoubleCards\DoubleSiding \MarginsXY{.25in}{.25in} \NoFill \gdef\mytype{Signs} \def\@compendium{\EVERY{Sign}{}} %%%%% %% \@ownermappings{Sign}{\MYsigns} %%%%% %% \@elementmapping{Sign}{% \BigSign{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYloc% }{% \MYtext% }% } \@elementmapping{SignMedium}{% \MediumSign{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYloc% }{% \MYtext% }% } \@elementmapping{SignSmall}{% \SmallSign{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYloc% }{% \MYtext% }% } \@elementmapping{SignTiny}{% \TinySign{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYloc% }{% \MYtext% }% } \@elementmapping{SignDot}{% \DotSign{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYloc% }% } \@elementmapping{Label}{% \BigLabel{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYtext% }% } \@elementmapping{LabelMedium}{% \MediumLabel{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYtext% }% } \@elementmapping{LabelSmall}{% \SmallLabel{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYtext% }% } \@elementmapping{SignStrip}{% \Strip{% \MYloc\ \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYtext% }% } \@elementmapping{LabelCover}{% \CoverLabel{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYtext% }% } \@elementmapping{LabelPage}{% \PageLabel{% \MYname% \unless\ifx\MYnumber\empty% \\\MYnumber% \fi% }{% \MYtext% }% } %%%%% %% \newdimen\whitespace \whitespace = 10pt \newdimen\signwidth \signwidth = 3.6in \newdimen\signheight \signheight = 3.6in \def\mediumwidth{3.8in} \def\mediumheight{4.5in} \def\smallwidth{3in} \def\smallheight{1.8in} \def\stripwidth{3.8in} \def\dotwidth{.75in} \def\familydefault{\sfdefault} %%%%% %% \def\noremove{% Please do not remove this until \takedownby.\break \vskip.5\whitespace% --- The MIT Assassins' Guild ---% } \long\def\@signfront#1#2#3{% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \fbox{% \vbox to\signheight{% \hsize\signwidth% \leftskip\whitespace plus1fil% \rightskip\whitespace plus1fil% \vskip\whitespace% \mbox{\gamenameabbrev}\hfill\mbox{\signdate}\break\vfill \textbf{#2}\break\vfill \fboxsep\whitespace% \fbox{% \parbox{.7\signwidth}{\centering\bfseries#1}% }% \break\vfill \parbox{.7\signwidth}{\parskip.5\baselineskip\raggedright#3}% \break\vfill\vfill\vfill \begingroup% \lineskip=3pt\noremove% \endgroup% \break \vskip\whitespace% }% }% \endgroup% } \def\@signback{% \begingroup% \parindent=0pt% \def\baselinstretch{0}% \fboxsep=\whitespace% \fbox{% \fbox{% \vbox to.6\signheight{% \hsize.6\signwidth% \leftskip.1\whitespace plus1fil% \rightskip.1\whitespace plus1fil% \vskip.1\whitespace% \mbox{\gamenameabbrev}\hfill\mbox{\signdate}\break\vfill This is a sign being used by the MIT Assassins' Guild.\break\vfill Please do not throw this away.\break \vskip.1\whitespace% }% }% }% \endgroup% } \long\def\@labelfront#1#2{% \begingroup% \fboxsep=-\fboxrule% \baselineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \fbox{% \vbox to\signheight{% \hsize\signwidth% \leftskip\whitespace plus1fil% \rightskip\whitespace plus1fil% \vskip\whitespace% \mbox{\gamenameabbrev}\hfill\mbox{\signdate}\break\vfill \fboxsep\whitespace% \fbox{% \parbox{.7\signwidth}{\centering\bfseries#1}% }% \break\vfill \parbox{.7\signwidth}{\parskip.5\baselineskip\raggedright#2}% \break\vfill\vfill\vfill \vskip\whitespace% }% }% \endgroup% } %%%%% %% \BigSign{<name>}{<location>}{<text>} %% \MediumSign{<name>}{<location>}{<text>} %% \SmallSign{<name>}{<location>}{<text>} %% %% These are for things that are taped to walls, or taped to %% packets that are taped to walls. \newcommand{\BigSign}[3]{% \begingroup% \signwidth\textwidth% \signheight\textheight% \doublecard{% \Large% \@signfront{\Huge\relax#1}{\Large\relax#2}{\large#3}% }{% \huge% \@signback% }% \endgroup% } \newcommand{\MediumSign}[3]{% \begingroup% \signwidth\mediumwidth% \signheight\mediumheight% \doublecard{% \normalsize% \@signfront{#1}{#2}{#3}% }{% \normalsize% \@signback% }% \endgroup% } \newcommand{\SmallSign}[3]{% \begingroup% \signwidth\smallwidth% \signheight\smallheight% \whitespace5pt% \doublecard{% \small% \@signfront{#1}{#2}{\baselineskip=0pt\relax#3}% }{% \whitespace5pt\scriptsize% \@signback% }% \endgroup% } %%%%% %% \BigLabel{<name>}{<text>} %% \MediumLabel{<name>}{<text>} %% \SmallLabel{<name>}{<text>} %% %% These are for things that are taped to packets that are not taped %% to walls. \newcommand{\BigLabel}[2]{% \begingroup% \signwidth\textwidth% \signheight\textheight% \card{% \Large% \@labelfront{\Huge\relax#1}{\large#2}% }% \endgroup% } \newcommand{\MediumLabel}[2]{% \begingroup% \signwidth\mediumwidth% \signheight\mediumheight% \card{% \normalsize% \@labelfront{#1}{#2}% }% \endgroup% } \newcommand{\SmallLabel}[2]{% \begingroup% \signwidth\smallwidth% \signheight\smallheight% \whitespace5pt% \card{% \small% \@labelfront{#1}{\baselineskip=0pt\relax#2}% }% \endgroup% } %%%%% %% \TinySign{<name>}{<location>}{<text>} %% \Dot{<name>}{<location>} %% %% These are for things that are taped to walls and hard to find \newcommand{\TinySign}[3]{% \begingroup% \signwidth2in% \fboxsep=-\fboxrule% \divide\whitespace3% \advance\fboxsep\whitespace% \advance\signwidth-2\fboxsep% \card{% \fbox{% \parbox{\signwidth}{% \tiny\raggedright% #2\hfill{\bfseries#1}\hfill\mbox{\gamenameabbrev}/\mbox{\signdate}% \\[\whitespace]% #3% }% }% }% \endgroup% } \newcommand{\DotSign}[2]{% \begingroup% \signwidth\dotwidth% \fboxsep=-\fboxrule% \divide\whitespace3% \advance\fboxsep\whitespace% \advance\signwidth-2\fboxsep% \card{% \fbox{% \parbox{\signwidth}{% \centering\tiny% \mbox{\gamenameabbrev}\\[\whitespace] \begingroup% \scriptsize% \textbf{#1}% \endgroup% \hspace{1sp}\\[\whitespace]% \begingroup% #2% \endgroup% \hspace{1sp}\\[\whitespace]% \mbox{\signdate}% }% }% }% \endgroup% } %%%%% %% \Strip{<label>}{<text>} \newbox\text@box \newbox\trig@box \newcommand{\Strip}[2]{% \begingroup% \signwidth\stripwidth% \fboxsep=-\fboxrule% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \advance\fboxsep.7\whitespace% \advance\signwidth-2\fboxsep% \setbox\trig@box=\vbox{% \hsize\signwidth\centering% \def\@tmp{% \parbox{.45\signwidth}{% \centering\tiny% \mbox{\gamenameabbrev}/\mbox{\signdate}\\[.25\whitespace]% \footnotesize#1% }% }% \@tmp\hfil\hfil\@tmp% }% \setbox\text@box=\vbox{% \hsize\signwidth% \parbox{\hsize}{% \raggedright\tiny% \mbox{\gamenameabbrev}/\mbox{\signdate}\hspace{\whitespace}#1% \\[.25\whitespace]% \footnotesize#2% }% }% \signheight\ht\trig@box% \ifdim\signheight<\ht\text@box% \signheight\ht\text@box% \fi% \doublecard{% \fbox{% \vbox to\signheight{% \vfill\box\text@box% }% }% }{% \box\trig@box% }% \endgroup% } %%%%% %% \CoverLabel{<name>}{<text>} \def\CoverLabel{\Cover} %%%%% %% \PageLabel{<label>}{<text>} \def\PageLabel{\Page} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{badges}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% Commands provided: %% \NameBadge{}{}{}{} %% \GMbadge{name} %% \Observer %% %%%%% \DoubleCards\DoubleSiding\NoFill \usepackage{color} \gdef\mytype{Name Badges} %%%%% %% List Charmacros to produce those characters' namebadges. %% Same for GMs. \@bycharmappings{\ifbadge\expandafter\NameBadge\badgemap\fi} %% \listfalse prevents a badge and a playerlist entry \SURFACEMAP{GM}{\iflist\GMbadge{\MYname}{\MYplayer}\fi} \def\@production{% \@setowner{GMs}% \SORT{GM}{alpha<}{\playeralphabetical}{\EVERY{GM}{}}{}% \@setowner{Observers}% \pageof{\Observer}% \charsproduction% \EVERY{Place}{}% } \def\@compendium{\@production} %%%%% %% \badgeheight and \badgewidth are the total height and width of %% the _folded_ namebadge, i.e. has to be at least smaller than %% a badgeholder. Actual printed image (to be folded) is twice %% as wide. %% \whitespace is the spacing around the inside of the frame. \newdimen\badgewidth \badgewidth = 3.1in \newdimen\badgeheight \badgeheight = 2in \newdimen\whitespace \whitespace = 3pt \def\familydefault{\sfdefault} %%%%% %% parts of namebadges \def\lefttop{Name-Badge} \def\righttop{Not Transferable} \def\leftbottom{\mbox{\gamenameabbrev}} \def\rightbottom{\mbox{\gamedateabbrev}} \def\backtext{I'M NOT HERE} \definecolor{badgeback}{gray}{.25} %%%%% %% \NameBadge{field1}{field2}{field3}{field4} %% \GMbadge{name} %% \Observer \newcommand{\NameBadge}[4]{% \begingroup% \doublecard{% \light@badge{% {\LARGE #1}\vfil% {\bfseries\Huge #2}\vfil% {\LARGE #3}\vfil% {\bfseries\Huge #4}\vfil% }% }{\badge@note}% \endgroup% } \newcommand{\GMbadge}[2]{% \begingroup% \doublecard{% \dark@badge{% {\bfseries\Huge #1}\vfil% {\LARGE #2}\vfil% }% }{\badge@note}% \endgroup% } \newcommand{\Observer}{% \begingroup% \doublecard{% \dark@badge{\bfseries\Huge OBSERVER\vfil}% }{\badge@note}% \endgroup} %%%%% %% Internal macros, increasingly more internal \long\def\light@badge#1{% \hbox{\light@side{#1}\hskip\whitespace\badge@back}% } \long\def\dark@badge#1{% \hbox{\dark@side{#1}\hskip\whitespace\badge@back}% } \def\badge@back{% \dark@side{\bfseries\Huge\backtext\vfil}% } \def\badge@note{% \vbox to\badgeheight{% \hsize=2\badgewidth% \leftskip=\badgewidth plus1fil% \rightskip=0pt plus1fil% \vfill \fboxsep=5pt% \fbox{% \fbox{% \parbox{.6\badgewidth}{% \centering% \Large\bfseries\leftbottom\par\rightbottom\par Name Badge\par\vskip5pt \normalsize(turn to other side) }% }% }% \vfill% }% } \newbox\@badgebox \newdimen\@badgedimen \def\nobadgedagger{\let\@badgedagger\empty} \def\bigbadgedagger{\let\@badgedagger\relax} \def\smallbadgedagger{\let\@badgedagger\null} \nobadgedagger \badgedagger %% get value from .cls file \def\@daggerbackground{% \unless\ifx\@badgedagger\empty% \makebox[0pt][l]{% \@badgedimen\badgewidth% \advance\@badgedimen-2\whitespace% \makebox[\@badgedimen]{% \ifx\@badgedagger\relax% \def\@fudge{-.9}% \else% \def\@fudge{-.865}% \fi% \raisebox{\@fudge\totalheight}[0pt][0pt]{% \includegraphics[% angle=-100,% origin=c,% width=0.8\badgewidth,% ]{% \ifx\@badgedagger\relax% \postscript/bigdagger% \else% \postscript/smalldagger% \fi% }% }% }% }% \fi% } \long\def\light@side#1{% \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \baselineskip=0pt% \lineskip=2pt% \parindent=0pt% \def\baselinestretch{0}% \setbox\@badgebox=\vbox{% \centering% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\badgewidth% \vskip\whitespace% \@daggerbackground% \lefttop \hfill \righttop \vfil {#1} \leftbottom \hfill \rightbottom \vskip\whitespace% }% \@badgedimen\ht\@badgebox% \advance\@badgedimen\dp\@badgebox% \ifdim\@badgedimen>\badgeheight% \badgeheight\@badgedimen% \typeout{! badge oversized}% \fi% \fbox{\vbox to\badgeheight{\unvbox\@badgebox}}% \endgroup% } \long\def\dark@side#1{% \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \baselineskip=0pt% \lineskip=1pt% \parindent=0pt% \def\baselinestretch{0}% \setbox\@badgebox=\vbox{% \centering% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\badgewidth% \vskip\whitespace \lefttop \hfill \righttop \vfil {#1} \leftbottom \hfill \rightbottom \vskip\whitespace% }% \@badgedimen\ht\@badgebox% \advance\@badgedimen\dp\@badgebox% \ifdim\@badgedimen>\badgeheight% \badgeheight\@badgedimen% \typeout{! badge oversized}% \fi% \fbox{% \colorbox{badgeback}{% \color{white}% \vbox to\badgeheight{\unvbox\@badgebox}% }% }% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{deathreports}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: deathreports option (internal) %% %% Commands provided: %% \deathreport %% %%%%% \gdef\mytype{Death Reports (internal)} %%%%% %% \deathreport -> meant to be back side of statcard or skillcard \newdimen\death@height \newdimen\death@width \newcommand{\deathreport}{% \vtop to \death@height{% \baselineskip=20pt plus1fil minus1fil% \lineskip=0pt% \parindent=0pt% \def\baselinestretch{0}% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\death@width% \vskip\whitespace% {\large\bfseries Death Report}\break When: \hrulefill\break Where: \hrulefill\break How: \hrulefill\break By Whom: \hrulefill\break Why (if you know): \hrulefill\break \null\hrulefill \vskip\whitespace% }% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{statcards}{deathreports}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% Commands provided: %% \StatCard{name}{\stat{name}{abbrev}{value} commands} %% %%%%% \DoubleCards\DoubleSiding\NoFill \gdef\mytype{Statcards} %%%%% %% Char macros produce stat cards \@bycharmappings{% \ifstats% \begingroup% \long\def\@setsubowner##1##2{##2}% \long\def\@transownersetsubowner##1##2{##2}% \StatCard{\@contact}{\@flatten@field{Stat}\MYstats}% \endgroup% \fi% } \def\@compendium{\@production} %%%%% %% \statcardheight and \statcard width are the total height and %% width, including the frame. %% \whitespace is the spacing around the inside of the frame. \newdimen\statcardwidth \statcardwidth = 3.2in \newdimen\statcardheight \statcardheight = 2in \newdimen\whitespace \whitespace = 10pt %%%%% %% standard parts of statcards \def\lefttop{Stat Card} \def\righttop{Not Transferable} \def\leftbottom{\mbox{\gamenameabbrev}} \def\rightbottom{\mbox{\gamedateabbrev}} \def\familydefault{\sfdefault} %%%%% %% set \death@height and \death@width \death@height\statcardheight \death@width\statcardwidth %%%%% %% \StatCard{name}{\stat{name}{abbrev}{value} commands} \newbox\temp@box \newbox\stats@box \newdimen\temp@dimen \newdimen\stats@height \newcommand{\StatCard}[2]{% \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \lineskip=0pt% \baselineskip=0pt% \parindent=0pt% \def\baselinestretch{0}% \setbox\temp@box=\vbox{% \small\lefttop\hfill\righttop \vskip1.5\whitespace {\normalsize\bfseries#1} \vskip2\whitespace \leftbottom\hfill\rightbottom% }% \stats@height\statcardheight% \advance\stats@height-\ht\temp@box% \advance\stats@height-\dp\temp@box% \setbox\temp@box=\vbox{% \temp@dimen\statcardwidth% \advance\temp@dimen-.5\temp@dimen% \advance\temp@dimen-3\whitespace% \BRANCHTYPES{Stat}{% \SURFACEMAP{\TYPE}{% \global\setbox\stats@box=\vbox{% \unvbox\stats@box% \vfill% \hrule height2pt width0pt% \hbox to\temp@dimen{% \setbox\temp@box=\hbox{\bfseries\MYabbrev:}% \advance\temp@dimen-\wd\temp@box% \advance\temp@dimen-.5\whitespace% \box\temp@box\hfill% \parbox[t]{\temp@dimen}{\raggedleft\MYvalue}}% \hrule height2pt width0pt% \vfill% }% }% }% \scriptsize\baselineskip0pt\lineskip0pt% \global\setbox\stats@box=\vbox{}% #2% }% \global\setbox\temp@box\null% \temp@dimen\ht\stats@box% \advance\temp@dimen\dp\stats@box% \ifdim\temp@dimen>\stats@height% \global\setbox\stats@box=\hbox{% \splittopskip0pt plus1fill% \setbox\temp@box\vsplit\stats@box to.5\temp@dimen% \temp@dimen\ht\temp@box% \advance\temp@dimen\dp\temp@box% \ifdim\temp@dimen>\stats@height% \stats@height\temp@dimen% \fi% \temp@dimen\ht\stats@box% \advance\temp@dimen\dp\stats@box% \ifdim\temp@dimen>\stats@height% \stats@height\temp@dimen% \fi% \hfill% \vbox to\stats@height{\unvbox\temp@box\vfill}% \hfill% \vrule width.2pt% \hfill% \vbox to\stats@height{\unvbox\stats@box}% \hfill% }% \else% \global\setbox\stats@box=\hbox{% \vbox to\stats@height{\unvbox\stats@box}% }% \fi% \setbox\temp@box=\vbox{% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\statcardwidth% \vskip\whitespace \small\lefttop\hfill\righttop \vskip.5\whitespace\vfill {\normalsize\bfseries#1}\break \vskip.5\whitespace\vfill \unhbox\stats@box\break% \vskip.5\whitespace\vfill \leftbottom\hfill\rightbottom \vskip\whitespace% }% \temp@dimen\ht\temp@box% \advance\temp@dimen\dp\temp@box% \ifdim\temp@dimen>\statcardheight% \statcardheight\temp@dimen% \typeout{! statcard oversized} \fi% \doublecard{% \fbox{\vbox to\statcardheight{\unvbox\temp@box}}% }{\deathreport}% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{skilllists}{deathreports}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Uses: cardsheet option %% %% %%%%% \DoubleCards\DoubleSiding \MarginsXY{15pt}{15pt}\NoFill \gdef\mytype{Skill List Cards} %%%%% %% \@bycharmappings{% \ifskills% \begingroup% \long\def\@setsubowner##1##2{##2}% \long\def\@transownersetsubowner##1##2{##2}% \SkillList{% \MYname% }{% \@flatten@field{Stat}\MYstats% }{% \@flatten@field{Abil}\MYskills% }% \endgroup% \fi% } \def\@compendium{\@production} %%%%% %% \newdimen\skillheight \skillheight = 3.1in \newdimen\skillwidth \skillwidth = 3.6in \newdimen\whitespace \whitespace = 10pt \def\familydefault{\sfdefault} %%%%% %% \def\skill@type{Skill List Card} \def\skill@trans{Not Transferable} \def\skill@owner{\ifx\@transowner\empty\myowner\else\mysubowner\fi} %%%%% %% set \death@height and \death@width \death@height\skillheight \death@width\skillwidth %%%%% %% \SkillList \newbox\skill@front \newdimen\skill@wd \newdimen\temp@dimen \newcommand{\SkillList}[3]{% \begingroup% \fboxsep=0pt% \fboxrule=.3pt% \baselineskip=0pt% \lineskip=0pt% \parindent=0pt% \def\baselinstretch{0}% \skill@wd=\skillwidth% \advance\skill@wd by-2\whitespace% \setbox\skill@front=\vbox{% \leftskip=\whitespace plus1fil% \rightskip=\whitespace plus1fil% \hsize=\skillwidth% \vskip\whitespace {\small\skill@type\hfill\skill@owner}\break \vfil {\bfseries\small{#1}}\break \vfil \parbox{\skill@wd}{% \scriptsize\raggedright% \parindent5pt% \begin{skilllist}% \BRANCHTYPES{Stat}{% \SURFACEMAP{\TYPE}{% \item\makebox[1.3in]{\MYname:\hfill\MYvalue}% }% }% \multicolsep\lineskip\relax% \begin{multicols}{2}\raggedcolumns#2\end{multicols}% #3% \end{skilllist}% }% \break \vskip\whitespace\vfil {\small\gamenameabbrev/\gamedateabbrev\hfill\skill@trans}% \vskip\whitespace% }% \temp@dimen\ht\skill@front% \advance\temp@dimen\dp\skill@front% \ifdim\temp@dimen>\skillheight% \skillheight\temp@dimen% \typeout{! skill list card oversized}% \fi% \doublecard{% \fbox{\vbox to\skillheight{\unvbox\skill@front}}% }{\deathreport}% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{boxlabels}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \DoubleCards\DoubleSiding \MarginsXY{20pt}{0pt} \NoFill \gdef\mytype{Box Labels} \def\boxbyplayer{% \def\@boxmap{\iflabel\BoxLabel{\MYplayer}\fi}% \@bycharmappings{\@boxmap}% \def\@production{% \@preprocids{\EVERY{Char}{}\EVERY{Place}{}\EVERY{Player}{\@fakeplayer}}% \SORT{Char}{alpha<}{\playeralphabetical}{\@charids}{% \@givennoplayer{\@boxmap}% }% \@degenerateids\boxlabel{GMs}% }% } \def\boxbycharacter{% \def\@boxmap{% \iflabel% \BoxLabel{% \MYname% \ifx\@degenerate\relax% \unless\ifx\MYplayer\empty% \\(\MYplayer)% \fi% \fi% }% \fi% }% \@bycharmappings{\@boxmap}% \def\@production{% \@preprocids{\EVERY{Char}{}\EVERY{Place}{}}% \SORT{Char}{alpha<}{\alphabetical}{\@charids}{\@boxmap}% \@degenerateids\boxlabel{GMs}% }% } \theboxpref \def\@compendium{\@production} %%%%% %% \@setowner doesn't do anything here \compactcards %%%%% %% \long\def\beginpunt#1\endpunt{#1} %%%%% %% \def\BoxLabel#1{% \begingroup% \def\@bl@box{\parbox{.45\hsize}{\centering\small\bfseries\sffamily#1}}% \doublecard{% \vbox to.4in{% \hsize3.75in% \vfill% \hbox to\hsize{\hfill\@bl@box\hfill\hfill\@bl@box\hfill}% \vfill% \hrule% }% }{}% \endgroup% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \DeclareGameSubOption{cheatsheet}{cardsheet}{% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%% \SingleCards\DoubleSiding\NoFill \MarginsXY{10pt}{10pt} \Atflushpage{} \gdef\mytype{GM-only Cheatsheet} %%%%% %% headers \lhead{\raisebox{.1in}[0pt][0pt]{\small\mytype\ / \myowner}} \rhead{\raisebox{.1in}[0pt][0pt]{\small\gamename\ / \gamedateabbrev}} %%%%% %% \def\familydefault{\sfdefault} %%%%% %% \def\@production{% \@setowner{PCs}\EVERY{PC}{}% \@setowner{NPCs}\EVERY{NPC}{}% \@setowner{Places}\EVERY{Place}{}% } \def\@compendium{\@production} \def\@cheatfields{% \def\@i##1##2{% \unless\ifx##1\empty% \@cheatmark{\em##2}: {\let\par\empty##1}% \fi% }% \@ownedfields% } \def\@cheatnotempty#1#2{\unless\ifx#1\empty\@cheatmark{\em#2}: #1\fi} \def\@cheatid#1#2{% \let\@cheattmp\MYname% #1{% \unless\ifx\MYname\@cheattmp% \@cheatmark{\em#2}: \MYname% \fi% }% } \def\@cheatmark{\item} \BRANCHTYPES{Char}{% \SURFACEMAP{\TYPE}{% \gettags% \CheatsheetEntry{% \MYname% \unless\ifx\MYplayer\empty% \ (\MYplayer)% \fi% \unless\ifx\MYnumber\empty% \ (\MYnumber)% \fi% \unless\ifx\MYfile\empty% \ \MYfile% \fi% }{% \@cheatid\real{real name} \@cheatid\nick{nickname} \@cheatid\maiden{maiden name} \@cheatnotempty\MYdesc{desc} \@cheatnotempty\MYwrapup{wrapup} \BRANCHTYPES{Stat}{% \SURFACEMAP{\TYPE}{% \emph{\MYabbrev}:~\MYvalue\hspace{1em}% }% }% \unless\ifx\MYstats\empty% \@cheatmark\MYstats% \fi% \long\def\doid#1{#1}% \@cheatfields% }% }% } \BRANCHTYPES{Place}{% \SURFACEMAP{\TYPE}{% \CheatsheetEntry{% \MYname% }{% \@cheatnotempty\MYnumber{number} \@cheatnotempty\MYwhere{where} \@cheatnotempty\MYwhen{when} \long\def\doid#1{#1} \@cheatfields% }% }% } \def\@subownercheatsheet#1{% \uniquemark% \begingroup% \ifx\@cheatmark\ME% \typeout{% ! \expandafter\unexpanded\expandafter{\ME{}} repeated within itself (ignored)% }% \else% \ADD{\let\@cheatmark\ME}% #1% \@testfields% \ifx\@owner\relax% \let\@cheatmark\empty% \let\par\empty% \ \textbf{(}% \@cheatfields% \hskip-1em\textbf{)}% \fi% \hskip1em% \ADD{\let\@cheatmark\relax}% \fi% \endgroup% } \BRANCHTYPES{SubOwner}{% \MAP{\TYPE}{% \@subownercheatsheet{% \MYname% \unless\ifx\MYnumber\empty% \ (\MYnumber)% \fi% }% }% } \def\@testloc{\mylocation} \BRANCHTYPES{Sign}{% \MAP{\TYPE}{% \@subownercheatsheet{% \MYname\unless\ifx\MYnumber\empty\ (\MYnumber)\fi% \unless\ifx\MYloc\@testloc% \unless\ifx\MYloc\empty% \ \textbf{(\MYloc)}% \fi% \fi% }% }% } %%%%% %% \long\def\CheatsheetEntry#1#2{% \card{% \parbox{186pt}{% \raggedright% \scriptsize% \begin{itemz}[#1]% %% list functionality \long\def\multi##1##2{% \ifnum##1>1% \ensuremath{\mathbf{##1\times}}% \fi% \ifnum##1>0\relax% ##2% \fi% }% \makenochange% \long\def\raw##1{{\em raw code}\hskip1em}% \long\def\pageof##1{page\ensuremath{\mathbf{\times}}##1}% %% if no \items, produce \item none \global\let\@itemzhere\empty% \let\@normitem\item% \def\item{\global\let\@itemzhere\relax\@normitem\relax}% #2% \let\item\@normitem% \ifx\@itemzhere\empty% \item none% \fi% \end{itemz} }% }% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } \begingroup% \catcode`[=1 \catcode`]=2 \catcode`{=12 \catcode`}=12 \gdef\@openbrace[{]% \gdef\@closebrace[}]% \endgroup \DeclareGameOption{json}{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% %%%%% \pagestyle{empty} \def\@production{\EVERY{Owner}[\DEFAULTOPTIONHOOK]{}} \def\@compendium{\@production} \newwrite\@outfile \long\def\@writeout#1{% \begingroup% \let\protect\@unexpandable@protect% \immediate\write\@outfile{#1}% \endgroup% } \def\@@strip#1{} \def\@strip{\expandafter\@@strip\string} \gdef\@firstjson{} \BRANCHTYPES{Owner}{% \MAP{\TYPE}{% \ifx\@firstjson\empty% \@writeout{ \@openbrace}% \gdef\@firstjson{\relax}% \else% \@writeout{ \@closebrace,\@openbrace}% \fi% \edef\@macro{\expandafter\@strip\MYCOMMAND}% \def\@types{"\MYTYPESTRING"}% \PARENTTYPES{\MYTYPESTRING}{\edef\@types{\@types,"\TYPE"}}% \jsonkeyval{macro}{\@macro}% \jsonkeyval{name}{\MYname}% \jsonkeyval{number}{\MYnumber}% \unless\ifx\MYjson\empty% \@writeout{ \space\MYjson}% \fi% \@writeout{ \space"classes":[\@types]}% }% } \immediate\openout\@outfile=\jobname.json \@writeout{[} \AtEndDocument{% \@writeout{ \@closebrace}% \@writeout{]}% \immediate\closeout\@outfile% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% } %%%%% %% %% Here the GemeTeX options are porcessed, the given option is loaded, %% and the base class and options are loaded. This finishes this %% file. %% %%%%% %%%%% %% Here is code that checks if \BASECLASS is defined before the %% \documentclass command. If it isn't, it defaults to article. See %% Extras/README-class. \unless\ifdefined\BASECLASS \def\BASECLASS{article} \fi %%%%% %% Finishing up the setup for the class. \ProcessOptions*\relax \ProcessGameOptions %% Load \BASECLASS with \BASEOPTIONS \ifdefined\BASEOPTIONS \PassOptionsToClass{\BASEOPTIONS}{\BASECLASS} \fi \LoadClass{\BASECLASS} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%