; TeX output 1997.03.28:1741soDtGGcmr17The7tGGcmss17moqredefspackagegiXQ ff cmr12more/de ningcommands(F4rankenstein'sbrain)?XQ cmr12MattSwift߆T cmtt12GVVersion:8v1.01 *DoScumenrtationrevision:81996/03/25$!Kt : cmbx9Abstractэoo cmr9A!}deligh9tful!collectionofde ning,$expansion,and!debuggingcommands bthatTmak9eelegantprogramminginL5Aacmr6A TuAEXfunandeasy:.#8INff cmbx12PartffII Nq cmbx12DiscussionꨍIK`y cmr10ThesemmmacroswerewritteninrespGonsetopracticalprogrammingneeds.$zIm2wouldn'tIwriteUUapackqagewithoutthemnow.!čI1aLNamingffconventionsITheconventionisthatacapital!p0J cmsl10E~Ͳmeansthemacroexpandssomethingjustonce.IAlowercasee,7asin"*argumentsqareexpanded.Commandswhichtakehcsname[iIargumentsUUhaveNameintheirnames.XWhenUUIwritep}'ackageinthisdoGcumentation,ImeanL5ffٓRcmr7A͉TU>'ExXpackqageorclass.I2aLDe ningffcommandsI\InitCS5and\InitCS*takeoneargument,ոh\csname[i0m,andinitializeitto{}.>The$ߤN cmtt9\InitCS3P\InitCS*Inon-*-formUUislong;the*-formisnot.X\InitName̲and\InitName*arethesamebuttakeanargumenthcsname[iy\InitName$\InitName*IwithoutUUabackslash.XT*ojmakeiteasiertoavoidtheproblemofcomparinglongandnon-longmacros \ShortEmpty$\LongEmptyIwithUU\ifx,comparemacroswith\ShortEmptyand\LongEmpty.X\ReserveCS{h\csname[i-ߘ}reservesh\csname[i7`forthecurrentpackqage'suse.$\ReserveCSL\ReserveNameI\ReserveNameUU{hcsname[i(}doGesthesameforahcsname[i,.X\requirecommandK_islike\providecommand,butifthecontrolsequenceis 6\requirecommandIalreadyȀde ned,%K\CheckCommandiscalledtomakesureit'sde nedidentically*,1*soIwhereas9\providecommandassumesthatifit'salreadyde ned,Qthede nitionis Iappropriate.)LUsingn\requirecommand{guarantees^thatacontrolsequencewillhaveItheUUgivende nition;oranerrorwilloGccur.X\newtokens8{h\csname[i-ߘ},q\newlet{h\csname[i}{h\csname[i},qand\newboolean$\newtokens\newlet \newbooleanI{hcsname[i(} giveanerroriftheircontrolsequenceargumentisalreadyde-I ned.|z\newtokensXcreatesatokenvqariable.\newletdoGesa\letassignment.I\newbooleany{hcsname[i(}createsthreenewcontrolsequences:twoswitches,I\csnametrueand\csnamefalse,andatest,\ifcsname. \newtokensisnotIouter.qIsUUthereanyreasonthisreallymatters?XLike8thekernel's\providecommand,qthecommands\providetokens{h\csname[i-ߘ},\providetokens 6\provideboolean 6\providesavebox$ 6\providecounter0\providelengthI\provideboolean8{hcsname[i(},q\providesavebox{h\csname[i-ߘ},\providecounterI{hcsname[i(},and>\providelength{h\csname[i-ߘ}willcreateanewob8ject(orob-Ijects)obasedonthenameh\csname[i7 vorhcsname[i1}onlyiftheyarenotalreadyIde ned. SeethecorrespGondingcommandsthatbeginwith\newinsteadofI\provideOforadescriptionofwhatkindofob8jectiscreated.`IncontrastwithI\providecommand,nhowever,these6commandswillwritearecordtothelog leifItheir+argumentwasalreadyde ned(\providecommanddoGesnothingatallinthisIcase).X\Undefine{h\csname[i-ߘ}causesh\csname[i56tobGeunde ned.4\UndefineNamey\Undefineb\UndefineNameIdoGesUUthesameforahcsname[i,.qUsewithcaution.\globalworksbGeforeit.X\defcommand8{h\csname[i-ߘ}[h#ofar}'gs!i1p][hdefaultforanoptar}'g}ib]de nesh\csname[i \defcommandL\defcommand*IinTthesamemanneras\newcommandexceptnowarningorerrorisissuedifIh\csname[iz4isUUalreadyde ned.X\defcommandRoisverysimilartotheprimitive\def,sowhywouldyouwantIto@useit?F*oronething,;thesyntaxisthesameasalltheotherL5ffA͉TU>'ExXde ningIcommands,ٿsoCitiseasiertoread,andeasiertochangetheworddefcommandtoIone\oftheotherde ningcommands.jSecond,^\defcommandsthattakeargumentsIhavesimplersyntaxwhende ningcommandsarenested.OY*oustillhavetodoubleItheA#charactersinthede nitionbGody*,E$butAtheargumentspGeci cation(e.g.,E$[n])IisUUthesameasifnotnested.XThere isapGerformance-syntaxtradeo ;yIchoGosetouse\defcommandwheneverItheb6commandtobGede nedistakinganargument.jWhenitdoesnottakeanIargument,+thereisnodi erencebGetween\defand\defcommandexceptthat\defIisUUfaster.XIaseezverylittlereasontoeveryuse\renewcommand.6ItcausesanerrorwhenIthecontrolsequenceisnotalreadyde ned.tConceivqablythisisusefulduringIdevelopment+tocatchprogrammingmistakes,butmuchmoreoftenI ndthatIIdon'tRcarewhetherthecontrolsequencewasde nedornot,SandthereforetheerrorI\renewcommandUUmightraiseisinappropriateandaproblem.X\NewName{hcsname[i(}{htemplate[i-T5}{hb}'ody}iQc}de neshcsname[i3Ӳtoexpandto3P\NewNamey\NewName*Ihb}'ody}ih}Zusing+aTU>'ExX-styleargumenthtemplate[i1,,ae.g.#1#2\@nilorsimply#1#2.IThe.6*-formisnotlong.dIfhcsname[i/ isalreadyde ned,6 anerrorwillbGesignalled.X\DefNameEislike\NewNamebutnoerrorissignalledifhcsname[i2Y)isalready3P\DefNamey\DefName*Ide ned.XIfthecommand\Globalimmediatelyprecedes\NewNameor\DefName,^then\GlobalItheUUde nitionwillbGeglobal.X%M cmbxsl10T oqdo:N-Get somethinglike&2in-IsideŸhse}'cond%3}tokens!iGwherever#1oGccurs.3B\EExpandexpandsthe rsttokenofh rstItokens!ilonlyyonce.ߒThe*-versionsmakeeachargumentshort.ߒThesecommandsIcanUUnest.XF*orUUexample,I% ?\def\a?{\b}c?\def\b?{Hello}c?\eExpand\a?world\In{m\def\c?{Thisisagoodwaytoavoidlotsofnoexpandsandexpandafters. #1.And?Icontinue.}m\cc?}c?\EExpand\a?BLOOB\In{m\edef#1{\b?world}mThis?isagoodwaytoavoidlotsofnoexpandsandmexpandafters. \a?BLOOB.AndIcontinue.c?} I(R6 cmss12LOOKSLIKE:_JIffi̟0Ǎ0ff㍑ThisisagoGodwaytoavoidlotsofnoGexpandsandexpandafters.>Helloworld.>AndIUUcontinue.ThisisagoGodwaytoavoidlotsofnoGexpandsandexpandafters.>Helloworld.>AndIUUcontinue.i0ffffffi̎$QXTheUUtwocommandsexpandtothesamethreesentences.3 soI4aLGobblingIItBoGccursfairlyoftenthatyouwanttogobblethingswhile\makeatotherisin\Gobble 3P\GobbleM3P\GobbleO$y\GobbleMM0y\GobbleMO<y\GobbleOM Ie ect,OKsothesecommandnameshaveno@'s. 0TheM鲲standsforamandatoryIargument,2andҷtheOUstandsforanoptionalargument.F*orexample,2suppGoseIthere>isacommand\foo[hoptar}'g}i#]{hmar}'g}iA}.rIfyou\let\foo\GobbleOM,thenItheUUargumentsto\foowillbGegobbledappropriately*.X\GobbleUUisthesameas\GobbleM,inimitationoftheinternal\@gobble.!čI5aLDebuggingII+haveTplansforexpandingthissectioninthenextreleasewithsomeAPIcom-ImandsUUforcontrollingthelevelofdebuggingoutput.XL5ffA͉TU>'ExXbydefaultgivesverylittlecontextforerrors.`\VerboseErrors\VerboseErrorsI[hnumb}'eri(]causesL5ffA͉TU>'ExXtogivehnumb}'eri2linesofcontext,ZforthemaximumIbyUUdefault.X\Debugy{hnumb}'eri(}setsadebuggingparametertohnumb}'eri-fʲ.Iyfhaveyplans!|\DebugItoturnthisintoabitwiseparameterlikemanyCprograms,G]butrightnowtheIbGehaviorvistoissueamessagewith\typeout,Ncall\VerboseErrors,andusetheIparameterKDtoassignvqaluesto\tracingoutput,{\tracingpages,\tracingmacros,IandUU\tracingcommands.XThe9commands\MonsterError,\MonsterWarning,and9\MonsterInfoarede-b\MonsterError 6\MonsterWarningL\MonsterInfo$b\MonsterDebugI ned8hereforusebyotherFrankensteinpackqagesandclasses.NpTheyaresimplyIwrappGersUUfortheobviouskernelcommands.!čI6aLMiscellaneousffinternalsI\@ifundefined@cs{h\csname[i-ߘ}{htrue[i}{hfalse[i}A6executesthehtrue[i&Hclauseiff\@ifundefined@csIh\csname[iz4isUUnotde ned,andthehelse[i Iclauseotherwise.X\addto@macro{h\csname[i-ߘ}{htokens!i#`}8addshtokens!i(c&totheendof{h\csname[i}.L\addto@macro 6\lg@addto@macroITheY%rede nitionof{h\csname[i-ߘ}isloGcal.Thekernelprovidestheglobalequivqalent,I\g@addto@macro.q\lg@addto@macroUUisbGothlongandglobal.X\prependto@macro{h\csname[i-ߘ}{htokens!i#`}addshtokens!i+̲tothebGeginningoff\prependto@macrot\g@prependto@macro9\lg@prependto@macroI{h\csname[i-ߘ}.^Therede nitionof{h\csname[i}isloGcal.^TheglobalequivqalentisI\g@prependto@macro.q\lg@prependto@macroUUisbGothlongandglobal.XLetE b> cmmi10TBԲbGethesequenceoftokensbetweenE\E@carand\@nil.JlThe rsttokenof\E@car...\@nil\E@cdr...\@nilITgisexpandedonce,Hand\E@car...\@nilexpandstothe rsttokenoftheresult.X\E@cdr...\@nilkissimilar, butexpandstotheentireresultexceptFits rstItoken.XF*orUUexample,after`\def\a{Hello} `\def\b{world}Ye\E@car?\athere\b.\@nil8wouldexpand rstofalltoH.And\E@cdr?\athere\b.\@nilIwould|expand rstofalltoellothere\b.,andtheneventuallyexpandfullytoIellothere?world..XTheexampleismorecomplicatedthanyouwouldnormallyuse.9UsuallyyouIwant-tocarandcdrasequenceoftokenscontainedinmacro\foo,#andthisIisCeasyenoughwith\E@car\foo\@nil. :T*ochopo the rsttokenof\foo,4.soI\edef\foo?{\E@cdr\foo\@nil}."(IfUyou'rewondering,thespaceafter\foois Iirrelevqant.)#8IPartffIs3IIImplemenZtationꨍI7aLVfersionffcontrol$\fileinfob\fileversion$\filedatey\docdate$\PPOptArgITheseUUde nitionsmustbGethe rstonesinthe le.Ls1S\def\fileinfo{moredefiningcommands(Frankenstein'sbrain)} Ls2S\def\fileversion{v1.01}Ls3S\def\filedate{1996/03/25}Ls4S\def\docdate{1996/03/25}Ls5S\edef\PPOptArg{%Ls6]\filedate\space\fileversion\space\fileinfoLs7S}XStoprighthereifwe'rejustloadingthe le'sinformation,janddon'twantto IloadMthiscoGdefortypesettingitsdocumentation(onlymakessenseforcertainpack-Iages).3TheHJuStLaAdInFoRmAtIoN! agwillbGesetbythedocumentationdriver;ItheUUDoXNeeDME agwillbGesetinthedtx le,andwillappearaboveUUifit'sset.Ls8S\makeatletter Ls9S\@ifundefined{JuStLoAdInFoRmAtIoN}{%I10]}{%I11]\@ifundefined{DoXNeeDME}{%I12f}{%I13f\usepackage{moredefs}%I14]}I15]\makeatotherI16]\endinputI17S}XNowUUwecheckforL5ffA͉TU>'ExX2eanddeclarethepackqage.I18S\NeedsTeXFormat{LaTeX2e}I19S\ProvidesPackage{moredefs}[\PPOptArg]!čI8aLGettingffstartedIW*eUUwillbGegintousecommandsaswede nethem. \@ifundefined@csIW*eUUwantthismacrotomakeothermacroseasiertoread.I20S\newcommand*\@ifundefined@cs[1]{%I21]\edef\reserved@a{%I22f\expandafter\@gobble\string#1%I23]}%I24]\@ifundefined\reserved@aI25p2\@firstoftwoI26f\@secondoftwoI27S}5@ soI9aLDe ningffcommands \sc@star@or@long \sc@star@nothingIThek}macros\sc@star@or@longand\sc@star@nothingareparalleltothekernel's I\@star@or@longuand\l@ngrel@x,}whichcontrolwhetherde nitionsarelongorInot.\sc@star@or@longzcausesthevqalueof\sc@star@nothingtobGeeither*orIempty*,depGending onwhetherit ndsa*whenitiscalled.GItalsosetsthekernel'sI\l@ngrel@x:tonothingor\long, respGectively*.O(We:needboth agsatleastonce.)I28S\newcommand*\sc@star@nothing{} I29S\newcommand*\sc@star@or@long[1]{%args:defining-commandI30]\@ifstar{%I31p2\let\l@ngrel@x\relaxI32p2\def\sc@star@nothing{*}#1%I33f}{%ELSEI34f\let\l@ngrel@x\longI35f\def\sc@star@nothing{}%I36f#1%I37]}%I38S}f\requirecommand \requirecommand* \require@commandIAUUtypicalapplicationofthestarmechanismsis\requirecommand.I39S\newcommand\requirecommand{%I40]\sc@star@or@long\require@commandI41S}I42S\newcommand\require@command[1]{%args:\csnameI43]\@ifundefined@cs{#1}{%I44p2\expandafter\newcommand\sc@star@nothingI45f}{%ELSEI46f\expandafter\CheckCommand\sc@star@nothingI47]}%I48]{#1}%I49S}3P\InitCS y\InitCS* $\InitName \InitName* \ReserveCS b\ReserveName L\ShortEmpty \LongEmptyI50S\newcommand\InitCS{%I51]\@star@or@long\Init@CSI52S}I53S\newcommand\Init@CS[1]{%args:\csnameI54]\l@ngrel@x\def#1{}%I55S}I56S\newcommand\InitName{%I57]\sc@star@or@long\Init@NameI58S}I59S\newcommand\Init@Name[1]{%args:csnameI60]\expandafter\DefName\sc@star@nothing{#1}{}{}%I61S}I62S\newcommand\ReserveCS[1]{%args:\csnameI63]\newcommand{#1}{}%I64S}I65S\newcommand\ReserveName[1]{%args:csnameI66]\NewName{#1}{}{}%I67S}I68S\InitCS*\ShortEmptyI69S\InitCS\LongEmpty6H۠so3P\sc@t@a 3P\sc@t@b 3P\sc@t@c 3P\sc@t@d 3P\sc@t@e 3P\sc@t@f 3P\sc@t@gIScratchUUvqariables. 9I70S\ReserveCS\sc@t@a I71S\ReserveCS\sc@t@bI72S\ReserveCS\sc@t@cI73S\ReserveCS\sc@t@dI74S\ReserveCS\sc@t@eI75S\ReserveCS\sc@t@fI76S\ReserveCS\sc@t@g\newtokens 3P\newletIBecause%\newtoksis\outer,YwehavetofoGol\defintoallowingittobGeinits IargumentUUbyusing\@nameuse.I77S\newcommand\newtokens[1]{%args:\csnameI78]\@ifdefinable#1{%I79f\@nameuse{newtoks}#1%I80]}%I81S}I82S\newcommand*\newlet[2]{%args:\csname-a\csname-bI83]\@ifdefinable#1{%I84f\let#1#2%I85]}%I86S} 6\providetokens 6\providelength f\providesavebox f\providecounter L\newboolean f\providebooleanITheL}\newbooleancommandisthesameastheoneintheifthenpackqage;Oosothat IpackgeUUwon'tclashwiththisone.qIsn't\requirecommandnice?I87S\newcommand*\providetokens[1]{%args:\csnameI88]\@ifundefined@cs{#1}{%I89p2\@nameuse{newtokens}#1%I90f}{%ELSEI91f\MonsterInfo{moredefs}{\protect\providetokens\spaceisnotreallocatingI92=tokenvariable\protect#1.\MessageBreakI93=Theexistingcontentsare[\the#1]}%I94]}%I95S}I96S\newcommand*\providelength[1]{%args:\csnameI97]\@ifundefined@cs{#1}{%I98p2\newlength{#1}%I99f}{%ELSEE100f\MonsterInfo{moredefs}{\protect\providelength\spaceisnotreallocatingE101=\protect#1.\MessageBreakE102=Theexistingvalueis[\the#1]}%E103]}%E104S}E105S\newcommand*\providesavebox[1]{%args:\csnameE106]\@ifundefined@cs{#1}{%E107p2\newsavebox{#1}%E108f}{%ELSEE109f\MonsterInfo{moredefs}{\protect\providesavebox\spaceisnotreallocatingE110=box\protect#1.}%E111]}%E112S}E113S\newcommand*\providecounter[1]{%args:stringE114]\@ifundefined{c@#1}{%E115p2\newcounter{#1}%E116f}{%ELSE7SosoE117f\MonsterInfo{moredefs}{\protect\providecounter\spaceisnotreallocating E118=counter#1.\MessageBreakE119=Theexistingvalueis[\expandafter\number\csnamec@#1\endcsname]}%E120]}%E121S}E122S\requirecommand*\newboolean[1]{%args:stringE123]\csnamenewif\expandafter\endcsname\csnameif#1\endcsnameE124S}E125S\newcommand*\provideboolean[1]{%args:stringE126]\@ifundefined{if#1}{%E127p2\newboolean{#1}%E128f}{%ELSEE129f\MonsterInfo{moredefs}{\protect\provideboolean\spaceisnotreallocatingE130=\protect#1.\MessageBreakE131=Thevalueis[\@nameuse{if#1}TRUE\elseFALSE\fi]}%E132]}%E133S}e\sc@toks@a b\addto@macro f\lg@addto@macro \prependto@macro 9\g@prependto@macro H\lg@prependto@macroIThere$arestillmissingacoupleofthepGermutations,.butI$won'taddthemuntilI IneedUUthem.qY*oucanaddthemyourselfinthecon guration lemoredefs.cfg. ̍E134S\newtokens\sc@toks@aE135E136S\newcommand\addto@macro[2]{%E137]\sc@toks@a=\expandafter{#1#2}%E138]\edef#1{%E139f\the\sc@toks@aE140]}%E141S}E142S\newcommand\lg@addto@macro[2]{%E143]\sc@toks@a=\expandafter{#1#2}%E144]\long\xdef#1{%E145f\the\sc@toks@aE146]}%E147S}E148S\newcommand\prependto@macro[2]{%E149]\sc@toks@a=\expandafter{#1#2}%E150]\edef#1{%E151f\the\sc@toks@aE152]}%E153S}E154S\newcommand\g@prependto@macro[2]{%E155]\sc@toks@a=\expandafter{#1#2}%E156]\global\edef#1{%E157f\the\sc@toks@aE158]}%E159S}E160S\newcommand\lg@prependto@macro[2]{%E161]\sc@toks@a=\expandafter{#1#2}%E162]\long\xdef#1{%E163f\the\sc@toks@aE164]}%E165S}$\Undefine \UndefineNameI\globalUUworksbGeforeit.8 ^`soE166S\newcommand\Undefine[1]{%args:\csname E167]\let#1\@undefinedE168S}E169S\newcommand\UndefineName[1]{%args:csnameE170]\expandafter\let\csname#1\endcsname\@undefinedE171S} L\defcommand b\defcommand* b\def@commandISeeUUtheuserdoGcumentationforadiscussionofwhentousethisinsteaeofr\def. ꫍E172S\newcommand\defcommand{%E173]\@star@or@long\def@commandE174S}E175S\newcommand\def@command{%E176]\let\@ifdefinable\@rc@ifdefinableE177]\new@commandE178S}y\DefName $\DefName* $\def@name y\NewName $\NewName* $\new@name 3P\Global \sc@globalI\GlobalUUworksbGefore\DefNameand\NewNameonly! ꫍E179S\newcommand\DefName{%E180]\@star@or@long\def@nameE181S}E182S\newcommand\def@name[3]{%args:arglistcsnamebodyE183]\sc@global\l@ngrel@x\@namedef{#1}#2{#3}%E184S}E185S\newcommand\NewName{%E186]\@star@or@long\new@nameE187S}E188S\newcommand\new@name[3]{%args:arglistcsnamebodyE189]\@ifundefined{#1}{%E190p2\sc@global\l@ngrel@x\@namedef{#1}#2{#3}%E191f}{%ELSEE192f\defcommand\reserved@a{%E193p2#1%E194f}%E195f\@notdefinableE196]}%E197S}E198S\newcommand\sc@global{%E199]\relaxE200S}E201S\newcommand\Global{%E202]\def\sc@global{%E203f\global\let\sc@global\relax\globalE204]}%E205S}\CheckName L\CheckName* L\check@name b\RequireName \RequireName* \require@name ꫍E206S\newcommand\CheckName{%E207]\@star@or@long\check@nameE208S}E209S\newcommand\check@name[3]{%args:arglistcsnamebodyE210]\expandafter\DefName\sc@star@nothing{reserved@a}{#2}{#3}%E211]\expandafter\@check@eq\csname#1\endcsname\reserved@aE212S}E213S\newcommand\RequireName{%9 h&soE214]\sc@star@or@long\require@name E215S}E216S\newcommand\require@name[3]{%args:arglistcsnamebodyE217]\@ifundefined{#1}{%E218p2\expandafter\DefName\sc@star@nothing{#1}{#2}{#3}%E219f}{%ELSEE220f\expandafter,\expandafterE221p2\expandafter\CheckNameE222p2\expandafter\sc@star@nothingE223p\csname#1\endcsnameE224p2{#2}{#3}%E225]}%E226S}H\NewTextFontCommand t\NewRobustCommand 9\new@robustcommand H\new@@robustcommandE227S\newcommand\NewTextFontCommand[2]{%args:\csnamefont-commandE228]\ReserveCS{#1}%E229]\DeclareTextFontCommand{#1}{#2}%E230S}E231S\newcommand\NewRobustCommand{%E232]\@star@or@long\new@robustcommandE233S}IW*e8need\new@@robustcommandtoescapGeweirdexpansiontroublesinside\@ Iifdefinable.E234S\newcommand\new@robustcommand[1]{%E235]\InitCS\sc@t@aE236]\@ifdefinable#1{%E237f\def\sc@t@a{\new@@robustcommand#1}%E238]}%E239]\sc@t@aE240S}E241S\newcommand\new@@robustcommand[1]{%E242]\edef\reserved@a{\string#1}%E243]\def\reserved@b{#1}%E244]\edef\reserved@b{%E245f\expandafter\strip@prefix\meaning\reserved@bE246]}%E247]\edef#1{%E248f\ifx\reserved@a\reserved@bE249p2\noexpand\x@protectE250p2\noexpand#1%E251f\fiE252f\noexpand\protectE253f\expandafter\noexpand\csnameE254p2\expandafter\@gobble\string#1\endcsnameE255]}%E256XdD\let\@ifdefinable\@rc@ifdefinableE257XdD\expandafter\new@command\csnameE258f\expandafter\@gobble\string#1\endcsnameE259S}'|\EletE260S\newcommand\Elet{%10 rhsoE261]\expandafter\let\expandafter E262S}"\EEletE263S\newcommand*\EElet{%E264]\expandafter\expandafter\expandafter\let\expandafter\expandafterE265S}b\NewUserInfo \NewUserInfo* \new@userinfoIUsing@\lowercasesinthismacroistricky*,N;sinceitgetsexpandedonlyinTU>'ExX's Istomach.E266S\newcommand\NewUserInfo{%E267]\sc@star@or@long\new@userinfoE268S}E269S\newcommand*\new@userinfo[2][]{%E270]\expandafter\InitCS\sc@star@nothing{#2}%E271]\def\sc@t@b{#1}%E272]\ifx\sc@t@b\ShortEmptyE273f\edef\sc@t@a{%E274p2\edef\noexpand\sc@t@b{%E275yw^\E@cdr\string#2\@nilE276p2}%E277f}%E278f\lowercase\expandafter{\sc@t@a}%E279]\elseE280f\edef\sc@t@b{\E@cdr\string#1\@nil}%E281]\fiE282]\edef\sc@t@a{%E283f\noexpand\NewName\sc@star@nothing{\sc@t@b}{####1}E284p2{\noexpand\renewcommand\sc@star@nothing\noexpand#2{####1}}E285]}%E286]\sc@t@aE287S}!čI10ifdControllingffexpansion 6\EExpand...\Inf\EExpand*...\In L\sc@EExpand 6\eExpand...\Inf\eExpand*...\In L\sc@eExpand$\eExecute\eExecute*IUsesUU\sc@t@a,\sc@t@b,\sc@t@c.E288S\newcommand\eExpand{%E289]\sc@star@or@long\sc@eExpandE290S}E291S\NewName{sc@eExpand}{#1\In#2}{%args:objectbodyE292]\l@ngrel@x\edef\sc@t@a{#1}%E293]\expandafter\defcommand\sc@star@nothing\sc@t@b[1]{#2}%E294]\expandafter,\sc@t@bE295f\expandafter{\sc@t@a}%E296S}E297S\newcommand\EExpand{%E298]\sc@star@or@long\sc@EExpandE299S}IWhenthisisshort,bGoththetwoargsareshort.V\sc@star@nothinggetsresetIbyUUthe rst\defcommand,sowesaveitin\sc@t@c.E300S\NewName{sc@EExpand}{#1\In#2}{%args:objectbodyE301]\let\sc@t@c\sc@star@nothing11 {HsoE302]\expandafter,\expandafter E303f\expandafter\defcommandE304f\expandafter\sc@t@cE305f\expandafter\sc@t@aE306f\expandafter{#1}%E307]\expandafter\defcommand\sc@t@c\sc@t@b[1]{#2}%E308]\expandafter\sc@t@bE309f\expandafter{\sc@t@a}%E310S}E311S\newcommand\eExecute[1]{%args:bodyE312]\eExpand#1\In{##1}%E313S}"\E@car "\E@cdrE314S\NewName{E@cdr}{#1\@nil}{%E315]\expandafter\@cdr#1\@nilE316S}E317S\NewName{E@car}{#1\@nil}{%E318]\expandafter\@car#1\@nilE319S}!čI11ifdGobbling3P\Gobble y\GobbleM y\GobbleO $\GobbleMM $\GobbleMO $\GobbleOM b\sc@gobbleOMI'm#R cmss10M-for-mandatoryarg,5i.e.,one-token.dOforoptionalarg,5i.e.,a-square-bracepair.E320S\newlet\Gobble\@gobbleE321S\newlet\GobbleM\@gobbleE322S\NewName{GobbleO}{[#1]}E323]{}E324S\newlet\GobbleMM\@gobbletwoE325S\newcommand\GobbleOM{%E326]\@ifnextchar[E327p2\sc@gobbleOME328f\GobbleE329S}E330S\NewName{sc@gobbleOM}{[#1]#2}E331]{}E332S\newcommand\GobbleMO[1]{%E333]\@ifnextchar[E334p2\GobbleOE335f{}%E336S}!čI12ifdDebugging 6\VerboseErrorsIW*eUUdonotuse\setcounterbutrathersetthesecountersloGcally.E337S\newcommand*\VerboseErrors[1][\@M]{%args:[number]E338]\c@errorcontextlines#1%E339]\showboxbreadth#1%E340]\showboxdepth#1%E341S}12 *so"\DebugISetUU\debugto0,1,or2.E342S\newcommand*\Debug[1]{%args:debug-level E343]\ifnum#1>0%E344f\let\sc@t@a\@ME345]\elseE346f\let\sc@t@a\m@neE347]\fiE348]\VerboseErrors[\sc@t@a]%E349]\tracingoutput#1%E350]\tracingpages#1%E351]\tracingmacros#1%E352]\tracingcommands#1%E353]\typeout{++++Debugging[#1]\on@line}%E354S}\MonsterError f\MonsterWarning b\MonsterInfoE355S\newcommand\MonsterWarning[2]{%args:packagewarningE356]\GenericWarning s,%continuationmessageE357f{(#1)\@spaces\@spaces\@spaces\@spaces\@spaces}E358f{Frankenstein(#1)WARNING:#2}%E359S}E360S\newcommand\MonsterError[3]{%args:packageerror-messagehelp-textE361]\GenericError%args:continuationmessagewhere-helpwhat-helpE362f{(#1)\@spaces\@spaces\@spaces\@spaces\@spaces}E363f{Frankenstein(#1)error:#2}E364f{Seethedocumenationforthe#1packageformoreinformation.}E365f{#3}%E366S}E367S\newcommand\MonsterInfo[2]{%args:packageinfoE368]\GenericInfoX%continuationmessageE369f{(#1)\@spaces\@spaces\@spaces\@spaces\@spaces}E370f{Frankenstein(#1)says:#2}%E371S}13|; (R6 cmss12'm#R cmss10& cmmi10K`y cmr10ٓRcmr7