÷ƒ’À;è TeX output 1997.03.05:1636‹ÿÿÿÿ ª ýs o ýÞ’„kQóDÓítG®G®cmr17¹A–7tNew“ImplemenŒqtation“of“LŸüdú‘úKGóX«Q cmr12ºAŽŽ‘¹”¹T‘ý[™Ÿ¸-EŽ‘;gX'sŽŸ‘h6ïó߆µTG® cmtt12¿verbatim–7t¹and“¿verbatim*“¹En•Œqvironmen“ts.ŽŸ’Ö„]ºRainer‘ê¨Sc¬rh‘ú opfŽŽ¤’©P Zenš¬rtrum–ê¨fSŽ‘ùÌvur“Daten˜v˜erarbSŽeitungŽŽ¡’ÂÀder–ê¨Univ¬rersit‘ú at“MainzŽŽ¡’ŸæÑAnselm-F›ÿVran•¬rtz-v“on-Ben“tzel-W˜eg‘ê¨12ŽŽ¡’Ó”çD-55099‘ê¨MainzŽŽ¡’¯F‘ÿVederal–ê¨Republic“of“German¬ryŽŽ¡’£ò_In¬rternet:‘8àó߆µT cmtt12ÆSchoepf@Uni-Mainz.DEŽŽŽŽŽŸgßü’Ö/ºBernd‘ê¨Raic¬rhleŽŽ¤’ϾVStettener–ê¨Str.“73ŽŽ¡’ÀЂD-73732‘ê¨W‘ú alden¬rbronnŽŽ¡’¯F‘ÿVederal–ê¨Republic“of“German¬ryŽŽ¡‘iHÃIn¬rternet:‘8àÆraichle@azu.Informatik.Uni-Stuttgart.DEŽŽŽŽŽŸKßü’ØȺChris‘ê¨Ro¬rwleyŽŽ¤’ÄJThe–ê¨OpSŽen“Univ•¬rersit“yŽŽ¡’Ò‘ZP¬rarsifal‘ê¨CollegeŽŽ¡’ÕKLFinc¬rhley‘ê¨RoadŽŽ¡’¤¶ London–ê¨NW3“7BG,“England,“UKŽŽ¡’ ÛøIn¬rternet:‘8àÆC.A.Rowley@open.ac.ukŽŽŽŽŽŸ^37’Ý º1996/06/04ŽŸ$’æ!Kót ‰: cmbx9ÈAbstractŽŸ¬Ñ‘oßüóo´‹Ç cmr9ÇThis––!pacš¾9k‘ÿ|rage“reimplemen˜ts“the“LŸýó5‘ü«‡ó¹Aa¨cmr6ÁAŽŽ‘© ÇT‘þuAŸïÿEŽ‘˜ŸX“ó ߤN cmtt9Ëverbatim“Çand“Ëverbatim*“Çen˜vi-Ž¤ ‘bronmenš¾9ts.‘EÑIn–#addition“it“pro˜vides“a“Ëcomment“Çen˜vironmen˜t“that“skips“an˜yŽ¡‘bcommands–ºor“text“bAÇet•¾9w“een–ºË\begin{comment}“Çand“the“next“Ë\end{comment}Ç.Ž¡‘bIt–Talso“de nes“the“command“Ëverbatiminput“Çto“input“a“whole“ le“v¾9erbatim.ŽŸ!Ä‘Ió"ÂÖN ff cmbx12Í1Ž‘aLËUsage‘ffnotesŽŸç‘IóKñ`y cmr10²LŸýó5‘üffóÙ“ Rcmr7±AŽŽ‘͉²T‘þU>Ÿ'EŽ‘ãxX's–ÝÐó#ßêŸ'EŽ‘ãxX“has“to“read“all“the“text“bGet•¸ãw“een–nÔthe“Î\begin{verbatim}“²and“theŽ¤ ‘bÎ\end{verbatim}–z<²bGefore“it“can“output“anš¸ãything,‘ƒvlong“v˜erbatim“listings“ma˜yŽ¡‘bo•¸ãv“er o“w–UUT‘þU>Ÿ'EŽ‘ãxX's“memory‘ÿ*ª.Ž©º‘IWhereas–ymthe“ rst“of“these“pšGoin¸ãts“can“b˜e“considered“only“a“minor“n¸ãuisance“theŽ¡‘Iother–UUone“is“a“real“limitation.Ž¡‘XThis–ìpacš¸ãk‘ÿqÇage“ le“con˜tains“a“reimplemen˜tation“of“the“Îverbatim“²and“Îverbatim*Ž¡‘I²en•¸ãvironmen“ts›Ì whic“h˜o“v“ercomes˜these˜restrictions.‘ÕìThere˜is,›é¹ho“w“ev“er,˜one‘Ì incom-Ž¡‘Ipatibilit•¸ãy›jPbGet“w“een˜the˜old˜and˜the˜new˜implemen“tations˜of˜these˜en“vironmen“ts:‘üDtheŽ¡‘Iold–ÛCvš¸ãersion“w˜ould“treat“text“on“the“same“line“as“the“Î\end{verbatim}“²commandŽ¡‘Ias–UUif“it“wš¸ãere“on“a“line“b˜y“itself.Ž¦’™½Òó$ò"V cmbx10ÏThis–ÕTnew“v®9ersion“will“simply“ignore“it.Ž¦‘I²(This–‡•is“the“price“one“has“to“paš¸ãy“for“the“remo˜v‘ÿqÇal“of“the“old“Îverbatim“²en˜vironmen˜t'sŽ¡‘Isize–UUlimitations.)‘qÇIt“will,“ho•¸ãw“ev“er,–UUissue“a“w¸ãarning“message“of“the“formŽŸº‘IËLaTeX–¹–warning:“Characters“dropped“after“\end{verbatim*}!Ž¦‘I²This–¨üis“not“a“real“problem“since“this“text“can“easily“bGe“put“on“the“next“line“withoutŽ¡‘Ia ecting–UUthe“output.Ž¡‘XThis–hnew“implemenš¸ãtation“also“solv˜es“the“second“problem“men˜tioned“abGo˜v˜e:‘—?itŽ¡‘Iis–ͬpšGossible“to“lea•¸ãv“e–ͬspaces“(but“ó%ý': cmti10Ðnot‘À„²b˜egin“a“new“line)“b˜et•¸ãw“een–ͬthe“Î\end“²and“theŽ¡‘IÎ{verbatim}–UU²or“Î{verbatim*}²:ŽŸº‘IË\begin‘¹–{verbatim*}Ž¤ ‘W,ÂtestŽ¡‘W,ÂtestŽ¡‘I\end‘¹–{verbatim*}Ž¦‘X²Additionally–Šwš¸ãe“in˜troGduce“a“Îcomment“²en˜vironmen˜t,‘×;with“the“e ect“that“theŽ¤ ‘Itext›7GbGet•¸ãw“een˜Î\begin{comment}˜²and˜Î\end{comment}˜²is˜simply˜ignored,‘=JregardlessŽ¡‘Iof–Š1what“it“lošGoks“lik•¸ãe.‘.A“t–Š1 rst“sigh¸ãt“this“seems“to“b˜e“quite“di eren¸ãt“from“the“purp˜oseŽ¡‘Iof–´"vš¸ãerbatim“listing,‘ËÕbut“actually“the“implemen˜tation“of“these“t˜w˜o“concepts“turnsŽ¡‘Iout–gŽto“bšGe“v¸ãery“similar.‘¨qBoth“rely“on“the“fact“that“the“text“b˜et•¸ãw“een‘gŽÎ\begin{...}Ž¡‘I²and–±ÈÎ\end{...}“²is“read“bš¸ãy“T‘þU>Ÿ'EŽ‘ãxX“without“in˜terpreting“an˜y“commands“or“spGecialŽ¡‘Icš¸ãharacters.‘\³The–remaining“di erence“bGet˜w˜een“Îverbatim“²and“Îcomment“²is“only“thatŽ¡‘Ithe–ÅStext“is“to“bšGe“t¸ãyp˜eset“in“the“ rst“case“and“to“b˜e“throš¸ãwn“a˜w˜a˜y“in“the“latter.‘AÇNoteŽ¡‘Ithat–UUthese“en•¸ãvironmen“ts–UUcannot“bGe“nested.Ž¡‘XÎ\verbatiminput–ß®²is“a“command“with“one“argumenš¸ãt“that“inputs“a“ le“v˜erbatim,Ž¡‘Ii.e.–UUthe“command“Îverbatiminput{xx.yy}“²has“the“same“e ect“asŽ©‘Sª®Î\begin{verbatim}Ž¡‘Sª®¸hÐContentsŽ’»®ofŽ’>ƒtheŽ’œZ leŽ’­¸Æó&ßêŸ'EŽ‘ãxX‘ü2Ÿÿó  b> cmmi10µ"ŽŽ‘.5 ²došGes“not“o er“a“go˜o˜d“in¸ãterface“to“pro-Ž¡‘Igrammers.‘ÕIn–˾conš¸ãtrast,‘éXthis“pac˜k‘ÿqÇage“pro˜vides“a“simple“mec˜hanism“to“implemen˜tŽ¡‘Isimilar–!Îfeatures,‘,the“Îcomment“²en•¸ãvironmen“t›!Îimplemen“ted˜here˜bGeing˜an˜example˜ofŽ¡‘Iwhat–UUcan“bGe“done“and“ho¸ãw.ŽŽŽŒ‹ ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²3ŽŽ o ý´‘Ió'ÂÖN  cmbx12Ò2.1Ž‘gÀSimple‘€examplesŽŸuT‘I²It–Ä_is“noš¸ãw“pGossible“to“use“the“Îverbatim“²en˜vironmen˜t“to“de ne“en˜vironmen˜ts“of“y˜ourŽŸ ‘Io¸ãwn.‘qÇE.g.,Ž©‘M¹–Ë\newenvironment{myverbatim}%Ž¤ ‘W,Â{\endgraf\noindent‘¹–MYVERBATIM:%Ž¡‘[æX\endgraf\verbatim}%Ž¡‘W,Â{\endverbatim}ŽŸ‘I²can–UUbGe“used“afterwš¸ãards“lik˜e“the“Îverbatim“²en˜vironmen˜t,“i.e.Ž¦‘IË\begin‘¹–{myverbatim}Ž¡‘Rs,testŽ¡‘Rs,testŽ¡‘I\end‘¹–{myverbatim}ŽŸ‘I²Another›UUw•¸ãa“y˜to˜use˜it˜is˜to˜writeŽ¦‘IË\let\foo=\commentŽ¡‘I\let\endfoo=\endcommentŽŸ‘I²and–³hfrom“that“pGoinš¸ãt“on“en˜vironmen˜t“Îfoo“²is“the“same“as“the“commen˜t“en˜vironmen˜t,Ž¤ ‘Ii.e.–UUev¸ãerything“inside“its“b•Go“dy–UUis“ignored.Ž¡‘XY‘ÿ*ªou–#maš¸ãy“also“add“spGecial“commands“after“the“Î\verbatim“²macro“is“in˜v˜ok˜ed,Ž¡‘Ie.g.Ž¦‘IË\newenvironment{myverbatim}%Ž¤ ‘Rs,{\verbatim\myspecialverbatimsetup}%Ž¡‘Rs,{\endverbatim}Ž¤‘I²though–yš¸ãou“ma˜y“w˜an˜t“to“learn“abšGout“the“ho˜ok“Î\every@verbatim“²at“this“p˜oin¸ãt.Ž© ‘IHo•¸ãw“ev“er,–UUthere“are“still“a“n•¸ãum“bGer–UUof“restrictions:Ž¡‘U8ä1.ŽŽŽ‘bY‘ÿ*ªou–‹Qm¸ãust“not“use“the“Î\begin“²orthe“Î\end“²command“inside“a“de nition,‘˜Ðe.g.Ž¦‘bthe–UUfolloš¸ãwing“t˜w˜o“examples“will“Ðnot‘H-²w˜ork:ŽŸ‘bË\newenvironment{myverbatim}%Ž¤ ‘b{\endgraf\noindent MYVERBATIM:%Ž¡‘b \endgraf\begin{verbatim}}%Ž¡‘b{\end{verbatim}}Ž¡‘b\newenvironment{fred}Ž¡‘b{\begin{minipage}{30mm}\verbatim}Ž¡‘b{\endverbatim\end{minipage}}ŽŸ‘b²If–@Âyš¸ãou“try“these“examples,‘xT‘þU>Ÿ'EŽ‘ãxX“will“repGort“a“\runa˜w˜a˜y“argumen˜t"“error.‘—MoreŽ¦‘bgenerally‘ÿ*ª,‘ "it–rÔis“not“pGossible“to“use“Î\begin².–ªª.“.“Î\end–rÔ²or“the“related“en•¸ãvironmen“tsŽ¦‘bin–EZthe“de nition“of“the“new“en•¸ãvironmen“t.‘lsInstead,‘HŒthe–EZcorrect“w•¸ãa“y–EZto“de neŽ¦‘bthis›UUen•¸ãvironmen“t˜w“ould˜bGeŽŸ‘bË\newenvironment{fred}Ž¡‘b{\minipage{30mm}\verbatim}Ž¡‘b{\endverbatim\endminipage}ŽŽŽŒ‹‘ ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²4ŽŽ o ý´‘U8ä2.ŽŽŽ‘bY‘ÿ*ªou–õ€canÐnot‘èX²use“the“Îverbatim“²en•¸ãvironmen“t–õ€inside“user“de ned“Ðc‘ÿ}'ommands‘Ò!²;ŽŸ ‘be.g.,Ž¤‘bË\newcommand{\verbatimfile}[1]%ŽŸ ‘b {\begin{verbatim}\input{#1}\end{verbatim}}Ž©‘b²došGes–UUÐnot‘H-²w¸ãork;“nor“do˜esŽ¡‘bË\newcommand{\verbatimfile}[1]{\verbatim\input{#1}\endverbatim}Ž¦‘U8ä²3.ŽŽŽ‘bThe–{name“of“the“newly“de ned“en•¸ãvironmen“t›{m“ust˜not˜con“tain˜c“haractersŽ¤ ‘bwith–ȵcategory“coGde“other“than“11“(letter)“or“12“(other),‘%or“this“will“notŽ¡‘bw¸ãork.ŽŸþ6‘IÒ2.2Ž‘gÀThe‘€in terfacesŽŸuT‘I²Let–‡nus“start“with“the“simple“things.‘-%Sometimes“it“ma¸ãy“bšGe“necessary“to“use“a“sp˜ecialŽ¡‘Itš¸ãypGeface–šúfor“y˜our“v˜erbatim“text,‘À@or“pšGerhaps“the“usual“computer“mo˜dern“t¸ãyp˜ewriterŽ¡‘IshapGe–UUin“a“reduced“size.Ž¡‘XY‘ÿ*ªou–˜žmaš¸ãy“select“this“b˜y“rede ning“the“macro“Î\verbatim@font².‘;£This“macro“isŽ¡‘Iexecuted–*at“the“bGeginning“of“evš¸ãery“v˜erbatim“text“to“select“the“fon˜t“shapGe.‘c`Do“notŽ¡‘Iuse– it“for“other“purpGoses;‘Å}if“yš¸ãou“ nd“y˜ourself“abusing“this“y˜ou“ma˜y“w˜an˜t“to“readŽ¡‘IabšGout–UUthe“Î\every@verbatim“²ho˜ok“b˜elo¸ãw.Ž¡‘XBy–“default,‘¢…Î\verbatim@font“²switcš¸ãhes“to“the“t˜ypGewriter“fon˜t“and“disables“theŽ¡‘Iligatures–UUcon¸ãtained“therein.Ž¡‘XThere–Ðis“a“hoGok“(i.e.“a“tokš¸ãen“register)“called“Î\every@verbatim“²whose“con˜ten˜tsŽ¡‘Iare–b‰inserted“inš¸ãto“T‘þU>Ÿ'EŽ‘ãxX's“mouth“just“bGefore“ev˜ery“v˜erbatim“text.‘™cPlease“use“theŽ¡‘IÎ\addto@hook–UU²macro“to“add“something“to“this“hoGok.‘qÇIt“is“used“as“follo¸ãws:Ž¤‘Sª®Î\addto@hook¸hÐnameŽ‘»³ofŽ‘*>ˆtheŽ‘:œ_ho‘ÿ}'ok‘¸iŽ‘Rÿ‰Î{¸hÐc‘ÿ}'ommandsŽ‘4µútoŽ‘@z:b‘ÿ}'eŽ‘Läadde‘ÿ}'d‘‰¸iŽ‘iôzÎ}Ž¡‘X²After–jall“spGeci c“setup,‘Gïlikš¸ãe“switc˜hing“of“category“cošGdes,‘Gïhas“b˜een“done,‘GïtheŽ¤ ‘IÎ\verbatim@start–Ðj²macro“is“called.‘ãThis“starts“the“main“loGop“of“the“scanningŽ¡‘Imec•¸ãhanism›UÞimplemen“ted˜here.‘sbAn“y˜other˜en“vironmen“t˜that˜w“an“ts˜to˜mak“e˜use˜ofŽ¡‘Ithis–UUfeature“should“execute“this“macro“as“its“last“action.Ž¡‘XThese–x_are“the“things“that“concern“the“start“of“a“vš¸ãerbatim“en˜vironmen˜t.‘ÚäOnceŽ¡‘Ithis–Õ(and“other)“setup“has“bšGeen“done,‘î­the“co˜de“in“this“pac¸ãk‘ÿqÇage“reads“and“pro˜cessesŽ¡‘Icš¸ãharacters–UUfrom“the“input“stream“in“the“follo˜wing“w˜a˜y:Ž©‘U8ä1.ŽŽŽ‘bBefore–© the“ rst“c¸ãharacter“of“an“input“line“is“read,‘ýùit“executes“the“macroŽ¡‘bÎ\verbatim@startline².Ž¦‘U8ä2.ŽŽŽ‘bAfter–™some“cš¸ãharacters“ha˜v˜e“bGeen“read,‘©êthe“macro“Î\verbatim@addtoline“²isŽ¡‘bcalled–JOwith“these“cš¸ãharacters“as“its“only“argumen˜t.‘nThis“ma˜y“happGen“sev˜eralŽ¡‘btimes–UUpGer“line“(when“an“Î\end“²command“is“presen¸ãt“on“the“line“in“question).Ž¦‘U8ä3.ŽŽŽ‘bWhen–Zæthe“end“of“the“line“is“reac¸ãhed,‘œJthe“macro“Î\verbatim@processlineŽ¡‘b²is–iäcalled“to“proGcess“the“cš¸ãharacters“that“Î\verbatim@addtoline“²has“accum˜u-Ž¡‘blated.Ž¦‘U8ä4.ŽŽŽ‘bFinally‘ÿ*ª,‘Vìthere–Všis“the“macro“Î\verbatim@finish“²that“is“called“just“bGefore“theŽ¡‘ben•¸ãvironmen“t–UUis“ended“b¸ãy“a“call“to“the“Î\end“²macro.ŽŽŽŒ‹û ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²5ŽŽ o ý´‘XT‘ÿ*ªo–ææmakš¸ãe“this“clear“let“us“consider“the“standard“Îverbatim“²en˜vironmen˜t.‘LøIn“thisŽŸ ‘Icase–UUthe“three“macros“abGo•¸ãv“e–UUare“de ned“as“follo¸ãws:Ž©ë…‘U8ä1.ŽŽŽ‘bÎ\verbatim@startline–UU²clears“the“cš¸ãharacter“bu er“(a“tok˜en“register).Ž¤õ‘U8ä2.ŽŽŽ‘bÎ\verbatim@addtoline–UU²adds“its“argumenš¸ãt“to“the“c˜haracter“bu er.Ž¡‘U8ä3.ŽŽŽ‘bÎ\verbatim@processline–²tš¸ãypGesets“the“c˜haracters“accum˜ulated“in“the“bu er.Ž¦‘IWith–Ûïthis“it“is“vš¸ãery“simple“to“implemen˜t“the“Îcomment“²en˜vironmen˜t:‘~úin“this“caseŽ¤ ‘IÎ\verbatim@startline–D²and“Î\verbatim@processline“²are“de ned“to“bGe“no-opsŽ¡‘Iwhereas–UUÎ\verbatim@addtoline“²discards“its“argumen¸ãt.Ž¡‘XLet's–ºuse“this“to“de ne“a“v‘ÿqÇarianš¸ãt“of“the“Îverbatim“²en˜vironmen˜t“that“prin˜tsŽ¡‘Iline›ýn•¸ãum“bGers˜in˜the˜left˜margin.‘­ÀAssume˜that˜this˜w“ould˜bGe˜done˜b“y˜a˜coun“terŽ¡‘Icalled–øäÎVerbatimLineNo².‘\tAssuming“that“this“counš¸ãter“w˜as“initialized“propGerly“b˜yŽ¡‘Ithe›UUen•¸ãvironmen“t,˜Î\verbatim@processline˜²w“ould˜bGe˜de ned˜in˜this˜case˜asŽŸë…‘IË\def\verbatim@processline{%Ž¤ ‘Rs,\addtocounter{VerbatimLineNo}{1}%Ž¡‘Rs,\leavevmodeŽ¡‘Rs,\llap{\theVerbatimLineNo\‘¹–\hskip\@totalleftmargin}%Ž¡‘Rs,\the\verbatim@line\par}Ž¦‘X²A‘¸Ëfurther–¸äpGossibilitš¸ãy“is“to“de ne“a“v‘ÿqÇarian˜t“of“the“Îverbatim“²en˜vironmen˜t“thatŽ¤ ‘IbGoš¸ãxes–È and“cen˜ters“the“whole“v˜erbatim“text.‘ÉìNote“that“the“bGo˜xed“text“should“bGeŽ¡‘Iless–UUthan“a“page“otherwise“yš¸ãou“ha˜v˜e“to“c˜hange“this“example.ŽŸff‘IË\def\verbatimboxed#1{\begingroupŽ¤ ‘Rs,\def\verbatim@processline{%Ž¡‘[æX{\setbox0=\hbox{\the\verbatim@line}%Ž¡‘`Ÿî\hsize=\wd0Ž¡‘`Ÿî\the\verbatim@line\par}}%Ž¡‘Rs,\setbox0=\vbox{\parskip=0pt\topsep=0pt\partopsep=0ptŽ¡’™Rö\verbatiminput{#1}}%Ž¡‘Rs,\begin{center}\fbox{\box0}\end{center}%Ž¡‘M¹–\endgroup}ŽŸff‘X²As–ºÐa“ nal“nonš¸ãtrivial“example“w˜e“describGe“the“de nition“of“an“en˜vironmen˜tŽ¤ ‘Icalled–MfÎverbatimwrite².‘o"It“writes“all“text“in“its“b•Go“dy–Mfto“a“ le“whose“name“is“giv¸ãenŽ¡‘Ias–w@an“argumenš¸ãt.‘׈W‘ÿ*ªe“assume“that“a“stream“n˜um˜bGer“called“Î\verbatim@out“²hasŽ¡‘Ialready–UUbGeen“reservš¸ãed“b˜y“means“of“the“Î\newwrite“²macro.Ž¡‘XLet's–UUbGegin“with“the“de nition“of“the“macro“Î\verbatimwrite².ŽŸë…‘IË\def\verbatimwrite#1{%Ž¦‘I²First–zwš¸ãe“call“Î\@bsphack“²so“that“this“en˜vironmen˜t“doGes“not“in uence“the“spacing.Ž¡‘IThen–UUw¸ãe“opšGen“the“ le“and“set“the“category“co˜des“of“all“sp˜ecial“c¸ãharacters:ŽŸë…‘Rs,Ë\@bsphackŽ¤ ‘Rs,\immediate\openout–¹–\verbatim@out“#1Ž¡‘Rs,\let\do\@makeother\dospecialsŽ¡‘Rs,\catcode`\^^M\activeŽ¦‘I²The–UUdefault“de nitions“of“the“macrosŽŸë…‘Rs,Ë\verbatim@startlineŽ¡‘Rs,\verbatim@addtolineŽ¡‘Rs,\verbatim@finishŽŽŽŒ‹, ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²6ŽŽ o ý´‘Iare–šalso“used“in“this“en•¸ãvironmen“t.‘#—Only–šthe“macro“Î\verbatim@processline“²hasŽ© ‘Ito–UUbšGe“c¸ãhanged“b˜efore“Î\verbatim@start“²is“called:ŽŸàî‘Rs,Ë\def\verbatim@processline{%Ž¤ ‘[æX\immediate\write\verbatim@out{\the\verbatim@line}}%Ž¡‘Rs,\verbatim@start}ŽŸàî‘I²The–ö»de nition“of“Î\endverbatimwrite“²is“vš¸ãery“simple:‘Bzw˜e“close“the“stream“and“callŽ¦‘IÎ\@esphack–UU²to“get“the“spacing“righ¸ãt.ŽŸàî‘IË\def\endverbatimwrite{\immediate\closeout\verbatim@out\@esphack}ŽŸ Óø‘IÍ3Ž‘aLËThe‘ffimplemenŒÌtationŽŸç‘I²The–ˆ‡vš¸ãery“ rst“thing“w˜e“do“is“to“ensure“that“this“ le“is“not“read“in“t˜wice.‘ \T‘ÿ*ªo“thisŽ¦‘Iend–d¹wš¸ãe“c˜hec˜k“whether“the“macro“Î\verbatim@@@“²is“de ned.‘ŸôIf“so,‘¨’w˜e“just“stopŽ¦‘Ireading–Ûthis“ le.‘\žThe“`pacš¸ãk‘ÿqÇage'“guard“here“allo˜ws“most“of“the“cošGde“to“b˜e“excludedŽ¦‘Iwhen–UUextracting“the“drivš¸ãer“ le“for“testing“this“pac˜k‘ÿqÇage.ŽŸ ¸;‘Lüs±1Ž‘Sª®ó©±Ê cmsy9Êhó)ÒoÇw cmss9Ôpack¾9ageŽ‘#g ÊiŽ¡‘Lüs±2Ž‘Sª®Ë\NeedsTeXFormat{LaTeX2e}Ž¡‘Lüs±3Ž‘Sª®Ë\ProvidesPackage{verbatim}Ž¡‘Lüs±4Ž‘kJœË[1996/09/25–¹–v1.5j“LaTeX2e“package“for“verbatim“enhancements]Ž¡‘Lüs±5Ž‘Sª®Ë\@ifundefined{verbatim@@@}{}{\endinput}ŽŸ¸;‘X²W‘ÿ*ªe–ùˆuse“a“mecš¸ãhanism“similar“to“the“one“implemen˜ted“for“the“Î\comment².–ªª.“.Ž¦‘IÎ\endcomment–=E²macro“in“¸A‘þŸžqMŽ‘QS‘¿ü²-T‘þU>Ÿ'EŽ‘ãxXŽ‘0û”:‘A§W‘ÿ*ªe“input“one“line“at“a“time“and“c•¸ãhec“k–=Eif“itŽ¦‘Iconš¸ãtains– ìthe“Î\end{...}“²tok˜ens.‘YOThen“w˜e“can“decide“whether“w˜e“ha˜v˜e“reac˜hed“theŽ¦‘Iend–UUof“the“vš¸ãerbatim“text,“or“m˜ust“con˜tin˜ue.ŽŸÀj‘IÒ3.1Ž‘gÀPreliminariesŽŸuT‘øf Ë\every@verbatimŽŽŽ‘I²The–UUhoGok“(i.e.“tok¸ãen“register)“Î\every@verbatim“²is“initialized“to“¸hÐempty‘â}¸iŽ‘&õ².ŽŸ ¸;‘Lüs±6Ž‘Sª®Ë\newtoks\every@verbatimŽ¡‘Lüs±7Ž‘Sª®Ë\every@verbatim={}Ž¤(²‘ Lø\@makeotherŽŽŽ‘IÎ\@makeother–›Ú²takš¸ães“as“argumen˜t“a“c˜haracter“and“c˜hanges“its“category“coGde“to“12Ž¦‘I(other).ŽŸ ¸;‘Lüs±8Ž‘Sª®Ë\def\@makeother#1{\catcode`#112\relax}Ž¡‘ÙÌ\@vobeyspacesŽŽŽ‘I²The–¥¿macro“Î\@vobeyspaces“²causes“spaces“in“the“input“to“bGe“prin¸ãted“as“spaces“inŽ¦‘Ithe‘UUoutput.ŽŸ ¸;‘Lüs±9Ž‘Sª®Ë\begingroupŽ¤ ‘I±10Ž‘XdDË\catcode`\‘¹–=\active%Ž¡‘I±11Ž‘XdDË\def\x{\def\@vobeyspaces{\catcode`\–¹–\active\let“\@xobeysp}}Ž¡‘I±12Ž‘XdDË\expandafter\endgroup\xŽ¤(²‘À$\@xobeyspŽŽŽ‘I²The–œ÷macro“Î\@xobeysp“²proGduces“exactly“one“space“in“the“output,‘Á×protected“againstŽ¦‘Ibreaking–UUjust“bšGefore“it.‘qÇ(Î\@M“²is“an“abbreviation“for“the“n•¸ãum“b˜er‘UU10000.)ŽŸ ¸;‘I±13Ž‘Sª®Ë\def\@xobeysp{\leavevmode\penalty\@M\‘¹–}Ž¡‘ý 6\verbatim@lineŽŽŽ‘I²W‘ÿ*ªe–õuse“a“newly“de ned“tok¸ãen“register“called“Î\verbatim@line“²that“will“bGe“used“asŽ¦‘Ithe–UUc¸ãharacter“bu er.ŽŸ ¸;‘I±14Ž‘Sª®Ë\newtoks\verbatim@lineŽŽŽŒ‹7¦ ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²7ŽŽ o ý´‘XThe–•Rfolloš¸ãwing“four“macros“are“de ned“globally“in“a“w˜a˜y“suitable“for“theŽ¤ ‘IÎverbatim–UU²and“Îverbatim*“²en•¸ãvironmen“ts.ŽŸµÜ‘å€HË\verbatim@startlineŽŽ¡‘å€H\verbatim@addtolineŽŽŽŽ¡¡‘Ü \verbatim@processlineŽŽŽŽŽ‘IÎ\verbatim@startline–ëx²initializes“proGcessing“of“a“line“bš¸ãy“empt˜ying“the“c˜haracterŽ¡‘Ibu er‘UU(Î\verbatim@line²).Ž© Zî‘I±15Ž‘Sª®Ë\def\verbatim@startline{\verbatim@line{}}ŽŸZî‘IÎ\verbatim@addtoline–6²adds“the“tokš¸ãens“in“its“argumen˜t“to“our“bu er“registerŽ¡‘IÎ\verbatim@line–UU²without“expanding“them.Ž¦‘I±16Ž‘Sª®Ë\def\verbatim@addtoline#1{%ŽŸ ‘I±17Ž‘]ÚË\verbatim@line\expandafter{\the\verbatim@line#1}}ŽŸZî‘I²ProGcessing–ca“line“inside“a“Îverbatim“²or“Îverbatim*“²en•¸ãvironmen“t–cmeans“prin¸ãtingŽ¡‘Iit.‘?=Ending–™Òthe“line“means“that“wš¸ãe“ha˜v˜e“to“bGegin“a“new“paragraph.‘?=W‘ÿ*ªe“use“Î\parŽ¡‘I²for–1Pthis“purpGose.‘¸Note“that“Î\par“²is“rede ned“in“Î\@verbatim“²to“force“T‘þU>Ÿ'EŽ‘ãxX“in¸ãtoŽ¡‘Ihorizonš¸ãtal–¢moGde“and“to“insert“an“empt˜y“bGo˜x“so“that“empt˜y“lines“in“the“input“doŽ¡‘IappGear–UUin“the“output.Ž¦‘I±18Ž‘Sª®Ë\def\verbatim@processline{\the\verbatim@line\par}ŽŸÊ‘ó­ \verbatim@finishŽŽŽ‘I²As–´'a“default,‘ËÜÎ\verbatim@finish“²proGcesses“the“remaining“c¸ãharacters.‘Ž>When“thisŽ¡‘Imacro–èäis“called“wš¸ãe“are“facing“the“follo˜wing“problem:‘˜æwhen“the“Î\end{verbatim}Ž¡‘I²command–ëyis“encounš¸ãtered“Î\verbatim@processline“²is“called“to“proGcess“the“c˜har-Ž¡‘Iacters–Z“preceding“the“command“on“the“same“line.‘If“there“are“none,‘[ãan“empt¸ãy“lineŽ¡‘Iwš¸ãould–UUbGe“output“if“w˜e“did“not“c˜hec˜k“for“this“case.Ž¡‘XIf–<>the“line“is“emptš¸ãy“Î\the\verbatim@line“²expands“to“nothing.‘ijT‘ÿ*ªo“test“this“w˜eŽ¡‘Iuse–ä½a“tric¸ãk“similar“to“that“on“p.“376“of“the“T‘þU>Ÿ'EŽ‘ãxXb•Go“ok,‘ûBbut–ä½with“Î$².–ªª.“.“Î$–ä½²instead“of“theŽ¡‘IÎ!–ôf²tokš¸ãens.‘QxThese“Î$“²tok˜ens“can“nev˜er“ha˜v˜e“the“same“category“coGde“as“a“Î$“²tok˜en“thatŽ¡‘Imigh¸ãt–³pšGossibly“app˜ear“in“the“tokš¸ãen“register“Î\verbatim@line²,‘*mas“suc˜h“a“tok˜en“willŽ¡‘Ialw•¸ãa“ys›dha“v“e˜b•Geen˜read˜with˜category˜co“de˜12˜(other).‘ôNote˜that˜Î\ifcat˜²expandsŽ¡‘Ithe–ñfolloš¸ãwing“tok˜ens“so“that“Î\the\verbatim@line“²is“replaced“b˜y“the“accum˜ulatedŽ¡‘Ic¸ãharactersŽ¦‘I±19Ž‘Sª®Ë\def\verbatim@finish{\ifcat$\the\verbatim@line$\elseŽŸ ‘I±20Ž‘]ÚË\verbatim@processline\fi}ŽŸp‘IÒ3.2Ž‘gÀThe–€Æverbatim“Òand“Æverbatim*“Òen• vironmen“tsŽŸuT‘ý 6Ë\verbatim@fontŽŽŽ‘I²W‘ÿ*ªe–b‹start“bš¸ãy“de ning“the“macro“Î\verbatim@font“²that“is“to“select“the“fon˜t“and“toŽ¡‘Iset›å³fon•¸ãt-depGenden“t˜parameters.‘"âThen˜w“e˜go˜through˜Î\verbatim@nolig@list˜²toŽ¡‘Ia•¸ãv“oid–{£certain“ligatures.‘ä²Î\verbatim@nolig@list“²is“macro“de ned“in“the“LŸýó5‘üff±AŽŽ‘͉²T‘þU>Ÿ'EŽ‘ãxX‘ü2Ÿÿµ"ŽŽŽ¡‘I²k¸ãernel–UUto“expand“toŽŸµÜ‘[æXË\do\`\do\<\do\>\do\,\do\'\do\-ŽŸµÜ‘I²All–UUthe“cš¸ãharacters“in“this“list“can“bGe“part“of“a“ligature“in“some“fon˜t“or“other.Ž¦‘I±21Ž‘Sª®Ë\def\verbatim@font{\normalfont\ttfamilyŽ¤ ‘I±22Ž’­pÐË\let\do\do@noligsŽ¡‘I±23Ž’­pÐË\verbatim@nolig@list}ŽŸÊ‘Ž\@verbatimŽŽŽ‘I²The–VDmacro“Î\@verbatim“²sets“up“things“propGerly‘ÿ*ª.‘t“First“of“all,‘–the“tok¸ãens“of“theŽ¤ ‘IÎ\every@verbatim–mD²hoGok“are“inserted.‘¹•Then“a“Îtrivlist“²en•¸ãvironmen“t–mDis“startedŽ¡‘Iand–ÓPits“ rst“Î\item“²command“inserted.‘ë¸Eac¸ãh“line“of“the“Îverbatim“²or“Îverbatim*Ž¡‘I²en•¸ãvironmen“t–UUwill“bGe“treated“as“a“separate“paragraph.Ž¦‘I±24Ž‘Sª®Ë\def\@verbatim{\the\every@verbatimŽŸ ‘I±25Ž‘]ÚË\trivlist–¹–\item“\relaxŽŽŽŒ‹Cb ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²8ŽŽ o ý´‘IThe–eúfolloš¸ãwing“extra“v˜ertical“space“is“for“compatibilit˜y“with“the“LŸýó5‘üff±AŽŽ‘͉²T‘þU>Ÿ'EŽ‘ãxXk˜ernel:‘“oth-Ž¤ ‘Ierwise,‘Vìusing–#hthe“Îverbatim“²pacš¸ãk‘ÿqÇage“c˜hanges“the“v˜ertical“spacing“of“a“ÎverbatimŽ¡‘I²en•¸ãvironmen“t–UUnested“within“a“Îquote“²en•¸ãvironmen“t.Ž© ii‘I±26Ž‘]ÚË\if@minipage\else\vskip\parskip\fiŽŸii‘I²The–Z§paragraph“parameters“are“set“appropriately:‘|jthe“pšGenalt¸ãy“at“the“b˜eginning“ofŽ¡‘Ithe›7en•¸ãvironmen“t,‘o}left˜and˜righ“t˜margins,‘o}paragraph˜inden“tation,‘o}the˜glue˜to˜ llŽ¡‘Ithe–‚last“line,‘Gand“the“vš¸ãertical“space“bGet˜w˜een“paragraphs.‘ø The“latter“space“has“toŽ¡‘IbGe–UUzero“since“wš¸ãe“do“not“w˜an˜t“to“add“extra“space“bGet˜w˜een“lines.Ž¦‘I±27Ž‘]ÚË\@beginparpenalty‘¹–\predisplaypenaltyŽ¤ ‘I±28Ž‘]ÚË\leftskip\@totalleftmargin\rightskip\z@Ž¡‘I±29Ž‘]ÚË\parindent\z@\parfillskip\@flushglue\parskip\z@ŽŸii‘I²There's–šone“pGoinš¸ãt“to“mak˜e“here:‘èRthe“Îlist“²en˜vironmen˜t“uses“T‘þU>Ÿ'EŽ‘ãxX's“Î\parshapeŽ¤ ‘I²primitivš¸ãe–Gto“get“a“spGecial“inden˜tation“for“the“ rst“line“of“the“list.‘^ÃIf“the“list“bGeginsŽ¡‘Iwith–MÐa“Îverbatim“²en•¸ãvironmen“t–MÐthis“Î\parshape“²is“still“in“e ect.‘oETherefore“wš¸ãe“ha˜v˜eŽ¡‘Ito–tœreset“this“inš¸ãternal“parameter“explicitly–ÿ*ª.‘ÏW“e–tœcould“do“this“b˜y“assigning“0“toŽ¡‘IÎ\parshape².‘h›Ho•¸ãw“ev“er,‘¼-there–§œis“a“simpler“w•¸ãa“y–§œto“ac•¸ãhiev“e›§œthis:‘Tw“e˜simply˜tell˜T‘þU>Ÿ'EŽ‘ãxXŽ¡‘Ito–­Œstart“a“new“paragraph.‘zlAs“is“explained“on“p.“103“of“the“T‘þU>Ÿ'EŽ‘ãxXb•Go“ok,‘Úthis‘­ŒresetsŽ¡‘IÎ\parshape–UU²to“zero.Ž¦‘I±30Ž‘]ÚË\@@parŽŸii‘I²W‘ÿ*ªe–dænoš¸ãw“ensure“that“Î\par“²has“the“correct“de nition,‘¨Énamely“to“force“T‘þU>Ÿ'EŽ‘ãxX“in˜toŽ¡‘Ihorizonš¸ãtal–чmoGde“and“to“include“an“empt˜y“bGo˜x.‘æ^This“is“to“ensure“that“empt˜yŽ¡‘Ilines–ªdo“appGear“in“the“output.‘pAfterw•¸ãards,‘ÿHw“e–ªinsert“the“Î\interlinepenaltyŽ¡‘I²since–=uT‘þU>Ÿ'EŽ‘ãxX“došGes“not“add“a“p˜enalt¸ãy“b˜et•¸ãw“een–=uparagraphs“(here:‘Blines)“bš¸ãy“its“o˜wnŽ¡‘Iinitiativš¸ãe.‘±ÅOtherwise–jªa“Îverbatim“²en˜vironmen˜t“could“bGe“brok˜en“across“pages“ev˜enŽ¡‘Iif–UUa“Î\samepage“²declaration“wš¸ãere“presen˜t.Ž¡‘XHo•¸ãw“ev“er,›Þin–êa“top-aligned“minipage,˜this“will“result“in“an“extra“empt¸ãy“lineŽ¡‘Iadded–½úat“the“top.‘«µTherefore,‘Ø#a“sligh¸ãtly“more“complicated“construct“is“necessary‘ÿ*ª.Ž¡‘IOne–yeof“the“impGortan¸ãt“things“here“is“the“inclusion“of“Î\leavevmode“²as“the“ rst“macroŽ¡‘Iin–!the“ rst“line,›+„for“example,˜a“blank“v¸ãerbatim“line“is“the“ rst“thing“in“a“list“item.Ž¦‘I±31Ž‘]ÚË\def\par{%Ž¤ ‘I±32Ž‘f‘Ë\if@tempswaŽ¡‘I±33Ž‘p2Ë\leavevmode\null\@@par\penalty\interlinepenaltyŽ¡‘I±34Ž‘f‘Ë\elseŽ¡‘I±35Ž‘p2Ë\@tempswatrueŽ¡‘I±36Ž‘p2Ë\ifhmode\@@par\penalty\interlinepenalty\fiŽ¡‘I±37Ž‘f‘Ë\fi}%Ž¤ii‘I²But–î‹to“a•¸ãv“oid–î‹an“error“message“when“the“en•¸ãvironmen“t–î‹doGesn't“conš¸ãtain“an˜y“text,‘w˜eŽŸ ‘Irede ne–UUÎ\@noitemerr“²whicš¸ãh“will“in“this“case“bGe“called“b˜y“Î\endtrivlist².Ž¦‘I±38Ž‘]ÚË\def\@noitemerr{\@warning{No–¹–verbatim“text}}%Ž¡‘I²No•¸ãw›UUw“e˜call˜Î\obeylines˜²to˜mak“e˜the˜end˜of˜line˜c“haracter˜activ“e,Ž¦‘I±39Ž‘]ÚË\obeylinesŽ¡‘I²c¸ãhange–UUthe“category“cošGde“of“all“sp˜ecial“c¸ãharacters,“to“12“(other).Ž¦‘I±40Ž‘]ÚË\let\do\@makeother‘¹–\dospecialsŽ¡‘I²and–UUswitcš¸ãh“to“the“fon˜t“to“bGe“used.Ž¦‘I±41Ž‘]ÚË\verbatim@fontŽ¡‘I²T‘ÿ*ªo›ã a•¸ãv“oid˜a˜breakpGoin“t˜after˜the˜lab•Gels˜b“o•¸ãx,‘yw“e˜remo“v“e˜the˜pGenalt“y˜put˜there˜b“yŽŸ ‘Ithe–UUlist“macros:‘qÇanother“use“of“Î\unpenalty²!Ž¦‘I±42Ž‘]ÚË\everypar–¹–\expandafter{\the\everypar“\unpenalty}}ŽŽŽŒ‹ R\ ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’þê²9ŽŽ o ý´‘À$Ë\verbatimŽŽŸ ‘Ž\verbatim*ŽŽŽŽŽ‘I²No•¸ãw›°@w“e˜de ne˜the˜toplev“el˜macros.‘‚‰Î\verbatim˜²is˜sligh“tly˜c“hanged:‘'žafter˜settingŽ© ‘Iup–UUthings“propGerly“it“calls“Î\verbatim@start².Ž¤ Ř‘I±43Ž‘Sª®Ë\def\verbatim{\@verbatim‘¹–\frenchspacing\@vobeyspaces\verbatim@start}ŽŸŘ‘IÎ\verbatim*–UU²is“de ned“accordingly‘ÿ*ª.Ž¡‘I±44Ž‘Sª®Ë\@namedef{verbatim*}{\@verbatim\verbatim@start}ŽŸPÇ‘“b\endverbatimŽŽ¦‘ÙÌ\endverbatim*ŽŽŽŽŽ‘I²T‘ÿ*ªo–Èåend“the“Îverbatim“²and“Îverbatim*“²en•¸ãvironmen“ts–Èåit“is“only“necessary“to“ nishŽ¦‘Ithe–UUÎtrivlist“²en•¸ãvironmen“t–UUstarted“in“Î\@verbatim².Ž¡‘I±45Ž‘Sª®Ë\let\endverbatim=\endtrivlistŽŸ ‘I±46Ž‘Sª®Ë\expandafter\let\csname–¹–endverbatim*\endcsname“=\endtrivlistŽŸËë‘IÒ3.3Ž‘gÀThe–€Æcomment“Òen• vironmen“tŽŸuT‘yºË\commentŽŽ¦‘ Lø\endcommentŽŽŽŽŽ‘I²The–¤ïÎ\comment“²macro“is“similar“to“Î\verbatim*².‘6ûHo•¸ãw“ev“er,‘È6w“e–¤ïdo“not“need“to“switc¸ãhŽ¦‘Ifonš¸ãts–‡or“set“spGecial“formatting“parameters“suc˜h“as“Î\parindent“²or“Î\parskip².‘#W‘ÿ*ªeŽ¦‘Ineed–konly“set“the“category“cošGde“of“all“sp˜ecial“c¸ãharacters“to“12“(other)“and“thatŽ¦‘Iof–ÄšÎ^^M‘Ä}²(the“end“of“line“cš¸ãharacter)“to“13“(activ˜e).‘¿•The“latter“is“needed“for“macroŽ¦‘Iparameter–Òdelimiter“matcš¸ãhing“in“the“in˜ternal“macros“de ned“bGelo˜w.‘F0In“con˜trast“toŽ¦‘Ithe–Ÿ'EŽ‘ãxX“that“Î\²,–ãûÎ{²,“and–ÇtÎ}“²are“the“lo˜w˜ercase“v˜ersions“of“Î!²,–ãûÎ[²,“and–ÇtÎ]².‘È#Then“w˜eŽ¦‘Ireplace–#ev¸ãery“ošGccurrence“of“Î\²,–AWÎ{²,“and–#Î}“²that“should“b˜e“read“with“category“co˜deŽ¦‘I12–¬rbš¸ãy“Î!²,–Â9Î[²,“and‘¬rÎ]²,“respGectiv˜ely‘ÿ*ª,“and–¬rgiv˜e“the“whole“list“of“tok˜ens“to“Î\lowercase²,Ž¦‘Iknoš¸ãwing–UUthat“category“coGdes“are“not“altered“b˜y“this“primitiv˜e!Ž¦‘XBut–#§ rst“wš¸ãe“ha˜v˜e“ensure“that“Î!²,–-—Î[²,“and–#§Î]“²themselv˜es“ha˜v˜e“the“correct“categoryŽ¦‘IcošGde!‘wT‘ÿ*ªo–¬oallo¸ãw“sp˜ecial“settings“of“these“co˜des“w¸ãe“hide“their“setting“in“the“macroŽ¦‘IÎ\vrb@catcodes².‘qÇIf–UUit“is“already“de ned“our“new“de nition“is“skippGed.Ž¡‘I±55Ž‘Sª®Ë\@ifundefined{vrb@catcodes}%Ž¤ ‘I±56Ž‘]ÚË{\def\vrb@catcodes{%Ž¡‘I±57Ž‘kJœË\catcode`\!12\catcode`\[12\catcode`\]12}}{}ŽŽŽŒ‹ až ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ10ŽŽ o ý´‘IThis–Z?tricš¸ãks“allo˜ws“us“to“use“this“cošGde“for“applications“where“other“category“co˜desŽ¤ ‘Iare–UUin“e ect.Ž¡‘XW‘ÿ*ªe–UUstart“a“group“to“kš¸ãeep“the“category“coGde“c˜hanges“loGcal.Ž©‘I±58Ž‘Sª®Ë\begingroupŽ¤ ‘I±59Ž‘XdDË\vrb@catcodesŽ¡‘I±60Ž‘XdDË\lccode`\!=`\\–¹–\lccode`\[=`\{“\lccode`\]=`\}ŽŸ‘I²W‘ÿ*ªe–[÷also“need“the“end-of-line“cš¸ãharacter“Î^^M²,“as“an“activ˜e“c˜haracter.‘…­If“w˜e“w˜ereŽ¤ ‘Ito–°_simply“write“Î\catcode`\^^M=\active“²then“wš¸ãe“w˜ould“get“an“un˜w˜an˜ted“activ˜eŽ¡‘Iend–ï¼of“line“cš¸ãharacter“at“the“end“of“ev˜ery“line“of“the“follo˜wing“macro“de nitions.Ž¡‘ITherefore–¶awš¸ãe“use“the“same“tric˜k“as“abGo˜v˜e:‘3àw˜e“write“a“tilde“Î~“²instead“of“Î^^M‘¶H²andŽ¡‘Ipretend–ýSthat“the“latter“is“the“lo•¸ãw“ercase›ýSv‘ÿqÇarian“t˜of˜the˜former.‘iÁTh“us˜w“e˜ha“v“e˜toŽ¡‘Iensure–UUnoš¸ãw“that“the“tilde“c˜haracter“has“category“coGde“13“(activ˜e).Ž¦‘I±61Ž‘XdDË\catcode`\~=\active‘¹–\lccode`\~=`\^^MŽŸ‘I²The–>tuse“of“the“Î\lowercase“²primitivš¸ãe“leads“to“one“problem:‘æVthe“uppGercase“c˜haracterŽ¡‘I`ÎC²'‘>;needs–>Ato“bšGe“used“in“the“co˜de“b˜eloš¸ãw“and“its“case“m˜ust“bGe“preserv˜ed.‘jSo“w˜e“addŽ¡‘Ithe‘UUcommand:Ž¦‘I±62Ž‘XdDË\lccode`\C=`\CŽŸ‘I²No•¸ãw›F£w“e˜start˜the˜tok“en˜list˜passed˜to˜Î\lowercase².‘E±W‘ÿ*ªe˜use˜the˜follo“wing˜littleŽ¡‘Itricš¸ãk–ˆÿ(propGosed“b˜y“Bernd“Raic˜hle):‘ÙThe“v˜ery“ rst“tok˜en“in“the“tok˜en“list“w˜e“giv˜eŽ¡‘Ito–‚æÎ\lowercase“²is“the“Î\endgroup“²primitivš¸ãe.‘+£This“means“that“it“is“proGcessed“b˜y“T‘þU>Ÿ'EŽ‘ãxXŽ¡‘Iimmediately–íDafter“Î\lowercase“²has“ nished“its“opGeration,‘?th¸ãus“ending“the“groupŽ¡‘Istarted–UUbš¸ãy“Î\begingroup“²abGo˜v˜e.‘qÇThis“a˜v˜oids“the“global“de nition“of“all“macros.Ž¦‘I±63Ž‘XdDË\lowercase{\endgroupŽŸ‘øf \verbatim@startŽŽŽ‘I²The– purpGose“of“Î\verbatim@start“²is“to“c•¸ãhec“k– whether“there“are“anš¸ãy“c˜haracters“onŽ¡‘Ithe–—_same“line“as“the“Î\begin{verbatim}“²and“to“pretend“that“they“w¸ãere“on“a“lineŽ¡‘Ib•¸ãy›æthemselv“es.‘È{On˜the˜other˜hand,‘NËif˜there˜are˜no˜c“haracters˜remaining˜on˜theŽ¡‘Icurrenš¸ãt–§‰line“w˜e“shall“just“ nd“an“end“of“line“c˜haracter.‘7ÙÎ\verbatim@start“²pGerformsŽ¡‘Iits–Äétask“bš¸ãy“ rst“grabbing“the“follo˜wing“c˜haracter“(its“argumen˜t).‘À‚This“argumen˜tŽ¡‘Iis–UUthen“compared“to“an“activš¸ãe“Î^^M²,“the“end“of“line“c˜haracter.Ž¦‘I±64Ž‘f‘Ë\def\verbatim@start#1{%Ž¤ ‘I±65Ž‘p2Ë\verbatim@startlineŽ¡‘I±66Ž‘p2Ë\if\noexpand#1\noexpand~%Ž¤‘I²If–V—this“is“true“wš¸ãe“transfer“con˜trol“to“Î\verbatim@“²to“proGcess“the“next“line.‘uŒW‘ÿ*ªe“useŽŸ ‘IÎ\next–UU²as“the“macro“whicš¸ãh“will“con˜tin˜ue“the“w˜ork.Ž¦‘I±67Ž‘yw^Ë\let\next\verbatim@Ž¡‘I²Otherwise,‘i»wš¸ãe–2tde ne“Î\next“²to“expand“to“a“call“to“Î\verbatim@“²follo˜w˜ed“b˜y“theŽ¤ ‘Icš¸ãharacter–ãþjust“read“so“that“it“is“reinserted“in˜to“the“text.‘ÁThis“means“that“thoseŽ¡‘Icš¸ãharacters–O¼remaining“on“this“line“are“handled“as“if“they“formed“a“line“b˜y“themselv˜es.Ž¦‘I±68Ž‘p2Ë\else‘¹–\def\next{\verbatim@#1}\fiŽŸ‘I²Finally–UUw¸ãe“call“Î\next².Ž¦‘I±69Ž‘p2Ë\next}%ŽŸ‘Ž\verbatim@ŽŽŽ‘I²The–:èthree“macros“Î\verbatim@²,–@1Î\verbatim@@²,“and–:èÎ\verbatim@@@“²form“the“\mainŽ¡‘IlošGop"–™»of“the“Îverbatim“²en•¸ãvironmen“t.‘3?The–™»purp˜ose“of“Î\verbatim@“²is“to“read“exactlyŽ¡‘Ione–¾ëline“of“input.‘®‰Î\verbatim@@“²and“Î\verbatim@@@“²w¸ãork“together“to“ nd“outŽ¡‘Iwhether–ê¨the“four“c¸ãharacters“Î\end“²(all“with“category“cošGde“12“(other))“o˜ccur“in“thatŽ¡‘Iline.‘mIf–þiso,‘(®Î\verbatim@@@“²will“call“Î\verbatim@test“²to“c•¸ãhec“k–þiwhether“this“Î\endŽŽŽŒ‹ p ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ11ŽŽ o ý´‘Iis–Q‚part“of“Î\end{verbatim}“²and“will“terminate“the“en•¸ãvironmen“t–Q‚if“this“is“the“case.Ž¤ ‘IOtherwise–Äwš¸ãe“con˜tin˜ue“as“if“nothing“had“happGened.‘³So“let's“ha˜v˜e“a“loGok“at“theŽ¡‘Ide nition–UUof“Î\verbatim@²:Ž©‘I±70Ž‘f‘Ë\def\verbatim@#1~{\verbatim@@#1!end\@nil}%ŽŸ‘I²Note–Ùthat“the“Î!“²cš¸ãharacter“will“ha˜v˜e“bGeen“replaced“b˜y“a“Î\“²with“category“coGde“12Ž¡‘I(other)–«õbš¸ãy“the“Î\lowercase“²primitiv˜e“go˜v˜erning“this“cošGde“b˜efore“the“de nition“ofŽ¡‘Ithis–Ä7macro“actually“takš¸ães“place.‘AhThat“means“that“it“tak˜es“the“line,‘á=puts“Î\end“²(fourŽ¡‘Ic•¸ãharacter›æÈtok“ens)˜and˜Î\@nil˜²(one˜con“trol˜sequence˜tok“en)˜as˜a˜delimiter˜bGehindŽ¡‘Iit,–UUand“then“calls“Î\verbatim@@².ŽŸ‘ LøË\verbatim@@ŽŽŽ‘IÎ\verbatim@@–+P²takš¸ães“ev˜erything“up“to“the“next“oGccurrence“of“the“four“c˜haractersŽ¡‘IÎ\end–UU²as“its“argumen¸ãt.Ž¦‘I±71Ž‘f‘Ë\def\verbatim@@#1!end{%ŽŸ‘I²That–%0means:‘}if“they“do“not“oGccur“in“the“original“line,‘Y&then“argumen¸ãt“Î#1“²is“theŽ¡‘Iwhole– input“line,‘5ùand“Î\@nil“²is“the“next“tok¸ãen“to“bšGe“pro˜cessed.‘ŒëHo•¸ãw“ev“er,‘5ùif‘ theŽ¡‘Ifour–¯gcš¸ãharacters“Î\end“²are“part“of“the“original“line,‘Зthen“Î#1“²consists“of“the“c˜haractersŽ¡‘Iin–rØfronš¸ãt“of“Î\end²,‘z8and“the“next“tok˜en“is“the“follo˜wing“c˜haracter“(alw˜a˜ys“remem˜bGerŽ¡‘Ithat–L©the“line“wš¸ãas“lengthened“b˜y“ v˜e“tok˜ens).‘nãWhatev˜er“Î#1“²ma˜y“bGe,‘Neit“is“v˜erbatimŽ¡‘Itext,–UUso“Î#1“²is“added“to“the“line“curren¸ãtly“built.Ž¦‘I±72Ž‘t½ÈË\verbatim@addtoline{#1}%ŽŸ‘I²The–²>next“tokš¸ãen“in“the“input“stream“is“of“spGecial“in˜terest“to“us.‘ ˆ‚ThereforeŽ¡‘IÎ\futurelet–UU²de nes“Î\next“²to“bšGe“equal“to“it“b˜efore“calling“Î\verbatim@@@².Ž¦‘I±73Ž‘t½ÈË\futurelet\next\verbatim@@@}%ŽŸ‘“b\verbatim@@@ŽŽŽ‘IÎ\verbatim@@@–wײwill“noš¸ãw“read“the“rest“of“the“tok˜ens“on“the“curren˜t“line,‘€xup“to“theŽ¡‘I nal–UUÎ\@nil“²tok¸ãen.Ž¦‘I±74Ž‘f‘Ë\def\verbatim@@@#1\@nil{%ŽŸ‘I²If–­íthe“ rst“of“the“abGo•¸ãv“e›­ít“w“o˜cases˜oGccurred,‘Äi.e.˜no˜Î\end˜²c“haracters˜w“ere˜on˜thatŽ¡‘Iline,–UUÎ#1“²is“emptš¸ãy“and“Î\next“²is“equal“to“Î\@nil².‘qÇThis“is“easily“c˜hec˜k˜ed.Ž¦‘I±75Ž‘t½ÈË\ifx\next\@nilŽŸ‘I²If–'so,‘Êthis“wš¸ãas“a“simple“line.‘V W‘ÿ*ªe“ nish“it“b˜y“proGcessing“the“line“w˜e“accum˜ulated“soŽ¡‘Ifar.‘qÇThen–UUw¸ãe“prepare“to“read“the“next“line.Ž¦‘I±76Ž‘~0ôË\verbatim@processlineŽ¤ ‘I±77Ž‘~0ôË\verbatim@startlineŽ¡‘I±78Ž‘~0ôË\let\next\verbatim@Ž¤‘I²Otherwise–UUwš¸ãe“ha˜v˜e“to“c˜hec˜k“what“follo˜ws“these“Î\end“²tok˜ens.Ž¦‘I±79Ž‘t½ÈË\elseŽ¡‘I²Before–ÛHwš¸ãe“con˜tin˜ue,‘ó±it's“a“go•Go“d–ÛHidea“to“stop“for“a“momen˜t“and“remem˜bGer“where“w˜eŽ¤ ‘Iare:‘þkW‘ÿ*ªe›nœha•¸ãv“e˜just˜read˜the˜four˜c“haracter˜tok“ens˜Î\end˜²and˜m“ust˜no“w˜c“hec“k˜whetherŽ¡‘Ithe–Š]name“of“the“en•¸ãvironmen“t–Š](surrounded“bš¸ãy“braces)“follo˜ws.‘. T‘ÿ*ªo“this“end“w˜e“de neŽ¡‘Ia–€‹macro“called“Î\@tempa“²that“reads“exactly“one“c¸ãharacter“and“decides“what“to“doŽ¡‘Inext.‘fÂThis–4Dmacro“should“do“the“folloš¸ãwing:‘a?skip“spaces“un˜til“it“encoun˜ters“either“aŽ¡‘Ileft–Çnbrace“or“the“end“of“the“line.‘BzBut“it“is“impGortanš¸ãt“to“remem˜bGer“whic˜h“c˜haractersŽ¡‘Iare–{7skippGed.‘ãnThe“Î\end¸hÐoptionalŽ‘*a‘sp–ÿ}'ac“es‘Ò!¸iŽ‘I«Î{“²cš¸ãharacters“ma˜y“bGe“part“of“the“v˜erbatimŽ¡‘Itext,–UUi.e.“these“cš¸ãharacters“m˜ust“bGe“prin˜ted.Ž¡‘XAssume–UUfor“example“that“the“currenš¸ãt“line“con˜tainsŽŸ‘IË \end {AVeryLongEnvironmentName}ŽŽŽŒ‹ x ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ12ŽŽ o ý´‘IAs–2Rwš¸ãe“shall“soGon“see,‘9Sthe“scanning“mec˜hanism“implemen˜ted“here“will“not“ nd“outŽ¤ ‘Ithat–¾this“is“text“to“bGe“prinš¸ãted“un˜til“it“has“read“the“righ˜t“brace.‘^êTherefore“w˜e“needŽ¡‘Ia›âˆw•¸ãa“y˜to˜accum“ulate˜the˜c“haracters˜read˜so˜that˜w“e˜can˜reinsert˜them˜if˜necessary‘ÿ*ª.Ž¡‘IThe–UUtok¸ãen“register“Î\@temptokena“²is“used“for“this“purpGose.Ž¡‘XBefore–wš¸ãe“do“this“w˜e“ha˜v˜e“to“get“rid“of“the“supGer uous“Î\end“²tok˜ens“at“the“endŽ¡‘Iof–ïýthe“line.‘OÿT‘ÿ*ªo“this“end“wš¸ãe“de ne“a“tempGorary“macro“whose“argumen˜t“is“delimitedŽ¡‘Ibš¸ãy–xKÎ\end\@nil“²(four“c˜haracter“tok˜ens“and“one“con˜trol“sequence“tok˜en)“to“bGe“usedŽ¡‘IbšGelo¸ãw–Åon“the“rest“of“the“line,‘$after“app˜ending“a“Î\@nil“²tok¸ãen“to“it.‘]B(Note“that“thisŽ¡‘Itokš¸ãen–dãcan“nev˜er“appGear“in“Î#1².)‘ pW‘ÿ*ªe“use“the“follo˜wing“de nition“of“Î\@tempa“²to“getŽ¡‘Ithe–UUrest“of“the“line“(after“the“ rst“Î\end²).Ž©‘I±80Ž‘~0ôË\def\@tempa##1!end\@nil{##1}%ŽŸ‘I²W‘ÿ*ªe–*menš¸ãtioned“already“that“w˜e“use“tok˜en“register“Î\@temptokena“²to“remem˜bGer“theŽ¡‘Ic•¸ãharacters›øw“e˜skip,‘ž in˜case˜w“e˜need˜them˜again.‘!¯W‘ÿ*ªe˜initialize˜this˜with˜the˜Î\endŽ¡‘I²w•¸ãe›UUha“v“e˜thro“wn˜a“w“a“y˜in˜the˜call˜to˜Î\@tempa².Ž¦‘I±81Ž‘~0ôË\@temptokena{!end}%ŽŸ‘I²W‘ÿ*ªe–lœshall“noš¸ãw“call“Î\verbatim@test“²to“proGcess“the“c˜haracters“remaining“on“theŽ¡‘Icurrenš¸ãt–®6line.‘|kBut“w˜ait“a“momen˜t:‘#Šw˜e“cannot“simply“call“this“macro“since“w˜eŽ¡‘Iha•¸ãv“e–¤already“read“the“whole“line.‘»µTherefore“wš¸ãe“ha˜v˜e“to“ rst“expand“the“macroŽ¡‘IÎ\@tempa–›`²to“insert“them“again“after“the“Î\verbatim@test“²tokš¸ãen.‘CèA–›NÎ^^M“²c˜haracterŽ¡‘Iis–‚ÕappšGended“to“denote“the“end“of“the“line.‘úH(Remem¸ãb˜er“that“this“c¸ãharacter“comesŽ¡‘Idisguised–UUas“a“tilde.)Ž¦‘I±82Ž‘~0ôË\def\next{\expandafter\verbatim@test\@tempa#1\@nil~}%Ž¤‘I²That's–UUalmost“all,“but“wš¸ãe“still“ha˜v˜e“to“no˜w“call“Î\next“²to“do“the“w˜ork.Ž¦‘I±83Ž‘t½ÈË\fi‘¹–\next}%ŽŸ‘ý 6\verbatim@testŽŽŽ‘I²W‘ÿ*ªe–UUde ne“Î\verbatim@test“²to“in•¸ãv“estigate›UUev“ery˜tok“en˜in˜turn.Ž¦‘I±84Ž‘f‘Ë\def\verbatim@test#1{%Ž¡‘I²First–ä•of“all“wš¸ãe“set“Î\next“²equal“to“Î\verbatim@test“²in“case“this“macro“m˜ust“callŽŸ ‘Iitself–UUrecursiv¸ãely“in“order“to“skip“spaces.Ž¦‘I±85Ž’‡¤ Ë\let\next\verbatim@testŽ¡‘I²W‘ÿ*ªe›UUha•¸ãv“e˜to˜distinguish˜four˜cases:ŽŸ‘U8ä1.ŽŽŽ‘bThe–ºnext“tokš¸ãen“is“a“Î^^M²,“i.e.“w˜e“reac˜hed“the“end“of“the“line.‘£öThat“meansŽ¤ ‘bthat–»ínothing“spGecial“wš¸ãas“found.‘¥Note“that“w˜e“use“Î\if“²for“the“follo˜wingŽ¡‘bcomparisons–UUso“that“the“category“coGde“of“the“cš¸ãharacters“is“irrelev‘ÿqÇan˜t.Ž©‘I±86Ž’ ¤"Ë\if\noexpand#1\noexpand~%ŽŸ‘b²W‘ÿ*ªe–­ƒadd“the“cš¸ãharacters“accum˜ulated“in“tok˜en“register“Î\@temptokena“²to“theŽ¡‘bcurrenš¸ãt–VÄline.‘vSince“Î\verbatim@addtoline“²doGes“not“expand“its“argumen˜t,Ž¡‘bw•¸ãe›qha“v“e˜to˜do˜the˜expansion˜at˜this˜pGoin“t.‘sThen˜w“e˜Î\let˜\next˜²equal˜toŽ¡‘bÎ\verbatim@–UU²to“prepare“to“read“the“next“line.Ž¦‘I±87Ž’ªNË\expandafter\verbatim@addtolineŽ¤ ‘I±88Ž’³ŠzË\expandafter{\the\@temptokena}%Ž¡‘I±89Ž’ªNË\verbatim@processlineŽ¡‘I±90Ž’ªNË\verbatim@startlineŽ¡‘I±91Ž’ªNË\let\next\verbatim@ŽŽŽŒ‹ Ž  ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ13ŽŽ o ý´‘U8ä2.ŽŽŽ‘bA‘ùÜspace–úcš¸ãharacter“follo˜ws.‘_ÜThis“is“allo˜w˜ed,‘#3so“w˜e“add“it“to“Î\@temptokenaŽ¤ ‘b²and‘UUcon•¸ãtin“ue.Ž©‘I±92Ž’ ¤"Ë\else‘¹–\if\noexpand#1ŽŸ ‘I±93Ž’ªNË\@temptokena\expandafter{\the\@temptokena#1}%ŽŸ‘U8ä²3.ŽŽŽ‘bAn–oopGen“brace“folloš¸ãws.‘¿This“is“the“most“in˜teresting“case.‘¿W‘ÿ*ªe“m˜ust“no˜wŽ¡‘bcollect–>²cš¸ãharacters“un˜til“w˜e“read“the“closing“brace“and“c˜hec˜k“whether“theyŽ¡‘bform–ÇÄthe“en•¸ãvironmen“t–ÇÄname.‘ÉThis“will“bGe“done“b¸ãy“Î\verbatim@testend²,Ž¡‘bso–EÆhere“wš¸ãe“let“Î\next“²equal“this“macro.‘CAgain“w˜e“will“proGcess“the“rest“ofŽ¡‘bthe–7Dline,‘oÀcš¸ãharacter“b˜y“c˜haracter.‘•The“c˜haracters“forming“the“name“of“theŽ¡‘ben•¸ãvironmen“t–,pwill“bGe“accum¸ãulated“in“Î\@tempc².‘÷W‘ÿ*ªe“initialize“this“macro“toŽ¡‘bexpand–UUto“nothing.Ž¦‘I±94Ž’ ¤"Ë\else‘¹–\if\noexpand#1\noexpand[%Ž¤ ‘I±95Ž’ªNË\let\@tempc\@emptyŽ¡‘I±96Ž’ªNË\let\next\verbatim@testendŽŸ‘b²Note–UUthat“the“Î[“²c¸ãharacter“will“bGe“a“Î{“²when“this“macro“is“de ned.ŽŸ‘U8ä4.ŽŽŽ‘bAnš¸ãy–háother“c˜haracter“means“that“the“Î\end“²w˜as“part“of“the“v˜erbatim“text.Ž¤ ‘bAdd–the“cš¸ãharacters“to“the“curren˜t“line“and“prepare“to“call“Î\verbatim@“²toŽ¡‘bproGcess–UUthe“rest“of“the“line.Ž¦‘I±97Ž’ ¤"Ë\elseŽ¤ ‘I±98Ž’ªNË\expandafter\verbatim@addtolineŽ¡‘I±99Ž’³ŠzË\expandafter{\the\@temptokena}%Ž¡‘E±100Ž’ªNË\def\next{\verbatim@#1}%Ž¡‘E±101Ž’ ¤"Ë\fi\fi\fiŽŸ‘I²The–UUlast“thing“this“macro“došGes“is“to“call“Î\next“²to“con•¸ãtin“ue‘UUpro˜cessing.Ž©‘E±102Ž’‡¤ Ë\next}%ŽŸ‘îót\verbatim@testendŽŽŽ‘IÎ\verbatim@testend–ÔÙ²is“called“when“Î\end¸hÐoptionalŽ‘)»3sp–ÿ}'ac“es‘Ò!¸iŽ‘I¿Î{“²w¸ãas“seen.‘FóIts“task“is“toŽ¤ ‘Iscan–›Kev¸ãerything“up“to“the“next“Î}“²and“to“call“Î\verbatim@@testend².‘3ÄIf“no“Î}“²is“foundŽ¡‘Iit–¹emš¸ãust“reinsert“the“c˜haracters“it“read“and“return“to“Î\verbatim@².‘øThe“follo˜wingŽ¡‘Ide nition–Õâis“similar“to“that“of“Î\verbatim@test²:‘ráit“takš¸ães“the“next“c˜haracter“andŽ¡‘Idecides–UUwhat“to“do.Ž¦‘E±103Ž‘f‘Ë\def\verbatim@testend#1{%ŽŸ‘I²Again,–UUwš¸ãe“ha˜v˜e“four“cases:ŽŸ‘U8ä1.ŽŽŽ‘bÎ^^M²:–¨àAs“no“Î}“²is“found“in“the“currenš¸ãt“line,‘Ë^add“the“c˜haracters“to“the“bu er.‘8KT‘ÿ*ªoŽ¡‘ba•¸ãv“oid–æ;a“complicated“construction“for“expanding“Î\@temptokena“²and“Î\@tempcŽ¡‘b²wš¸ãe–.do“it“in“t˜w˜o“steps.‘ºQThen“w˜e“con˜tin˜ue“with“Î\verbatim@“²to“proGcess“theŽ¡‘bnext‘UUline.ŽŸ‘E±104Ž’—0öË\if\noexpand#1\noexpand~%Ž¤ ‘E±105Ž’ ¤"Ë\expandafter\verbatim@addtolineŽ¡‘E±106Ž’ªNË\expandafter{\the\@temptokena[}%Ž¡‘E±107Ž’ ¤"Ë\expandafter\verbatim@addtolineŽ¡‘E±108Ž’ªNË\expandafter{\@tempc}%Ž¡‘E±109Ž’ ¤"Ë\verbatim@processlineŽ¡‘E±110Ž’ ¤"Ë\verbatim@startlineŽ¡‘E±111Ž’ ¤"Ë\let\next\verbatim@ŽŽŽŒ‹›Œ ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ14ŽŽ o ý´‘U8ä2.ŽŽŽ‘bÎ}²:‘<žCall–ëÎ\verbatim@@testend“²to“c•¸ãhec“k–ëif“this“is“the“righš¸ãt“en˜vironmen˜t“name.Ž©qÇ‘E±112Ž’—0öË\else\if\noexpand#1\noexpand]%ŽŸ ‘E±113Ž’ ¤"Ë\let\next\verbatim@@testendŽŸqÈ‘U8ä²3.ŽŽŽ‘bÎ\²:‘§This–}Åcš¸ãharacter“m˜ust“not“oGccur“in“the“name“of“an“en˜vironmen˜t.‘ëTh˜us“w˜eŽ¤ ‘bstop–šûcollecting“cš¸ãharacters.‘B¸In“principle,‘¬dthe“same“argumen˜t“w˜ould“apply“toŽ¡‘bother–Ìöcš¸ãharacters“as“w˜ell,–êÞe.g.,“Î{².‘Ø«Ho˜w˜ev˜er,“Î\–Ìö²is“a“spGecial“case,‘êÞsince“it“ma˜yŽ¡‘bbGe–ò©the“ rst“cš¸ãharacter“of“Î\end².‘IÃThis“means“that“w˜e“ha˜v˜e“to“loGok“again“forŽ¡‘bÎ\end{¸hÐenvir‘ÿ}'onmentŽ‘=îóname‘À[¸iŽ‘Z¬Î}².‘m×Note–þ°that“wš¸ãe“pre xed“the“Î!“²b˜y“a“Î\noexpandŽ¡‘b²primitivš¸ãe,–UUto“protect“ourselv˜es“against“it“bGeing“an“activ˜e“c˜haracter.Ž¦‘E±114Ž’—0öË\else\if\noexpand#1\noexpand!%Ž¤ ‘E±115Ž’ ¤"Ë\expandafter\verbatim@addtolineŽ¡‘E±116Ž’ªNË\expandafter{\the\@temptokena[}%Ž¡‘E±117Ž’ ¤"Ë\expandafter\verbatim@addtolineŽ¡‘E±118Ž’ªNË\expandafter{\@tempc}%Ž¡‘E±119Ž’ ¤"Ë\def\next{\verbatim@!}%ŽŸqÈ‘U8ä²4.ŽŽŽ‘bAnš¸ãy–òÝother“c˜haracter:‘@‹collect“it“and“con˜tin˜ue.‘PõW‘ÿ*ªe“cannot“use“Î\edef“²to“de neŽŸ ‘bÎ\@tempc–UU²since“its“replacemenš¸ãt“text“migh˜t“con˜tain“activ˜e“c˜haracter“tok˜ens.Ž¦‘E±120Ž’—0öË\else‘¹–\expandafter\def\expandafter\@tempc\expandafterŽ¡‘E±121Ž’ ¤"Ë{\@tempc#1}\fi\fi\fiŽŸ㎑I²As–«bGefore,›$Íthe“macro“ends“b¸ãy“calling“itself,˜to“proGcess“the“next“c¸ãharacter“if“appro-Ž¤ ‘Ipriate.Ž© 8ä‘E±122Ž‘~0ôË\next}%ŽŸª«‘ê9Þ\verbatim@@testendŽŽŽ‘I²Unlikš¸ãe–«Üthe“previous“macros“Î\verbatim@@testend“²is“simple:‘Õit“has“only“to“c˜hec˜kŽ¡‘Iif–UUthe“Î\end{².–ªª.“.“Î}–UU²matc¸ãhes“the“correspGonding“Î\begin{².–ªª.“.“Î}².Ž¦‘E±123Ž‘f‘Ë\def\verbatim@@testend{%ŽŸ8ä‘I²W‘ÿ*ªe–Kuse“Î\next“²again“to“de ne“the“things“that“are“to“bšGe“done.‘TnRemem¸ãb˜er“thatŽ¡‘Ithe–ÄÊname“of“the“currenš¸ãt“en˜vironmen˜t“is“held“in“Î\@currenvir²,‘à§the“c˜haracters“ac-Ž¡‘Icum•¸ãulated›¸çb“y˜Î\verbatim@testend˜²are˜in˜Î\@tempc².‘œ~So˜w“e˜simply˜compare˜theseŽ¡‘Iand–Ð[prepare“to“execute“Î\end{¸hÐcurr‘ÿ}'entŽ‘&"Èenvir‘ÿ}'onment‘òظiŽ‘aãÎ}“²macro“if“they“matc¸ãh.‘EtBeforeŽ¡‘Iwš¸ãe–ßÆdo“this“w˜e“call“Î\verbatim@finish“²to“proGcess“the“last“line.‘W‘ÿ*ªe“de ne“Î\nextŽ¡‘I²via–Ç Î\edef“²so“that“Î\@currenvir“²is“replaced“bš¸ãy“its“expansion.‘ȧTherefore“w˜e“needŽ¡‘IÎ\noexpand–UU²to“inhibit“the“expansion“of“Î\end“²at“this“pGoin¸ãt.Ž¦‘E±124Ž‘t½ÈË\ifx\@tempc\@currenvirŽ¤ ‘E±125Ž‘~0ôË\verbatim@finishŽ¡‘E±126Ž‘~0ôË\edef\next{\noexpand\end{\@currenvir}%ŽŸ8ä‘I²Without–^this“tricš¸ãk“the“Î\end“²command“w˜ould“not“bGe“able“to“correctly“c˜hec˜k“whetherŽ¤ ‘Iits–éxargumenš¸ãt“matc˜hes“the“name“of“the“curren˜t“en˜vironmen˜t“and“y˜ou'd“get“anŽ¡‘Iinš¸ãteresting–UULŸýó5‘üff±AŽŽ‘͉²T‘þU>Ÿ'EŽ‘ãxX“error“message“suc˜h“as:ŽŸqÇ‘IË!–¹–\begin{verbatim*}“ended“by“\end{verbatim*}.ŽŸqÇ‘I²But–Õ what“do“wš¸ãe“do“with“the“rest“of“the“c˜haracters,‘î¶those“that“remain“on“that“line?Ž¡‘IW‘ÿ*ªe–.hcall“Î\verbatim@rescan“²to“takš¸ãe“care“of“that.‘dÍIts“ rst“argumen˜t“is“the“name“ofŽ¡‘Ithe›ëen•¸ãvironmen“t˜just˜ended,‘‚in˜case˜w“e˜need˜it˜again.‘3Î\verbatim@rescan˜²tak“esŽ¡‘Ithe–æÝlist“of“c¸ãharacters“to“bšGe“repro˜cessed“as“its“second“argumenš¸ãt.‘&`(This“tok˜en“listŽ¡‘Iwš¸ãas–ª«inserted“after“the“curren˜t“macro“b˜y“Î\verbatim@@@².)‘qÉSince“w˜e“are“still“in“anŽ¡‘IÎ\edef–UU²wš¸ãe“protect“it“b˜y“means“ofÎ\noexpand².Ž¦‘E±127Ž’²*fË\noexpand\verbatim@rescan{\@currenvir}}%ŽŽŽŒ‹§Z ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ15ŽŽ o ý´‘IIf–3°the“names“do“not“matc•¸ãh,‘:kw“e–3°reinsert“evš¸ãerything“read“up“to“no˜w“and“prepare“toŽŸ ‘Icall–UUÎ\verbatim@“²to“proGcess“the“rest“of“the“line.Ž©‘E±128Ž‘t½ÈË\elseŽ¤ ‘E±129Ž‘~0ôË\expandafter\verbatim@addtolineŽ¡‘E±130Ž’‡¤ Ë\expandafter{\the\@temptokena[}%Ž¡‘E±131Ž’‡¤ Ë\expandafter\verbatim@addtolineŽ¡‘E±132Ž’‘LË\expandafter{\@tempc]}%Ž¡‘E±133Ž‘~0ôË\let\next\verbatim@Ž¡‘E±134Ž‘t½ÈË\fiŽŸ‘I²Finally–UUw¸ãe“call“Î\next².Ž¦‘E±135Ž‘t½ÈË\next}%ŽŸ‘ó­ \verbatim@rescanŽŽŽ‘I²In–Ù›principle“Î\verbatim@rescan“²could“bGe“used“to“analyse“the“c¸ãharacters“remain-Ž¤ ‘Iing–after“the“Î\end{...}“²command“and“pretend“that“these“w¸ãere“read“\propGerly",Ž¡‘Iassuming–*V\standard"“category“cošGdes“are“in“force.Ÿü^ÿ±1ŽŽ‘ßå²But“this“is“not“alw•¸ãa“ys‘*Vp˜ossibleŽ¡‘I(when–ÿÆthere“are“unmatcš¸ãhed“curly“braces“in“the“rest“of“the“line).‘UBBesides,‘âw˜e“thinkŽ¡‘Ithat–UWthis“is“not“wš¸ãorth“the“e ort:‘qËAfter“a“Îverbatim“²or“Îverbatim*“²en˜vironmen˜tŽ¡‘Ia–Ñ—new“line“in“the“output“is“bšGegun“an•¸ãyw“a“y‘ÿ*ª,‘ð¨and–Ñ—an“Î\end{comment}“²can“easily“b˜eŽ¡‘Iput–¦êon“a“line“bš¸ãy“itself.‘f‡So“there“is“no“reason“wh˜y“there“should“bGe“an˜y“text“here.Ž¡‘IF‘ÿ*ªor–#òthe“bšGene t“of“the“user“who“did“put“something“there“(a“commen¸ãt,‘W™p˜erhaps)Ž¡‘Iwš¸ãe–30simply“issue“a“w˜arning“and“drop“them.‘ YThe“methoGd“of“testing“is“explainedŽ¡‘Iin–¦AppšGendix“D,“p.“376“of“the“T‘þU>Ÿ'EŽ‘ãxXb˜o˜ok.‘»W‘ÿ*ªe“use“Î^^M‘w²instead“of“the“Î!“²c¸ãharacterŽ¡‘Iused–"there“since“this“is“a“cš¸ãharacter“that“cannot“appGear“in“Î#1².‘^ The“t˜w˜o“Î\noexpandŽ¡‘I²primitivš¸ães–UUare“necessary“to“a˜v˜oid“expansion“of“activ˜e“c˜haracters“and“macros.Ž¡‘XOne–2žextra“subtletš¸ãy“should“bGe“noted“here:‘`lremem˜bGer“that“the“tok˜en“list“w˜e“areŽ¡‘Icurren¸ãtly– ïbuilding“will“ rst“bšGe“pro˜cessed“bš¸ãy“the“Î\lowercase“²primitiv˜e“bGefore“T‘þU>Ÿ'EŽ‘ãxXŽ¡‘Icarries–Dout“the“de nitions.‘•This“means“that“the“`ÎC²'‘6cš¸ãharacter“in“the“argumen˜t“toŽ¡‘Ithe–0ðÎ\@warning“²macro“m¸ãust“bšGe“protected“against“b˜eing“c¸ãhanged“to“`Îc²'.‘e¥That's“theŽ¡‘Ireason–h|whš¸ãy“w˜e“added“the“Î\lccode`\C=`\C‘hw²assignmen˜t“abGo˜v˜e.‘«;W‘ÿ*ªe“can“no˜w“ nishŽ¡‘Ithe–Vùargumenš¸ãt“to“Î\lowercase“²as“w˜ell“as“the“group“in“whic˜h“the“category“coGdesŽ¡‘Iw•¸ãere‘UUc“hanged.Ž¦‘E±136Ž‘f‘Ë\def\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\elseŽŸ ‘E±137Ž‘yw^Ë\@warning{Characters–¹–dropped“after“`\string\end{#1}'}\fi}}ŽŸþ6‘IÒ3.5Ž‘gÀThe–€Æ\verbatiminput“ÒcommandŽŸuT‘å€HË\verbatim@in@streamŽŽŽ‘I²W‘ÿ*ªe–UUbšGegin“b¸ãy“allo˜cating“an“input“stream“(out“of“the“16“a¸ãv‘ÿqÇailable“input“streams).Ž¦‘E±138Ž‘Sª®Ë\newread\verbatim@in@streamŽŸ‘ê9Þ\verbatim@readfileŽŽŽ‘I²The–ýmacro“Î\verbatim@readfile“²encloses“the“main“loGop“b¸ãy“calls“to“the“macrosŽ¡‘IÎ\verbatim@startline–©²and“Î\verbatim@finish²,‘u~respGectivš¸ãely‘ÿ*ª.‘ ‹ÄThis“mak˜es“sureŽ¡‘Ithat– the“user“can“initialize“and“ nish“the“command“when“the“ le“is“empt¸ãy“orŽ¡‘IdošGesn't–d%exist.‘ž6The“Îverbatim“²en•¸ãvironmen“t–d%has“a“similar“b˜eha¸ãviour“when“calledŽ¡‘Iwith–UUan“empt¸ãy“text.Ž¦‘E±139Ž‘Sª®Ë\def\verbatim@readfile#1{%ŽŸ ‘E±140Ž‘]ÚË\verbatim@startlineŽ‘IŸ&e‰ffÿrŸ J=‘ "5Ÿý-:Á1ŽŽŽ‘LÜó|{Ycmr8ÀRememšÃŽbŸ'EŽ‘ãxX'sŽŸ ‘Iinput‘UUstac¸ãk.Ÿü^ÿ±2ŽŽŽ¦‘E161Ž‘f‘Ë\expandafter\verbatim@read@fileŽ¤ ‘E±162Ž‘]ÚË\fiŽ¡‘E±163Ž‘Sª®Ë}ŽŸ‘ý 6\verbatiminputŽŽŽ‘IÎ\verbatiminput–íç² rst“starts“a“group“to“kš¸ãeep“fon˜t“and“category“c˜hanges“loGcal.Ž¤ ‘IThen–sRit“calls“the“macro“Î\verbatim@input“²with“additional“argumen¸ãts,‘zÑdepGendingŽ¡‘Ion–UUwhether“an“asterisk“follo¸ãws.Ž¦‘E±164Ž‘Sª®Ë\def\verbatiminput{\begingroupŽ¤ ‘E±165Ž‘]ÚË\@ifstar{\verbatim@input\relax}%Ž¡‘E±166Ž’‚êŠË{\verbatim@input{\frenchspacing\@vobeyspaces}}}Ž‘IŸff‰ffÿrŸ J=‘ "5Ÿý-:Á2ŽŽŽ‘LÜÀA‘²©standard–²âT‘þ•AŸ¸ãEŽ‘MX“wšÃŽould“rep–¹–Expect“``characters“dropped''Ž¡‘E±250Ž‘~0ôËwarning–¹–messages“in“this“test!“<====}Ž¡‘E±251Ž‘Sª®Ë\typeout{}Ž¡‘E±252ŽŽ¡‘E253Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±254Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±255Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±256Ž‘]ÚË\begin{verbatim}Ž¡‘E±257Ž‘f‘ËtestŽ¡‘E±258Ž‘f‘Ë\end{verbatim*}Ž¡‘E±259Ž‘f‘ËtestŽ¡‘E±260Ž‘f‘Ë\end{verbatimŽ¡‘E±261Ž‘f‘Ëtest–¹–of“ligatures:“<`!`?`>Ž¡‘E±262Ž‘f‘Ë\endverbatimŽ¡‘E±263Ž‘f‘ËtestŽ¡‘E±264Ž‘f‘Ë\end‘ s,verbatimŽ¡‘E±265Ž‘f‘ËtestŽ¡‘E±266Ž‘f‘Ëtest–¹–of“end“of“line:Ž¡‘E±267Ž‘f‘Ë\endŽ¡‘E±268Ž‘f‘Ë{verbatim}Ž¡‘E±269Ž‘]ÚË\end{verbatim}–¹–Further“text“to“be“typeset:“$\alpha$.Ž¡‘E±270Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±271Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±272Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±273Ž‘]ÚË\begin{verbatim*}Ž¡‘E±274Ž‘f‘ËtestŽ¡‘E±275Ž‘f‘ËtestŽŽŽŒ‹å_ ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ20ŽŽ o ý´‘E±276Ž‘]ÚË\end‘¹–{verbatim*}Ž¤ ‘E±277Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±278Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±279Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±280Ž‘]ÚË\begin{verbatim*}‘ s,bla‘¹–blaŽ¡‘E±281Ž‘f‘ËtestŽ¡‘E±282Ž‘f‘ËtestŽ¡‘E±283Ž‘]ÚË\end‘¹–{verbatim*}Ž¡‘E±284Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±285Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±286Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±287Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±288ŽŽ¡‘E289Ž‘Sª®ËFirst–¹–of“Chris“Rowley's“fiendish“tests:Ž¡‘E±290Ž‘Sª®Ë\begin{verbatim}Ž¡‘E±291Ž‘Sª®Ëthe–¹–double“end“testŽ¡‘E±292Ž‘Sª®Ë\end\end{verbatim}‘ s,or–¹–even“\end“\end{verbatim}Ž¡‘E±293Ž‘Sª®Ë%Ž¡‘E±294Ž‘Sª®Ë%not‘¹–\end\ended??Ž¡‘E±295Ž‘Sª®Ë%\end{verbatim}Ž¡‘E±296ŽŽ¡‘E297Ž‘Sª®ËAnother–¹–of“Chris'“devils:Ž¡‘E±298Ž‘Sª®Ë\begin{verbatim}Ž¡‘E±299Ž‘Sª®Ëthe–¹–single“brace“testŽ¡‘E±300Ž‘Sª®Ë\end{not–¹–the“end\end{verbatim}Ž¡‘E±301Ž‘Sª®Ë%Ž¡‘E±302Ž‘Sª®Ë%not‘¹–\end}ed??Ž¡‘E±303Ž‘Sª®Ë%\end{verbatim}Ž¡‘E±304Ž‘Sª®ËBack–¹–to“my“own“tests:Ž¡‘E±305Ž‘]ÚË\begin{myverbatim}Ž¡‘E±306Ž‘f‘ËtestŽ¡‘E±307Ž‘f‘ËtestŽ¡‘E±308Ž‘]ÚË\end–¹–{myverbatim}“rest“of“lineŽ¡‘E±309Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±310Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±311Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±312ŽŽ¡‘E313Ž‘Sª®ËTest–¹–of“empty“verbatim:Ž¡‘E±314Ž‘Sª®Ë\begin{verbatim}Ž¡‘E±315Ž‘Sª®Ë\end{verbatim}Ž¡‘E±316Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±317Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±318Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±319Ž‘]ÚË\begin‘¹–{verbatimlisting}{verbtest.tex}Ž¡‘E±320Ž‘f‘ËAdditonal–¹–verbatim“textŽ¡‘E±321Ž‘p2Ë...Ž¡‘E±322Ž‘]ÚË\end{verbatimlisting}Ž¡‘E±323Ž‘Sª®ËAnd–¹–here“for“listing“a“file:Ž¡‘E±324Ž‘]ÚË\verbatiminput{verbtest.tex}Ž¡‘E±325Ž‘Sª®ËAnd–¹–again,“with“explicit“spaces:Ž¡‘E±326Ž‘]ÚË\verbatiminput*{verbtest.tex}Ž¡‘E±327Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±328Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±329Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽŽŽŒ‹î  ª ýs‘IÓV‘ÿ*ªerbatim–UUst¸ãyle“option’ùꜲ21ŽŽ o ý´‘E±330Ž‘]ÚË\begin{comment}Ž¤ ‘E±331Ž‘f‘ËtestŽ¡‘E±332Ž‘f‘Ë\end{verbatim*}Ž¡‘E±333Ž‘f‘ËtestŽ¡‘E±334Ž‘f‘Ë\end‘¹–{commentŽ¡‘E±335Ž‘f‘ËtestŽ¡‘E±336Ž‘f‘Ë\endverbatimŽ¡‘E±337Ž‘f‘ËtestŽ¡‘E±338Ž‘f‘Ë\end‘ s,verbatimŽ¡‘E±339Ž‘f‘ËtestŽ¡‘E±340Ž‘]ÚË\end–¹–{comment}“Further“text“to“be“typeset:“$\alpha$.Ž¡‘E±341Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±342Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±343Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±344Ž‘]ÚË\begin{comment}‘ s,bla‘¹–blaŽ¡‘E±345Ž‘f‘ËtestŽ¡‘E±346Ž‘f‘ËtestŽ¡‘E±347Ž‘]ÚË\end‘¹–{comment}Ž¡‘E±348Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±349Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±350Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±351Ž‘Sª®ËText–¹–Text“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E±352ŽŽ¡‘E353Ž‘Sª®Ë\begin{verbatimwrite}{verbtest.txt}Ž¡‘E±354Ž‘Sª®Ëasfa cmmi10óKñ`y cmr10óÙ“ Rcmr7ùþ4ßßßßßß