% simpsons.tex -- macros for using the Simpsons font. % % by Raymond Chen (rjc@math.princeton.edu) % % You say \Lisa, \Homer, \Bart, or \Marge to typeset the corresponding % character. The default is to draw the character facing to the right % and looking directly at you. To modify this, you can do the following: % % Prefix the csname \Left to get the character face left instead of right. % E.g., \Left\Lisa % % Prefix the csname \Goofy and suffix two pairs of coordinates, which % modify how the pupils are drawn. E.g., \Goofy\Lisa(7,5)(5,5) % The first pair of coordinates is applied to the right pupil (which % is the one on the left when printed) and the second pair to the left % pupil. The units are relative to the size of the character. % (So if you say ``\font\simpsons=simpsons scaled 1200'' you don't have % to modify all the coordinates in the \Goofy's.) % % If you prefix \Goofy\Left, then the mirror-image-reversal takes place % <> the goofiness is applied. This is so that you can just say % \Goofy\Left\Lisa(7,5)(5,5) to get a mirror image of \Goofy\Lisa(7,5)(5,5). % % Sample goofinesses: % % \Goofy\Lisa(7,5)(5,5) % \Goofy\Homer(6,4)(4,4) % \let\ifGoofy=\iffalse \def\Goofy{\let\ifGoofy\iftrue} \def\unGoofy{\let\ifGoofy\iffalse} \let\ifLeft=\iffalse \def\Left {\let\ifLeft \iftrue} \def\unLeft {\let\ifLeft \iffalse} \font\simpsons=simpsons \nopagenumbers \count255=\catcode`\@ % save the old catcode \catcode`\@=11 % \Simps@nEyeball % % On entry: % \count@ points to the first fontdimen for the current character % \box0 contains the character being typeset (used only if Left) % % Uses: \dimen@ for scratch computations % % Pseudocode: % % If left: \dimen@ = \wd0 - first fontdimen % If right: \dimen@ = first fontdimen % % Advance \count@ to the second fontdimen (must do now, outside a group) % % Build a zero-width box containing { % If left: \dimen@ = \dimen@ - #1ex % If right: \dimen@ = \dimen@ + #1ex % Move right \dimen@ % % \dimen@ = second fontdimen + #2ex % Move up \dimen@ % Place the eyeball % } % Advance \count@ to the next fontdimen (ready for next iteration) % % But note that the ``If left: ... If right: ...'' stuff is done % extraordinarily dastardlyly. \def\Simps@nEyeball(#1,#2){% \dimen@ \ifLeft \wd\z@ \advance\dimen@-\fi \fontdimen\count@\simpsons \advance\count@\@ne \hbox to\z@{\advance\dimen@\ifLeft-\fi#1ex \kern\dimen@ \dimen@\fontdimen\count@\simpsons \advance\dimen@#2ex \raise\dimen@\hbox{\char0}\hss}% \advance\count@\@ne} % \doSimpson % % Uses: All register usage is localized to a group. % % Pseudocode: % % \leavevmode, in case we were in vertical mode % Begin a group % Switch to simpsons font. % Set \count@ = 2 * #1 % Set \box0 to \char\count@ (or \char(\count@+1) if left) % Set \count@ = 4 + 4 * #1 % \Simps@nEyeball the right eyeball % \Simps@nEyeball the left eyeball % Emit \box0 % End the group % Reset \Goofy and \Left \def\doSimpson#1(#2,#3)(#4,#5){\leavevmode {\simpsons \count@=#1% \advance\count@\count@ \setbox\z@=\hbox{\ifLeft\advance\count@\@ne\fi \char\count@}% \advance\count@\tw@ \multiply\count@\tw@ \Simps@nEyeball(#2,#3)% \Simps@nEyeball(#4,#5)% \box\z@}\unGoofy\unLeft} \def\Simpson{\ifGoofy\let\next\doSimpson\else\let\next\normalSimpson\fi\next} \def\normalSimpson#1{\doSimpson#1(0,0)(0,0)} \chardef\f@ur=4 \chardef\f@ve=5 \chardef\s@x=6 \def\Lisa{\Simpson\@ne} \def\Homer{\Simpson\tw@} \def\Bart{\Simpson\thr@@} \def\Marge{\Simpson\f@ur} \def\Maggie{\Simpson\f@ve} \def\Burns{\Simpson\s@x} \def\SNPP{{\simpsons\@ne}} \catcode`\@=\count255 % restore the catcode