% \iffalse % (This is a META-COMMENT.) % % This is file `halloweenmath.dtx'. % % This file is part of a work named "halloweenmath package". % % Copyright (C) 2019 by Gustavo MEZZETTI. % % This file may be distributed and/or modified under the conditions % of the LaTeX Project Public License, either version 1.3 of this % license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % The halloweenmath package has the LPPL maintenance status % "author-maintained". % % The file `manifest.txt' that comes along with this file specifies what the % halloweenmath package consists of; more precisely, it explains how the % locutions "Work" and "Compiled Work", used in the LaTeX Project Public % License, are to be interpreted in the case of this work. % % Note that the distribution of this file alone is "distribution of % only part of the Work" in the sense of the LaTeX Project Public % License, and should be avoided (see the LaTeX Project Public % Licence for details). % % (End of the META-COMMENT.) % \fi % % \def\filename{halloweenmath.dtx} % \def\fileversion{0.11} % \def\filedate{2019/11/01} % \def\docdate {2019/11/01} % \def\doclongdate{November~1, 2019} % % \CheckSum{2262} % % \changes{0.01}{2017 Jan 06}{First writing of the code} % \changes{0.10}{2017 Apr 16}{Changed the look of the broom in the extensible % ``arrow-like'' symbols, but retained the old one in newly added pitchforks} % \changes{0.10}{2017 Apr 16}{Added bats (ordinary symbols and extensible % ``arrow-like'' series)} % \changes{0.10}{2017 Apr 16}{Added skulls (binary operators and ``large'' % operators)} % \changes{0.10}{2017 Apr 16}{Added ``unwitched'' extensible brooms and % pitchforks} % \changes{0.10}{2017 Apr 16}{Added ``Boo'' options} % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % % \MakeShortVerb{\"} % \DeleteShortVerb{\|} % % \DoNotIndex{\begin,\end,\def,\let,\else,\fi,\@ifdefinable,\@empty} % \DoNotIndex{\newcommand,\renewcommand} % \DoNotIndex{\newenvironment,\renewenvironment} % \DoNotIndex{\z@,\z@skip,\p@,\@ne,\tw@,\thr@@,\@m,\@M,\m@ne} % \DoNotIndex{\setlength,\setcounter,\addtolength} % \DoNotIndex{\expandafter,\do,\relax,\advance,\multiply,\divide} % \DoNotIndex{\DeclareOption,\ExecuteOptions,\ProcessOptions} % \DoNotIndex{\",\.,\@} % \DoNotIndex{\-,\+} % % \IndexPrologue{ % \section{\indexname} % Numbers in italics refer to the page where the corresponding entry % is described, the ones underlined to the code line of the % definition, the rest to the code lines where the entry is used. % } % \setcounter{IndexColumns}{2} % % \GlossaryPrologue{\section{Change History}} % % \setcounter{StandardModuleDepth}{1} % % \setlength{\unitlength}{1cm} % \definecolor{guidelines}{rgb}{0,.5,1} % \definecolor{coverwitch}{rgb}{.1,.4,.5} % % \newcommand*{\DS}{\textsf{DocStrip}} % \newcommand*{\TikZ}{Ti\emph{k}Z} % \renewcommand*{\partname}{Part} % \newcommand*{\halloweenmath}{halloweenmath} % \newcommand*{\amsmath}{amsmath} % \newcommand*{\picttwoe}{pict2e} % \newcommand*{\textoken}[1]{\(\langle\mbox{\normalfont #1}\rangle\)} % \makeatletter % \newcommand*{\myspecialindex}[2] % {\special@index{#1\actualchar#2\encapchar main}} % \newcounter{paramlist} % \renewcommand*{\theparamlist}{^^A % \ifnum \value{paramlist}>\z@ % \ifnum \value{paramlist}<10 % \arabic{paramlist}^^A % \else % \@ctrerr % \fi % \fi % } % \newenvironment*{paramlist}{^^A % \setcounter{paramlist}\z@ % \@beginparpenalty \@M \relax % \setlength\topsep{\z@}^^A % \tabbing % \(\mbox{\#0}\leftarrow {\,}\)\=\kill % }{^^A % \endtabbing % } % \newcommand*{\param}{^^A % \stepcounter{paramlist}^^A % \(\mbox{\#\theparamlist}\leftarrow{}\)\>^^A % } % \newenvironment*{tightitemize}{^^A % \itemize % \setlength\topsep{\p@ \@plus\p@}^^A % \setlength\partopsep{\z@}^^A % \setlength\itemsep{\p@}^^A % \setlength\parsep{\z@ \@plus\p@}^^A % \setlength\parskip{\parsep}^^A % \setlength\@topsepadd{\topsep}^^A % \setlength\@topsep{\@topsepadd}^^A % }{\enditemize} % \newcommand{\@no@imp@StopEventually}[1]{#1\endinput} % \newcommand*{\IfImplementation}{% % \ifx \StopEventually \@no@imp@StopEventually % \expandafter\@secondoftwo % \else % \expandafter\@firstoftwo % \fi % } % \makeatother % \newcommand*{\counterindex}[1]{\myspecialindex{#1}{{\string\ttfamily % \space #1} (counter)}\index{counters:\levelchar{\protect\ttfamily % #1}\encapchar usage}} % \newcommand*{\optuseindex}[1]{\SortIndex{#1}{\protect\opt{#1} % (option)\encapchar usage}\index{options:\levelchar % \protect\opt{#1}\encapchar usage}} % ^^A REMEMBER: "\DeclareTextFontCommand" can be used only in preamble! % \DeclareRobustCommand*{\packlass}[1]{{\normalfont\sffamily #1}} % \DeclareRobustCommand*{\filedir} [1]{{\normalfont\ttfamily #1}} % \DeclareRobustCommand*{\env}[1]{{\normalfont\ttfamily #1}} % ^^A \DeclareRobustCommand*{\ctr}[]{{\normalfont\ttfamily #1}} % \DeclareRobustCommand*{\opt}[1]{{\normalfont\ttfamily #1}} % \newcommand*{\sopt}[1]{\mbox{\opt{#1}}\optuseindex{#1}} % \newcommand*{\binvert}{\mathbin{|}} % \DeclareRobustCommand*{\TeXSXFullName}{^^A % \TeX \kern .13333em --\,\LaTeX\ Stack Exchange^^A % } % \DeclareRobustCommand*{\TeXSXAbbrev}{\TeX.SX\@} % \DeclareRobustCommand*{\TeXSXuser}[1]{{\normalfont\sffamily #1}} % \DeclareRobustCommand*{\TeXtok}[1]{\mbox{$\langle$#1\/$\rangle$}} % \newcommand*{\cfr}{\TeXSXuser{cfr}} % \newcommand*{\eg}{\emph{e.g.}, } ^^A note the space at the end % % \providecommand*{\href}[3][]{#3} % \providecommand*{\pdfbookmark}[3][]{} % \providecommand*{\nolinkurl}[1]{\url{#1}} ^^A if hyperref isn't loades, % ^^A hand over to url package % \providecommand*{\hypersetup}{} % % \addtolength{\marginparwidth}{2pt} % % \newcommand*{\magicstar}[1]{^^A % \begingroup % \setlength\unitlength{#1\unitlength}^^A % \begin{picture}(0,0)^^A % \polygon*(0,1)(-.225,.309)(-.951,.309)(-.363,-.118)(-.588,-.809)^^A % (0,-.382)(.588,-.809)(.363,-.118)(.951,.309)(.225,.309)^^A % \end{picture}^^A % \endgroup % } % % % % \title{ % The \packlass{\halloweenmath} package:\\ % scary and creepy math symbols\\ % with \texorpdfstring{\hologo{AmSLaTeX}}{AMS-LaTeX}\ % integration\thanks{This file has % version~\fileversion, release date \filedate; % last documentation update: \docdate. % Copyright \copyright~2019 by G.~Mezzetti % (see page~\pageref{S:Copy}).} % } % \author{G. Mezzetti} % \date{\doclongdate} % % \hypersetup{ % pdftitle = {The halloweenmath package: % scary and creepy math symbols % with AMS-LaTeX integration}, % pdfauthor = {G. Mezzetti}, % pdfsubject = {Documentation of the halloweenmath package}, % pdfkeywords = {Halloween, math, scary mathematical symbols}, % pdfcreationdate = {D:20191101120000}, % pdfmoddate = {D:20191101120000}, % bookmarksopen, % bookmarksopenlevel = 1 % } % % \pdfbookmark[0]{Front Matter}{FrontMatter} % \maketitle % % \begin{abstract} % This document describes a \LaTeX\ package that originates from a question % asked for enjoyment on % \href{https://tex.stackexchange.com/}{\emph{\TeXSXFullName}} % (see~\cite{bib:cfr}) by the user % \href{https://tex.stackexchange.com/users/39222/cfr}{\cfr}; this package % defines a handful of commands for typesetting mathematical symbols of % various kinds (including ``large'' operators, extensible arrow-like % relations, and growing arrow-like math accents) that all draw from the % classic Halloween-related iconography (pumpkins, witches, ghosts, cats, and % so on) while being, at the same time, seamlessly integrated within the rest % of the mathematics produced by \hologo{LaTeX}\slash\hologo{AmSLaTeX}. % \end{abstract} % % \vfil % % \begin{center} % \color{coverwitch} % \begin{picture}(0,8)(0,-4) % \roundcap % \linethickness{4pt} % \Line(-2,-2)(6,2) % \linethickness{2pt} % \Line(-2,-2)(-5,-2.5) % \Line(-2,-2)(-4.85,-2.95) % \Line(-2,-2)(-4.6,-3.3) % \Line(-2,-2)(-4.35,-3.65) % \Line(-2,-2)(-4,-4) % \put(-3,-1.2){\magicstar{.4}} % \put(-4.1,-.8){\magicstar{.8}} % \put(-5.4,-1.8){\magicstar{.6}} % \Line(0,1.8)(-.2,1.4) % \polyline(.6,3.2)(.8,3)(1.5,3) % \put(1.6,3){\oval(.2,.2)[tl]} % \put(1.6,3){\oval(.2,.2)[r]} % \polyline(1.6,2.9)(1.8,2.4)(1.2,2.4)(1,2.5)(1,2.3) % (1.2,2)(1.6,1.8)(1.7,1.8)(1.7,1.6)(1.4,1.5) % (0,1.8)(-.2,2) % \Line(.2,2.8)(.6,3) % \polygon*(-1,2)(-2,0)(-2,-1)(-1.5,-2)(1,-2) % (0,-3.6)(.4,-3.8)(.6,-3.4)(.8,-4)(2,-4) % (1,-3.6)(1,-3)(1.6,-3.2)(2,-1.5)(0,-1) % (0,-.6)(1.4,-.6)(1.8,-.4)(2,0)(0,0) % (0,1.4) % \polygon*(-3,2)(-2.8,3)(-2,4)(-1.5,4.1)(-1,4)(0,3.5) % (1,3.8)(2.5,3.5)(3,3.3)(2,3.4)(0,3)(-1,2)(-2,1.6) % (-2.7,2)(-2,2)(-1,3)(-2,3.5)(-2.6,3) % \linethickness{.4pt} % \Line(1.7,1.6)(2,1.6) % \Line(1.7,1.6)(1.9,1.4) % \Line(1.7,1.6)(1.7,1.3) % ^^A % ^^A The cat: % \put(3.6,1){\circle*{1.2}} % \put(4.2,1.4){\circle*{1}} % \put(4.5,2){\circle*{.8}} % \polygon*(4.1,2)(4.1,2.5)(4.5,2.2)(4.9,2.5)(4.9,2) % \linethickness{4pt} % \cbezier(3.2,.6)(2,0)(4.2,-.4)(3,-1) % \buttcap % \linethickness{.4pt} % \Line(3.8,2.1)(5.2,1.9) % \Line(3.8,2)(5.2,2) % \Line(3.8,1.9)(5.2,2.1) % \end{picture} % \end{center} % % \newpage % \tableofcontents % \IfImplementation{\listoffigures}{} % % \newpage % \begingroup % % \setlength{\parskip}{\medskipamount} % \setlength{\parindent}{0pt} % % \section*{Copyright notice} % \label{S:Copy} % \vspace{-\parskip} % % Copyright \copyright~2019 by Gustavo \textsc{Mezzetti}. % All rights are reserved, except as noted below. % % This document has been produced by feeding to a \LaTeX\ typesetting engine % the file \filedir{\filename} version \fileversion\ (\docdate). This file % is part of a work named ``\packlass{\halloweenmath} package'', and may be % distributed and/or modified only as a part thereof. % Subsection~\ref{sS:License} on page~\pageref{sS:License} explains the % conditions under which the \packlass{\halloweenmath} package may be % distributed and/or modified. % % The \packlass{\halloweenmath} package has the following LPPL maintenance % status:\\ % ``author-maintained''. % % Permission is granted to make new printed copies of this document, by any % means (\emph{e.g.}, photocopying, direct printing from the electronic % version, and so on). % % Note, though, that distribution of this document alone is ``distribution of % only part of the Work'' in the sense of the \LaTeX\ Project Public License, % and should therefore be avoided: please distribute, in addition, the source % file \filedir{\halloweenmath.dtx} together with all other files listed in % \filedir{manifest.txt}, as explained as well in Subsection~\ref{sS:License} % and in the file \filedir{manifest.txt} itself. % % \section*{Author's addresses} % \label{S:MyAddresses} % \vspace{-\parskip} % % The recommended way to contact the author is by e-mail; his address is: % % \begin{list}{\setlength{\topsep}{0pt}}\item\relax % gustavo dot mezzetti at istruzione dot it % \end{list} % % Please include the \emph{exact} phrase \verb*|halloweenmath package| in the % \emph{subject} of your message; otherwise, your message could be % thrown away by a mail filter. In this regard, the weakness of the % laws concerning the protection of privacy forces me to explicitly % forbid the use of the above address for any kind of advertising, % marketing, polling, or similar commercial or statistical contact. % % If you have no e-mail access, write to: % % \begin{list}{\setlength{\topsep}{0pt}}\item\relax % Gustavo \textsc{Mezzetti}\\ % L.~S.~U. ``A.~di Savoia Duca d'Aosta''\\ % Via del Santo, 57\\ % I--35123\quad PADOVA\quad PD\\ % Italy % \end{list} % % \endgroup % % % % \setcounter{secnumdepth}{0} % % % % \clearpage % \section{Introduction} % % On October~31, 2016, around 3 in the morning (GMT\@), user % \href{https://tex.stackexchange.com/users/39222/cfr}{\cfr} asked a % question~\cite{bib:cfr} on the % \href{https://tex.stackexchange.com/}{\emph{\TeXSXFullName} network}, % challenging other users to contribute \LaTeX\ documents that showcased % ``the spookiest, creepiest images'' ever possible. I~was aware of a % method---well known, nonetheless---to integrate arbitrary pictures into % math formulas as though they were mathematical symbols, so, on the pretext % ``that, since \hologo{(La)TeX} is a language primarily designed to handle % text with math, the lack of a `math-flavored' % answer~\ldots\linebreak[0]\,was a gap that ought to be filled'', I~wrote an % answer implementing a command that drew a (not particularly spooky or % creepy) little witch astride of her broom, but with the silly distinctive % feature of being seen by \LaTeX\ as a mathematical ``large'' operator like % "\sum", "\prod", "\int", or "\bigcup"; this first command was named % "\mathwitch" and was ``intended for denoting the operation of applying % black magic to the ensuing subformula''. % % I~subsequently added an extensible math accent similar to % "\overrightarrow", but with the arrow replaced by a broom carrying the same % witch and a black cat, and my answer ended up winning the contest (the % presence of the cat turned out to be a decisive factor); besides, some % users were so enthusiast of the new commands that they requested that they % were re-implemented as a new, stand-alone package. Well, here it is. % % In the writing of the package, more features, and creatures, have been % added. Also available now are: % \begin{itemize} % \item % ghosts, both still and hovering (or, if you prefer, acting both as ordinary % symbols and as math accents similar to "\overrightarrow"); % \item % a "\pumpkin" binary operator, with an associated ``large'' operator named % "\bigpumpkin"\footnote{\cs{greatpumpkin} is available as a synonym, in % homage to Linus van Pelt.} (cf.~"\cup" vs.\ "\bigcup", "\cap" vs.\ % "\bigcap", "\vee" vs.\ "\bigvee", "\oplus" vs.\ "\bigoplus",\,\ldots); % \item % extensible ``arrow-like'' brooms that act as relation symbols; % \item % clouds, for denoting unscrutable subformulas (this one is even sensible!); % \item % fluttering bats, skulls, and more. % \end{itemize} % All the above are available for the \texttt{bold} math version as well as % for the \texttt{normal} one. % The symbols provided should prove sufficient for preparing lecture notes, % slides, tests, or even exams to amuse~(?\@) your students with during the % Halloween period. Of course, any suggestion for additions and/or % improvements are most welcome: you can find my addresses on % page~\pageref{S:MyAddresses}. % % As for the name of this new package, \cfr\ initially % \href{https://tex.stackexchange.com/questions/336768/seasonal-challenge-contributions-from-texing-dead-welcome#comment828307_337719}{proposed} % \packlass{mathwitch} (from the name of the main command); % \href{https://tex.stackexchange.com/users/81905/guilherme-zanotelli}{\TeXSXuser{Guilherme % Zanotelli}} then % \href{https://tex.stackexchange.com/questions/336768/seasonal-challenge-contributions-from-texing-dead-welcome#comment828796_337719}{suggested} % \packlass{mathemagics} (a truly befitting pun!); but in the end I~decided % to choose \packlass{\halloweenmath} because (1)~it instantly and clearly % communicates the context in which the package arose, as well as the purpose % for which it was written, and (2)~it is 13~characters long. % % This work is dedicated to \cfr, without whom it would have never seen the % light, and to whom I~am offering it ``as an Epiphany present''---or rather, % as one would say in Italian, ``\emph{come regalo per la Befana}'', where % the last word bears not-so-subtle connections with the world of % witches\ldots\footnote{Indeed, the first version of this package was % released on January~6, 2017.} % % \subsection{Disclaimer} % % Although a \LaTeX\ package is a piece of software that executes in a % rather protected environment and should therefore be relatively % incapable of doing serious damages, no warranty is given, as usual with % computer software, that this code will work properly, or even that it % will work at all. To be on the safe side, be aware that using this % code can even result in loss of data and/or damages to your disks and % your storage media. If you use this code, you do so exclusively at % your own risk! % % See Subsection~\ref{sS:License} and the \LaTeX\ Project Public % Licence for more information. % % \subsection{About this document} % % This document, like many documentation files distributed for \LaTeX, is % divided into two parts. % % The first part, \emph{User's Manual}, contains all the documentation you % need to be able to \emph{use} the \packlass{\halloweenmath} package. Every % user of this package will probably want to read this part. % % The second part, \emph{Implementation}, can be omitted if you % want (explanations on how to omit it are given at the beginning % of the part itself), and contains information that concerns only % ``hackers'' who want to learn how the package that this document % presents is \emph{implemented}. Actually, this part contains the % complete listing of the \LaTeX\ code that implements the macros, % in the usual \DS\ format; if you are not a \LaTeX\ hacker, this % part will probably have little meaning to you. % % In this release too, alas, I~have to ask to be excused for not having % completed the comments in the \emph{Implementation} part. Some~35\% of the % code is still uncommented, and, as I~had already said in the % \emph{Introduction} to version~0.01, at present I~cannot yet make any % reliable guess as to when (or even if!\@) I'll be able to finish the work. % It is precisely for this reason that I~decided to release it in this % incomplete form, to avoid deferring indefinitely the availability of the % new, horrifying features that this version introduces. % % % % \setcounter{secnumdepth}{3} % % % % \clearpage % \part{User's Manual} % % \section{About this part} % % This part tells you how to use the \packlass{\halloweenmath} package. It % also contains detailed instructions on how to install it and how to % generate this same documentation, but normally you need not bother reading % this information, either because your \TeX\ distribution already includes % both the package code and its documentation, or because package % installation is implicitly dealt with by the automatic update mechanism % provided by the distribution itself. % % \section{How to use the \packlass{\halloweenmath} package} % \label{S:Usage} % % This section explains everything you need to know in order to be able to % use the \packlass{\halloweenmath} package. However, to keep this document % independent of the package itself, the output produced by the various % commands is not shown here: for this, you are referred to % \cite{bib:manual}. % % \subsection{Package loading} % % The usual "\usepackage" declaration is used, as in % \begin{verbatim}\usepackage{halloweenmath}\end{verbatim} It should be % noted, however, that the \packlass{\halloweenmath} package requires the % \packlass{\amsmath} package, and loads it (without specifying any option) % if it is not already loaded. If you want to pass options to % \packlass{\amsmath}, load it before \packlass{\halloweenmath}. % % The \packlass{\halloweenmath} package defines no options by itself; % nevertheless, it does honor the [\opt{no}]\opt{sumlimits} options from the % \packlass{\amsmath} package (see below). % % \subsection{Scary symbols} % % This package defines some commands \emph{for use in mathematical mode}, % which provide a handful of symbols, all of which honor the \texttt{bold} % math version, when in force. They can be loosely grouped as follows. % % \subsubsection{Pumpkins} % \label{ssS:Pumpkins} % % \DescribeMacro{\pumpkin} % \DescribeMacro{\bigpumpkin} % \DescribeMacro{\greatpumpkin} % It is even too obvious to begin with pumpinks. In this regard, the package % provides two interrelated commands: % \begin{itemize} % \item % "\pumpkin" yields a binary operator symbol in the shape of a (little) % pumpkin; % \item % "\bigpumpkin" is the ``large'' operator that is to "\pumpkin" as % "\bigoplus" is to "\oplus"; it typesets a somewhat bigger pumpkin in % in-line formulas, which becomes significantly larger in displayed formulas. % \end{itemize} % The [\opt{no}]\opt{sumlimits} options from the \packlass{\amsmath} package % also affect the "\bigpumpkin" command. As a homage to Linus van Pelt, % "\greatpumpkin" is available as a perfect synonym for "\bigpumpkin". % % \subsubsection{Witches, brooms, and black cats} % \label{ssS:Witches} % % All this arose from a witch. % % \DescribeMacro{\mathwitch} \DescribeMacro{\reversemathwich} % The "\mathwitch" command yields a ``large'' operator symbol, similar to % "\sum", representing a witch astride of a broom (in my answers % to~\cite{bib:cfr}, I~claimed that this symbol denotes the operation of % applying black magic to the ensuing subformula, a fundamental operation in % so many mathematical proofs\ldots). There is also a "\reversemathwich" % command, which produces an operator that looks like a mirror image of the % above, for denoting the inverse operation of undoing the black magic. Both % commands honor the [\opt{no}]\opt{sumlimits} options from the % \packlass{\amsmath} package. % % \DescribeMacro{\xrightwitchonbroom} % \DescribeMacro{\xleftwitchonbroom} % Witches infest the field of extensible ``arrow-like'' symbols too: the % commands "\xrightwitchonbroom" and "\xleftwitchonbroom" are syntactically % identical to, \eg "\xrightarrow", but produce an extensible broom with a % witch sitting on it. That is to say, the syntax for "\xrightwitchonbroom" % is as follows % \begin{flushleft} % \cmd{\xrightwitchonbroom}\oarg{under text}\marg{over text} % \end{flushleft} % and "\xleftwitchonbroom" is similar. % % \DescribeMacro{\xrightwitchonpitchfork} % \DescribeMacro{\xleftwitchonpitchfork} % In version~0.01 of this package, the "\x"$\,*\,$"witchonbroom" commands % drew under the witch a ``broom'' that, actually, looked more like a % pitchfork (\TeXSXuser{cfr} had already complained about this in % \href{https://tex.stackexchange.com/questions/336768/seasonal-challenge-contributions-from-texing-dead-welcome#comment829686_337719}{one % of her comments} to my original answer on \TeXSXAbbrev); in the present % version this has been corrected, but the output produced by the first % version (which I~liked) can still be obtained by means of these two % commands, whose name is, indeed, more appropriate to the look of the % symbols they yield. Obviously, their syntax remains identical, \eg % \begin{flushleft} % \cmd{\xleftwitchonpitchfork}\oarg{under text}\marg{over text} % \end{flushleft} % % \DescribeMacro{\overrightwitchonbroom} % \DescribeMacro{\overleftwitchonbroom} % \DescribeMacro{\underrightwitchonbroom} % \DescribeMacro{\underleftwitchonbroom} % Finally, the four commands % \begin{flushleft} % "\overrightwitchonbroom "\marg{subformula} \\ % "\overleftwitchonbroom "\marg{subformula} \\ % "\underrightwitchonbroom"\marg{subformula} \\ % "\underleftwitchonbroom "\marg{subformula} % \end{flushleft} % are similar to, \eg "\overrightarrow", and typeset a broom, with a witch % sitting on it, over or under the subformula specified in their % argument.\footnote{It should be noted that, in my answers % to~\cite{bib:cfr}, only the command that now corresponds to % \cmd{\overrightwitchonbroom} was provided, but under the different name % \cmd{\overrightbroom}.} % \DescribeMacro{\overrightwitchonpitchfork} % \DescribeMacro{\overleftwitchonpitchfork} % \DescribeMacro{\underrightwitchonpitchfork} % \DescribeMacro{\underleftwitchonpitchfork} % Also in this case, the look of the symbols they draw has changed since % version~0.01 of this package, but the old shapes have been kept available % under different, and more appropriate, names: just use % \begin{flushleft} % "\overrightwitchonpitchfork "\marg{subformula} \\ % "\overleftwitchonpitchfork "\marg{subformula} \\ % "\underrightwitchonpitchfork"\marg{subformula} \\ % "\underleftwitchonpitchfork "\marg{subformula} % \end{flushleft} % instead of the above. % % \paragraph*{Important note:} % All the commands described in this subsection have a \mbox{$*$-form} that % adds a black cat on the broomstick. The syntax should be easy to remember, % since the additional asterisk can be thought of as reminiscent of the cat. % % \subsubsection{Ghosts} % % Of course, on Halloween, ghosts cannot be missing either. % % \DescribeMacro{\mathghost} % \DescribeMacro{\mathrightghost} % \DescribeMacro{\mathleftghost} % There are three similar commands (without arguments) that produce ordinary % symbols, that is, symbols that are treated like letters: the "\mathghost" % command yield a symbol resembling a ghost standing upfront; the % "\mathrightghost" (resp., "\mathleftghost") command gives a symbol that % looks like a ghost moving toward the right (resp., the left). % % \DescribeMacro{\xrightswishingghost} % \DescribeMacro{\xleftswishingghost} % Once again, ghosts too haunt the region of extensible ``arrow-like'' % symbols: % \begin{flushleft} % "\xrightswishingghost"\oarg{under text}\marg{over text} \\ % "\xleftswishingghost "\oarg{under text}\marg{over text} % \end{flushleft} % are analogous to, \eg "\xrightarrow", but, in place of the arrow, draw a % ghost swishing, respectively, toward the right and toward the left. % % \DescribeMacro{\overrightswishingghost} % \DescribeMacro{\overleftswishingghost} % \DescribeMacro{\underrightswishingghost} % \DescribeMacro{\underleftswishingghost} % It is now easy to guess what the following four commands do: % \begin{flushleft} % "\overrightswishingghost "\marg{subformula} \\ % "\overleftswishingghost "\marg{subformula} \\ % "\underrightswishingghost"\marg{subformula} \\ % "\underleftswishingghost "\marg{subformula} % \end{flushleft} % % \subsubsection{Bats} % % For some people, bats are even more horrifying than ghosts. The % \packlass{\halloweenmath} package provides a collection of commands for % drawing bat-like symbols that are closely analogous to the ghost-related % ones. % % \DescribeMacro{\mathbat} % \DescribeMacro{\mathrightbat} % \DescribeMacro{\mathleftbat} % You can get an ordinary symbol resembling a bat flying, respectively, % toward you, toward the right, and toward the left with the three % argumentless commands "\mathbat", "\mathrightbat", and "\mathleftbat". The % height of these symbols has intentionally been made pretty small, to % facilitate their use in superscripts. % % \DescribeMacro{\xrightflutteringbat} % \DescribeMacro{\xleftflutteringbat} % You can get extensible ``arrow-like'' relation symbols that depict a % fluttering bat by means of the following constructs: % \begin{flushleft} % "\xrightflutteringbat"\oarg{under text}\marg{over text} \\ % "\xleftflutteringbat "\oarg{under text}\marg{over text} % \end{flushleft} % \DescribeMacro{\overrightflutteringbat} % \DescribeMacro{\overleftflutteringbat} % \DescribeMacro{\underrightflutteringbat} % \DescribeMacro{\underleftflutteringbat} % And these are the associated ``over\mbox{-}\slash under-arrow-like'' % commands: % \begin{flushleft} % "\overrightflutteringbat "\marg{subformula} \\ % "\overleftflutteringbat "\marg{subformula} \\ % "\underrightflutteringbat"\marg{subformula} \\ % "\underleftflutteringbat "\marg{subformula} % \end{flushleft} % % \DescribeMacro{\overbat} % \DescribeMacro{\underbat} % There are, finally, two more commands that have no parallel in the % collection of ghostly symbols (because ghost are to tall!): they are % \begin{flushleft} % "\overbat "$*$\marg{subformula} \\ % "\underbat"$*$\marg{subformula} % \end{flushleft} % where $*$ indicates an optional "*" denoting, as usual, their % \mbox{$*$-form}. These constructs typeset \meta{subformula} respectively % surmounted by the bat produced by "\mathbat", or with that symbol % underneath. The normal (\emph{i.e.}, unstarred) form pretends that the bat % has zero width (but some height), so that, say, "$x+\overbat{y}+z$" has the % same horizontal spacing as "$x+y+z$"; if you prefer that the actual width % of the bat be taken into account instead, then use the starred variants. % % \subsubsection{Skulls} % % \DescribeMacro{\skull} % \DescribeMacro{\bigskull} % For skulls, I~imagined a r\^{o}le very similar to that of % \hyperref[ssS:Pumpkins]{pumpkins}. Indeed, anything that is shaped like a % human head reminds me of symbols like "\oplus"~($\oplus$) and % "\otimes"~($\otimes$), so that my fantasy immediately goes to a binary % operator and its associated ``large'' operator. In this case, we have: % \begin{itemize} % \item % "\skull", which is the binary operator (similar to "\oplus"); % \item % "\bigskull", which is the ``large'' operator (similar to "\bigoplus") and % which, like all symbols of this kind, becomes significantly larger in % displayed math. % \end{itemize} % As for all ``large'' operators defined by this package, the % [\opt{no}]\opt{sumlimits} options from the \packlass{\amsmath} package % affect the "\bigskull" command too. % % \subsubsection{Other symbols} % % The \packlass{\halloweenmath} package implements one more symbol that could % loosely be connected with the world of witches. % % \DescribeMacro{\mathcloud} \DescribeMacro{\reversemathcloud} % Mathemagicians often deal with unscrutable formulas. To represent them, % the "\mathcloud" command (without arguments) is available, which produces a % symbol, with the form of a cloud, that behaves to a certain extent like a % fraction, in that it is typeset in a significantly larger size in displayed % formulas than in in-line ones. The companion command "\reversemathcloud" % yields a mirror image of the same symbol. % % \subsection{More \textquotedblleft arrow-like\textquotedblright\ symbols % (these don\textquoteright t scare!)} % % If designing the first symbol, the "\mathwitch", could be relatively % entertaining, the implementation of the other operators and ordinary % symbols like "\pumpkin", "\mathghost", "\mathcloud", or "\bigskull" soon % became a rather dull and repetitive task, that essentialy consisted of % nothing more than placing lots of dots on a grid. The part related to the % extensible ``arrow-like'' commands was a bit more amusing, since it % involved dealing with at least a few typical \TeX nical aspects. Probably, % it was for this reason that this field grew so much in passing from the % first release of the package to the second. % % \subsubsection{Script-style version of standard over\protect\slash under % arrows} % \label{ssS:StandardArrows} % % In order to implement our over\slash under ``arrow-like'' symbols, we had % to develop an extension of some internal macros of the \packlass{\amsmath} % package. These extensions can be applied to produce variants of the % standard over\slash under arrows too. % % \DescribeMacro{\overscriptrightarrow} % \DescribeMacro{\overscriptleftarrow} % \DescribeMacro{\overscriptleftrightarrow} % \DescribeMacro{\underscriptrightarrow} % \DescribeMacro{\underscriptleftarrow} % \DescribeMacro{\underscriptleftrightarrow} % The following six commands are analogous to their standard counterparts % whose names do not contain the "script" substring, but the arrows they put % above or below the given subformulas are typeset in their relative script % style, instead of in the same style as the subformulas themselves (as the % standard commands do): % \begin{flushleft} % "\overscriptrightarrow "\marg{subformula} \\ % "\overscriptleftarrow "\marg{subformula} \\ % "\overscriptleftrightarrow "\marg{subformula} \\ % "\underscriptrightarrow "\marg{subformula} \\ % "\underscriptleftarrow "\marg{subformula} \\ % "\underscriptleftrightarrow"\marg{subformula} % \end{flushleft} % % \subsubsection{\textquotedblleft Unwitched\textquotedblright\ brooms % and pitchforks} % % In the last years, the use of unmanned aircrafts has become increasingly % important, and it has in parallel become more and more common to see flying % devices of this kind even across the skies of our cities (just think of % drones and of how they tend to be employed ubiquitously for the most % heterogeneous kinds of jobs and services). Needless to say, it was % inevitable that this aeronautical revolution propagated even to an % inherently conservative world like that of sorcery, and it should come as % no great surprise to learn that the \packlass{\halloweenmath} package now % features ``unwitched'' versions of all the ``arrow-like'' extensible % symbols too, both of those that depict brooms and of those which stick to % the original pitchfork-like shape. The useful side of these is that the % absence of the witch allows for a reduction of the vertical space they take % up. % % \DescribeMacro{\xrightbroom} % \DescribeMacro{\xleftbroom} % To begin with, we have the extensible ``arrow-like'' relations, those % modeled after "\xrightarrow": they are % \begin{flushleft} % "\xrightbroom"\oarg{under text}\marg{over text} \\ % "\xleftbroom "\oarg{under text}\marg{over text} \\ % \end{flushleft} % and produce extensible brooms \emph{without} a witch sitting on them. % \DescribeMacro{\xrightpitchfork} % \DescribeMacro{\xleftpitchfork} % The commands % \begin{flushleft} % "\xrightpitchfork"\oarg{under text}\marg{over text} \\ % "\xleftpitchfork "\oarg{under text}\marg{over text} % \end{flushleft} % are almost identical, only they yield pitchforks instead of brooms---or, if % you prefer, brooms with the shape that was used in version~0.01 of this % package. % % \DescribeMacro{\rightbroom} % \DescribeMacro{\leftbroom} % When both the \meta{under text} and the \meta{over text} are void, the % "\xrightbroom"\,\ldots\linebreak[0]"\xleftpitchfork" commands yield a % symbol that is, on purpose, more or less as large as what "\xrightarrow{}" % yields (\emph{i.e.},~$\xrightarrow{}$); but it turns out that such a short % broom (or pitchfork) completely lacks the broomstick. For this reason, the % two (argumentless) commands "\rightbroom" and "\leftbroom" has been % provided too: they typeset a broom the same length of a % "\longrightarrow"\slash "\longleftarrow" ($\longrightarrow$\slash % $\longleftarrow$). % \DescribeMacro{\hmrightpitchfork} % \DescribeMacro{\hmleftpitchfork} % It would now seem logical to infer that the two companion commands that % typeset pitchforks should be named "\rightpitchfork" and "\leftpitchfork"; % unfortunately, these names already denote two different (albeit vaguely % similar) symbols supplied by the \packlass{MnSymbol} package. Because of % this potential name clash, we have chosen instead to call them % "\hmrightpitchfork" and "\hmleftpitchfork", respectively (the % \texttt{hm}~prefix, of course, stands for ``Halloween math''). % % Before getting to the group of the ``over\mbox{-}\slash under-arrow-like'' % extensible brooms, a preliminary statement needs to be made. For the % ``witched'' version of all these, we had chosen to typeset them in the % relative script style associated to the style of the affected subformula. % For example, in a construct like % \begin{verbatim}$W_{\overrightwitchonbroom{x_{1}+\dots+x_{n}}}$\end{verbatim} % the subformula "x_{1}+\dots+x_{n}", argument of the % "\overrightwitchonbroom" command, is set in script style, therefore the % style applied to the covering broom (and witch) will be the scriptscript % style. We already remarked in Subsection~\ref{ssS:StandardArrows} that % this is not what the standard ``over\mbox{-}\slash under-arrow'' commands % do: instead, they use for the arrow the same style as that in which the % argument gets typeset. The reason for this different behavior was that, % with the same style of the affected subformula, the witch would have looked % too large; but when the witch isn't there, both solutions are viable, and % we do provide both. % % ^^A \paragraph{Brooms\slash pitchforks in the same relative style.} % We have, in the first place, a set of commands for placing brooms or % pitchforks (a.k.a.\ version-0.01-styled brooms) over or under a subformula, % setting them in the same style as the subformula itself. % \DescribeMacro{\overrightbroom} % \DescribeMacro{\overleftbroom} % \DescribeMacro{\underrightbroom} % \DescribeMacro{\underleftbroom} % There are four ``over\mbox{-}\slash under-arrow-like'' extensible % brooms\ldots % \begin{flushleft} % "\overrightbroom "\marg{subformula} \\ % "\overleftbroom "\marg{subformula} \\ % "\underrightbroom"\marg{subformula} \\ % "\underleftbroom "\marg{subformula} % \end{flushleft} % \DescribeMacro{\overrightpitchfork} % \DescribeMacro{\overleftpitchfork} % \DescribeMacro{\underrightpitchfork} % \DescribeMacro{\underleftpitchfork} % \ldots and four corresponding ``over\mbox{-}\slash under-arrow-like'' % extensible pitchforks: % \begin{flushleft} % "\overrightpitchfork "\marg{subformula} \\ % "\overleftpitchfork "\marg{subformula} \\ % "\underrightpitchfork"\marg{subformula} \\ % "\underleftpitchfork "\marg{subformula} % \end{flushleft} % % ^^A \paragraph{Brooms\slash pitchforks in relative script style.} % Then, for each of the commands just listed, a corresponding variant is % provided that sets the broom, or the pitchfork, in the relative script % style of the style applied to \meta{subformula}, and which is named % following the same convention we already used for the commands of % Subsection~\ref{ssS:StandardArrows}, that is, inserting the "script" % substring. % \DescribeMacro{\overscriptrightbroom} % \DescribeMacro{\overscriptleftbroom} % \DescribeMacro{\underscriptrightbroom} % \DescribeMacro{\underscriptleftbroom} % Thus, again, we find four ``over\mbox{-}\slash under-arrow-like'' % extensible brooms\ldots % \begin{flushleft} % "\overscriptrightbroom "\marg{subformula} \\ % "\overscriptleftbroom "\marg{subformula} \\ % "\underscriptrightbroom"\marg{subformula} \\ % "\underscriptleftbroom "\marg{subformula} % \end{flushleft} % \DescribeMacro{\overscriptrightpitchfork} % \DescribeMacro{\overscriptleftpitchfork} % \DescribeMacro{\underscriptrightpitchfork} % \DescribeMacro{\underscriptleftpitchfork} % \ldots and four matching ``over\mbox{-}\slash under-arrow-like'' extensible % pitchforks: % \begin{flushleft} % "\overscriptrightpitchfork "\marg{subformula} \\ % "\overscriptleftpitchfork "\marg{subformula} \\ % "\underscriptrightpitchfork"\marg{subformula} \\ % "\underscriptleftpitchfork "\marg{subformula} % \end{flushleft} % % \paragraph*{Please note:} % Since all of the commands listed in this subsection omit the witch, none % of them has got a \mbox{$*$-form} for adding a cat (the cat can only go % with the witch: no witch, no cat). % % \subsubsection{Summary of the naming scheme} % % It is worth noting that the commands for the extensible brooms\slash % pitchforks follow a consistent naming scheme: the name is of the form % \begin{center} % \texttt{\bslash}\meta{x-over-under}\meta{opt-script}^^A % \meta{left-right}\meta{opt-witch}\meta{broom-pitchf} % \end{center} % where % \begin{flalign*} % \meta{x-over-under} &\longrightarrow % \texttt{x}\binvert\texttt{over}\binvert\texttt{under} & % \meta{opt-script} &\longrightarrow % \meta{empty}\binvert\texttt{script} \\ % \meta{left-right} &\longrightarrow % \texttt{left}\binvert\texttt{right} & % \meta{opt-witch} &\longrightarrow % \meta{empty}\binvert\texttt{witchon} \\ % \meta{broom-pitchf} &\longrightarrow % \texttt{broom}\binvert\texttt{pitchfork} % \end{flalign*} % with the constraint that \meta{opt-script} must be \meta{empty} if either \( \meta{x-over-under} = % \texttt{x} \) or \( \meta{opt-witch} \neq \meta{empty} \). % % \section % [Installing the pacakge code and documentation] % {Installing the package code and documentation\footnote{^^A % Recall that you need to read this section only in the unusual case that you % have to carry out a manual installation from the sources; normally, you'll % be using a prepackaged \TeX\ distribution like % \href{https://www.tug.org/texlive/}{\TeX~Live} or % \href{https://miktex.org/}{MiK\TeX}, which can automatically manage % installation as well as updates.^^A % }} % % As usual for \LaTeX\ distributions, the \packlass{\halloweenmath} % package is distributed in the form of a \filedir{.dtx} file, % namely \filedir{\halloweenmath.dtx}, and an accompanying % \filedir{.ins} file, namely \filedir{\halloweenmath.ins}. % % \subsection{Installation} % % To extract the code, run \LaTeX\ (or plain \TeX) once on the % file \filedir{\halloweenmath.ins}. This will generate the following % \LaTeX\ input file: % \begin{quote} % \ttfamily % \halloweenmath.sty % \end{quote} % To finish the installation, move it to a \LaTeX\ input directory. The % above listing of the files you need to move is also displayed on the % terminal at the end of the run of the file \filedir{\halloweenmath.ins}. % The documentation of your \TeX\ installation should tell you how to find % the \LaTeX\ input directory/ies, and probably also how to create new % \LaTeX\ input directories reserved to contain your personal packages. % The accepted TDS-compliant directory where the above file should be put is % \begin{quote} % \filedir{\$TEXMF/tex/latex/halloweenmath/} % \end{quote} % % Please note: before using the \packlass{\halloweenmath} package you % must read its license (see Subsection~\ref{sS:License}) to see whether its % terms are acceptable for you, especially for what concerns the lack of any % warranty; if they are not, don't use it. % % \subsection{Documentation} % % To produce this documentation, run \LaTeX\ three times (for the ToC to get % right) on the file \filedir{\halloweenmath.dtx}. This won't give you the % index and the change history, though: for those, you should run % \emph{MakeIndex} on the files \filedir{\halloweenmath.idx} and % \filedir{\halloweenmath.glo}, obtained during the last of the aforesaid % three \LaTeX\ runs, with styles \filedir{gind.ist} and \filedir{gglo.ist}, % respectively (which are part of the standard \LaTeX\ distribution); then % pass \filedir{\halloweenmath.dtx} through \LaTeX\ twice more. % % The documentation produced by default includes the \emph{Implementation} % part too; see the beginning of this part for instructions on how to omit % it. % % \subsection{The makefile} % \label{sS:Makefile} % % A (quite trivial!\@) makefile, named \filedir{Makefile}, that ``knows'' how % to carry out the installation, is offered along with the package. Although % it is not a required part of the distribution (as per LPPL\@), you may find % that some distributors supply it all the same (I~hope the CTAN\@ sites will % do so). With this makefile in the same directory as the two source files % \filedir{\filename} and \filedir{\halloweenmath.ins}, the simple shell % command, given inside that same directory, % \begin{quote} % \ttfamily % make % \end{quote} % will \emph{both} extract the code file \emph{and} typeset the full % documentation (in~PDF\@). Type % \begin{quote} % \ttfamily % make help % \end{quote} % for more information. % % \subsection{License} % \label{sS:License} % % The \packlass{\halloweenmath} package is \emph{not} in the public % domain: its author, Gustavo \textsc{Mezzetti}, owns the % copyright, and in general retains all the rights therein; but as % a special exception, the author grants you the permissions % indicated below. % % \subsubsection{Distribution and/or modification} % % The \packlass{\halloweenmath} package may be distributed and/or % modified under the conditions of the \LaTeX\ Project Public % License, either version~1.3 of this license or (at your option) % any later version. The latest version of this license is in % \begin{quote} % \ttfamily % http://www.latex-project.org/lppl.txt % \end{quote} % and version~1.3 or later is part of all distributions of \LaTeX\ % version 2005/12/01 or later. % % The \packlass{\halloweenmath} package has the LPPL maintenance status % ``author-maintained''. % % The file \filedir{manifest.txt} included along with this file % specifies what the \packlass{\halloweenmath} package consists of; more % precisely, it explains how the locutions ``Work'' and ``Compiled % Work'', used in the \LaTeX\ Project Public License, are to be % interpreted in the case of this work. % % \subsubsection{Use} % % The use of the \packlass{\halloweenmath} package is unrestricted, % provided that you accept the terms and conditions of the \LaTeX\ % Project Public License and of the following subsection for what % concerns the absence of any warranty. % % \subsubsection{No warranty} % % There is absolutely no warranty for the \packlass{\halloweenmath} % package. The Copyright Holder provides the \packlass{\halloweenmath} % package ``as is'', without warranty of any kind, either expressed % or implied, including, but not limited to, the implied warranties % of merchantability and fitness for a particular purpose. The % entire risk as to the quality and performance of the % \packlass{\halloweenmath} package is with you. Should the % \packlass{\halloweenmath} package prove defective, you assume the cost % of all necessary servicing, repair, or correction. % % In no event will The Copyright Holder, or any other party who may % distribute and/or modify the \packlass{\halloweenmath} package as % permitted by the \LaTeX\ Project Public License, be liable to you % for damages, including any general, special, incidental or % consequential damages arising out of any use of the % \packlass{\halloweenmath} package or out of inability to use it % (including, but not limited to, loss of data, data being rendered % inaccurate, or losses sustained by anyone as a result of any % failure of the \packlass{\halloweenmath} package to operate with any % other programs), even if The Copyright Holder or said other party % has been advised of the possibility of such damages. % % \StopEventually{ % \setcounter{secnumdepth}{0} % \providecommand*\bysame{\leavevmode\hbox to3em{\hrulefill}\thinspace} % % \clearpage % \pdfbookmark[0]{Back Matter}{BackMatter} % \begin{thebibliography}{9} % \addcontentsline{toc}{section}{\refname} % % \bibitem{bib:cfr} % \emph{Seasonal Challenge (Contributions from \TeX ing Dead % Welcome)},\\ % \url{https://tex.stackexchange.com/q/336768/69818} % % \bibitem{bib:manual} % \emph{User's manual for the \packlass{\halloweenmath} package}, included % in the documentation of the \packlass{\halloweenmath} package,\\ % \href{file:halloweenmath-man.pdf} % {\nolinkurl{$TEXMF/doc/latex/halloweenmath/halloweenmath-man.pdf}} % % \IfImplementation{ % \bibitem{bib:diffs-m} % File \filedir{diffs-m.txt}, which is part of the standard % \hologo{AmSLaTeX} distribution,\\ % \nolinkurl{$TEXMF/doc/latex/amsmath/diffs-m.txt} % % \bibitem{bib:std} % \emph{Why does the \packlass{\amsmath} package define % \textnormal{\cs{std@minus}} and \textnormal{\cs{std@equal}}?},\\ % \url{https://tex.stackexchange.com/q/352043} % }{} % % \end{thebibliography} % } % % % % \clearpage % \part{Implementation} % % \section{About this part} % % This part is of interest only to \LaTeX\ hackers; to avoid % having this part printed, look in the file \filedir{\filename} % for a line that looks \emph{exactly} like this % \begin{verbatim}%% \OnlyDescription % uncomment to discard Implementation part\end{verbatim} % and remove the two leading percent signs ("%%"). % % \section{A driver for this document} % % This part of the file is \emph{not} included in any generated file: % it is simply the driver. % \begin{macrocode} %<*driver> % \end{macrocode} % % To begin with, we load the \packlass{ltxdoc} class % and the packages we require. % \begin{macrocode} \documentclass{ltxdoc} \usepackage{amsmath,color,pict2e,hologo} \usepackage{hypdoc} % \end{macrocode} % We now set a few typesetting options. % First of all, we want a history listing and a full index, the latter % organized by line numbers. % \begin{macrocode} \RecordChanges \EnableCrossrefs \CodelineIndex % \end{macrocode} % If you don't want to include the second part of this document, % \emph{Implementation}, uncomment the line containing the command % "\OnlyDescription". % \begin{macrocode} %% \OnlyDescription % uncomment to discard Implementation part % \end{macrocode} % Finally, setting "\hfuzz" and "\vfuzz" to 0~points is only one % of the many neurotic symptoms of the author! % \begin{macrocode} \hfuzz = 0pt \vfuzz = 0pt % \end{macrocode} % Now input this same file, using \DS\ conventions. % \begin{macrocode} \begin{document} \DocInput{halloweenmath.dtx} % \end{macrocode} % Then print the change list and the index. We put these commands in % the driver, rather than in the comments of this file, because % producing the change list and the index is somewhat cumbersome, and some % users could prefer to omit them: such users should simply use a % different driver. % \begin{macrocode} % \clearpage % attach Change history below References \PrintChanges \clearpage \PrintIndex % \end{macrocode} % When this file is read directly by \LaTeX\ without the intervention % of \DS, the following line will make \TeX\ stop % reading. % \begin{macrocode} \end{document} % \end{macrocode} % End of driver module. % \begin{macrocode} % % \end{macrocode} % % \section{The code for the \packlass{\halloweenmath} package} % % This part of the file goes into \filedir{\halloweenmath.sty}. % \begin{macrocode} %<*halloweenmath> % \end{macrocode} % % \subsection{Identification} % % No particular reason for asking for a particular release of \LaTeXe; but at % least, let us specify a date on which the \packlass{\picttwoe} package was % likely to exist. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}[2004/06/01] % LaTeX2e is required! % \end{macrocode} % The usual identification: % \begin{macrocode} \ProvidesPackage{halloweenmath} [2019/11/01 v0.11 (development)] % \end{macrocode} % % \subsection{Initial code} % % \begin{macro}{\@HwM@say@BOO} % Of course, to make this anything even vaguely resembling an ``Easter egg'', % I~should at least pretend to try to obfuscate the code; but too much time % has already been wasted on this huge and ridicolous heap of foolishness. % \begin{macrocode} \newcommand*\@HwM@say@BOO{% \begingroup \escapechar \m@ne \def~{\string\\}% \def\-{\space\space}% \def\+{\space\space\space\space}% \def\={\+\+\+\+}% \def\*{****}% \typeout{}% \typeout{\+ _-==-_ \+ /~/~/~}% \typeout{\+|\-\-\-|\+< BOO! >\+\+\+\today...}% \typeout{\+|(.)(.)|\+/~/~/~/}% \typeout{\++--/~--+\- /\=\*\*\*\*\*\*\*}% \typeout{\+ [::::] __/ \= ... This is HALLOWEENMATH!}% \typeout{\+\-----\-\+\=\*\*\*\*\*\*\*}% \typeout{}% \endgroup } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@opt@say@BOO} % Well, at least do not add comments to what is already crystal clear by % itself\ldots % \begin{macrocode} \newcommand*\@HwM@opt@say@BOO{} % \end{macrocode} % \end{macro} % % \subsection{Declaration of options} % % Hidden options. Note that they are later processed in the order in which % they are declared here. % \begin{macrocode} \DeclareOption{silent}{% \let \@HwM@opt@say@BOO \@empty } \DeclareOption{boo}{% \let \@HwM@opt@say@BOO \@HwM@say@BOO } \DeclareOption{boo-10-31}{% \ifnum\month=10 \ifnum\day=31 \let \@HwM@opt@say@BOO \@HwM@say@BOO \else \let \@HwM@opt@say@BOO \@empty \fi \else \let \@HwM@opt@say@BOO \@empty \fi } % \end{macrocode} % % \subsection{Option processing} % % Note that, at the end, at least we release the memory taken up by this % piece of buffoonery. % \begin{macrocode} \ExecuteOptions{boo-10-31} \ProcessOptions\relax \@HwM@opt@say@BOO \let \@HwM@say@BOO = \@undefined \let \@HwM@opt@say@BOO = \@undefined % \end{macrocode} % % \subsection{Package loading} % % Besides the \packlass{\picttwoe} package, that we need to draw the % pictures, we also require the \packlass{\amsmath} package. % \begin{macrocode} \RequirePackage{amsmath,pict2e} % \end{macrocode} % % \subsection{Main code} % % Let's begin with an important remark. It would be pretty easy to fulfill % the purpose of this package using \TikZ; this has been deliberately % avoided. This package has been written for fun, and part of this fun lay % in the constraint of using only the means provided by the \env{picture} % environment, albeit with the \packlass{\picttwoe} extensions. Please % accept this fact without arguing about it. % % The names of all the macros defined in this package start with the prefix % "\@HwM@" (``namespace'' prefix). % % \subsubsection{Preliminary macros} % % We begin with defining some macros that provide basic functionality. % % \begin{macro}{\@HwM@tempa} % Temporary scratch macro reserved for this package. Here we just check % that the name can be used, while, at the same time, reserving it. % \begin{macrocode} \@ifdefinable\@HwM@tempa{} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@thickness@units@for} % The unit of measure we are going to use for line thicknesses; since it is % defined in term of the ``default-rule-thickness'' "\fontdimen", it will % automatically scale with the font size. The suffix "for" at the end of the % names reminds that a font selector like "\textfont" must follow and will be % absorbed as argument~\#1. % \begin{macrocode} \newcommand*\@HwM@thickness@units@for[1]{\fontdimen 8 #1\thr@@} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@right@or@left} % \changes{0.11}{2019 Nov 01}{Corrected bug: \cs{@HwM@right@or@left} % now defaults to \cs{@gobbletwo}} % Used to pass information about the orientation of left\slash right % symmetric figures. More precisely, it is a switch that selects % between two branches according to the current orientation. Here we % set the global default (no current orientation defined) so that it % ignores \emph{both} branches, thus correcting a bug in versions % prior to 0.11. % \begin{macrocode} \@ifdefinable\@HwM@right@or@left{\let \@HwM@right@or@left=\@gobbletwo} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@set@right@dir} % Causes the following left\slash right symmetric figure to face to the % right. % \begin{macrocode} \newcommand*\@HwM@set@right@dir{% \let \@HwM@right@or@left \@firstoftwo } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@set@left@dir} % Causes the following left\slash right symmetric figure to face to the left. % \begin{macrocode} \newcommand*\@HwM@set@left@dir{% \let \@HwM@right@or@left \@secondoftwo } % \end{macrocode} % \end{macro} % % \begin{environment}{@HwM@math@picture} % Customized \env{picture} environment for our ``math pictures'', makes some % initializations that are always needed (local to its group). Arguments: % \begin{paramlist} % \param % bounding box height, in coordinate units;\\ % \param % $y$-coordinate of lower left corner of bounding box;\\ % \param % additional code to be executed during initialization;\\ % \param % font selector (\eg "\textfont");\\ % \param % bounding box width, in coordinate units;\\ % \param % $x$-coordinate of lower left corner of bounding box. % \end{paramlist} % \begin{macrocode} \newenvironment*{@HwM@math@picture}[6]{% \setlength\unitlength{\fontdimen 22 #4\tw@}% #3% \@HwM@right@or@left{% \def\+{+}% \def\-{-}% }{% \def\+{-}% \def\-{+}% }% \picture(#5,#1)(#6,#2)% }{\endpicture} % \end{macrocode} % \end{environment} % % \begin{macro}{\@HwM@short@circuited@vphant} % ``Short-circuited'' version of "\vphantom". % \begin{macrocode} \newcommand*\@HwM@short@circuited@vphant{\v@true\h@false\mathph@nt} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@oplus@strut} % \changes{0.10}{2017 Apr 16}{Corrected bug: the size of the strut used to % be that of \cs{bigoplus}} % Vertical phantom the size of "\oplus". Arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@oplus@strut[1]{% \@HwM@short@circuited@vphant #1\oplus } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@bigoplus@strut} % \changes{0.10}{2017 Apr 16}{Added this macro} % Vertical phantom the size of "\bigoplus". Arguments: % \begin{paramlist} % \param % style selector (\eg "\displaystyle"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@bigoplus@strut[1]{% \@HwM@short@circuited@vphant #1\bigoplus@ } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@d@pict@strut} % Inserts a ``depth-only half-strut'' (the~"d" in the name is for ``depth''), % \#1~is its size in picture units. % \begin{macrocode} \newcommand*\@HwM@d@pict@strut[1]{% \vrule \@width\z@ \@height\z@ \@depth #1\unitlength } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@picture} % \begin{macro}{\end@HwM@large@picture} % This is actually a definition of an environment. The environment beign % defined, namely \env{@HwM@large@picture}, is simply syntactic sugar for a % typical invocation of the \env{@HwM@math@picture} environment, for a % picture of ``large'' size (\( \mbox{height}=5 \), \( \mbox{depth}=3 \), % with the baseline running at \( y=-1 \)), suitable for the display-style % version of a large operator. Supplies arguments \#1--\#4 of % \env{@HwM@math@picture}, with \#4 being "\textfont"; the caller must supply % the remaining ones. % \begin{macrocode} \newcommand*\@HwM@large@picture{% \@HwM@math@picture{5}{-1}{\@HwM@d@pict@strut\thr@@}\textfont } \let\end@HwM@large@picture = \end@HwM@math@picture % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@HwM@small@picture} % \begin{macro}{\end@HwM@small@picture} % This is actually a definition of an environment. The environment beign % defined, namely \env{@HwM@small@picture}, is simply syntactic sugar for a % typical invocation of the \env{@HwM@math@picture} environment, for a % picture of ``small'' size (\( \mbox{height}=3 \), \( \mbox{depth}=1 \), % with the baseline running at \( y=-1 \)), suitable for the % non-display-style version of a large operator. Supplies arguments \#1--\#3 % of \env{@HwM@math@picture}; the caller must supply the remaining ones, % \emph{including} argument~\#4. % \begin{macrocode} \newcommand*\@HwM@small@picture{% \@HwM@math@picture{3}{-1}{\@HwM@d@pict@strut\@ne}% } \let\end@HwM@small@picture = \end@HwM@math@picture % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@HwM@bigop@picture} % \begin{macro}{\end@HwM@bigop@picture} % This is actually a definition of an environment. The environment beign % defined, namely \env{@HwM@bigop@picture}, is simply syntactic sugar for a % typical invocation of the \env{@HwM@math@picture} environment, for a % picture having the vertical size of a "\bigoplus", with baseline running at % \( y=-1 \). Supplies arguments \#1--\#3 of \env{@HwM@math@picture}; the % caller must supply the others, \emph{including} argument~\#4, immediately % after the single argument to this environment, which is % \begin{paramlist} % \param % style selector (\eg "\displaystyle"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@bigop@picture[1]{% \@HwM@math@picture{0}{-1}{\@HwM@bigoplus@strut #1}% } \let\end@HwM@bigop@picture = \end@HwM@math@picture % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\@HwM@oplus@picture} % \begin{macro}{\end@HwM@oplus@picture} % This is actually a definition of an environment. The environment beign % defined, namely \env{@HwM@oplus@picture}, is simply syntactic sugar for a % typical invocation of the \env{@HwM@math@picture} environment, for a % picture having the vertical size of an "\oplus", with baseline running at % \( y=-1 \). Supplies arguments \#1--\#3 of \env{@HwM@math@picture}; the % caller must supply the others, \emph{including} argument~\#4, immediately % after the single argument to this environment, which is % \begin{paramlist} % \param % style selector (\eg "\scriptstyle"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@oplus@picture[1]{% \@HwM@math@picture{0}{-1}{\@HwM@oplus@strut #1}% } \let\end@HwM@oplus@picture = \end@HwM@math@picture % \end{macrocode} % \end{macro} % \end{macro} % % \paragraph*{Comment added in version~0.10:} % After all, I~think I'd better recap what the full argument lists for the % ``specialized'' math picture environments are. % % \medskip % Full argument list for \env{@HwM@large@picture}: % \begin{paramlist} % \param % bounding box width, in coordinate units;\\ % \param % $x$-coordinate of lower left corner of bounding box. % \end{paramlist} % % \medskip % Full argument list for \env{@HwM@small@picture}: % \begin{paramlist} % \param % font selector (\eg "\textfont");\\ % \param % bounding box width, in coordinate units;\\ % \param % $x$-coordinate of lower left corner of bounding box. % \end{paramlist} % % \medskip % Full argument list for both \env{@HwM@bigop@picture} and % \env{@HwM@oplus@picture}: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont");\\ % \param % bounding box width, in coordinate units;\\ % \param % $x$-coordinate of lower left corner of bounding box. % \end{paramlist} % % \begin{macro}{\if@HwM@cat@} % Switch that tells whether a witch that is about to be drawn should be % accompanied by her cat or not. % \begin{macrocode} \@ifdefinable\if@HwM@cat@{\newif\if@HwM@cat@} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@bold@version@name} % In version~0.01 of this package, the definition of the "\@HwM@if@bold@math" % macro (see below) used to be % \begin{verbatim}\newcommand*\@HwM@if@bold@math{% % \def\@tempa{bold}% % \ifx\math@version\@tempa % \expandafter\@firstoftwo % \else % \expandafter\@secondoftwo % \fi %}\end{verbatim} % We have now decided to set the comparison string (\texttt{bold}) here, once % and for all: this allows the following macro to be purely expandable, a % feature we'll now need. % \begin{macrocode} \newcommand*\@HwM@bold@version@name{bold} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@if@bold@math} % \changes{0.10}{2017 Apr 16}{Made purely expandable} % \LaTeX-style conditional: if the math version is currently \texttt{bold}, % executes the code in the first argument, otherwise the code in the second % argument. Now made purely expandable (see above). % \begin{macrocode} \newcommand*\@HwM@if@bold@math{% \ifx\math@version\@HwM@bold@version@name \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@choose@thicknesses} % Shuffles arguments according to the current math version. Now purely % expandable. % \begin{macrocode} \newcommand*\@HwM@choose@thicknesses[3]{% \@HwM@if@bold@math{#1#3}{#1#2} } % \end{macrocode} % The typical use of this macro is as follows: suppose you have a macro % \cmd{\CS} with, say, five arguments, and suppose you want to invoke it % passing different values for some of the arguments, depending on the % current math version; more precisely, let's say that you want the following % call to be made % \begin{flushleft} % \small % "\CS{"\meta{fixed-value1}"}{"\meta{fixed-value2}"}{"^^A % \meta{bold-value3}"}{"\meta{bold-value4}"}{"^^A % \meta{bold-value5}"}" % \end{flushleft} % if the current math version is \texttt{bold}, but that you want, instead, % to call % \begin{flushleft} % \small % "\CS{"\meta{fixed-value1}"}{"\meta{fixed-value2}"}{"^^A % \meta{nrml-value3}"}{"\meta{nrml-value4}"}{"^^A % \meta{nrml-value5}"}" % \end{flushleft} % if it is not; then you would say % \begin{flushleft} % \small % "\@HwM@choose@thicknesses{\CS{"\meta{fixed-value1}"}{"^^A % \meta{fixed-value2}"}}"\\ % " {{"\meta{normal-value3}"}{"\meta{normal-value4}"}{"^^A % \meta{normal-value5}"}}"\\ % " {{"\meta{bold-value3}"}{"\meta{bold-value4}"}{"^^A % \meta{bold-value5}"}}" % \end{flushleft} % Note the inner pairs of braces; as usual, they can be omitted if they % surround a single token, \eg % \begin{verbatim}\@HwM@choose@thicknesses{\CS{FFF1}\textfont} % {\thr@@{4.0}{5.0}} % {{BBB3}{BBB4}\@empty}\end{verbatim} % \end{macro} % % \begin{macro}{\@HwM@magic@star} % Draws a star; argument~\#1 is a scale factor. % \begin{macrocode} \newcommand*{\@HwM@magic@star}[1]{% \begingroup \setlength\unitlength{#1\unitlength}% \picture(0,0)% \polygon*(0,1)(-.225,.309)(-.951,.309)(-.363,-.118)(-.588,-.809)% (0,-.382)(.588,-.809)(.363,-.118)(.951,.309)(.225,.309)% \endpicture \endgroup } % \end{macrocode} % \end{macro} % % \paragraph*{General remark:} % In all of the following drawings, the thickness of most of the lines % depends on the current math version. On the other hand, some pictures are % made up of smaller reusable pieces that are shared among more than one % drawing. As a matter of mental order, I~prefer to confine the lookup for % the current version to a single place for each picture, and pass the % appropriate thicknesses down to the macros that draw the single pieces as % parameters. Nonetheless, the interface toward the rest of the code % requires macros that can draw a picture without requiring the caller to % specify thickness arguments. This means that some drawing macros must % exist in two variants: % \begin{itemize} % \item % a ``private'' variant that requires the caller to specify thickness % parameters; % \item % a ``public'' variant that doesn't require such parameters, but uses, % instead, the "\@HwM@choose@thicknesses" macro to find out the % appropriate thickness values by itself. % \end{itemize} % To make it clear when two macros are actually two such variants of the same % conceptual function, we shall consistently adhere to the following naming % convention: % \begin{itemize} % \item % the name of the``private'' private variant will be made up of words % separated by "@"~characters, and each of those word will \emph{not} be % capitalized (for example, "\@HwM@large@witch"); % \item % the name of the ``public'' variant will be composed by exactly the same % words, again separated by "@"~characters, \emph{but} with each word % being also capitalized (for example, "\@HwM@Large@Witch"). % \end{itemize} % Note, though, that the ``public'' variant of a macro will typically (but % not always) require the caller to specify a font selector like "\textfont"; % we'll see that, from the point of view of the other parts of the code, this % is an acceptable requirement for the interface. % % \subsubsection{Drawing the witch (and the cat)} % % The following macros are responsible for the bulk of the task of drawing % the witch (with an optional cat). Figure~\ref{fig:witch} shows a sketch of % this drawing. % % \begin{figure}[tp] % \centering % The small variant:\\*[\bigskipamount] % \begin{picture}(6,4)(-3,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \linethickness{3pt} % \roundcap % \Line(-1,-1)(3,1) % \linethickness{1.5pt} % \Line(-1,-1)(-2.5,-1.25) % \Line(-1,-1)(-2.4,-1.5) % \Line(-1,-1)(-2.25,-1.75) % \Line(-1,-1)(-2,-2) % \put(-1.7,-.4){\magicstar{.4}} % \put(-2.7,-.8){\magicstar{.25}} % \Line(0,.9)(-.1,.7) % \polyline(.3,1.6)(.4,1.5)(.75,1.5)(.9,1.2)(.5,1.2) % (.6,1)(.8,.9)(.7,.75)(0,.9)(-.1,1) % \Line(.1,1.4)(.3,1.5) % \polygon*(-.5,1)(-1,0)(-1,-.5)(-.75,-1)(.5,-1) % (0,-1.8)(.2,-1.9)(.3,-1.7)(.4,-2)(1,-2) % (.5,-1.8)(.5,-1.5)(.8,-1.6)(1,-.75)(0,-.5) % (0,-.3)(.7,-.3)(.9,-.2)(1,0)(0,0) % (0,.7) % \polygon*(-1.5,1)(-1.4,1.5)(-1,2)(-.5,2)(0,1.75) % (.5,1.9)(1.25,1.75)(0,1.5)(-.5,1)(-1,.8) % (-1.2,1)(-1,1)(-.5,1.5)(-1,1.75)(-1.3,1.5) % ^^A % ^^A The cat: % \put(1.8,.5){\circle*{.6}} % \put(2.1,.7){\circle*{.5}} % \put(2.25,1){\circle*{.4}} % \polygon*(2.05,1)(2.05,1.25)(2.25,1.1)(2.45,1.25)(2.45,1) % \linethickness{3pt} % \cbezier(1.6,.3)(1,0)(2.1,-.2)(1.5,-.5) % \end{picture} % % \bigskip\bigskip\bigskip % % The large variant:\\*[\bigskipamount] % \begin{picture}(12,8)(-6,-4) % \linethickness{.1pt} % \color{guidelines} % \multiput(-6,-4)(1,0){13}{\line(0,1){8}} % \multiput(-6,-4)(0,1) {9}{\line(1,0){12}} % \color{black} % \roundcap % \linethickness{4pt} % \Line(-2,-2)(6,2) % \linethickness{2pt} % \Line(-2,-2)(-5,-2.5) % \Line(-2,-2)(-4.85,-2.95) % \Line(-2,-2)(-4.6,-3.3) % \Line(-2,-2)(-4.35,-3.65) % \Line(-2,-2)(-4,-4) % \put(-3,-1.2){\magicstar{.4}} % \put(-4.1,-.8){\magicstar{.8}} % \put(-5.4,-1.8){\magicstar{.6}} % \Line(0,1.8)(-.2,1.4) % \polyline(.6,3.2)(.8,3)(1.5,3) % \put(1.6,3){\oval(.2,.2)[tl]} % \put(1.6,3){\oval(.2,.2)[r]} % \polyline(1.6,2.9)(1.8,2.4)(1.2,2.4)(1,2.5)(1,2.3) % (1.2,2)(1.6,1.8)(1.7,1.8)(1.7,1.6)(1.4,1.5) % (0,1.8)(-.2,2) % \Line(.2,2.8)(.6,3) % \polygon*(-1,2)(-2,0)(-2,-1)(-1.5,-2)(1,-2) % (0,-3.6)(.4,-3.8)(.6,-3.4)(.8,-4)(2,-4) % (1,-3.6)(1,-3)(1.6,-3.2)(2,-1.5)(0,-1) % (0,-.6)(1.4,-.6)(1.8,-.4)(2,0)(0,0) % (0,1.4) % \polygon*(-3,2)(-2.8,3)(-2,4)(-1.5,4.1)(-1,4)(0,3.5) % (1,3.8)(2.5,3.5)(3,3.3)(2,3.4)(0,3)(-1,2)(-2,1.6) % (-2.7,2)(-2,2)(-1,3)(-2,3.5)(-2.6,3) % \linethickness{.4pt} % \Line(1.7,1.6)(2,1.6) % \Line(1.7,1.6)(1.9,1.4) % \Line(1.7,1.6)(1.7,1.3) % ^^A % ^^A The cat: % \put(3.6,1){\circle*{1.2}} % \put(4.2,1.4){\circle*{1}} % \put(4.5,2){\circle*{.8}} % \polygon*(4.1,2)(4.1,2.5)(4.5,2.2)(4.9,2.5)(4.9,2) % \linethickness{4pt} % \cbezier(3.2,.6)(2,0)(4.2,-.4)(3,-1) % \buttcap % \linethickness{.4pt} % \Line(3.8,2.1)(5.2,1.9) % \Line(3.8,2)(5.2,2) % \Line(3.8,1.9)(5.2,2.1) % \end{picture} % % \caption{Sketches of the witch} % \label{fig:witch} % \end{figure} % % \begin{macro}{\@HwM@large@witch} % This is the macro that draws the ``large'' version of the witch (for % "\displaystyle"). This is the ``private'' variant, with the following % parameters: % \begin{paramlist} % \param % "l"~for a right-facing witch, "r"~for a left-facing one;\\ % \param % "r"~for a right-facing witch, "l"~for a left-facing one;\\ % \param % main drawing thickn., in units of the default-rule-thickness % "\fontdimen";\\ % \param % thickness of the broomstick and of the cat's tail, in the same units;\\ % \param % thickness of hair (beard, whiskers), in points~(\texttt{pt}). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@large@witch[5]{% \begin{@HwM@large@picture}{12}{-6}% \roundcap \linethickness{#4\@HwM@thickness@units@for \textfont}% \Line(\-2,-2)(\+6,2)% \linethickness{#3\@HwM@thickness@units@for \textfont}% \Line(\-2,-2)(\-5,-2.5)% \Line(\-2,-2)(\-4.85,-2.95)% \Line(\-2,-2)(\-4.6,-3.3)% \Line(\-2,-2)(\-4.35,-3.65)% \Line(\-2,-2)(\-4,-4)% \put(\-3,-1.2){\@HwM@magic@star{.4}}% \put(\-4.1,-.8){\@HwM@magic@star{.8}}% \put(\-5.4,-1.8){\@HwM@magic@star{.6}}% \Line(0,1.8)(\-.2,1.4)% \polyline(\+.6,3.2)(\+.8,3)(\+1.5,3)% \put(\+1.6,3){\oval(.2,.2)[t#1]}% \put(\+1.6,3){\oval(.2,.2)[#2]}% \polyline(\+1.6,2.9)(\+1.8,2.4)(\+1.2,2.4)(\+1,2.5)(\+1,2.3)% (\+1.2,2)(\+1.6,1.8)(\+1.7,1.8)(\+1.7,1.6)(\+1.4,1.5)% (0,1.8)(\-.2,2)% \polygon*(\-1,2)(\-2,0)(\-2,-1)(\-1.5,-2)(\+1,-2)% (0,-3.6)(\+.4,-3.8)(\+.6,-3.4)(\+.8,-4)(\+2,-4)% (\+1,-3.6)(\+1,-3)(\+1.6,-3.2)(\+2,-1.5)(0,-1)% (0,-.6)(\+1.4,-.6)(\+1.8,-.4)(\+2,0)(0,0)% (0,1.4)% \polygon*(\-3,2)(\-2.8,3)(\-2,4)(\-1.5,4.1)(\-1,4)(0,3.5)% (\+1,3.8)(\+2.5,3.5)(\+3,3.3)(\+2,3.4)(0,3)(\-1,2)% (\-2,1.6)(\-2.7,2)(\-2,2)(\-1,3)(\-2,3.5)(\-2.6,3)% \buttcap % \end{macrocode} % The witch's eye: % \begin{macrocode} \Line(\+.2,2.8)(\+.6,3)% % \end{macrocode} % Rest of the code: % \begin{macrocode} \linethickness{#5\p@}% \Line(\+1.7,1.6)(\+2,1.6)% \Line(\+1.7,1.6)(\+1.9,1.4)% \Line(\+1.7,1.6)(\+1.7,1.3)% \if@HwM@cat@ \Line(\+3.8,2.1)(\+5.2,1.9)% \Line(\+3.8,2)(\+5.2,2)% \Line(\+3.8,1.9)(\+5.2,2.1)% \roundcap \linethickness{#4\@HwM@thickness@units@for \textfont}% \put(\+3.6,1){\circle*{1.2}}% \put(\+4.2,1.4){\circle*{1}}% \put(\+4.5,2){\circle*{.8}}% \polygon*(\+4.1,2)(\+4.1,2.5)(\+4.5,2.2)(\+4.9,2.5)(\+4.9,2)% \cbezier(\+3.2,.6)(\+2,0)(\+4.2,-.4)(\+3,-1)% \fi \end{@HwM@large@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Large@Witch} % The ``public'' variant of the above, with the following parameters: % \begin{paramlist} % \param % "l"~for a right-facing witch, "r"~for a left-facing one;\\ % \param % "r"~for a right-facing witch, "l"~for a left-facing one. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Large@Witch[2]{% \@HwM@choose@thicknesses{\@HwM@large@witch #1#2}% {{.4}{1.8}{.1}}% {{.8}{2.7}{.15}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@common@small@body} % The macros that draw the ``small'' version of the witch (for styles others % than "\displaystyle") are more complex, because some parts of the drawing % are shared also by the extensible brooms ("\xrightwicthonbroom", % "\overrightwitchonbroom", and the like). The following macro draws the % parts that are common to all such constructions. This is the ``private'' % variant, with the following parameters: % \begin{paramlist} % \param % font selector (\eg "\textfont");\\ % \param % line thickness for the witch's face, in relative units. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@common@small@body[2]{% \linethickness{#2\@HwM@thickness@units@for #1}% \buttcap % \end{macrocode} % The witch's eye: % \begin{macrocode} \Line(\+.1,1.4)(\+.3,1.5)% % \end{macrocode} % Rest of the code: % \begin{macrocode} \roundcap \Line(0,.9)(\-.1,.7)% \polyline(\+.3,1.6)(\+.4,1.5)(\+.75,1.5)(\+.9,1.2)(\+.5,1.2)% (\+.6,1)(\+.8,.9)(\+.7,.75)(0,.9)(\-.1,1)% \polygon*(\-.5,1)(\-1,0)(\-1,-.5)(\-.75,-1)(\+.5,-1)% (0,-1.8)(\+.2,-1.9)(\+.3,-1.7)(\+.4,-2)(\+1,-2)% (\+.5,-1.8)(\+.5,-1.5)(\+.8,-1.6)(\+1,-.75)(0,-.5)% (0,.7)% \polygon*(\-1.5,1)(\-1.4,1.5)(\-1,2)(\-.5,2)(0,1.75)% (\+.5,1.9)(\+1.25,1.75)(0,1.5)(\-.5,1)(\-1,.8)% (\-1.2,1)(\-1,1)(\-.5,1.5)(\-1,1.75)(\-1.3,1.5)% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Common@Small@Body} % The ``public'' variant of the above; parameters: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Common@Small@Body[1]{% \@HwM@choose@thicknesses {\@HwM@common@small@body #1}{{.35}}{{.7}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@common@small@cat} % Draws the part of the cat that is shared also by the extensible brooms; % ``private'' variant, parameters are as follows: % \begin{paramlist} % \param % font selector (\eg "\textfont");\\ % \param % line thickness for the cat's tail, in relative units. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@common@small@cat[2]{% \roundcap \linethickness{#2\@HwM@thickness@units@for #1}% \if@HwM@cat@ \put(\+1.8,.5){\circle*{.6}}% \put(\+2.1,.7){\circle*{.5}}% \put(\+2.25,1){\circle*{.4}}% \polygon*(\+2.05,1)(\+2.05,1.25)(\+2.25,1.1)(\+2.45,1.25) (\+2.45,1)% \cbezier(\+1.8,.4)(\+1.2,.1)(\+2,-.1)(\+1.4,-.4)% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Common@Small@Cat} % The ``public'' variant of the above; parameters: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Common@Small@Cat[1]{% \@HwM@choose@thicknesses {\@HwM@common@small@cat #1}{{}}{{2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Small@Witch} % This is the macro that draws the complete ``small'' variant of the witch % (for styles other than "\displaystyle"). This one exists only in the % ``public'' variant, with the following arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont"). % \end{paramlist} % The first parameter is imposed by the interface toward other parts of the % code, because other macros that share the same interface might need it, but % isn't actually used in this case. % \begin{macrocode} \newcommand*\@HwM@Small@Witch[2]{% \begin{@HwM@small@picture}#2{6}{-3}% \@HwM@Common@Small@Cat #2% \Line(\-1,-1)(\+3,1)% \@HwM@Common@Small@Body #2% \Line(\-1,-1)(\-2.5,-1.25)% \Line(\-1,-1)(\-2.4,-1.5)% \Line(\-1,-1)(\-2.25,-1.75)% \Line(\-1,-1)(\-2,-2)% \put(\-1.7,-.4){\@HwM@magic@star{.4}}% \put(\-2.7,-.8){\@HwM@magic@star{.25}}% \polygon*(0,-.3)(\+.7,-.3)(\+.9,-.2)(\+1,0)(0,0)% \end{@HwM@small@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Small@Witch@Wo@Broom} % Draws the small witch w/o the broom. This one exists only in the % ``public'' variant, with the following argument: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Small@Witch@Wo@Broom[1]{% \begin{@HwM@math@picture}{4}{-2}{}#1{0}{\+1}% \@HwM@Common@Small@Body #1% \polygon*(\-.1,.4)(\+1,-.9)(\+1,-1.2)(\+.8,-1.2)(\-.1,0)% \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Small@Cat@On@Hori@Broom} % Draws a small cat on a horizontal broomstick. This one exists only in the % ``public'' variant, with the following argument: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Small@Cat@On@Hori@Broom[1]{% \begin{@HwM@math@picture}{0}{-.6}{}#1{0}{\+2.5}% \@HwM@Common@Small@Cat #1% \Line(\+2.2,.8)(\+2.4,.4)% \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \subsubsection{Drawing the pumpkins} % % Here we group the macros that take care of drawing the pumpkins. % Figure~\ref{fig:pumpkins} shows a sketch of the relevant drawings. % % \begin{figure}[tp] % \newcommand*{\PumpkinSmallMouth}[7]{^^A % \polygon*^^A % (-#1)(-#2)(-#3)(0,#4)(#3)(#2)(#1)^^A % (#5)(#6)(0,#7)(-#6)(-#5)^^A % } % \newcommand*{\PumpkinLargeMouth}[9]{^^A % \polygon*^^A % (-#1)(-#2)(-#3)(-#4)(0,#5)(#4)(#3)(#2)(#1)^^A % (#6)(#7)(#8)(0,#9)(-#8)(-#7)(-#6)^^A % } % % \centering % % The binary operator variant:\\*[\medskipamount] % \begin{picture}(3.2,4)(-1.6,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-2,-2)(1,0){5}{\line(0,1){4}} % \multiput(-2,-2)(0,1){5}{\line(1,0){4}} % \color{black} % \roundcap % \linethickness{1.3pt} % \Line(-.1,1)(-.15,1.4)(.15,1.4)(.1,1) % \Line(-.1,-1)(.1,-1) % \newcommand*{\PumpkinProfile}[1]{% % \cbezier(#1.1,1)(#11.2,1.7)(#11.6,.8)(#11.6,0)% % \cbezier(#1.1,-1)(#11,-1.5)(#11.6,-.8)(#11.6,0)% % \put(#1.6,.5){\circle*{.4}}% % } % \PumpkinProfile- % \PumpkinProfile+ % \PumpkinSmallMouth{1,-.1}{.7,-.5}{.4,-.4} % {-.7} % {.6,-.3}{.3,-.2} % {-.4} % \end{picture} % % \bigskip\bigskip % % The small variant:\\*[\medskipamount] % \begin{picture}(4.5,4)(-2.25,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \roundcap % \linethickness{2pt} % \Line(-.1,1.5)(-.15,2)(.15,2)(.1,1.5) % \Line(-.1,-1.8)(.1,-1.8) % \newcommand*{\PumpkinProfile}[1]{% % \cbezier(#1.1,1.5)(#11.75,2.5)(#12.25,1)(#12.25,0)% % \cbezier(#1.1,-1.8)(#11.6,-2.4)(#12.25,-1)(#12.25,0)% % \put(#1.75,.75){\circle*{.5}}% % } % \PumpkinProfile- % \PumpkinProfile+ % \polygon*(0,.2)(-.2,-.2)(.2,-.2) % \PumpkinSmallMouth{1.3,-.3}{.8,-.8}{.5,-.7} % {-1} % {.7,-.6}{.4,-.5} % {-.7} % \end{picture} % % \bigskip\bigskip % % The large variant:\\*[\medskipamount] % \begin{picture}(9,8)(-4.5,-4) % \linethickness{.1pt} % \color{guidelines} % \multiput(-5,-4)(1,0){11}{\line(0,1) {8}} % \multiput(-5,-4)(0,1) {9}{\line(1,0){10}} % \color{black} % \roundcap % \linethickness{3pt} % \Line(-.15,2.25)(-.3,3)(.3,3)(.15,2.25) % \Line(-.15,-2.7)(.15,-2.7) % \newcommand*{\PumpkinProfile}[1]{% % \cbezier(#1.15,2.25)(#12.63,3.75)(#13.38,1.5)(#13.38,0)% % \cbezier(#1.15,-2.7)(#12.4,-3.6)(#13.38,-1.5)(#13.38,0)% % \put(#11.13,1.13){\circle*{.8}}% % } % \PumpkinProfile- % \PumpkinProfile+ % \polygon*(0,.35)(-.35,-.35)(.35,-.35) % \PumpkinLargeMouth{2,-.5}{1.3,-1.4}{.8,-1.3}{.5,-1.6} % {-1.5} % {1.2,-1.1}{.7,-1}{.45,-1.1} % {-1} % \end{picture} % % \caption{Sketches of the pumpkins} % \label{fig:pumpkins} % \end{figure} % % As you can see in figure~\ref{fig:pumpkins}, pumpkins come in three % variants: a binary operator and the two versions (both for display and % nondisplay math) of a ``large'' operator. Below, the macros for each % version are preceded by one or two useful ``subroutines'', that draw some % patterns that appear more than once in the picture. % % \begin{macro}{\@HwM@large@pumpkin@profile} % Subroutine that draws the outline of the pumpkin and one eye, for a % ``large'' operator in display style. Argument~\#1 is either \texttt{-} % or~\texttt{+}, depending on which half of the pumpkin you want to draw. % \begin{macrocode} \newcommand*\@HwM@large@pumpkin@profile[1]{% \cbezier(#1.15,2.25)(#12.63,3.75)(#13.38,1.5)(#13.38,0)% \cbezier(#1.15,-2.7)(#12.4,-3.6)(#13.38,-1.5)(#13.38,0)% \put(#11.13,1.13){\circle*{.8}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@pumpkin@mouth} % This subroutine draws the variant of the mouth that is used by the display % version of the ``large'' operator. The parameters are suitable point % coordinates. % \begin{macrocode} \newcommand*\@HwM@large@pumpkin@mouth[9]{% \polygon*% % \end{macrocode} % Lower lip: % \begin{macrocode} (-#1)(-#2)(-#3)(-#4)(0,#5)(#4)(#3)(#2)(#1)% % \end{macrocode} % Upper lip: % \begin{macrocode} (#6)(#7)(#8)(0,#9)(-#8)(-#7)(-#6)% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@pumpkin} % Private version of the macro that draws the pumpkin correspondng to a % ``large'' operator used in display math mode. Argument: % \begin{paramlist} % \param % drawing thickness, in units of the default-rule-thickness "\fontdimen". % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@large@pumpkin[1]{% \begin{@HwM@bigop@picture}\displaystyle \textfont {7.5}{-3.75}% \roundcap \linethickness{#1\@HwM@thickness@units@for \textfont}% \Line(-.15,2.25)(-.3,3)(.3,3)(.15,2.25)% \Line(-.15,-2.7)(.15,-2.7)% \@HwM@large@pumpkin@profile-% \@HwM@large@pumpkin@profile+% \polygon*(0,.35)(-.35,-.35)(.35,-.35)% \@HwM@large@pumpkin@mouth{2,-.5}{1.3,-1.4}{.8,-1.3}{.5,-1.6}% {-1.5}% {1.2,-1.1}{.7,-1}{.45,-1.1}% {-1}% \end{@HwM@bigop@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Large@Pumpkin} % Public version of the above; requires no parameters. % \begin{macrocode} \newcommand*\@HwM@Large@Pumpkin{% \@HwM@choose@thicknesses \@HwM@large@pumpkin {{1.8}}% {{2.2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@pumpkin@profile} % Subroutine that draws the outline of the pumpkin and one eye, for a % ``large'' operator \emph{not} in display style. Argument~\#1 is either % \texttt{-} or~\texttt{+}, depending on which half of the pumpkin you want % to draw. % \begin{macrocode} \newcommand*\@HwM@small@pumpkin@profile[1]{% \cbezier(#1.1,1.5)(#11.75,2.5)(#12.25,1)(#12.25,0)% \cbezier(#1.1,-1.8)(#11.6,-2.4)(#12.25,-1)(#12.25,0)% \put(#1.75,.75){\circle*{.5}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@pumpkin@mouth} % This subroutine draws the variant of the mouth that is shared between the % binary operator and the nondisplay version of the ``large'' operator. The % parameters are suitable point coordinates. % \begin{macrocode} \newcommand*\@HwM@small@pumpkin@mouth[7]{% \polygon*% % \end{macrocode} % Lower lip: % \begin{macrocode} (-#1)(-#2)(-#3)(0,#4)(#3)(#2)(#1)% % \end{macrocode} % Upper lip: % \begin{macrocode} (#5)(#6)(0,#7)(-#6)(-#5)% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@pumpkin} % Private version of the macro that draws the pumpkin correspondng to a % ``large'' operator used in nondisplay math mode. Arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont");\\ % \param % drawing thickness, in units of the default-rule-thickness "\fontdimen". % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@small@pumpkin[3]{% \begin{@HwM@bigop@picture}#1#2{5}{-2.5}% \roundcap \linethickness{#3\@HwM@thickness@units@for #2}% \Line(-.1,1.5)(-.15,2)(.15,2)(.1,1.5)% \Line(-.1,-1.8)(.1,-1.8)% \@HwM@small@pumpkin@profile-% \@HwM@small@pumpkin@profile+% \polygon*(0,.2)(-.2,-.2)(.2,-.2)% \@HwM@small@pumpkin@mouth{1.3,-.3}{.8,-.8}{.5,-.7}% {-1}% {.7,-.6}{.4,-.5}% {-.7}% \end{@HwM@bigop@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Small@Pumpkin} % Public version of the above, with the following arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Small@Pumpkin[2]{% \@HwM@choose@thicknesses{\@HwM@small@pumpkin #1#2}% {{}}% {{1.5}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@binop@pumpkin@profile} % Subroutine that draws the outline of the pumpkin and one eye, for a binary % operator (in whatever style). Argument~\#1 is either \texttt{-} % or~\texttt{+}, depending on which half of the pumpkin you want to draw. % \begin{macrocode} \newcommand*\@HwM@binop@pumpkin@profile[1]{% \cbezier(#1.1,1)(#11.2,1.7)(#11.6,.8)(#11.6,0)% \cbezier(#1.1,-1)(#11,-1.5)(#11.6,-.8)(#11.6,0)% \put(#1.6,.5){\circle*{.4}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@binop@pumpkin} % Private version of the macro that draws the pumpkin correspondng to a % binary operator. Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont");\\ % \param % drawing thickness, in units of the default-rule-thickness "\fontdimen". % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@binop@pumpkin[3]{% \begin{@HwM@oplus@picture}#1#2{3.6}{-1.8}% \roundcap \linethickness{#3\@HwM@thickness@units@for #2}% \Line(-.1,1)(-.15,1.4)(.15,1.4)(.1,1)% \Line(-.1,-1)(.1,-1)% \@HwM@binop@pumpkin@profile-% \@HwM@binop@pumpkin@profile+% \@HwM@small@pumpkin@mouth{1,-.1}{.7,-.5}{.4,-.4}% {-.7}% {.6,-.3}{.3,-.2}% {-.4}% \end{@HwM@oplus@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Binop@Pumpkin} % Public version of the above, with the following arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Binop@Pumpkin[2]{% \@HwM@choose@thicknesses{\@HwM@binop@pumpkin #1#2}% {{.6}}% {{1.2}}% } % \end{macrocode} % \end{macro} % % \subsubsection{Drawing the skulls} % % Now it's the turn of the macros that take care of drawing the skulls. % Figure~\ref{fig:skulls} shows a sketch of the relevant drawings. % % \begin{figure}[tp] % \newcommand*{\binaryskullnose}[8]{^^A % \moveto(0,-.#1)^^A % \curveto(-.#2,-.#1)(-.#3,-.#4)(-.#5,-.#6)^^A % \curveto(-.#7,-.#8)(.#7,-.#8)(.#5,-.#6)^^A % \curveto(.#3,-.#4)(.#2,-.#1)(0,-.#1)^^A % \fillpath % } % \newcommand*{\semibinaryskullcontour}[1]{^^A % \moveto(#1.15,0)^^A % \curveto(#1.15,.1)(#1.15,.21)(#1.4,.2)^^A % \curveto(#1.6,.19)(#1.69,.1)(#1.7,0)^^A % \curveto(#1.71,-.1)(#1.6,-.3)(#1.5,-.3)^^A % \curveto(#1.4,-.3)(#1.15,-.2)(#1.15,0)^^A % \fillpath % \cbezier(0,1.333336)(#11,1.333336)(#11.2,0.5)(#11,0)^^A % \cbezier(#11,0)(#11.05,-.9)(#1.5,-.3)(#1.5,-.65)^^A % } % \newcommand*{\semibinaryskullteeth}[2]{^^A % \moveto(#1.5,-.7)^^A % \curveto(#1.45,-.6)(#1.4,-.6)(#1.35,-.7)^^A % \curveto(#1.4,-1.2)(#1.5,-1.2)(#1.5,-.7)^^A % \strokepath % \moveto(#1.33,-.7)^^A % \curveto(#1.3,-.6)(#1.22,-.6)(#1.19,-.75)^^A % \curveto(#1.15,-.9)(#1.38,-.9)(#1.33,-.7)^^A % \strokepath % \moveto(#1.17,-.75)^^A % \curveto(#1.13,-.65)(#1.05,-.62)(#1.02,-.75)^^A % \curveto(#2.03,-.95)(#1.22,-.95)(#1.17,-.75)^^A % \strokepath % } % % \newcommand*{\semismallskullcontour}[1]{^^A % \moveto(#1.225,0)^^A % \curveto(#1.225,.15)(#1.225,.315)(#1.6,.3)^^A % \curveto(#1.9,.285)(#11.035,.15)(#11.05,0)^^A % \curveto(#11.065,-.15)(#1.9,-.45)(#1.75,-.45)^^A % \curveto(#1.6,-.45)(#1.225,-.3)(#1.225,0)^^A % \fillpath % \cbezier(0,2)(#11.5,2)(#11.8,0.75)(#11.5,0)^^A % \cbezier(#11.5,0)(#11.575,-1.35)(#1.75,-.45)(#1.75,-1)^^A % } % \newcommand*{\semismallskulljaw}[1]{^^A % \moveto(#11.25,-.9)^^A % \curveto(#11.24,-1.2)(#11.2,-1)(#11.1,-1.3)^^A % \curveto(#11,-1.6)(#11,-1.8)(#1.75,-1.9)^^A % \curveto(0,-2.1)(#1.3,-2)(0,-2)^^A % \strokepath % } % \newcommand*{\semismallskullinnerjaw}[1]{^^A % \moveto(#11,-.9)^^A % \curveto(#1.9,-1)(#11,-1.5)(#1.75,-1.5)^^A % \strokepath % } % \newcommand*{\semismallskullteeth}[2]{^^A % \moveto(#1.75,-1)^^A % \curveto(#1.65,-.9)(#1.6,-.9)(#1.5,-1)^^A % \curveto(#1.6,-2)(#1.7,-2)(#1.75,-1)^^A % \strokepath % \moveto(#1.45,-1)^^A % \curveto(#1.4,-.9)(#1.3,-.9)(#1.285,-1.05)^^A % \curveto(#1.2,-1.35)(#1.6,-1.35)(#1.45,-1)^^A % \strokepath % \moveto(#1.25,-1.05)^^A % \curveto(#1.2,-.9)(#1.04,-.9)(#1.03,-1.05)^^A % \curveto(#2.08,-1.4)(#1.35,-1.4)(#1.25,-1.05)^^A % \strokepath % \moveto(#1.5,-1.5)^^A % \curveto(#1.47,-1.65)(#1.35,-1.6)(#1.3,-1.55)^^A % \curveto(#1.15,-1.25)(#1.65,-1.25)(#1.5,-1.5)^^A % \strokepath % \moveto(#1.25,-1.55)^^A % \curveto(#1.2,-1.7)(#1.04,-1.7)(#1.03,-1.55)^^A % \curveto(#2.1,-1.3)(#1.35,-1.3)(#1.25,-1.55)^^A % \strokepath % } % % \newcommand*{\largeskullnose}[9]{^^A % \moveto(0,-#1)^^A % \curveto(-#2,-#1)(-#3,-#1)(-#4,-#5)^^A % \curveto(-#6,-#7)(-#8,-#9)(0,-#9)^^A % \curveto(#8,-#9)(#6,-#7)(#4,-#5)^^A % \curveto(#3,-#1)(#2,-#1)(0,-#1)^^A % \fillpath % } % \newcommand*{\semilargeskullcontour}[1]{^^A % \moveto(#1.3375,0)^^A % \curveto(#1.3375,.225)(#1.3375,.4725)(#1.9,.45)^^A % \curveto(#11.35,.4275)(#11.5525,.225)(#11.575,0)^^A % \curveto(#11.5975,-.225)(#11.35,-.675)(#11.125,-.675)^^A % \curveto(#1.9,-.675)(#1.3375,-.45)(#1.3375,0)^^A % \fillpath % \cbezier(#12,2)(#12.1,1.8)(#12.7,1.125)(#12.25,0)^^A % \moveto(#12.24,.1)^^A % \curveto(#12.3,-1)(#12,-1.2)(#11.5,-1.2)^^A % \curveto(#11.3,-1.2)(#11.125,-1.3)(#11.125,-1.5)^^A % \strokepath % ^^A Jaw % \moveto(#11.875,-1.35)^^A % \curveto(#11.86,-1.8)(#11.8,-1.5)(#11.65,-1.95)^^A % \curveto(#11.5,-2.4)(#11.5,-2.75)(#11.2,-2.9)^^A % \curveto(#1.9,-3.05)(#11,-3.2)(#1.3,-3.1)^^A % \strokepath % } % \newcommand*{\semilargeskullinnerjaw}[1]{^^A % \moveto(#11.5,-1.35)^^A % \curveto(#11.35,-1.5)(#11.5,-2.25)(#11.125,-2.25)^^A % \strokepath % } % \newcommand*{\semilargeskullteeth}[2]{^^A % \moveto(#1.75,-2.25)^^A % \curveto(#1.65,-2.5)(#1.55,-2.5)(#1.45,-2.3)^^A % \curveto(#1.35,-2.05)(#1.4,-2)(#1.6,-2)^^A % \curveto(#1.8,-2)(#1.8,-2.05)(#1.75,-2.25)^^A % \strokepath % \moveto(#1.35,-2.3)^^A % \curveto(#1.25,-2.6)(#1.1,-2.65)(#1.05,-2.3)^^A % \curveto(#1.05,-2.05)(0,-2.05)(#1.2,-2.05)^^A % \curveto(#1.4,-2.05)(#1.42,-2)(#1.35,-2.3)^^A % \strokepath % \moveto(#11.12,-1.6)^^A % \curveto(#11,-1.3)(#1.9,-1.3)(#1.75,-1.6)^^A % \curveto(#11,-3)(#11,-3)(#11.12,-1.5)^^A % \strokepath % \moveto(#1.7,-1.6)^^A % \curveto(#1.6,-1.4)(#1.5,-1.4)(#1.45,-1.65)^^A % \curveto(#1.45,-1.85)(#1.4,-1.95)(#1.55,-1.95)^^A % \curveto(#1.85,-1.95)(#1.75,-1.75)(#1.7,-1.6)^^A % \strokepath % \moveto(#1.4,-1.65)^^A % \curveto(#1.3,-1.4)(#1.1,-1.4)(#1.05,-1.7)^^A % \curveto(#1.05,-1.9)(#2.05,-2)(#1.225,-2)^^A % \curveto(#1.5,-2)(#1.45,-1.9)(#1.4,-1.65) % \strokepath % } % \newcommand*{\semilargeskullthinlines}[1]{^^A % \moveto(#1.8,.7)^^A % \curveto(#1.4,.7)(#1.4,.9)(#1.2,.7)^^A % \curveto(#1.1,.6)(#1.2,.4)(#1.2,.3)^^A % \strokepath % \cbezier(#11.3,.7)(#11.5,.7)(#11.5,.75)(#11.75,.5)^^A % } % % \centering % % The binary operator variant:\\*[\medskipamount] % \begin{picture}(3.2,4)(-1.6,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-2,-2)(1,0){5}{\line(0,1){4}} % \multiput(-2,-2)(0,1){5}{\line(1,0){4}} % \color{black} % \roundcap % \linethickness{.7pt} % \semibinaryskullteeth-+ % \semibinaryskullteeth+- % \linethickness{1.3pt} % \binaryskullnose{5}{1}{2}{5}{15}{4}{1}{1} % \semibinaryskullcontour- % \semibinaryskullcontour+ % \end{picture} % % \bigskip\bigskip % % The small variant:\\*[\medskipamount] % \begin{picture}(4,4)(-2,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-2,-2)(1,0){5}{\line(0,1){4}} % \multiput(-2,-2)(0,1){5}{\line(1,0){4}} % \color{black} % \roundcap % \linethickness{.8pt} % \semismallskullteeth-+ % \semismallskullteeth+- % \linethickness{2pt} % \binaryskullnose{75}{15}{3}{75}{225}{6}{15}{15} % \semismallskullcontour- % \semismallskullcontour+ % \semismallskulljaw- % \semismallskulljaw+ % \linethickness{1.2pt} % \semismallskullinnerjaw- % \semismallskullinnerjaw+ % \end{picture} % % \bigskip\bigskip % % The large variant:\\*[\medskipamount] % \begin{picture}(9,8)(-4.5,-4) % \linethickness{.1pt} % \color{guidelines} % \multiput(-4,-4)(1,0){9}{\line(0,1){8}} % \multiput(-4,-4)(0,1){9}{\line(1,0){8}} % \color{black} % \roundcap % \linethickness{1pt} % \semilargeskullteeth-+ % \semilargeskullteeth+- % \linethickness{3pt} % \largeskullnose % {1.125}{.1}{.5}{.3375}{.9}{.147}{.7}{.2}{.4} % \cbezier(-2,2)(-1.25,3.5)(1.25,3.5)(2,2) % \semilargeskullcontour- % \semilargeskullcontour+ % \cbezier(-.3,-3.1)(0,-3)(0,-3)(.3,-3.1) % \linethickness{1.8pt} % \semilargeskullinnerjaw- % \semilargeskullinnerjaw+ % \linethickness{.5pt} % \semilargeskullthinlines- % \semilargeskullthinlines+ % \end{picture} % % \caption{Sketches of the skulls} % \label{fig:skulls} % \end{figure} % % As you can see in figure~\ref{fig:pumpkins}, skulls too come in three % variants: a binary operator and the two versions (both for display and % nondisplay math) of a ``large'' operator. Below, the macros for each % version are preceded by one or two useful ``subroutines'', that draw some % patterns that appear more than once in the picture. % % \begin{macro}{\@HwM@large@skull@nose} % Subroutine that draws the (hole corresponding to the) nose in the variant % of the skull that is used for a ``large'' operator typeset in display % style. Parameters are suitable points coordinates. % \begin{macrocode} \newcommand*\@HwM@large@skull@nose[9]{% \moveto(0,-#1)% \curveto(-#2,-#1)(-#3,-#1)(-#4,-#5)% \curveto(-#6,-#7)(-#8,-#9)(0,-#9)% \curveto(#8,-#9)(#6,-#7)(#4,-#5)% \curveto(#3,-#1)(#2,-#1)(0,-#1)% \fillpath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@skull@profile} % Subroutine that draws the outline and the outer part of the jaw in the % variant of the skull that is used for a ``large'' operator typeset in % display style. Argument~\#1 is either \texttt{-} or~\texttt{+}, depending % on which half of the skull you want to draw. % \begin{macrocode} \newcommand*\@HwM@large@skull@profile[1]{% \moveto(#1.3375,0)% \curveto(#1.3375,.225)(#1.3375,.4725)(#1.9,.45)% \curveto(#11.35,.4275)(#11.5525,.225)(#11.575,0)% \curveto(#11.5975,-.225)(#11.35,-.675)(#11.125,-.675)% \curveto(#1.9,-.675)(#1.3375,-.45)(#1.3375,0)% \fillpath \cbezier(#12,2)(#12.1,1.8)(#12.7,1.125)(#12.25,0)% \moveto(#12.24,.1)% \curveto(#12.3,-1)(#12,-1.2)(#11.5,-1.2)% \curveto(#11.3,-1.2)(#11.125,-1.3)(#11.125,-1.5)% \strokepath % \end{macrocode} % The outer contour of the jaw: % \begin{macrocode} \moveto(#11.875,-1.35)% \curveto(#11.86,-1.8)(#11.8,-1.5)(#11.65,-1.95)% \curveto(#11.5,-2.4)(#11.5,-2.75)(#11.2,-2.9)% \curveto(#1.9,-3.05)(#11,-3.2)(#1.3,-3.1)% \strokepath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@skull@innerjaw} % Subroutine that draws the inner part of the jaw in the variant of the skull % that is used for a ``large'' operator typeset in display style. % Argument~\#1 is either \texttt{-} or~\texttt{+}, depending on which half of % the skull you want to draw. % \begin{macrocode} \newcommand*\@HwM@large@skull@innerjaw[1]{% \moveto(#11.5,-1.35)% \curveto(#11.35,-1.5)(#11.5,-2.25)(#11.125,-2.25)% \strokepath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@skull@teeth} % Subroutine for drawing the teeth in the variant of the skull that is used % for a ``large'' operator typeset in display style. Argument~\#1 is either % \texttt{-} or~\texttt{+}, depending on which half of the skull you want to % draw; then, argument~\#2 must always be the opposite sign (that is, either % \texttt{+} or~\texttt{-}, respectively). % \begin{macrocode} \newcommand*\@HwM@large@skull@teeth[2]{% \moveto(#1.75,-2.25)% \curveto(#1.65,-2.5)(#1.55,-2.5)(#1.45,-2.3)% \curveto(#1.35,-2.05)(#1.4,-2)(#1.6,-2)% \curveto(#1.8,-2)(#1.8,-2.05)(#1.75,-2.25)% \strokepath \moveto(#1.35,-2.3)% \curveto(#1.25,-2.6)(#1.1,-2.65)(#1.05,-2.3)% \curveto(#1.05,-2.05)(0,-2.05)(#1.2,-2.05)% \curveto(#1.4,-2.05)(#1.42,-2)(#1.35,-2.3)% \strokepath \moveto(#1.7,-1.6)% \curveto(#1.6,-1.4)(#1.5,-1.4)(#1.45,-1.65)% \curveto(#1.45,-1.85)(#1.4,-1.95)(#1.55,-1.95)% \curveto(#1.85,-1.95)(#1.75,-1.75)(#1.7,-1.6)% \strokepath \moveto(#11.12,-1.6)% \curveto(#11,-1.3)(#1.9,-1.3)(#1.75,-1.6)% \curveto(#11,-3)(#11,-3)(#11.12,-1.5)% \strokepath \moveto(#1.4,-1.65)% \curveto(#1.3,-1.4)(#1.1,-1.4)(#1.05,-1.7)% \curveto(#1.05,-1.9)(#2.05,-2)(#1.225,-2)% \curveto(#1.5,-2)(#1.45,-1.9)(#1.4,-1.65) \strokepath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@large@skull@brows} % Subroutine for drawing the brows in the variant of the skull that is used % for a ``large'' operator typeset in display style. Argument~\#1 is either % \texttt{-} or~\texttt{+}, depending on which half of the skull you want to % draw. % \begin{macrocode} \newcommand*\@HwM@large@skull@brows[1]{% \moveto(#1.8,.7)% \curveto(#1.4,.7)(#1.4,.9)(#1.2,.7)% \curveto(#1.1,.6)(#1.2,.4)(#1.2,.3)% \strokepath \cbezier(#11.3,.7)(#11.5,.7)(#11.5,.75)(#11.75,.5)% } % \end{macrocode} % \end{macro} % % Admittedly, not all these subroutines were actually needed; but I~wrote the % code this way when I~dashed off the skethces, and I~was too lazy to % streamline it afterwards, when copying it to this package! % % \begin{macro}{\@HwM@large@skull} % Private version of the macro that draws the skull correspondng to a % ``large'' operator used in display math mode. Arguments: % \begin{paramlist} % \param % main drawing thickn., in units of the default-rule-thickness % "\fontdimen";\\ % \param % line thickness for drawing the inner of the jaw, in the same units;\\ % \param % line thickness for drawing the teeth, in the same units;\\ % \param % line thickness for drawing the brows, in points~(\texttt{pt}). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@large@skull[4]{% \begin{@HwM@bigop@picture}\displaystyle \textfont {6}{-3}% \roundcap \linethickness{#3\@HwM@thickness@units@for \textfont}% \@HwM@large@skull@teeth-+% \@HwM@large@skull@teeth+-% \linethickness{#1\@HwM@thickness@units@for \textfont}% \@HwM@large@skull@nose {1.125}{.1}{.5}{.3375}{.9}{.147}{.7}{.2}{.4}% \cbezier(-2,2)(-1.25,3.5)(1.25,3.5)(2,2)% \@HwM@large@skull@profile-% \@HwM@large@skull@profile+% \cbezier(-.3,-3.1)(0,-3)(0,-3)(.3,-3.1)% \linethickness{#2\@HwM@thickness@units@for \textfont}% \@HwM@large@skull@innerjaw-% \@HwM@large@skull@innerjaw+% \linethickness{#4\p@}% \@HwM@large@skull@brows-% \@HwM@large@skull@brows+% \end{@HwM@bigop@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Large@Skull} % Public version of the above; requires no parameters. % \begin{macrocode} \newcommand*\@HwM@Large@Skull{% \@HwM@choose@thicknesses \@HwM@large@skull {{1.5}{.9}{.3}{.075}}% {{2}{1.2}{.4}{.1}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@skull@nose} % Subroutine that draws the (hole corresponding to the) variant of the nose % that is shared between the binary operator and the nondisplay version of % the ``large'' operator. The parameters are suitable point coordinates. % \begin{macrocode} \newcommand*\@HwM@small@skull@nose[8]{% \moveto(0,-.#1)% \curveto(-.#2,-.#1)(-.#3,-.#4)(-.#5,-.#6)% \curveto(-.#7,-.#8)(.#7,-.#8)(.#5,-.#6)% \curveto(.#3,-.#4)(.#2,-.#1)(0,-.#1)% \fillpath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@skull@profile} % Subroutine that draws the outline and the outer part of the jaw in the % variant of the skull that is used for a ``large'' operator typeset in % \emph{non}-display style. Argument~\#1 is either \texttt{-} or~\texttt{+}, % depending on which half of the skull you want to draw. % \begin{macrocode} \newcommand*\@HwM@small@skull@profile[1]{% \moveto(#1.225,0)% \curveto(#1.225,.15)(#1.225,.315)(#1.6,.3)% \curveto(#1.9,.285)(#11.035,.15)(#11.05,0)% \curveto(#11.065,-.15)(#1.9,-.45)(#1.75,-.45)% \curveto(#1.6,-.45)(#1.225,-.3)(#1.225,0)% \fillpath \cbezier(0,2)(#11.5,2)(#11.8,0.75)(#11.5,0)% \cbezier(#11.5,0)(#11.575,-1.35)(#1.75,-.45)(#1.75,-1)% % \end{macrocode} % The outer contour of the jaw: % \begin{macrocode} \moveto(#11.25,-.9)% \curveto(#11.24,-1.2)(#11.2,-1)(#11.1,-1.3)% \curveto(#11,-1.6)(#11,-1.8)(#1.75,-1.9)% \curveto(0,-2.1)(#1.3,-2)(0,-2)% \strokepath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@skull@innerjaw} % Subroutine that draws the inner part of the jaw in the variant of the skull % that is used for a ``large'' operator typeset in display style. % Argument~\#1 is either \texttt{-} or~\texttt{+}, depending on which half of % the skull you want to draw. % \begin{macrocode} \newcommand*\@HwM@small@skull@innerjaw[1]{% \moveto(#11,-.9)% \curveto(#1.9,-1)(#11,-1.5)(#1.75,-1.5)% \strokepath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@skull@teeth} % Subroutine for drawing the teeth in the variant of the skull that is used % for a ``large'' operator which gets typeset in \emph{non}-display style. % Argument~\#1 is either \texttt{-} or~\texttt{+}, depending on which half of % the skull you want to draw; then, argument~\#2 must always be the opposite % sign (that is, either \texttt{+} or~\texttt{-}, respectively). % \begin{macrocode} \newcommand*\@HwM@small@skull@teeth[2]{% \moveto(#1.5,-1.5)% \curveto(#1.47,-1.65)(#1.35,-1.6)(#1.3,-1.55)% \curveto(#1.15,-1.25)(#1.65,-1.25)(#1.5,-1.5)% \strokepath \moveto(#1.25,-1.55)% \curveto(#1.2,-1.7)(#1.04,-1.7)(#1.03,-1.55)% \curveto(#2.1,-1.3)(#1.35,-1.3)(#1.25,-1.55)% \strokepath \moveto(#1.45,-1)% \curveto(#1.4,-.9)(#1.3,-.9)(#1.285,-1.05)% \curveto(#1.2,-1.35)(#1.6,-1.35)(#1.45,-1)% \strokepath \moveto(#1.75,-1)% \curveto(#1.65,-.9)(#1.6,-.9)(#1.5,-1)% \curveto(#1.6,-2)(#1.7,-2)(#1.75,-1)% \strokepath \moveto(#1.25,-1.05)% \curveto(#1.2,-.9)(#1.04,-.9)(#1.03,-1.05)% \curveto(#2.08,-1.4)(#1.35,-1.4)(#1.25,-1.05)% \strokepath } % \end{macrocode} % \end{macro} % % The same remark, as the one we made above, about the redundancy of these % subroutines (and about my laziness!\@) applies here. % % \begin{macro}{\@HwM@small@skull} % Private version of the macro that draws the skull correspondng to a % ``large'' operator used in \emph{non}-display math mode. Arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont");\\ % \param % main drawing thickn., in units of the default-rule-thickness % "\fontdimen";\\ % \param % line thickness for drawing the inner of the jaw, in the same units;\\ % \param % line thickness for drawing the teeth, in the same units. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@small@skull[5]{% \begin{@HwM@bigop@picture}#1#2{3.48}{-1.74}% \roundcap \linethickness{#5\@HwM@thickness@units@for #2}% \@HwM@small@skull@teeth-+% \@HwM@small@skull@teeth+-% \linethickness{#3\@HwM@thickness@units@for #2}% \@HwM@small@skull@nose{75}{15}{3}{75}{225}{6}{15}{15}% \@HwM@small@skull@profile-% \@HwM@small@skull@profile+% \linethickness{#4\@HwM@thickness@units@for #2}% \@HwM@small@skull@innerjaw-% \@HwM@small@skull@innerjaw+% \end{@HwM@bigop@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Small@Skull} % Public version of the above, with the following arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Small@Skull[2]{% \@HwM@choose@thicknesses{\@HwM@small@skull #1#2}% {{}{.6}{.25}}% {{1.333333}{.7}{.3}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@binop@skull@profile} % Subroutine that draws the outline of the variant of the skull that is used % for a binary operator (in whatever style). Argument~\#1 is either % \texttt{-} or~\texttt{+}, depending on which half of the skull you want to % draw. % \begin{macrocode} \newcommand*\@HwM@binop@skull@profile[1]{% \moveto(#1.15,0)% \curveto(#1.15,.1)(#1.15,.21)(#1.4,.2)% \curveto(#1.6,.19)(#1.69,.1)(#1.7,0)% \curveto(#1.71,-.1)(#1.6,-.3)(#1.5,-.3)% \curveto(#1.4,-.3)(#1.15,-.2)(#1.15,0)% \fillpath \cbezier(0,1.333336)(#11,1.333336)(#11.2,0.5)(#11,0)% \cbezier(#11,0)(#11.05,-.9)(#1.5,-.3)(#1.5,-.65)% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@binop@skull@teeth} % Subroutine for drawing the teeth in the variant of the skull that is used % for a binary operator. Argument~\#1 is either \texttt{-} or~\texttt{+}, % depending on which half of the skull you want to draw; then, argument~\#2 % must always be the opposite sign (that is, either \texttt{+} or~\texttt{-}, % respectively). % \begin{macrocode} \newcommand*\@HwM@binop@skull@teeth[2]{% \moveto(#1.33,-.7)% \curveto(#1.3,-.6)(#1.22,-.6)(#1.19,-.75)% \curveto(#1.15,-.9)(#1.38,-.9)(#1.33,-.7)% \strokepath \moveto(#1.5,-.7)% \curveto(#1.45,-.6)(#1.4,-.6)(#1.35,-.7)% \curveto(#1.4,-1.2)(#1.5,-1.2)(#1.5,-.7)% \strokepath \moveto(#1.17,-.75)% \curveto(#1.13,-.65)(#1.05,-.62)(#1.02,-.75)% \curveto(#2.03,-.95)(#1.22,-.95)(#1.17,-.75)% \strokepath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@binop@skull} % Private version of the macro that draws the skull for a binary operator. % Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont");\\ % \param % main drawing thickn., in units of the default-rule-thickness % "\fontdimen";\\ % \param % line thickness for drawing the teeth, in the same units. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@binop@skull[4]{% \begin{@HwM@oplus@picture}#1#2{2.48}{-1.24}% \roundcap \linethickness{#4\@HwM@thickness@units@for #2}% \@HwM@binop@skull@teeth-+% \@HwM@binop@skull@teeth+-% \linethickness{#3\@HwM@thickness@units@for #2}% \@HwM@small@skull@nose{5}{1}{2}{5}{15}{4}{1}{1}% \@HwM@binop@skull@profile-% \@HwM@binop@skull@profile+% \end{@HwM@oplus@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Binop@Skull} % Public version of the above, with the following arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@Binop@Skull[2]{% \@HwM@choose@thicknesses{\@HwM@binop@skull #1#2}% {{.6}{.2}}% {{.9}{.266667}}% } % \end{macrocode} % \end{macro} % % \subsubsection{Drawing the clouds} % % Clouds are relatively simple to deal with: they are treated similarly to % fractions, in that they are typeset in a larger version, used only for % "\displaystyle" math, and in a smaller one, used in all the other cases. % Figure~\ref{fig:cloud} sketches both variants. % % \begin{figure}[tp] % \centering % The small variant:\\*[\bigskipamount] % \begin{picture}(6,4)(-3,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \linethickness{1.5pt} % \roundcap % \cbezier(-2.5,0)(-3.5,.25)(-3,2)(-1,1.5) % \cbezier(-1.2,1.25)(-.75,2)(1,2.5)(1,1.5) % \cbezier(.9,1.4)(1.25,2)(2.25,1.25)(1.4,.9) % \cbezier(1.6,1)(3.5,1)(3,0)(2.5,0) % \cbezier(2.5,0)(3,0)(3.5,-1)(2.1,-1.2) % \cbezier(2.5,-1.1)(2.5,-2)(1,-2.5)(0,-1.5) % \cbezier(.1,-1.2)(-.1,-2.25)(-2.25,-2)(-2,-1) % \cbezier(-1.7,-1)(-2.75,-1)(-3.25,-.25)(-2.5,0) % \end{picture} % % \bigskip\bigskip\bigskip % % The large variant:\\*[\bigskipamount] % \begin{picture}(12,8)(-6,-4) % \linethickness{.1pt} % \color{guidelines} % \multiput(-6,-4)(1,0){13}{\line(0,1){8}} % \multiput(-6,-4)(0,1) {9}{\line(1,0){12}} % \color{black} % \roundcap % \linethickness{2pt} % \cbezier(-5,0)(-7,.5)(-5.5,3.25)(-4,2.5) % \cbezier(-3.8,2.1)(-4.75,3.5)(-2,4)(-2,3) % \cbezier(-2.4,2.5)(-1.5,4)(2,5)(2,3) % \cbezier(1.8,2.8)(2.5,4)(4.5,2.5)(2.8,1.8) % \cbezier(3.2,2)(7,2)(6,0)(5,0) % \cbezier(5,0)(6,0)(6.25,-1)(5.3,-1.4) % \cbezier(4.6,-1.1)(6.8,-1.5)(4.3,-4)(3.6,-2.1) % \cbezier(3.9,-2.6)(4,-3)(2,-5)(0,-3) % \cbezier(.2,-2.4)(-.2,-4.5)(-4.5,-4)(-4,-2) % \cbezier(-3.4,-2)(-5.5,-2)(-6.5,-.5)(-5,0) % \end{picture} % % \caption{Sketches of the cloud} % \label{fig:cloud} % \end{figure} % % By good fortune, clouds do not require any subroutine\ldots % % \begin{macro}{\@HwM@large@cloud} % This is the private version of the macro that draws the larger cloud. % Argument: % \begin{paramlist} % \param % drawing thickness, in units of the default-rule-thickness "\fontdimen". % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@large@cloud[1]{% \begin{@HwM@large@picture}{12}{-6}% \roundcap \linethickness{#1\@HwM@thickness@units@for \textfont}% \cbezier(\-5,0)(\-7,.5)(\-5.5,3.25)(\-4,2.5)% \cbezier(\-3.8,2.1)(\-4.75,3.5)(\-2,4)(\-2,3)% \cbezier(\-2.4,2.5)(\-1.5,4)(\+2,5)(\+2,3)% \cbezier(\+1.8,2.8)(\+2.5,4)(\+4.5,2.5)(\+2.8,1.8)% \cbezier(\+3.2,2)(\+7,2)(\+6,0)(\+5,0)% \cbezier(\+5,0)(\+6,0)(\+6.25,-1)(\+5.3,-1.4)% \cbezier(\+4.6,-1.1)(\+6.8,-1.5)(\+4.3,-4)(\+3.6,-2.1)% \cbezier(\+3.9,-2.6)(\+4,-3)(\+2,-5)(0,-3)% \cbezier(\+.2,-2.4)(\-.2,-4.5)(\-4.5,-4)(\-4,-2)% \cbezier(\-3.4,-2)(\-5.5,-2)(\-6.5,-.5)(\-5,0)% \end{@HwM@large@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Large@Cloud} % Public version of the above; requires no parameters. % \begin{macrocode} \newcommand*\@HwM@Large@Cloud{% \@HwM@choose@thicknesses \@HwM@large@cloud {{.8}}% {{1.6}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@small@cloud} % Private version of the macro that draws the smaller cloud (which has a % little fewer details than the larger one). Arguments: % \begin{paramlist} % \param % font selector (\eg "\scriptfont");\\ % \param % drawing thickness, in units of the default-rule-thickness "\fontdimen". % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@small@cloud[2]{% \begin{@HwM@small@picture}#1{6}{-3}% \roundcap \linethickness{#2\@HwM@thickness@units@for #1}% \cbezier(\-2.5,0)(\-3.5,.25)(\-3,2)(\-1,1.5)% \cbezier(\-1.2,1.25)(\-.75,2)(\+1,2.5)(\+1,1.5)% \cbezier(\+.9,1.4)(\+1.25,2)(\+2.25,1.25)(\+1.4,.9)% \cbezier(\+1.6,1)(\+3.5,1)(\+3,0)(\+2.5,0)% \cbezier(\+2.5,0)(\+3,0)(\+3.5,-1)(\+2.1,-1.2)% \cbezier(\+2.5,-1.1)(\+2.5,-2)(\+1,-2.5)(0,-1.5)% \cbezier(\+.1,-1.2)(\-.1,-2.25)(\-2.25,-2)(\-2,-1)% \cbezier(\-1.7,-1)(\-2.75,-1)(\-3.25,-.25)(\-2.5,0)% \end{@HwM@small@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Small@Cloud} % Public version of the above. Arguments: % \begin{paramlist} % \param % style selector (\eg "\scriptstyle");\\ % \param % font selector (\eg "\scriptfont"). % \end{paramlist} % The first parameter is imposed by the interface toward other parts of the % code, because other macros that share the same interface might need it, but % isn't actually used in this case. % \begin{macrocode} \newcommand*\@HwM@Small@Cloud[2]{% \@HwM@choose@thicknesses{\@HwM@small@cloud #2}% {{.5}}% {{1.2}}% } % \end{macrocode} % \end{macro} % % That's all: as we promised, this has been a quick one! % % \subsubsection{Drawing the ghosts} % % For ghosts, I~imagined a r\^{o}le as ordinary symbols, and nothing else; % therefore, they exist in only one size, but, in return, they can be seen % from three different views (left, front, and right), as % figure~\ref{fig:ghosts} depicts. From the implementation viewpoint, only % two variants need to be defined: a ``symmetric ghost'', that corresponds to % the front view, and an ``asymmetric ghost'', which yields the left and the % right views through the same mechanism that toggles, for example, between % the straight and the reverse witch. % % \begin{figure}[tp] % \newcommand*{\SymmetricGhostContour}[8]{^^A % \cbezier(-#1,#2)(-#3,#4)(-#3,#5)(-#3,#6)^^A % \Line(-#3,#6)(-#3,#7)^^A % \cbezier(#1,#2)(#3,#4)(#3,#5)(#3,#6)^^A % \Line(#3,#6)(#3,#7)^^A % \cbezier(-#3,#7)(-#3,#8)(#3,#8)(#3,#7)^^A % } % \newcommand*{\SymmetricGhostBorder}[8]{^^A % \cbezier(-#1,#2)(-#3,#4)(-#5,#6)(-#7,#2)^^A % \qbezier(-#7,#2)(0,#8)(#7,#2)^^A % \cbezier(#1,#2)(#3,#4)(#5,#6)(#7,#2)^^A % } % \newcommand*{\SymmetricGhostEyes}[3]{^^A % \put(-#1,#2){\circle*{#3}}^^A % \put(#1,#2){\circle*{#3}}^^A % } % \newcommand*{\AsymmetricGhost}[2]{^^A % \roundcap % \linethickness{1.5pt}^^A % \cbezier(#11.75,-1.5)(#11,-1)(#1.7,-.5)(#1.5,0)^^A % \cbezier(#1.5,0)(#1.3,.5)(0,1.6)(#21,1.6)^^A % \cbezier(#21,1.6)(#21.8,1.6)(#21.8,.9)(#21.8,.6)^^A % \cbezier(#21.8,.6)(#21.8,-.3)(#2.9,-.7)(#21.25,-1.5)^^A % \linethickness{1pt}^^A % \cbezier(#11.75,-1.5)(#11.4,-1.2)(#11.1,-1.8)(#1.75,-1.5)^^A % \cbezier(#1.75,-1.5)(#1.4,-1.2)(#1.1,-1.8)(#2.25,-1.5)^^A % \cbezier(#2.25,-1.5)(#2.6,-1.2)(#2.9,-1.8)(#21.25,-1.5)^^A % \put(#21.2,.7){\circle*{.4}}^^A % } % % \centering % \addtolength\leftskip {-2cm} % \addtolength\rightskip{-2cm} % % Only the small variant is defined:\\*[\bigskipamount] % \begin{picture}(4,4)(-2,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-2,-2)(1,0){5}{\line(0,1){4}} % \multiput(-2,-2)(0,1){5}{\line(1,0){4}} % \color{black} % \AsymmetricGhost+- % \end{picture}\qquad % \begin{picture}(4,4)(-2,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-2,-2)(1,0){5}{\line(0,1){4}} % \multiput(-2,-2)(0,1){5}{\line(1,0){4}} % \color{black} % \roundcap % \linethickness{1.5pt} % \SymmetricGhostContour{1.5}{-1.5}{1}{-1}{-.5}{0}{.5}{2} % \linethickness{1pt} % \SymmetricGhostBorder{1.5}{-1.5}{1.1}{-1.1}{.7}{-1.9}{.3}{-1.2} % \SymmetricGhostEyes{.4}{.7}{.4} % \end{picture}\qquad % \begin{picture}(4,4)(-2,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-2,-2)(1,0){5}{\line(0,1){4}} % \multiput(-2,-2)(0,1){5}{\line(1,0){4}} % \color{black} % \AsymmetricGhost-+ % \end{picture}\par % % \caption{Sketches of the ghosts} % \label{fig:ghosts} % \end{figure} % % For ghosts, again, we do have some subroutines; and, again, some of these % could actually be inserted inline. % % \begin{macro}{\@HwM@symm@ghost@contour} % Subroutine that draws the thicker part of a symmetric ghost's contour. % Parameters are suitable point coordinates. % \begin{macrocode} \newcommand*\@HwM@symm@ghost@contour[8]{% \cbezier(-#1,#2)(-#3,#4)(-#3,#5)(-#3,#6)% \Line(-#3,#6)(-#3,#7)% \cbezier(#1,#2)(#3,#4)(#3,#5)(#3,#6)% \Line(#3,#6)(#3,#7)% \cbezier(-#3,#7)(-#3,#8)(#3,#8)(#3,#7)% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@symm@ghost@border} % Subroutine that draws the lower border of a symmetric ghost's sheet (the % thinner part of its contour). Parameters are suitable point coordinates. % \begin{macrocode} \newcommand*\@HwM@symm@ghost@border[8]{% \cbezier(-#1,#2)(-#3,#4)(-#5,#6)(-#7,#2)% \qbezier(-#7,#2)(0,#8)(#7,#2)% \cbezier(#1,#2)(#3,#4)(#5,#6)(#7,#2)% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@symm@ghost@eyes} % Subroutine that draws the eyes of a symmetric ghost. The parameters are % self-explanatory. % \begin{macrocode} \newcommand*\@HwM@symm@ghost@eyes[3]{% \put(-#1,#2){\circle*{#3}}% \put(#1,#2){\circle*{#3}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@symmetric@ghost} % Private version of the macro that draws the symmetric ghost. Arguments: % \begin{paramlist} % \param % font selector (\eg "\textfont");\\ % \param % contour thickness, in units of the default-rule-thickness % "\fontdimen";\\ % \param % lower border thickness, in the same units. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@symmetric@ghost[3]{% \begin{@HwM@math@picture}{2.6}{-1}% {\@HwM@d@pict@strut{.6}}#1{3.2}{-1.6}% \roundcap \linethickness{#2\@HwM@thickness@units@for #1}% \@HwM@symm@ghost@contour{1.5}{-1.5}{1}{-1}{-.5}{0}{.5}{2}% \linethickness{#3\@HwM@thickness@units@for #1}% \@HwM@symm@ghost@border{1.5}{-1.5}{1.1}{-1.1}{.7}{-1.9}{.3}{-1.2}% \@HwM@symm@ghost@eyes{.4}{.7}{.4}% \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Symmetric@Ghost} % Public version of the above. Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % The first parameter is imposed by the interface toward other parts of the % code, because other macros that share the same interface might need it, but % isn't actually used in this case. % \begin{macrocode} \newcommand*\@HwM@Symmetric@Ghost[2]{% \@HwM@choose@thicknesses{\@HwM@symmetric@ghost #2}% {{.9}{.6}}% {{1.8}{1.2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@asymmetric@ghost} % Private version of the macro that draws the asymmetric ghost. Arguments: % \begin{paramlist} % \param % font selector (\eg "\textfont");\\ % \param % contour thickness, in units of the default-rule-thickness % "\fontdimen";\\ % \param % lower border thickness, in the same units. % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@asymmetric@ghost[3]{% \begin{@HwM@math@picture}{2.6}{-1}% {\@HwM@d@pict@strut{.6}}#1{3.8}% {-\@HwM@right@or@left{1.6}{2.2}}% \roundcap \linethickness{#2\@HwM@thickness@units@for #1}% \cbezier(\-1.75,-1.5)(\-1,-1)(\-.7,-.5)(\-.5,0)% \cbezier(\-.5,0)(\-.3,.5)(0,1.6)(\+1,1.6)% \cbezier(\+1,1.6)(\+1.8,1.6)(\+1.8,.9)(\+1.8,.6)% \cbezier(\+1.8,.6)(\+1.8,-.3)(\+.9,-.7)(\+1.25,-1.5)% \linethickness{#3\@HwM@thickness@units@for #1}% \cbezier(\-1.75,-1.5)(\-1.4,-1.2)(\-1.1,-1.8)(\-.75,-1.5)% \cbezier(\-.75,-1.5)(\-.4,-1.2)(\-.1,-1.8)(\+.25,-1.5)% \cbezier(\+.25,-1.5)(\+.6,-1.2)(\+.9,-1.8)(\+1.25,-1.5)% \put(\+1.2,.7){\circle*{.4}}% \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Asymmetric@Ghost} % Public version of the above. Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % The first parameter is imposed by the interface toward other parts of the % code, because other macros that share the same interface might need it, but % isn't actually used in this case. % \begin{macrocode} \newcommand*\@HwM@Asymmetric@Ghost[2]{% \@HwM@choose@thicknesses{\@HwM@asymmetric@ghost #2}% {{.9}{.6}}% {{1.8}{1.2}}% } % \end{macrocode} % \end{macro} % % \subsubsection{Drawing the bats} % % We've finally got to the last of our characters (at least for this % version): the bat. Bats are rendered as filled, as opposed to stroked, % black shapes, and therefore it is impossible to differentiate the normal % and the bold version by changing the thickness of the strokes (because % there aren't any): the shape itself needs to be made slightly larger. % Besides this, as in the case of ghosts we have designed a ``symmetric'' bat % and an ``asymmetric'' one, where the latter can be drawn in two opposite % orientations: this makes a total of six possible variants, which are % portrayed in figures \ref{fig:s-bats} and~\ref{fig:a-bats}. The reference % lines help you spot the differences between the bold and the normal % versions. % % \begin{figure}[tp] % \newcommand*{\BatWing}[1]{^^A % \moveto(#1.7,0)^^A % \curveto(#11.5,.1)(#12.2,.5)(#12,1)^^A % \curveto(#12.5,.5)(#12.9,0)(#12.9,-.5)^^A % \curveto(#12.8,0)(#12,-.5)(#12.25,-1)^^A % \curveto(#12,-.5)(#11.7,-.3)(#11.5,-.7)^^A % \curveto(#11.4,-.5)(#11.2,-.3)(#11,-.5)^^A % \curveto(#1.9,-.4)(#1.7,-.4)(#1.5,-.5)^^A % \closepath % \fillpath % } % \newcommand*{\BoldBatWing}[1]{^^A % \moveto(#1.7,.1)^^A % \curveto(#11.5,.2)(#12.25,.6)(#12,1.1)^^A % \curveto(#12.6,.5)(#13,0)(#13,-.6)^^A % \curveto(#12.8,0)(#12,-.6)(#12.25,-1.1)^^A % \curveto(#12,-.6)(#11.7,-.4)(#11.5,-.8)^^A % \curveto(#11.4,-.6)(#11.2,-.4)(#11,-.6)^^A % \curveto(#1.9,-.5)(#1.7,-.5)(#1.5,-.5)^^A % \closepath % \fillpath % } % % \newcommand*{\Bat}{^^A % \moveto(-.5,-.5)^^A % \curveto(-.4,-.6)(-.2,-.7)(-.2,-1)^^A % \curveto(-.1,-.7)(.1,-.7)(.2,-1)^^A % \curveto(.2,-.7)(.4,-.6)(.5,-.5)^^A % \closepath % \fillpath % \BatWing-^^A % \BatWing+^^A % \moveto(.5,0)^^A % \circlearc{.35}{0}{.15}{0}{180}^^A % \lineto(-.2,0)^^A % \circlearc{-.35}{0}{.15}{0}{180}^^A % \lineto(-.75,0)^^A % \curveto(-.75,.45)(-.7,.5)(-.5,1)^^A % \circlearc{0}{1}{.5}{180}{360}^^A % \curveto(.7,.5)(.75,.45)(.75,0)^^A % \closepath % \fillpath % \moveto(-.75,0)^^A % \circlearc{0}{0}{.75}{180}{360}^^A % \lineto(.5,0)^^A % \circlearc{.35}{0}{.15}{360}{180}^^A % \lineto(-.2,0)^^A % \circlearc{-.35}{0}{.15}{360}{180}^^A % \closepath % \fillpath % } % \newcommand*{\BoldBat}{^^A % \moveto(-.6,-.5)^^A % \curveto(-.5,-.6)(-.3,-.7)(-.3,-1.1)^^A % \curveto(-.1,-.7)(.1,-.7)(.3,-1.1)^^A % \curveto(.3,-.7)(.5,-.6)(.6,-.5)^^A % \closepath % \fillpath % \BoldBatWing-^^A % \BoldBatWing+^^A % \moveto(.5,0)^^A % \circlearc{.35}{0}{.15}{0}{180}^^A % \lineto(-.2,0)^^A % \circlearc{-.35}{0}{.15}{0}{180}^^A % \lineto(-.8,0)^^A % \curveto(-.8,.5)(-.7,.5)(-.55,1.1)^^A % \circlearc{0}{1.1}{.55}{180}{360}^^A % \curveto(.7,.5)(.8,.5)(.8,0)^^A % \closepath % \fillpath % \moveto(-.8,0)^^A % \circlearc{0}{0}{.8}{180}{360}^^A % \lineto(.5,0)^^A % \circlearc{.35}{0}{.15}{360}{180}^^A % \lineto(-.2,0)^^A % \circlearc{-.35}{0}{.15}{360}{180}^^A % \closepath % \fillpath % } % % \centering % % The symmetric bat, % in the \texttt{normal}\ldots\\*[\bigskipamount] % \begin{picture}(6,4)(-3,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \Bat % \end{picture} % % \bigskip\bigskip\bigskip % % \ldots and in the \texttt{bold} math version.\\*[\bigskipamount] % \begin{picture}(6,4)(-3,-2) % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \BoldBat % \end{picture} % % \caption{Sketches of the symmetric bats} % \label{fig:s-bats} % \end{figure} % % \begin{figure}[tp] % \newcommand*{\AsymmBat}{^^A % \moveto(\-.5,.2)^^A % \curveto(\-1.5,.3)(\-2.2,.5)(\-1.8,1)^^A % \curveto(\-2.5,.5)(\-2.9,0)(\-2.9,-.5)^^A % \curveto(\-2.7,0)(\-2,-.25)(\-2,-.8)^^A % \curveto(\-2,-.5)(\-1.6,-.25)(\-1.4,-.5)^^A % \curveto(\-1.4,-.2)(\-1.2,-.1)(\-1,-.3)^^A % \curveto(\-1,-.1)(\-.7,-.1)(\-.6,-.1)^^A % \closepath % \fillpath % \moveto(\+.9,0)^^A % \curveto(\+2,-.1)(\+2.2,.5)(\+2,.7)^^A % \curveto(\+2.5,.6)(\+3.2,0)(\+2.9,-.7)^^A % \curveto(\+2.6,-.2)(\+2,-.5)(\+2,-1)^^A % \curveto(\+2,-.5)(\+1.7,-.4)(\+1.5,-.7)^^A % \curveto(\+1.6,-.4)(\+1.3,-.2)(\+1.1,-.5)^^A % \curveto(\+1.1,-.3)(\+1,-.3)(\+.8,-.3)^^A % \closepath % \fillpath % \moveto(\+.8,-.1)^^A % \curveto(\+.85,.08)(\+.65,.13)(\+.6,-.05)^^A % \lineto(\+.3,0)^^A % \curveto(\+.35,.2)(\+.05,.3)(0,.1)^^A % \lineto(\-.8,0)^^A % \curveto(\-.7,.3)(\-.4,.7)(\+.25,1)^^A % \curveto(\+.2,.4)(\+.8,.3)(\+1,.9)^^A % \curveto(\+1.1,.7)(\+1.1,.2)(\+1,0)^^A % \closepath % \fillpath % \moveto(\+.8,-.1)^^A % \curveto(\+.75,-.28)(\+.55,-.23)(\+.6,-.05)^^A % \lineto(\+.3,0)^^A % \curveto(\+.25,-.18)(\-.05,-.08)(0,.1)^^A % \lineto(\-.8,0)^^A % \curveto(\-.9,-.3)(\-.8,-.6)(\-1,-.9)^^A % \curveto(\-.8,-.6)(\-.4,-.7)(\-.6,-1)^^A % \curveto(\-.2,-.8)(\+.2,-.82)(\+.3,-.8)^^A % \curveto(\+.85,-.69)(\+.99,-.02)(\+1,0)^^A % \closepath % \fillpath % } % \newcommand*{\BoldAsymmBat}{^^A % \moveto(\-.5,.3)^^A % \curveto(\-1.5,.4)(\-2.2,.6)(\-1.9,1.1)^^A % \curveto(\-2.6,.6)(\-3,0)(\-3,-.6)^^A % \curveto(\-2.6,-.1)(\-2,-.4)(\-2,-.9)^^A % \curveto(\-2,-.6)(\-1.6,-.35)(\-1.4,-.6)^^A % \curveto(\-1.4,-.3)(\-1.2,-.2)(\-1,-.4)^^A % \curveto(\-1,-.2)(\-.7,-.2)(\-.6,-.2)^^A % \closepath % \fillpath % \moveto(\+.9,.1)^^A % \curveto(\+1.8,0)(\+2.3,.3)(\+2.1,.8)^^A % \curveto(\+2.6,.7)(\+3.3,-.1)(\+3,-.8)^^A % \curveto(\+2.7,-.3)(\+2,-.6)(\+2,-1.1)^^A % \curveto(\+2,-.6)(\+1.7,-.5)(\+1.5,-.8)^^A % \curveto(\+1.6,-.5)(\+1.3,-.3)(\+1.1,-.6)^^A % \curveto(\+1.1,-.4)(\+1,-.4)(\+.8,-.4)^^A % \closepath % \fillpath % \moveto(\+.8,-.1)^^A % \curveto(\+.85,.08)(\+.65,.13)(\+.6,-.05)^^A % \lineto(\+.3,0)^^A % \curveto(\+.35,.2)(\+.05,.3)(0,.1)^^A % \lineto(\-.85,0)^^A % \curveto(\-.75,.3)(\-.4,.7)(\+.25,1.1)^^A % \curveto(\+.2,.55)(\+.8,.45)(\+1,1)^^A % \curveto(\+1.1,.8)(\+1.2,.2)(\+1.05,0)^^A % \closepath % \fillpath % \moveto(\+.8,-.1)^^A % \curveto(\+.75,-.28)(\+.55,-.23)(\+.6,-.05)^^A % \lineto(\+.3,0)^^A % \curveto(\+.25,-.18)(\-.05,-.08)(0,.1)^^A % \lineto(\-.85,0)^^A % \curveto(\-.95,-.3)(\-.8,-.6)(\-1,-1)^^A % \curveto(\-.75,-.7)(\-.4,-.8)(\-.5,-1.1)^^A % \curveto(\-.2,-.8)(\+.2,-.82)(\+.3,-.8)^^A % \curveto(\+.85,-.69)(\+1.04,-.0133333)(\+1.05,0)^^A % \closepath % \fillpath % } % % \centering % \addtolength\leftskip {-2cm} % \addtolength\rightskip{-2cm} % % The asymmetric bat, % in the \texttt{normal}\ldots\\*[\bigskipamount] % \begin{picture}(6,4)(-3,-2) % \def\+{-} % \def\-{+} % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \AsymmBat % \end{picture}\qquad % \begin{picture}(6,4)(-3,-2) % \def\+{+} % \def\-{-} % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \AsymmBat % \end{picture} % % \bigskip\bigskip\bigskip % % \ldots and in the \texttt{bold} math version.\\*[\bigskipamount] % \begin{picture}(6,4)(-3,-2) % \def\+{-} % \def\-{+} % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \BoldAsymmBat % \end{picture}\qquad % \begin{picture}(6,4)(-3,-2) % \def\+{+} % \def\-{-} % \linethickness{.1pt} % \color{guidelines} % \multiput(-3,-2)(1,0){7}{\line(0,1){4}} % \multiput(-3,-2)(0,1){5}{\line(1,0){6}} % \color{black} % \BoldAsymmBat % \end{picture} % % \caption{Sketches of the asymmetric bats} % \label{fig:a-bats} % \end{figure} % % \begin{macro}{\@HwM@symmetric@bat@wing} % Subroutine that draws the wing of a symmetric, normal (that is, not bold) % bat. Argument~\#1 is either \texttt{-} or~\texttt{+}, depending on which % wing you want to draw. % \begin{macrocode} \newcommand*\@HwM@symmetric@bat@wing[1]{% \moveto(#1.7,0)% \curveto(#11.5,.1)(#12.2,.5)(#12,1)% \curveto(#12.5,.5)(#12.9,0)(#12.9,-.5)% \curveto(#12.8,0)(#12,-.5)(#12.25,-1)% \curveto(#12,-.5)(#11.7,-.3)(#11.5,-.7)% \curveto(#11.4,-.5)(#11.2,-.3)(#11,-.5)% \curveto(#1.9,-.4)(#1.7,-.4)(#1.5,-.5)% \closepath \fillpath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@symmetric@bbat@wing} % Subroutine that draws the wing of a symmetric, bold bat (note the % additional~\texttt{b}). Argument~\#1 is either \texttt{-} or~\texttt{+}, % depending on which wing you want to draw. % \begin{macrocode} \newcommand*\@HwM@symmetric@bbat@wing[1]{% \moveto(#1.7,.1)% \curveto(#11.5,.2)(#12.25,.6)(#12,1.1)% \curveto(#12.6,.5)(#13,0)(#13,-.6)% \curveto(#12.8,0)(#12,-.6)(#12.25,-1.1)% \curveto(#12,-.6)(#11.7,-.4)(#11.5,-.8)% \curveto(#11.4,-.6)(#11.2,-.4)(#11,-.6)% \curveto(#1.9,-.5)(#1.7,-.5)(#1.5,-.5)% \closepath \fillpath } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@symmetric@bat} % Macro that draws the symmetric, normal (that is, not bold) bat. Argument: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@symmetric@bat[1]{% \begin{@HwM@math@picture}{2}{-1}{}#1{6}{-3}% \moveto(-.5,-.5)% \curveto(-.4,-.6)(-.2,-.7)(-.2,-1)% \curveto(-.1,-.7)(.1,-.7)(.2,-1)% \curveto(.2,-.7)(.4,-.6)(.5,-.5)% \closepath \fillpath \@HwM@symmetric@bat@wing-% \@HwM@symmetric@bat@wing+% \moveto(.5,0)% \circlearc{.35}{0}{.15}{0}{180}% \lineto(-.2,0)% \circlearc{-.35}{0}{.15}{0}{180}% \lineto(-.75,0)% \curveto(-.75,.45)(-.7,.5)(-.5,1)% \circlearc{0}{1}{.5}{180}{360}% \curveto(.7,.5)(.75,.45)(.75,0)% \closepath \fillpath \moveto(-.75,0)% \circlearc{0}{0}{.75}{180}{360}% \lineto(.5,0)% \circlearc{.35}{0}{.15}{360}{180}% \lineto(-.2,0)% \circlearc{-.35}{0}{.15}{360}{180}% \closepath \fillpath \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@symmetric@bold@bat} % Macro that draws the symmetric, bold bat. Argument: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@symmetric@bold@bat[1]{% \begin{@HwM@math@picture}{2}{-1}{}#1{6}{-3}% \moveto(-.6,-.5)% \curveto(-.5,-.6)(-.3,-.7)(-.3,-1.1)% \curveto(-.1,-.7)(.1,-.7)(.3,-1.1)% \curveto(.3,-.7)(.5,-.6)(.6,-.5)% \closepath \fillpath \@HwM@symmetric@bbat@wing-% \@HwM@symmetric@bbat@wing+% \moveto(.5,0)% \circlearc{.35}{0}{.15}{0}{180}% \lineto(-.2,0)% \circlearc{-.35}{0}{.15}{0}{180}% \lineto(-.8,0)% \curveto(-.8,.5)(-.7,.5)(-.55,1.1)% \circlearc{0}{1.1}{.55}{180}{360}% \curveto(.7,.5)(.8,.5)(.8,0)% \closepath \fillpath \moveto(-.8,0)% \circlearc{0}{0}{.8}{180}{360}% \lineto(.5,0)% \circlearc{.35}{0}{.15}{360}{180}% \lineto(-.2,0)% \circlearc{-.35}{0}{.15}{360}{180}% \closepath \fillpath \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Symmetric@Bat} % Macro that draws the symmetric bat, automatically choosing between the % normal and the bold version; because of this, it is directly a ``public'' % macro. Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % The first parameter is imposed by the interface toward other parts of the % code, even if is not used here (as it happened in several other similar % macros). % \begin{macrocode} \newcommand*\@HwM@Symmetric@Bat[2]{% \@HwM@if@bold@math{% \@HwM@symmetric@bold@bat #2% }{% \@HwM@symmetric@bat #2% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@asymmetric@bat} % Macro that draws the asymmetric, normal (that is, not bold) bat. Argument: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@asymmetric@bat[1]{% \begin{@HwM@math@picture}{2}{-1}{}#1{6}{-3}% \moveto(\-.5,.2)% \curveto(\-1.5,.3)(\-2.2,.5)(\-1.8,1)% \curveto(\-2.5,.5)(\-2.9,0)(\-2.9,-.5)% \curveto(\-2.7,0)(\-2,-.25)(\-2,-.8)% \curveto(\-2,-.5)(\-1.6,-.25)(\-1.4,-.5)% \curveto(\-1.4,-.2)(\-1.2,-.1)(\-1,-.3)% \curveto(\-1,-.1)(\-.7,-.1)(\-.6,-.1)% \closepath \fillpath \moveto(\+.9,0) \curveto(\+2,-.1)(\+2.2,.5)(\+2,.7) \curveto(\+2.5,.6)(\+3.2,0)(\+2.9,-.7)% \curveto(\+2.6,-.2)(\+2,-.5)(\+2,-1)% \curveto(\+2,-.5)(\+1.7,-.4)(\+1.5,-.7)% \curveto(\+1.6,-.4)(\+1.3,-.2)(\+1.1,-.5)% \curveto(\+1.1,-.3)(\+1,-.3)(\+.8,-.3)% \closepath \fillpath \moveto(\+.8,-.1)% \curveto(\+.85,.08)(\+.65,.13)(\+.6,-.05)% \lineto(\+.3,0)% \curveto(\+.35,.2)(\+.05,.3)(0,.1)% \lineto(\-.8,0)% \curveto(\-.7,.3)(\-.4,.7)(\+.25,1)% \curveto(\+.2,.4)(\+.8,.3)(\+1,.9)% \curveto(\+1.1,.7)(\+1.1,.2)(\+1,0)% \closepath \fillpath \moveto(\+.8,-.1)% \curveto(\+.75,-.28)(\+.55,-.23)(\+.6,-.05)% \lineto(\+.3,0)% \curveto(\+.25,-.18)(\-.05,-.08)(0,.1)% \lineto(\-.8,0)% \curveto(\-.9,-.3)(\-.8,-.6)(\-1,-.9)% \curveto(\-.8,-.6)(\-.4,-.7)(\-.6,-1)% \curveto(\-.2,-.8)(\+.2,-.82)(\+.3,-.8)% \curveto(\+.85,-.69)(\+.99,-.02)(\+1,0)% \closepath \fillpath \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@asymmetric@bold@bat} % Macro that draws the asymmetric, bold bat. Argument: % \begin{paramlist} % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@asymmetric@bold@bat[1]{% \begin{@HwM@math@picture}{2}{-1}{}#1{6}{-3}% \moveto(\-.5,.3)% \curveto(\-1.5,.4)(\-2.2,.6)(\-1.9,1.1)% \curveto(\-2.6,.6)(\-3,0)(\-3,-.6)% \curveto(\-2.6,-.1)(\-2,-.4)(\-2,-.9)% \curveto(\-2,-.6)(\-1.6,-.35)(\-1.4,-.6)% \curveto(\-1.4,-.3)(\-1.2,-.2)(\-1,-.4)% \curveto(\-1,-.2)(\-.7,-.2)(\-.6,-.2)% \closepath \fillpath \moveto(\+.9,.1) \curveto(\+1.8,0)(\+2.3,.3)(\+2.1,.8)% \curveto(\+2.6,.7)(\+3.3,-.1)(\+3,-.8)% \curveto(\+2.7,-.3)(\+2,-.6)(\+2,-1.1)% \curveto(\+2,-.6)(\+1.7,-.5)(\+1.5,-.8)% \curveto(\+1.6,-.5)(\+1.3,-.3)(\+1.1,-.6)% \curveto(\+1.1,-.4)(\+1,-.4)(\+.8,-.4)% \closepath \fillpath \moveto(\+.8,-.1)% \curveto(\+.85,.08)(\+.65,.13)(\+.6,-.05)% \lineto(\+.3,0)% \curveto(\+.35,.2)(\+.05,.3)(0,.1)% \lineto(\-.85,0)% \curveto(\-.75,.3)(\-.4,.7)(\+.25,1.1)% \curveto(\+.2,.55)(\+.8,.45)(\+1,1)% \curveto(\+1.1,.8)(\+1.2,.2)(\+1.05,0)% \closepath \fillpath \moveto(\+.8,-.1)% \curveto(\+.75,-.28)(\+.55,-.23)(\+.6,-.05)% \lineto(\+.3,0)% \curveto(\+.25,-.18)(\-.05,-.08)(0,.1)% \lineto(\-.85,0)% \curveto(\-.95,-.3)(\-.8,-.6)(\-1,-1)% \curveto(\-.75,-.7)(\-.4,-.8)(\-.5,-1.1)% \curveto(\-.2,-.8)(\+.2,-.82)(\+.3,-.8)% \curveto(\+.85,-.69)(\+1.04,-.0133333)(\+1.05,0)% \closepath \fillpath \end{@HwM@math@picture}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@Asymmetric@Bat} % Macro that draws the asymmetric bat, automatically choosing between the % normal and the bold version; because of this, it is directly a ``public'' % macro. Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % This should be the last time we have to repeat the usual remark about the % first parameter: although it is not used in this macro, it is imposed by % the interface toward other parts of the code, which is shared also by a few % macros that, instead, require the information it conveys. % \begin{macrocode} \newcommand*\@HwM@Asymmetric@Bat[2]{% \@HwM@if@bold@math{% \@HwM@asymmetric@bold@bat #2% }{% \@HwM@asymmetric@bat #2% }% } % \end{macrocode} % \end{macro} % % \subsubsection{New brooms, old pitchforks} % % As we have already remarked in the first part, more precisely in % Subsection~\ref{ssS:Witches}, the look of brooms, as they were implemented % by the first release of this package, had already been % \href{https://tex.stackexchange.com/questions/336768/seasonal-challenge-contributions-from-texing-dead-welcome#comment829686_337719}{politely % questioned}: the problem was that, in certain commands, the brush was % rendered as an "\in" or~"\ni" character ($\in$/$\ni$), making the supposed % broom look more like a pitchfork. The same commands now represent the % brush with a composite character obtained by overprinting a $<$ or~$>$ % character to a~$-$; however, the old representation is retained too, using % different command names. The following macros define both the old-style % pitchforks and the new ``composite'' brushes. % % \begin{macro}{\@HwM@oooalign} % This macro overprints two or more characters, taking math style into due % account. It is my personal version of "\ooalign". Arguments: % \begin{paramlist} % \param % style selector (\eg "\textstyle");\\ % \param % the symbols to be printed over oneanother, separated by "\cr". % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@oooalign[2]{% \leavevmode \vbox{% \baselineskip\z@skip % \end{macrocode} % The following line is just for elegance, since "\lineskip" will never be % used\ldots % \begin{macrocode} \lineskip\z@skip % \end{macrocode} % \ldots given the setting of "\lineskiplimit". % \begin{macrocode} \lineskiplimit -\maxdimen \m@th \ialign{\hfil$#1##$\hfil\crcr #2\crcr}% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@overprint@rel} % This macro builds a composite relation symbol out of the two characters % specified in the arguments. % \begin{macrocode} \newcommand*\@HwM@overprint@rel[2]{% \mathrel{\mathpalette \@HwM@oooalign {#1\cr#2}}% } % \end{macrocode} % \end{macro} % % The \packlass{\amsmath} package secures away, under the name "\std@minus", % the original "\mathcode" of the \texttt{-}~character; it does so because % this "\mathcode" is redefined when typesetting operator names % (see~\cite{bib:diffs-m}, near the end of the ``Changes in amsmath~2.0 % [November 1999]''), and this would cause an extensible arrow, that happened % to be used inside an operator name, as in % \begin{verbatim}\DeclareMathOperator{\test}{\underleftrightarrow{test}}\end{verbatim} % to come out wrong. The saved "\mathcode" is used later in the "\relbar" % macro. Since we use are using "\relbar" for our brooms too, for some while % we've been concerned that other symbols we are going to employ could ``get % out of synch'', as it were, with what "\relbar" would yield. This had % initially led us to adopt the following, ``paranoid'' approach: % \begin{verbatim}\def\do#1#2{\@ifdefinable#1{\mathchardef#1=\mathcode`#2\relax}} %\do \@HwM@std@greater > %\do \@HwM@std@less < %\def\do#1#2\@ifdefinable#1{\let #1=#2} %\do \@HwM@std@in \in %\do \@HwM@std@ni \ni %\AtBeginDocument{% % \mathchardef \@HwM@std@greater \mathcode`>\relax % \mathchardef \@HwM@std@less \mathcode`<\relax % \let \@HwM@std@in = \in % \let \@HwM@std@ni = \ni %} %\newcommand*\@HwM@rightbroomtail{% % \@HwM@overprint@rel \std@minus \@HwM@std@greater %} %\newcommand*\@HwM@leftbroomtail{% % \@HwM@overprint@rel \std@minus \@HwM@std@less %} %\newcommand*\@HwM@rightpforktail{\mathrel\@HwM@std@ni} %\newcommand*\@HwM@leftpforktail {\mathrel\@HwM@std@in}\end{verbatim} % Note that the definition of "\in" and~"\ni" was secured away too (and saved % again at "\begin{document}"!\@), and not even I~can tell what was the % reasoning behind that: being \TeXtok{mathchardef token}'s by their own, % "\in" and~"\ni" needn't be saved as such; admittedly, there had been no % reasoning at all! The redundant "\mathrel" in the definition of % "\@HwM@rightpforktail" and "\@HwM@leftpforktail" deserves special mention % as well; but we find the same redundancy in the definition of "\Relbar", % not only in \packlass{\amsmath}, but also back in Knuth's coding of the % \texttt{plain} format. % % Later on, paranoia was lowered to what could even be deemed a sensible % level; indeed, storing away the "\mathcode" of~\texttt{<}/\texttt{>} is % closely similar to what the \packlass{\amsmath} package does when it % defines "\std@equal". % \begin{verbatim}\def\do#1#2{\@ifdefinable#1{\mathchardef#1=\mathcode`#2\relax}} %\do \@HwM@std@greater > %\do \@HwM@std@less < %\AtBeginDocument{% % \mathchardef \@HwM@std@greater \mathcode`>\relax % \mathchardef \@HwM@std@less \mathcode`<\relax %} %\newcommand*\@HwM@rightbroomtail{% % \@HwM@overprint@rel \std@minus \@HwM@std@greater %} %\newcommand*\@HwM@leftbroomtail{% % \@HwM@overprint@rel \std@minus \@HwM@std@less %} %\newcommand*\@HwM@rightpforktail{\mathrel\ni} %\newcommand*\@HwM@leftpforktail {\mathrel\in}\end{verbatim} % However, this code retains the fundamental drawback that affected the % previous version as well: it will break down with engines that use Unicode % math. Of course, it would be easy to cater for this too, but the point is % that\ldots\ well, there's no point in all this "\mathcode" securement in % the first place: OK\@, it is necessary to provide it for the~\texttt{-} % character, which can denote two different symbols (minus and hyphen), taken % from two different fonts, but neither for \texttt{<} or~\texttt{>}, nor, % for that matter, for~\texttt{=}. So, in the end we decided simply to keep % the symbolic names for the ``broom tail'' symbols, so that they serve as % hooks, should we ever need to take a different course of action in the % future, but to specify \texttt{<} and~\texttt{>} as literals, at least for % now. % % \begin{macro}{\@HwM@rightbroomtail} % The representation of the brush in the ``new'' brooms; version for brooms % that point to the right. % \begin{macrocode} \newcommand*\@HwM@rightbroomtail{\@HwM@overprint@rel \std@minus >} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@leftbroomtail} % As above, but for brooms that point to the left. % \begin{macrocode} \newcommand*\@HwM@leftbroomtail {\@HwM@overprint@rel \std@minus <} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@rightpforktail} % Similar hook, but for pitchforks, pointing to the right. % \begin{macrocode} \newcommand*\@HwM@rightpforktail{\mathrel\ni} % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@leftpforktail} % For pitchforks pointing to the left. % \begin{macrocode} \newcommand*\@HwM@leftpforktail {\mathrel\in} % \end{macrocode} % \end{macro} % % Note again that, in the last two macros, we retained the redundant % "\mathrel", exactly as Knuth and the authors of \packlass{\amsmath} did in % the definition of "\Relbar": indeed, in order for "\joinrel" to work % properly, it is essential that the symbols it acts on behave as relations, % while, on the other hand, as remote as it might seem, there is always the % possibility that the final user has redefined the r\^{o}le of "\in"/"ni". % (Or, at least, this the tale I~recount to myself\ldots) % % For the above discussion about "\std@minus", I~have to thank again the % people at \href{https://tex.stackexchange.com/}{\TeXSXAbbrev}, who provided % me with the necessary insight into the matter: see~\cite{bib:std}. % % \subsubsection{Helper macros for the extensible symbols} % \label{sS:ExtensHelper} % % This subsection contains some utility macros that help typeset certain % extensible components, like broomsticks, swishes of ghosts, and so on. % Such components are implemented by means of the "\leaders" primitive, or of % a variant thereof. % % \begin{macro}{\@HwM@arrowfill@skip} % Instead of relying on temporaries, we reserve a "\skip" register % specifically devoted to holding the skip for the "\leaders". % \begin{macrocode} \newlength\@HwM@arrowfill@skip % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@auto@font@selector} % Suppose you have \meta{something} (\eg a macro token) that expects to be % followed by a pair \meta{style selector}\meta{font selector}, where % \meta{style selctor} is a single token like "\displaystyle" or % "\scriptscriptstyle", and \meta{font selector} is a single token like % "\textfont" or "\scriptfont"; then % \begin{flushleft} % "\@HwM@auto@font@selector{"\meta{something}"}"\meta{style selector} % \end{flushleft} % is transformed into % \begin{flushleft} % \meta{something}\meta{style selector}\meta{font selector} % \end{flushleft} % where \meta{style selector} is the same selector as the one that was % originally present, and \meta{font selector} is the correct font selector % that is associated with it (namely, "\textfont" for "\displaystyle" and % "\textstyle", "\scriptfont" for "\scriptstyle", and "\scriptscriptfont" for % "\scriptscriptstyle"). For example, % \begin{flushleft} % "\@HwM@auto@font@selector{"\meta{something}"}\displaystyle" % \end{flushleft} % is transformed into % \begin{flushleft} % \meta{something}"\displaystyle\textfont" % \end{flushleft} % In other words, prepending \meta{something} with "\@HwM@auto@font@selector" % turns it from something that requires the two arguments \meta{style % selector}\meta{font selector} into something else that takes just the % single argument \meta{style selector}: the appropriate \meta{font selector} % will be automatically supplied (whence the name of this macro). % In version~0.01 of this package, this macro was implemented as shown here: % \begin{verbatim}\newcommand*\@HwM@auto@font@selector[2]{% % \def\@tempa{#1}% % \edef\@tempb{% % \ifx\displaystyle #2% % \textfont % \else \ifx\textstyle #2% % \textfont % \else \ifx\scriptstyle #2% % \scriptfont % \else \ifx\scriptscriptstyle #2% % \scriptscriptfont % \fi\fi\fi\fi % }% % \expandafter \@tempa \expandafter #2\@tempb %}\end{verbatim} % But in this version, the multiple-choice conditional has been simplified as % follows. % \textbf{Beware:} this is still a simple implementation that relies on % assignments and that is therefore \emph{not} purely expandable. % \begin{macrocode} \newcommand*\@HwM@auto@font@selector[2]{% \def\@tempa{#1}% \edef\@tempb{% \ifx\scriptscriptstyle #2% \scriptscriptfont \else \ifx\scriptstyle #2% \scriptfont \else \textfont \fi\fi }% \expandafter \@tempa \expandafter #2\@tempb } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@extended@arrowfill@} % This macro is loosely similar to the "\arrowfill@" macro found in the % \packlass{\amsmath} package, though its functionality is extended so as to % satisfy our needs. Basically, it invokes a caller-supplied (pseudo-)macro % that typeset the "\leaders", passing to it the appropriate value for % "\@HwM@arrowfill@skip". Arguments: % \begin{paramlist} % \param % the "\leaders" (pseudo-)macro (its arguments are specified below);\\ % \param % the minimal width, expressed as a multiple of 18~math units. % \end{paramlist} % Arguments of the caller-supplied (pseudo-)macro: % \begin{paramlist} % \param % style selector (\eg "\displaystyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@extended@arrowfill@[2]{% \@HwM@auto@font@selector {\@HwM@stylefont@arrowfill{#1}{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@stylefont@arrowfill} % This is, in a sense, the ``internal'' version of the above macro, that is, % the version that ought to be called \emph{after} the process of argument % doubling implemented by "\@HwM@auto@font@selector" has taken place (see the % description of that macro for details). Note that the name of this macro % does \emph{not} end in an~\texttt{@}. Arguments: % \begin{paramlist} % \param % the "\leaders" (pseudo-)macro (having the same 2~arguments as above);\\ % \param % the minimal width, expressed as a multiple of 18~math units;\\ % \param % style selector (\eg "\displaystyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@stylefont@arrowfill[4]{% $\m@th \thickmuskip 0mu% \medmuskip \thickmuskip \thinmuskip \thickmuskip \setlength\@HwM@arrowfill@skip {#2\fontdimen 6 #4\tw@ \@plus \@ne fill}% #3% #1#3#4% $% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@enriched@arrowfill@} % This macro provides an ``enriched'' version of the "\arrowfill@" macro, % that invokes two additional macros, supplied by the caller, one before and % one after "\cleaders"; these macros can insert additional stretchable % material. In practice, this is used, below, to add the black cat on the % broomstick. Note that, here, the ``"\leaders" pseudo-macro'' is % ``"\HwM@arrowfill@cleaders{#1}{#2}{#3}{#4}{#5}"''. % % The arguments for this macro are as follows: % \begin{tightitemize} % \item % \#1, \#2, and~\#3 are the three characters that would be used by % "\arrowfill@" for the "\cleaders" (resp.: left, repeatable, right); % \item % \#4 and~\#5 are the two additional macros (resp.: left of "\cleaders", % right of "\cleaders"); % \item % those argument must be followed, in the calling code, by the argument % that holds the minimal size of the extensible symbol. % \end{tightitemize} % The arguments of the two ``additional macros'' are as follows: % \begin{paramlist} % \param % style selector (\eg "\displaystyle");\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@enriched@arrowfill@[5]{% \@HwM@extended@arrowfill@ {\HwM@arrowfill@cleaders{#1}{#2}{#3}{#4}{#5}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\HwM@arrowfill@cleaders} % The arguments for this macro are as follows: % \begin{tightitemize} % \item % \#1, \#2, and~\#3 are the three characters, as above; % \item % \#4 and~\#5 are the two additional macros, as above; % \item % \( \mbox{\#6} \leftarrow \mbox{style sel.} \) % (\eg "\displaystyle"), % \( \mbox{\#7} \leftarrow \mbox{font sel.} \) % (\eg "\textfont"). % \end{tightitemize} % \begin{macrocode} \newcommand*\HwM@arrowfill@cleaders[7]{% #4#6#7% \relax #1\mkern-7mu% \cleaders\hbox{$#6\mkern-2mu#2\mkern-2mu$}\hskip\@HwM@arrowfill@skip \mkern-7mu#3\relax #5#6#7% } % \end{macrocode} % \end{macro} % % \subsubsection{Macros for extensible symbols (brooms, ghosts,~\ldots)} % % This subsection defines the actual macros that typeset the extensible % broomsticks, swishes, etc., building on the top of the macros presented in % Subsection~\ref{sS:ExtensHelper}. Extensible broomsticks come first. % % \begin{macro}{\@HwM@rightbroomfill@Wwac@} % This macro should be thought of as an analog of \packlass{\amsmath}'s % "\rightarrowfill@": it takes no arguments and yields an extensible broom % complete with witch and, if appropriate, cat, both facing toward the right. % For this macro only, we choose to include extensive comments, that % exemplify how the macros defined in the % \hyperref[sS:ExtensHelper]{preceding subsection} can be utilized. % \begin{macrocode} \newcommand*\@HwM@rightbroomfill@Wwac@{% % \end{macrocode} % Set up the right-facing direction: % \begin{macrocode} \@HwM@set@right@dir % \end{macrocode} % Have "\@HwM@enriched@arrowfill@" (assemble and) supply the extensible % broom. Recall that the first three arguments are the characters it is % built from: % \begin{macrocode} \@HwM@enriched@arrowfill@ \@HwM@rightbroomtail\relbar\relbar % \end{macrocode} % The first additional macro (left of "\cleaders") does nothing, % yet it must gobble two arguments: % \begin{macrocode} \@gobbletwo % \end{macrocode} % The second additional macro adds the witch, and possibly the cat, to the % right of the "\cleaders", and is defined below: % \begin{macrocode} \@HwM@right@add@witch@cat % \end{macrocode} % The minimal size of the extensible broom (1~chunk of 18\,mu =~18\,mu): % \begin{macrocode} \@ne } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@rightpitchfill@Wwac@} % Like "\@HwM@rightbroomfill@Wwac@", but yields an extensible pitchfork. % \begin{macrocode} \newcommand*\@HwM@rightpitchfill@Wwac@{% \@HwM@set@right@dir \@HwM@enriched@arrowfill@ \@HwM@rightpforktail\relbar\relbar \@gobbletwo \@HwM@right@add@witch@cat \@ne } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@right@add@witch@cat} % Adds the witch and possibly the cat. Arguments: % \begin{paramlist} % \param % style selector (\eg "\displaystyle"), ignored;\\ % \param % font selector (\eg "\textfont"). % \end{paramlist} % \begin{macrocode} \newcommand*\@HwM@right@add@witch@cat[2]{% % \end{macrocode} % First backspace by half of the width of the extensible symbol\ldots % \begin{macrocode} \hskip -\glueexpr \@HwM@arrowfill@skip/\tw@ \relax % \end{macrocode} % \ldots then typeset the witch. % \begin{macrocode} \@HwM@Small@Witch@Wo@Broom #2% % \end{macrocode} % If the cat has also been requested\ldots % \begin{macrocode} \if@HwM@cat@ % \end{macrocode} % \ldots then move forward by $1/4$~of the width\ldots % \begin{macrocode} \hskip \glueexpr \@HwM@arrowfill@skip/4 \relax % \end{macrocode} % \ldots typeset the cat\ldots % \begin{macrocode} \@HwM@Small@Cat@On@Hori@Broom #2% % \end{macrocode} % \ldots then move forward by another $1/4$~of the width. % \begin{macrocode} \hskip \glueexpr \@HwM@arrowfill@skip/4 \relax % \end{macrocode} % Otherwise, just move forward by $1/2$~of the width, thus canceling the % previous backspace. % \begin{macrocode} \else \hskip \glueexpr \@HwM@arrowfill@skip/\tw@ \relax \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@leftbroomfill@Wwac@} % Like "\@HwM@rightbroomfill@Wwac@", but facing to the left. % \begin{macrocode} \newcommand*\@HwM@leftbroomfill@Wwac@{% \@HwM@set@left@dir \@HwM@enriched@arrowfill@ \relbar\relbar\@HwM@leftbroomtail \@HwM@left@add@witch@cat \@gobbletwo \@ne } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@leftpitchfill@Wwac@} % Like "\@HwM@rightpitchfill@Wwac@", but facing to the left. % \begin{macrocode} \newcommand*\@HwM@leftpitchfill@Wwac@{% \@HwM@set@left@dir \@HwM@enriched@arrowfill@ \relbar\relbar\@HwM@leftpforktail \@HwM@left@add@witch@cat \@gobbletwo \@ne } % \end{macrocode} % \end{macro} % % \begin{macro}{\@HwM@left@add@witch@cat} % Similar to "\@HwM@right@add@witch@cat". % \begin{macrocode} \newcommand*\@HwM@left@add@witch@cat[2]{% \if@HwM@cat@ \hskip \glueexpr \@HwM@arrowfill@skip/4 \relax \@HwM@Small@Cat@On@Hori@Broom #2% \hskip \glueexpr \@HwM@arrowfill@skip/4 \relax \else \hskip \glueexpr \@HwM@arrowfill@skip/\tw@ \relax \fi \@HwM@Small@Witch@Wo@Broom #2% \hskip -\glueexpr \@HwM@arrowfill@skip/\tw@ \relax } % \end{macrocode} % \end{macro} % % Next, we take care of the ``swishes'' that accompany ghosts and fluttering % bats. Probably, here, we should try harder to factor out common code. % % \begin{macro}{\@HwM@init@swish@dimens} % Subroutine; \#1~is a font selector (\eg "\textfont"). % \begin{macrocode} \newcommand*\@HwM@init@swish@dimens[1]{% \dimen4 \glueexpr \fontdimen 22 #1\tw@ *\tw@/\thr@@ \dimen6 .\@HwM@if@bold@math{333333}{25}\@HwM@thickness@units@for #1% \dimen@ \dimen4 \@HwM@calc@swish@thickness } % \end{macrocode} % \end{macro} % % \textbf{Uncommented code} starts here. % \begin{macrocode} \newcommand*\@HwM@calc@swish@thickness{% \dimen@ii -\dimen@ \advance \dimen@ii \dimen6 } \newcommand*\@HwM@swish@leaders{% \leaders \hrule \@height\dimen@ \@depth\dimen@ii \hskip } \newcommand*\@HwM@right@swish[3]{% % #1 := swishing subform. (e.g., "\mkern 1.5mu\relax \mathrightbat") % #2 := style selector (e.g., "\displaystyle") % #3 := font selector (e.g., "\textfont") \@HwM@init@swish@dimens #3% \hskip \glueexpr \@HwM@arrowfill@skip/4\relax \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip/4\relax \hskip \glueexpr \@HwM@arrowfill@skip/8\relax \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip*\thr@@/8\relax \hskip -\@HwM@arrowfill@skip \advance \dimen@ \dimen4 \@HwM@calc@swish@thickness \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip*\thr@@/4 \relax \hskip \glueexpr \@HwM@arrowfill@skip/8\relax \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip/8+\dimen4 /\tw@ \relax \hskip -\glueexpr \@HwM@arrowfill@skip/\tw@ \relax \advance \dimen@ \dimen4 \@HwM@calc@swish@thickness \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip/\tw@ +\dimen4 /\tw@ \relax \kern -\dimen4 #1% } \newcommand*\@HwM@left@swish[3]{% % #1 := swishing subformula (e.g., "\mathleftbat \mkern 1.5mu\relax") % #2 := style selector (e.g., "\displaystyle") % #3 := font selector (e.g., "\textfont") #1% \@HwM@init@swish@dimens #3% \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip*\thr@@/8\relax \hskip \glueexpr \@HwM@arrowfill@skip/8\relax \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip/4\relax \hskip -\glueexpr \@HwM@arrowfill@skip*\thr@@/4+\dimen4 /\tw@ \relax \advance \dimen@ \dimen4 \@HwM@calc@swish@thickness \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip/8+\dimen4 /\tw@\relax \hskip \glueexpr \@HwM@arrowfill@skip/8\relax \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip*\thr@@/4\relax \hskip -\glueexpr \@HwM@arrowfill@skip +\dimen4 \relax \advance \dimen@ \dimen4 \@HwM@calc@swish@thickness \@HwM@swish@leaders \glueexpr \@HwM@arrowfill@skip/\tw@ +\dimen4 /\tw@ \relax \hskip \glueexpr \@HwM@arrowfill@skip/\tw@ +\dimen4 /\tw@ \relax } \newcommand*\@HwM@rightghostfill@{% \@HwM@extended@arrowfill@ {\@HwM@right@swish \mathrightghost}{.5}% } \newcommand*\@HwM@leftghostfill@{% \@HwM@extended@arrowfill@ {\@HwM@left@swish \mathleftghost}{.5}% } \newcommand*\@HwM@rightbatfill@{% \@HwM@extended@arrowfill@ {\@HwM@right@swish{\mkern 1.5mu\relax \mathrightbat}}{.5}% } \newcommand*\@HwM@leftbatfill@{% \@HwM@extended@arrowfill@ {\@HwM@left@swish{\mathleftbat \mkern 1.5mu\relax}}{.5}% } \newcommand*\@HwM@rightbroomfill@{% \arrowfill@ \@HwM@rightbroomtail\relbar\relbar } \newcommand*\@HwM@leftbroomfill@{% \arrowfill@ \relbar\relbar\@HwM@leftbroomtail } \newcommand*\@HwM@rightpitchfill@{% \arrowfill@ \@HwM@rightpforktail\relbar\relbar } \newcommand*\@HwM@leftpitchfill@{% \arrowfill@ \relbar\relbar\@HwM@leftpforktail } \newcommand*\@HwM@dblstyle@mathpalette[2]{% % Works like "\mathpalette", but macro passed in #1 must take % (at least) three arguments, of which the first _two_ are % style selections. \mathchoice {#1\displaystyle \scriptstyle {#2}}% {#1\textstyle \scriptstyle {#2}}% {#1\scriptstyle \scriptscriptstyle {#2}}% {#1\scriptscriptstyle \scriptscriptstyle {#2}}% } \newcommand*\@HwM@variable@mathpalette[2]{% \mathchoice {#1}% {#2\textstyle \textfont }% {#2\scriptstyle \scriptfont }% {#2\scriptscriptstyle \scriptscriptfont}% } \newcommand*\@HwM@constant@mathpalette[1]{% \mathchoice {#1\displaystyle \textfont }% {#1\textstyle \textfont }% {#1\scriptstyle \scriptfont }% {#1\scriptscriptstyle \scriptscriptfont}% } \newcommand*\@HwM@general@large@operator[2]{% \mathop{% \@HwM@variable@mathpalette{#1}{#2}% }\slimits@ } \newcommand*\@HwM@general@inner@symbol[2]{% \mathinner{% \@HwM@variable@mathpalette{#1}{#2}% }% } \newcommand*\@HwM@general@binary@operation[1]{% \mathbin{% \@HwM@constant@mathpalette{#1}% }% } \newcommand*\@HwM@general@ordinary@symbol[1]{% \mathord{% \@HwM@constant@mathpalette{#1}% }% } \newcommand*\@HwM@ifstar@cat[1]{% \@ifstar {\@HwM@cat@true #1}% {\@HwM@cat@false #1}% } \newcommand*\mathwitch{% \DOTSB \@HwM@set@right@dir \@HwM@ifstar@cat{\@HwM@mathwitch lr}% } \newcommand*\reversemathwitch{% \DOTSB \@HwM@set@left@dir \@HwM@ifstar@cat{\@HwM@mathwitch rl}% } \newcommand*\@HwM@mathwitch[2]{% \@HwM@general@large@operator {\@HwM@Large@Witch #1#2}% \@HwM@Small@Witch } \newcommand*\pumpkin{% \DOTSB \@HwM@general@binary@operation \@HwM@Binop@Pumpkin } \newcommand*\bigpumpkin{% \DOTSB \@HwM@general@large@operator \@HwM@Large@Pumpkin \@HwM@Small@Pumpkin } \@ifdefinable\greatpumpkin{\let\greatpumpkin=\bigpumpkin} \newcommand*\skull{% \DOTSB \@HwM@general@binary@operation \@HwM@Binop@Skull } \newcommand*\bigskull{% \DOTSB \@HwM@general@large@operator \@HwM@Large@Skull \@HwM@Small@Skull } \newcommand*\mathcloud {\@HwM@set@right@dir \@HwM@mathcloud} \newcommand*\reversemathcloud{\@HwM@set@left@dir \@HwM@mathcloud} \newcommand*\@HwM@mathcloud{% \@HwM@general@inner@symbol \@HwM@Large@Cloud \@HwM@Small@Cloud } \newcommand*\mathghost{% \@HwM@general@ordinary@symbol \@HwM@Symmetric@Ghost } \newcommand*\mathrightghost{\@HwM@set@right@dir \@HwM@mathghost} \newcommand*\mathleftghost {\@HwM@set@left@dir \@HwM@mathghost} \newcommand*\@HwM@mathghost{% \@HwM@general@ordinary@symbol \@HwM@Asymmetric@Ghost } \newcommand*\mathbat{% \@HwM@general@ordinary@symbol \@HwM@Symmetric@Bat } \newcommand*\mathrightbat{\@HwM@set@right@dir \@HwM@mathbat} \newcommand*\mathleftbat {\@HwM@set@left@dir \@HwM@mathbat} \newcommand*\@HwM@mathbat{% \@HwM@general@ordinary@symbol \@HwM@Asymmetric@Bat } \newcommand*\@HwM@dblstyle@overarrow@[4]{% % #1 := stretchable covering arrow % #2 := base style % #3 := style for covering arrow % #4 := base symbol \vbox{\ialign{##\crcr #1#3\crcr \noalign{\nointerlineskip}% $\m@th\hfil #2#4\hfil$\crcr }}% } \newcommand*\@HwM@dblstyle@underarrow@[4]{% % #1 := stretchable underlying arrow % #2 := base style % #3 := style for underlying arrow % #4 := base symbol \vtop{\ialign{##\crcr $\m@th\hfil #2#4\hfil$\crcr \noalign{\nointerlineskip \kern\ex@}% #1#3\crcr }}% } \newcommand*\@HwM@general@ou@w@cat[1]{% \@HwM@ifstar@cat{\@HwM@dblstyle@mathpalette{#1}}% } \newcommand*\overrightwitchonbroom{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@overarrow@ \@HwM@rightbroomfill@Wwac@}% } \newcommand*\overleftwitchonbroom{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@overarrow@ \@HwM@leftbroomfill@Wwac@}% } \newcommand*\overrightwitchonpitchfork{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@overarrow@ \@HwM@rightpitchfill@Wwac@}% } \newcommand*\overleftwitchonpitchfork{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@overarrow@ \@HwM@leftpitchfill@Wwac@}% } \newcommand*\overrightswishingghost{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@rightghostfill@}% } \newcommand*\overleftswishingghost{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@leftghostfill@}% } \newcommand*\overrightflutteringbat{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@rightbatfill@}% } \newcommand*\overleftflutteringbat{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@leftbatfill@}% } \newcommand*\underrightwitchonbroom{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@underarrow@ \@HwM@rightbroomfill@Wwac@}% } \newcommand*\underleftwitchonbroom{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@underarrow@ \@HwM@leftbroomfill@Wwac@}% } \newcommand*\underrightwitchonpitchfork{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@underarrow@ \@HwM@rightpitchfill@Wwac@}% } \newcommand*\underleftwitchonpitchfork{% \@HwM@general@ou@w@cat {\@HwM@dblstyle@underarrow@ \@HwM@leftpitchfill@Wwac@}% } \newcommand*\underrightswishingghost{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@rightghostfill@}% } \newcommand*\underleftswishingghost{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@leftghostfill@}% } \newcommand*\underrightflutteringbat{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@rightbatfill@}% } \newcommand*\underleftflutteringbat{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@leftbatfill@}% } \newcommand*\overrightbroom{% \mathpalette{\overarrow@ \@HwM@rightbroomfill@}% } \newcommand*\overleftbroom{% \mathpalette{\overarrow@ \@HwM@leftbroomfill@}% } \newcommand*\overrightpitchfork{% \mathpalette{\overarrow@ \@HwM@rightpitchfill@}% } \newcommand*\overleftpitchfork{% \mathpalette{\overarrow@ \@HwM@leftpitchfill@}% } \newcommand*\underrightbroom{% \mathpalette{\underarrow@ \@HwM@rightbroomfill@}% } \newcommand*\underleftbroom{% \mathpalette{\underarrow@ \@HwM@leftbroomfill@}% } \newcommand*\underrightpitchfork{% \mathpalette{\underarrow@ \@HwM@rightpitchfill@}% } \newcommand*\underleftpitchfork{% \mathpalette{\underarrow@ \@HwM@leftpitchfill@}% } \newcommand*\overscriptrightbroom{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@rightbroomfill@}% } \newcommand*\overscriptleftbroom{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@leftbroomfill@}% } \newcommand*\overscriptrightpitchfork{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@rightpitchfill@}% } \newcommand*\overscriptleftpitchfork{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \@HwM@leftpitchfill@}% } \newcommand*\underscriptrightbroom{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@rightbroomfill@}% } \newcommand*\underscriptleftbroom{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@leftbroomfill@}% } \newcommand*\underscriptrightpitchfork{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@rightpitchfill@}% } \newcommand*\underscriptleftpitchfork{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \@HwM@leftpitchfill@}% } \newcommand*\overscriptrightarrow{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \rightarrowfill@}% } \newcommand*\overscriptleftarrow{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \leftarrowfill@}% } \newcommand*\overscriptleftrightarrow{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@overarrow@ \leftrightarrowfill@}% } \newcommand*\underscriptrightarrow{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \rightarrowfill@}% } \newcommand*\underscriptleftarrow{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \leftarrowfill@}% } \newcommand*\underscriptleftrightarrow{% \@HwM@dblstyle@mathpalette {\@HwM@dblstyle@underarrow@ \leftrightarrowfill@}% } \newcommand*\@HwM@make@arrowfill@like[3]{% % #1 := base symbol, which expects as its own arguments % - #1, a style selector (e.g., "\scriptstyle") % - #2, a font selector (e.g., "\scriptfont") % #2 := centering method, either "\hfil" or "\hidewidth" % #3 := style selector (e.g., "\scriptstyle") #2% \@HwM@auto@font@selector{#1}#3% braces around #1 are for robustness #2% } \newcommand*\@HwM@over@under@bat[2]{% % #1 := "\@HwM@dblstyle@overarrow@" | "\@HwM@dblstyle@underarrow@" % #2 := "\hfil" | "\hidewidth" \@HwM@dblstyle@mathpalette{% #1{% \@HwM@make@arrowfill@like \@HwM@Symmetric@Bat #2% }% }% } \newcommand*\overbat{% \@ifstar{% \@HwM@over@under@bat \@HwM@dblstyle@overarrow@ \hfil }{% \@HwM@over@under@bat \@HwM@dblstyle@overarrow@ \hidewidth }% } \newcommand*\underbat{% \@ifstar{% \@HwM@over@under@bat \@HwM@dblstyle@underarrow@ \hfil }{% \@HwM@over@under@bat \@HwM@dblstyle@underarrow@ \hidewidth }% } \newcommand*\@HwM@ext@arrow@w@cat[5]{% \def\@HwM@tempa{\ext@arrow {#1}{#2}{#3}{#4}{#5}}% \@HwM@ifstar@cat{\@HwM@ext@arrow@w@cat@x}% } \newcommand*\@HwM@ext@arrow@w@cat@x[2][]{% \@HwM@tempa {#1}{#2}% } \newcommand*\xrightwitchonbroom{% \@HwM@ext@arrow@w@cat 9395\@HwM@rightbroomfill@Wwac@ } \newcommand*\xleftwitchonbroom{% \@HwM@ext@arrow@w@cat 3959\@HwM@leftbroomfill@Wwac@ } \newcommand*\xrightwitchonpitchfork{% \@HwM@ext@arrow@w@cat 9395\@HwM@rightpitchfill@Wwac@ } \newcommand*\xleftwitchonpitchfork{% \@HwM@ext@arrow@w@cat 3959\@HwM@leftpitchfill@Wwac@ } \newcommand*\xrightswishingghost[2][]{% \ext@arrow 3{12}5{15}\@HwM@rightghostfill@{#1}{#2}% } \newcommand*\xleftswishingghost[2][]{% \ext@arrow {12}3{15}5\@HwM@leftghostfill@{#1}{#2}% } \newcommand*\xrightflutteringbat[2][]{% \ext@arrow 0055\@HwM@rightbatfill@{#1}{#2}% } \newcommand*\xleftflutteringbat[2][]{% \ext@arrow 0055\@HwM@leftbatfill@{#1}{#2}% } \newcommand*\xrightbroom{% \@HwM@ext@arrow@w@cat 9395\@HwM@rightbroomfill@ } \newcommand*\xleftbroom{% \@HwM@ext@arrow@w@cat 3959\@HwM@leftbroomfill@ } \newcommand*\xrightpitchfork{% \@HwM@ext@arrow@w@cat 9395\@HwM@rightpitchfill@ } \newcommand*\xleftpitchfork{% \@HwM@ext@arrow@w@cat 3959\@HwM@leftpitchfill@ } \newcommand*\@HwM@tighter@joinrel{% \mathrel{\mkern-6.5mu}% } \newcommand*\rightbroom{% \DOTSB \protect\@HwM@rightbroomtail \protect\@HwM@tighter@joinrel \protect\relbar \protect\@HwM@tighter@joinrel \protect\relbar } \newcommand*\leftbroom{% \DOTSB \protect\relbar \protect\@HwM@tighter@joinrel \protect\relbar \protect\@HwM@tighter@joinrel \protect\@HwM@leftbroomtail } \newcommand*\hmrightpitchfork{% \DOTSB \protect\@HwM@rightpforktail \protect\@HwM@tighter@joinrel \protect\relbar \protect\@HwM@tighter@joinrel \protect\relbar } \newcommand*\hmleftpitchfork{% \DOTSB \protect\relbar \protect\@HwM@tighter@joinrel \protect\relbar \protect\@HwM@tighter@joinrel \protect\@HwM@leftpforktail } \let \do = \noexpand % \end{macrocode} % % End of the module for the \packlass{\halloweenmath} package. % \begin{macrocode} % % \end{macrocode} % % \section{End of input} % % The usual "\endinput" which prevents the \DS\ program from putting % garbage into the generated files. % \begin{macrocode} \endinput % \end{macrocode} % % \Finale %