÷ƒ’À;è TeX output 2001.10.31:1006‹ÿÿÿÿ ª ýs o ýÝþÀ‘IróUªsÉG®G®ecrm1728ºUne–hçnouvšŒyelle“d€énition“des“en˜vironnemen˜ts“LŸü]b‘ú'ÊóÓ·å ecrm1200ÁAŽŽ‘†ÇºT‘ýK*Ÿ·òEŽ‘OÂXŽŸ’¢`Íó”N9>G®G®ectt1728Âverbatim–hçºet“Âverbatim*º.ŽŸÿ’Ö††ÁRainer‘êlSc¬wh€öpfŽŽ¤’©TæZenš¬wtrum–êlf€ür“Daten˜v˜erarbSˆeitungŽŽ¡’Â$der–êlUniv¬wersit€ät“MainzŽŽ¡’Ÿì@Anselm-F›ÿeran•¬wtz-v“on-Ben“tzel-W˜eg‘êl12ŽŽ¡’Ó—=D-55099‘êlMainzŽŽ¡’¯F‘ÿeederal–êlRepublic“of“German¬wyŽŽ¡’¤žËIn¬wternet:‘êlóD7`± ectt1200ÉSchoepf@Uni-Mainz.DEŽŽŽŽŽŸgߢ’Ö_ÁBernd‘êlRaic¬whleŽŽ¤’ÏÀåStettener–êlStr.“73ŽŽ¡’ÀÓ÷D-73732‘êlW€älden¬wbronnŽŽ¡’¯F‘ÿeederal–êlRepublic“of“German¬wyŽŽ¡‘iøÜIn¬wternet:‘êlÉraichle@azu.Informatik.Uni-Stuttgart.DEŽŽŽŽŽŸKߢ’ØÙÁChris‘êlRo¬wwleyŽŽ¤’ÄM[The–êlOpSˆen“Univ•¬wersit“yŽŽ¡’Ò“ÀP¬warsifal‘êlCollegeŽŽ¡’ÕMŠFinc¬whley‘êlRoadŽŽ¡’¤»ÆLondon–êlNW3“7BG,“England,“UKŽŽ¡’¡ˆ–In¬wternet:‘êlÉC.A.Rowley@open.ac.ukŽŽŽŽŽŸYߢ’‹Á(traduction–êlfran€çaise:“Jean-Pierre“DrucbSˆertŽŽŸ’¥A>Jean-Pierre.DrucbSˆert@onecert.fr)ŽŽŽŽŽŸ&2’Ý!Ö1997/04/30ŽŸ˜è’è!”ó ‹–uÌ ecbx0900ËR€ésum€éŽŸ Ñ1‘oß$óÙ.œŒ ecrm0900ÊCe–pacš¾Len•¸èvironnemen“ts˜de˜LŸýï‘üf ó)TÆ2‚ecrm0700ÔAŽŽ‘Íz¹T‘þUYŸ&úEŽ‘ã9X˜ó*qLË ectt1000Õverbatim˜¹et˜Õverbatim*˜¹on“t˜des˜compGortemen“tsŽ¤ ‘Iqui›U pGeuv•¸èen“t˜conduire˜aux˜probl€èmes˜suiv‘ÿqÐan“ts˜:Ž¡‘XŽŽ‘aÿ°€Étan¸èt–‘Bdonn€ée“la“m€éthoGde“utilis€ée“(dans“la“macro“qui“d€élimite“les“param€ètres)Ž¡‘aÿ°pšGour–õ d€étecter“le“Õ\end{verbatim}“¹ferman¸èt,“on“ne“p˜eut“pas“laisser“d'espaceŽ¡‘aÿ°en¸ètre–U les“mots“Õ\end“¹et“Õ{verbatim}¹.ŽŽŸ’ø(1ŽŽŒ‹* ª ýs‘Ió/”í^Ó ecsl1000ÚOptions–U de“V‘ÿ*¸erbatim’F ¹2ŽŽ o ý´‘XŽŽ‘aÿ°Puisque–˜elle“v˜ersion“tout“simplemen˜t“l'ignore.Ž¡‘I¹(C'est–É=le“prix“€à“pa•¸èy“er–É=pGour“€éviter“la“limitation“de“la“taille“du“texte“cit€é“dansŽ¤ ‘Il'ancienne–°evš¸èersion.)“Un“message“d'a˜v˜ertissemen˜t“sera“cepGendan˜t“€émis,“de“la“forme“:Ž©q‘IÐLaTeX–¹Nwarning:“Characters“dropped“after“\end{verbatim*}!ŽŸq‘I¹Ce–1n'est“pas“€à“propremenš¸èt“parler“un“probl€ème“puisque“ce“texte“pGeut“facilemen˜tŽ¡‘I€être–U plac€é“sur“la“ligne“suiv‘ÿqÐan¸ète.Ž¡‘XCette–5nouvš¸èelle“d€énition“r€ésoud“aussi“le“second“probl€ème“men˜tion€é“plus“haut“:Ž¡‘Iil–“ôest“main•¸ètenan“t–“ôpGossible“de“laisser“des“espaces“(mais“Öp‘ÿ}/as‘f ¹de“commencer“une“ligne)Ž¡‘Ien¸ètre–U Õ\end“¹et“Õ{verbatim}“¹ou“Õ{verbatim*}“¹:Ž¦‘IÐ\begin‘¹N{verbatim*}Ž¤ ‘W+êtestŽ¡‘W+êtestŽ¡‘I\end‘¹N{verbatim*}ŽŸq‘X¹Nous–Kðinš¸ètroGduisons“de“plus“un“en˜vironnemen˜t“Õcomment“¹a˜y˜an˜t“pGour“eet“d'ignorerŽ¤ ‘Itout–Àªtexte“en¸ètre“Õ\begin{comment}“¹et“Õ\end{comment}¹,“quelqu'il“soit.“€À‘ÀŽpremi€èreŽ¡‘Ivue,–Vcela“semš¸èble“relativ˜emen˜t“€éloign€é“du“but“de“la“citation“d'un“passage“Överb‘ÿ}/atim¹,Ž¡‘Imais–-ql'impl€émenš¸ètation“de“ces“id€ées“se“r€év˜ele“similaire.“Les“deux“son˜t“bas€ées“surŽ¡‘Ile–ofait“que“le“texte“en¸ètre“Õ\begin{...}“¹et“Õ\end{...}“¹est“lu“par“T‘þUYŸ&úEŽ‘ã9X“sans“qu'ilŽ¡‘Ien–œLinš¸èterpr€ète“les“commandes“ou“les“caract€ères“spG€éciaux.“La“seule“di€érence“en˜treŽ¡‘IÕverbatim–×0¹et“Õcomment“¹est“que“le“texte“est“imprim€é“dans“le“premier“cas“et“ignor€éŽ¡‘Idans–ü le“second.“Notez“de“plus“que“ces“en•¸èvironnemen“ts–ü ne“pGeuv•¸èen“t–ü €être“utilis€és“l'unŽ¡‘Idans‘U l'autre.Ž¡‘XÕ\verbatiminput–Z’¹est“une“commande“€à“un“seul“argumenš¸èt“qui“lit“un“c˜hier“Över-Ž¡‘Ib‘ÿ}/atim¹.–U La“commande“Õverbatiminput{xx.yy}“¹a“le“m€ême“eet“que“:Ž©‘Sª®Õ\begin{verbatim}Ž¡‘Sª®ó !",š cmsy10¸hÖContenuŽ‘­ÙduŽ’| chierŽ’¬‚ó-qLË ecit1000Øxx.yy‘¼V¸iŽŽ¡‘Sª®Õ\end{verbatim}Ž¦‘I¹Cette–U commande“a“aussi“une“v‘ÿqÐarian¸ète“Õ*“¹qui“imprime“les“espaces“sous“la“forme“Õ ¹.ŽŸ!Ö‘IÓ2Ž‘`ÁInšcterfaces–G\for“pac˜k‘ÿÆage“writers“(non“traduit)ŽŸæ~‘X¹The–2GÕverbatim“¹en•¸èvironmen“t–2Gof“LŸýï‘üf ÔAŽŽ‘Íz¹T‘þUYŸ&úEŽ‘ã9X‘ä2Ÿÿó  b> cmmi10µ"ŽŽ‘+¶/¹došGes“not“oer“a“go˜o˜d“in¸èterface“to“pro-Ž¡‘Igrammers.–ÐIn“conš¸ètrast,“this“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–U can“bGe“done“and“ho¸èw.ŽŽŽŒ‹ j ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’F ¹3ŽŽ o ý´‘Ió.¥!¢N ecbx1200Ù2.1Ž‘g¾Simple‘¸examplesŽŸtî‘X¹It–``is“noš¸èw“pGossible“to“use“the“Õverbatim“¹en˜vironmen˜t“to“dene“en˜vironmen˜ts“ofŽŸ ‘Iy•¸èour›U o“wn.˜E.g.,Ž© j‘M¹NÐ\newenvironment{myverbatim}%Ž¤ ‘W+ê{\endgraf\noindent‘¹NMYVERBATIM:%Ž¡‘[å8\endgraf\verbatim}%Ž¡‘W+ê{\endverbatim}ŽŸj‘I¹can–U bGe“used“afterwš¸èards“lik˜e“the“Õverbatim“¹en˜vironmen˜t,“i.e.Ž¦‘IÐ\begin‘¹N{myverbatim}Ž¡‘RrœtestŽ¡‘RrœtestŽ¡‘I\end‘¹N{myverbatim}ŽŸj‘I¹Another›U w•¸èa“y˜to˜use˜it˜is˜to˜writeŽ¦‘IÐ\let\foo=\commentŽ¡‘I\let\endfoo=\endcommentŽŸj‘I¹and–´õfrom“that“pGoinš¸èt“on“en˜vironmen˜t“Õfoo“¹is“the“same“as“the“commen˜t“en˜vironmen˜t,Ž¤ ‘Ii.e.–U ev¸èerything“inside“its“b•Go“dy–U is“ignored.Ž¡‘XY‘ÿ*¸ou–%;maš¸èy“also“add“spGecial“commands“after“the“Õ\verbatim“¹macro“is“in˜v˜ok˜ed,Ž¡‘Ie.g.Ž¦‘IÐ\newenvironment{myverbatim}%Ž¤ ‘Rrœ{\verbatim\myspecialverbatimsetup}%Ž¡‘Rrœ{\endverbatim}Ž¤j‘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,–U there“are“still“a“n•¸èum“bGer–U of“restrictions“:Ž¡‘U9b1.ŽŽŽ‘bY‘ÿ*¸ou–ñm¸èust“not“use“the“Õ\begin“¹orthe“Õ\end“¹command“inside“a“denition,“e.g.Ž¦‘bthe–U folloš¸èwing“t˜w˜o“examples“will“Önot‘Gé¹w˜ork“:ŽŸ j‘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}}ŽŸj‘b¹If–£Wyš¸èou“try“these“examples,“T‘þUYŸ&úEŽ‘ã9X“will“repGort“a“runa˜w˜a˜y“argumen˜t‘xŸerror.“MoreŽ¦‘bgenerally‘ÿ*¸,–Ÿsit“is“not“pGossible“to“use“Õ\begin¹.–ª.“.Õ\end–Ÿs¹or“the“related“en•¸èvironmen“tsŽ¦‘bin–_»the“denition“of“the“new“en•¸èvironmen“t.–_»Instead,“the“correct“w•¸èa“y–_»to“deneŽ¦‘bthis›U en•¸èvironmen“t˜w“ould˜bGeŽŸ j‘bÐ\newenvironment{fred}Ž¡‘b{\minipage{30mm}\verbatim}Ž¡‘b{\endverbatim\endminipage}ŽŸj‘U9b¹2.ŽŽŽ‘bY‘ÿ*¸ou–È$canÖnot‘ºí¹use“the“Õverbatim“¹en•¸èvironmen“t–È$inside“user“dened“Öc‘ÿ}/ommands‘|¨¹;Ž¦‘be.g.,Ž© j‘bÐ\newcommand{\verbatimfile}[1]%Ž¡‘b {\begin{verbatim}\input{#1}\end{verbatim}}Ž¤j‘b¹došGes–U Önot‘Gé¹w¸èork‘ª“;“nor“do˜esŽ¦‘bÐ\newcommand{\verbatimfile}[1]{\verbatim\input{#1}\endverbatim}Ž¡‘U9b¹3.ŽŽŽ‘bThe–Oôname“of“the“newly“dened“en•¸èvironmen“t›Oôm“ust˜not˜con“tain˜c“haracters˜withŽŸ ‘bcategory–U coGde“other“than“óKñ`y cmr10²11“¹(letter)“or“²12“¹(other),“or“this“will“not“w¸èork.ŽŽŽŒ‹m ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’F ¹4ŽŽ o ý´‘IÙ2.2Ž‘g¾The‘¸in terfacesŽŸtî‘X¹Let–Ù'us“start“with“the“simple“things.“Sometimes“it“ma¸èy“bGe“necessary“to“use“aŽ¤ ‘Isp•Gecial›t¸èyp“eface˜for˜y•¸èour˜v“erbatim˜text,˜or˜p•Gerhaps˜the˜usual˜computer˜mo“dernŽ¡‘It¸èyp•Gewriter›U shap“e˜in˜a˜reduced˜size.Ž¡‘XY‘ÿ*¸ou–Àhmaš¸èy“select“this“b˜y“redening“the“macro“Õ\verbatim@font¹.“This“macro“isŽ¡‘Iexecuted–Aäat“the“bGeginning“of“evš¸èery“v˜erbatim“text“to“select“the“fon˜t“shapGe.“Do“notŽ¡‘Iuse–‡lit“for“other“purpGoses‘ª“;“if“yš¸èou“nd“y˜ourself“abusing“this“y˜ou“ma˜y“w˜an˜t“to“readŽ¡‘IabšGout–U the“Õ\every@verbatim“¹ho˜ok“b˜elo¸èw.Ž¡‘XBy––†default,“Õ\verbatim@font“¹switcš¸èhes“to“the“t˜ypGewriter“fon˜t“and“disables“theŽ¡‘Iligatures–U con¸ètained“therein.Ž¡‘XThere–Œis“a“hoGok“(i.e.“a“tokš¸èen“register)“called“Õ\every@verbatim“¹whose“con˜ten˜tsŽ¡‘Iare–¨­inserted“inš¸èto“T‘þUYŸ&úEŽ‘ã9X's“mouth“just“bGefore“ev˜ery“v˜erbatim“text.“Please“use“theŽ¡‘IÕ\addto@hook–U ¹macro“to“add“something“to“this“hoGok.“It“is“used“as“follo¸èws“:Ž¤‘Sª®Õ\addto@hook¸hÖnameŽ‘ºofŽ‘*<.theŽ‘:™ho‘ÿ}/ok‘}¸iŽ‘RúîÕ{¸hÖc‘ÿ}/ommandsŽ‘4²ütoŽ‘@vƒb‘ÿ}/eŽ‘L{padde‘ÿ}/d‘w¸iŽ‘iîtÕ}Ž¡‘X¹After–%all“spGecic“setup,“likš¸èe“switc˜hing“of“category“cošGdes,“has“b˜een“done,“theŽ¤ ‘IÕ\verbatim@start–j†¹macro“is“called.“This“starts“the“main“loGop“of“the“scanning“me-Ž¡‘Ic•¸èhanism›ßäimplemen“ted˜here.˜An“y˜other˜en“vironmen“t˜that˜w“an“ts˜to˜mak“e˜use˜of˜thisŽ¡‘Ifeature–U should“execute“this“macro“as“its“last“action.Ž¡‘XThese–—yare“the“things“that“concern“the“start“of“a“vš¸èerbatim“en˜vironmen˜t.“OnceŽ¡‘Ithis–ØD(and“other)“setup“has“bšGeen“done,“the“co˜de“in“this“pac¸èk‘ÿqÐage“reads“and“pro˜cessesŽ¡‘Icš¸èharacters–U from“the“input“stream“in“the“follo˜wing“w˜a˜y“:ŽŸq‘U9b1.ŽŽŽ‘bBefore–°âthe“rst“c¸èharacter“of“an“input“line“is“read,“it“executes“the“macroŽ¡‘bÕ\verbatim@startline¹.Ž©qŒ‘U9b2.ŽŽŽ‘bAfter–œîsome“cš¸èharacters“ha˜v˜e“bGeen“read,“the“macro“Õ\verbatim@addtoline“¹isŽ¡‘bcalled–fƒwith“these“cš¸èharacters“as“its“only“argumen˜t.“This“ma˜y“happGen“sev˜eralŽ¡‘btimes–U pGer“line“(when“an“Õ\end“¹command“is“presen¸èt“on“the“line“in“question).Ž¦‘U9b3.ŽŽŽ‘bWhen–`²the“end“of“the“line“is“reac¸èhed,“the“macro“Õ\verbatim@processline“¹isŽ¡‘bcalled–·®to“proGcess“the“cš¸èharacters“that“Õ\verbatim@addtoline“¹has“accum˜ula-Ž¡‘bted.Ž¦‘U9b4.ŽŽŽ‘bFinally‘ÿ*¸,–XKthere“is“the“macro“Õ\verbatim@finish“¹that“is“called“just“bGefore“theŽ¡‘ben•¸èvironmen“t–U is“ended“b¸èy“a“call“to“the“Õ\end“¹macro.Ž©q‘XT‘ÿ*¸o–Smakš¸èe“this“clear“let“us“consider“the“standard“Õverbatim“¹en˜vironmen˜t.“In“thisŽ¡‘Icase–U the“three“macros“abGo•¸èv“e–U are“dened“as“follo¸èws“:Ž¦‘U9b1.ŽŽŽ‘bÕ\verbatim@startline–U ¹clears“the“cš¸èharacter“buer“(a“tok˜en“register).Ž¤qŒ‘U9b2.ŽŽŽ‘bÕ\verbatim@addtoline–U ¹adds“its“argumenš¸èt“to“the“c˜haracter“buer.Ž¡‘U9b3.ŽŽŽ‘bÕ\verbatim@processline–Ú¹tš¸èypGesets“the“c˜haracters“accum˜ulated“in“the“buer.Ž¦‘IWith–´¨this“it“is“vš¸èery“simple“to“implemen˜t“the“Õcomment“¹en˜vironmen˜t“:“in“this“caseŽ¤ ‘IÕ\verbatim@startline–Fç¹and“Õ\verbatim@processline“¹are“dened“to“bGe“no-opsŽ¡‘Iwhereas–U Õ\verbatim@addtoline“¹discards“its“argumen¸èt.Ž¡‘XLet's–»use“this“to“dene“a“v‘ÿqÐarianš¸èt“of“the“Õverbatim“¹en˜vironmen˜t“that“prin˜tsŽ¡‘Iline›Dàn•¸èum“bGers˜in˜the˜left˜margin.˜Assume˜that˜this˜w“ould˜bGe˜done˜b“y˜a˜coun“terŽ¡‘Icalled–? ÕVerbatimLineNo¹.“Assuming“that“this“counš¸èter“w˜as“initialized“propGerly“b˜yŽ¡‘Ithe›U en•¸èvironmen“t,˜Õ\verbatim@processline˜¹w“ould˜bGe˜dened˜in˜this˜case˜asŽŸq‘IÐ\def\verbatim@processline{%Ž¤ ‘Rrœ\addtocounter{VerbatimLineNo}{1}%Ž¡‘Rrœ\leavevmodeŽŽŽŒ‹"  ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’F ¹5ŽŽ o ý´‘RrœÐ\llap{\theVerbatimLineNo\‘¹N\hskip\@totalleftmargin}%Ž© ‘Rrœ\the\verbatim@line\par}ŽŸq‘X¹A‘ºUfurther–ºppGossibilitš¸èy“is“to“dene“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–U than“a“page“otherwise“yš¸èou“ha˜v˜e“to“c˜hange“this“example.ŽŸ*V‘IÐ\def\verbatimboxed#1{\begingroupŽ¦‘Rrœ\def\verbatim@processline{%Ž¦‘[å8{\setbox0=\hbox{\the\verbatim@line}%Ž¦‘`ž†\hsize=\wd0Ž¦‘`ž†\the\verbatim@line\par}}%Ž¦‘Rrœ\setbox0=\vbox{\parskip=0pt\topsep=0pt\partopsep=0ptŽ¦’™N.\verbatiminput{#1}}%Ž¦‘Rrœ\begin{center}\fbox{\box0}\end{center}%Ž¦‘M¹N\endgroup}ŽŸ*V‘X¹As–B9a“nal“nonš¸ètrivial“example“w˜e“describGe“the“denition“of“an“en˜vironmen˜t“calledŽ¡‘IÕverbatimwrite¹.–ƒÖIt“writes“all“text“in“its“b•Go“dy–ƒÖto“a“le“whose“name“is“giv¸èen“as“anŽ¡‘Iargumenš¸èt.–®W‘ÿ*¸e“assume“that“a“stream“n˜um˜bGer“called“Õ\verbatim@out“¹has“alreadyŽ¡‘IbGeen–U reservš¸èed“b˜y“means“of“the“Õ\newwrite“¹macro.Ž¡‘XLet's–U bGegin“with“the“denition“of“the“macro“Õ\verbatimwrite¹.Ž©q‘IÐ\def\verbatimwrite#1{%ŽŸq‘I¹First–{µwš¸èe“call“Õ\@bsphack“¹so“that“this“en˜vironmen˜t“doGes“not“inuence“the“spacing.Ž¡‘IThen–U w¸èe“opšGen“the“le“and“set“the“category“co˜des“of“all“sp˜ecial“c¸èharacters“:Ž¦‘RrœÐ\@bsphackŽ¤ ‘Rrœ\immediate\openout–¹N\verbatim@out“#1Ž¡‘Rrœ\let\do\@makeother\dospecialsŽ¡‘Rrœ\catcode`\^^M\activeŽŸq‘I¹The–U default“denitions“of“the“macrosŽ¦‘RrœÐ\verbatim@startlineŽ¡‘Rrœ\verbatim@addtolineŽ¡‘Rrœ\verbatim@finishŽŸq‘I¹are–ºàalso“used“in“this“en•¸èvironmen“t.–ºàOnly“the“macro“Õ\verbatim@processline“¹hasŽŸ ‘Ito–U bšGe“c¸èhanged“b˜efore“Õ\verbatim@start“¹is“called“:Ž¦‘RrœÐ\def\verbatim@processline{%Ž¡‘[å8\immediate\write\verbatim@out{\the\verbatim@line}}%Ž¡‘Rrœ\verbatim@start}ŽŸq‘I¹The–×idenition“of“Õ\endverbatimwrite“¹is“vš¸èery“simple“:“w˜e“close“the“stream“and“callŽ¤ ‘IÕ\@esphack–U ¹to“get“the“spacing“righ¸èt.Ž¦‘IÐ\def\endverbatimwrite{\immediate\closeout\verbatim@out\@esphack}ŽŸ!Ö‘IÓ3Ž‘`ÁThe‘G\implemenctationŽŸæ~‘X¹The–çvš¸èery“rst“thing“w˜e“do“is“to“ensure“that“this“le“is“not“read“in“t˜wice.“T‘ÿ*¸oŽ¡‘Ithis–.end“wš¸èe“c˜hec˜k“whether“the“macro“Õ\verbatim@@@“¹is“dened.“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–U extracting“the“drivš¸èer“le“for“testing“this“pac˜k‘ÿqÐage.Ž¦‘LüàÔ1Ž‘Sª®ó#©±Ê cmsy9Îhó0ÒoÇw cmss9Ûpack¾9ageŽ‘#g ÎiŽŸ ‘LüàÔ2Ž‘Sª®Ð\NeedsTeXFormat{LaTeX2e}ŽŽŽŒ‹1j ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’F ¹6ŽŽ o ý´‘LüàÔ3Ž‘Sª®Ð\ProvidesPackage{verbatim}Ž¤ ‘LüàÔ4Ž‘kI4Ð[1997/04/30–¹Nv1.5k“LaTeX2e“package“for“verbatim“enhancements]Ž¡‘LüàÔ5Ž‘Sª®Ð\@ifundefined{verbatim@@@}{}{\endinput}ŽŸq‘X¹W‘ÿ*¸e–!ïuse“a“mecš¸èhanism“similar“to“the“one“implemen˜ted“for“the“Õ\comment¹.–ª.“.Ž¤ ‘IÕ\endcomment–Ý8¹macro“in“¸A‘þ"ŸžWMŽ‘‘S‘¿ü¹-T‘þUYŸ&úEŽ‘ã9XŽ‘6wž:“W‘ÿ*¸e“input“one“line“at“a“time“and“c•¸èhec“k‘Ý8ifŽ¡‘Iit–Ãdconš¸ètains“the“Õ\end{...}“¹tok˜ens.“Then“w˜e“can“decide“whether“w˜e“ha˜v˜e“reac˜hedŽ¡‘Ithe–U end“of“the“vš¸èerbatim“text,“or“m˜ust“con˜tin˜ue.ŽŸýY‘IÙ3.1Ž‘g¾PreliminariesŽŸtî‘øk Ð\every@verbatimŽŽŽ‘I¹The–U hoGok“(i.e.“tok¸èen“register)“Õ\every@verbatim“¹is“initialized“to“¸hÖempty‘ân¸iŽ‘&¹.Ž©q‘LüàÔ6Ž‘Sª®Ð\newtoks\every@verbatimŽŸ ‘LüàÔ7Ž‘Sª®Ð\every@verbatim={}ŽŸ*V‘ PX\@makeotherŽŽŽ‘IÕ\@makeother–l¹takš¸èes“as“argumen˜t“a“c˜haracter“and“c˜hanges“its“category“coGde“to“²12Ž¡‘I¹(other).Ž¦‘LüàÔ8Ž‘Sª®Ð\def\@makeother#1{\catcode`#112\relax}ŽŸ*V‘ݼ\@vobeyspacesŽŽŽ‘I¹The–§9macro“Õ\@vobeyspaces“¹causes“spaces“in“the“input“to“bGe“prin¸èted“as“spaces“inŽ¡‘Ithe‘U output.Ž¦‘LüàÔ9Ž‘Sª®Ð\begingroupŽ¤ ‘I®Ô10Ž‘XcüÐ\catcode`\‘¹N=\active%Ž¡‘I®Ô11Ž‘XcüÐ\def\x{\def\@vobeyspaces{\catcode`\–¹N\active\let“\@xobeysp}}Ž¡‘I®Ô12Ž‘XcüÐ\expandafter\endgroup\xŽ¤*V‘Âô\@xobeyspŽŽŽ‘I¹The–¢-macro“Õ\@xobeysp“¹proGduces“exactly“one“space“in“the“output,“protected“againstŽŸ ‘Ibreaking–U just“bšGefore“it.“(Õ\@M“¹is“an“abbreviation“for“the“n•¸èum“b˜er‘U ²10000¹.)Ž¦‘I®Ô13Ž‘Sª®Ð\def\@xobeysp{\leavevmode\penalty\@M\‘¹N}Ž¡‘ý$n\verbatim@lineŽŽŽ‘I¹W‘ÿ*¸e–ö•use“a“newly“dened“tok¸èen“register“called“Õ\verbatim@line“¹that“will“bGe“used“asŽŸ ‘Ithe–U c¸èharacter“buer.Ž¦‘I®Ô14Ž‘Sª®Ð\newtoks\verbatim@lineŽ¡‘X¹The––Áfolloš¸èwing“four“macros“are“dened“globally“in“a“w˜a˜y“suitable“for“theŽ¤ ‘IÕverbatim–U ¹and“Õverbatim*“¹en•¸èvironmen“ts.ŽŸq‘å…èÐ\verbatim@startlineŽŽ¡‘å…è\verbatim@addtolineŽŽŽŽ¡¡‘ÜL\verbatim@processlineŽŽŽŽŽ‘IÕ\verbatim@startline–í­¹initializes“proGcessing“of“a“line“bš¸èy“empt˜ying“the“c˜haracterŽ¡‘Ibuer‘U (Õ\verbatim@line¹).Ž¦‘I®Ô15Ž‘Sª®Ð\def\verbatim@startline{\verbatim@line{}}ŽŸq‘IÕ\verbatim@addtoline–7ð¹adds“the“tokš¸èens“in“its“argumen˜t“to“our“buer“registerŽ¡‘IÕ\verbatim@line–U ¹without“expanding“them.Ž¦‘I®Ô16Ž‘Sª®Ð\def\verbatim@addtoline#1{%ŽŸ ‘I®Ô17Ž‘]JÐ\verbatim@line\expandafter{\the\verbatim@line#1}}ŽŸq‘I¹ProGcessing–e€a“line“inside“a“Õverbatim“¹or“Õverbatim*“¹en•¸èvironmen“t–e€means“prin¸ètingŽ¡‘Iit.–ÓAEnding“the“line“means“that“wš¸èe“ha˜v˜e“to“bGegin“a“new“paragraph.“W‘ÿ*¸e“use“Õ\parŽ¡‘I¹for–jwthis“purpGose.“Note“that“Õ\par“¹is“redened“in“Õ\@verbatim“¹to“force“T‘þUYŸ&úEŽ‘ã9X“in¸ètoŽ¡‘Ihorizonš¸ètal–£cmoGde“and“to“insert“an“empt˜y“bGo˜x“so“that“empt˜y“lines“in“the“input“doŽ¡‘IappGear–U in“the“output.Ž¦‘I®Ô18Ž‘Sª®Ð\def\verbatim@processline{\the\verbatim@line\par}ŽŽŽŒ‹\do\,\do\'\do\-ŽŸEà‘I¹All–U the“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Ž’­kxÐ\let\do\do@noligsŽ¡‘I®Ô23Ž’­kxÐ\verbatim@nolig@list}ŽŸèΑ ¦\@verbatimŽŽŽ‘I¹The–š macro“Õ\@verbatim“¹sets“up“things“propGerly‘ÿ*¸.“First“of“all,“the“tok¸èens“of“theŽ¤ ‘IÕ\every@verbatim–Í:¹hoGok“are“inserted.“Then“a“Õtrivlist“¹en•¸èvironmen“t–Í:is“startedŽ¡‘Iand–™its“rst“Õ\item“¹command“inserted.“Eac¸èh“line“of“the“Õverbatim“¹or“Õverbatim*Ž¡‘I¹en•¸èvironmen“t–U will“bGe“treated“as“a“separate“paragraph.Ž¦‘I®Ô24Ž‘Sª®Ð\def\@verbatim{\the\every@verbatimŽŸ ‘I®Ô25Ž‘]JÐ\trivlist–¹N\item“\relaxŽŸEà‘I¹The–…èfolloš¸èwing“extra“v˜ertical“space“is“for“compatibilit˜y“with“the“LŸýï‘üf ÔAŽŽ‘Íz¹T‘þUYŸ&úEŽ‘ã9Xk˜ernel“:“other-Ž¡‘Iwise,–føusing“the“Õverbatim“¹pacš¸èk‘ÿqÐage“c˜hanges“the“v˜ertical“spacing“of“a“Õverbatim“¹en-Ž¡‘Ivironmenš¸èt–U nested“within“a“Õquote“¹en˜vironmen˜t.Ž¦‘I®Ô26Ž‘]JÐ\if@minipage\else\vskip\parskip\fiŽŸEà‘I¹The–2=paragraph“parameters“are“set“appropriately“:“the“pšGenalt¸èy“at“the“b˜eginningŽ¡‘Iof–Athe“en•¸èvironmen“t,–Aleft“and“righš¸èt“margins,“paragraph“inden˜tation,“the“glue“to“llŽ¡‘Ithe–¡5last“line,“and“the“vš¸èertical“space“bGet˜w˜een“paragraphs.“The“latter“space“has“toŽ¡‘IbGe–U zero“since“wš¸èe“do“not“w˜an˜t“to“add“extra“space“bGet˜w˜een“lines.Ž¦‘I®Ô27Ž‘]JÐ\@beginparpenalty‘¹N\predisplaypenaltyŽ¤ ‘I®Ô28Ž‘]JÐ\leftskip\@totalleftmargin\rightskip\z@Ž¡‘I®Ô29Ž‘]JÐ\parindent\z@\parfillskip\@flushglue\parskip\z@ŽŸEà‘I¹There's–bÅone“pGoinš¸èt“to“mak˜e“here“:“the“Õlist“¹en˜vironmen˜t“uses“T‘þUYŸ&úEŽ‘ã9X's“Õ\parshapeŽ¤ ‘I¹primitivš¸èe–1¢to“get“a“spGecial“inden˜tation“for“the“rst“line“of“the“list.“If“the“list“bGeginsŽ¡‘Iwith–ga“Õverbatim“¹en•¸èvironmen“t–gthis“Õ\parshape“¹is“still“in“eect.“Therefore“wš¸èe“ha˜v˜eŽ¡‘Ito–¸reset“this“in¸èternal“parameter“explicitly›ÿ*¸.“W˜e“could“do“this“b¸èy“assigning“²0“¹toŽ¡‘IÕ\parshape¹.›¡ßHo•¸èw“ev“er,˜there˜is˜a˜simpler˜w“a“y˜to˜ac“hiev“e˜this˜:˜w“e˜simply˜tell˜T‘þUYŸ&úEŽ‘ã9XŽŽŽŒ‹H ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’F ¹8ŽŽ o ý´‘Ito–Îÿstart“a“new“paragraph.“As“is“explained“on“p.“103“of“the“T‘þUYŸ&úEŽ‘ã9Xb•Go“ok,–Îÿthis“resetsŽ¤ ‘IÕ\parshape–U ¹to“zero.Ž©Tœ‘I®Ô30Ž‘]JÐ\@@parŽŸTœ‘I¹W‘ÿ*¸e–knoš¸èw“ensure“that“Õ\par“¹has“the“correct“denition,“namely“to“force“T‘þUYŸ&úEŽ‘ã9X“in˜toŽ¡‘Ihorizonš¸ètal–`ÞmoGde“and“to“include“an“empt˜y“bGo˜x.“This“is“to“ensure“that“empt˜y“linesŽ¡‘Ido–êrappGear“in“the“output.“Afterwš¸èards,“w˜e“insert“the“Õ\interlinepenalty“¹sinceŽ¡‘IT‘þUYŸ&úEŽ‘ã9X–»ÅdošGes“not“add“a“p˜enalt¸èy“b˜et•¸èw“een–»Åparagraphs“(here“:“lines)“bš¸èy“its“o˜wn“initia-Ž¡‘Itivš¸èe.–ô‘Otherwise“a“Õverbatim“¹en˜vironmen˜t“could“bGe“brok˜en“across“pages“ev˜en“if“aŽ¡‘IÕ\samepage–U ¹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–zÔof“the“impGortan¸èt“things“here“is“the“inclusion“of“Õ\leavevmode“¹as“the“rst“macroŽ¡‘Iin–#ithe“rst“line,“for“example,“a“blank“v¸èerbatim“line“is“the“rst“thing“in“a“list“item.Ž¦‘I®Ô31Ž‘]JÐ\def\par{%Ž¤ ‘I®Ô32Ž‘fæÐ\if@tempswaŽ¡‘I®Ô33Ž‘p‚Ð\leavevmode\null\@@par\penalty\interlinepenaltyŽ¡‘I®Ô34Ž‘fæÐ\elseŽ¡‘I®Ô35Ž‘p‚Ð\@tempswatrueŽ¡‘I®Ô36Ž‘p‚Ð\ifhmode\@@par\penalty\interlinepenalty\fiŽ¡‘I®Ô37Ž‘fæÐ\fi}%Ž¤Tœ‘I¹But–ñ©to“a•¸èv“oid–ñ©an“error“message“when“the“en•¸èvironmen“t–ñ©doGesn't“conš¸ètain“an˜y“text,“w˜eŽŸ ‘Iredene–U Õ\@noitemerr“¹whicš¸èh“will“in“this“case“bGe“called“b˜y“Õ\endtrivlist¹.Ž¦‘I®Ô38Ž‘]JÐ\def\@noitemerr{\@warning{No–¹Nverbatim“text}}%Ž¡‘I¹No•¸èw›U w“e˜call˜Õ\obeylines˜¹to˜mak“e˜the˜end˜of˜line˜c“haracter˜activ“e,Ž¦‘I®Ô39Ž‘]JÐ\obeylinesŽ¡‘I¹c¸èhange–U the“category“cošGde“of“all“sp˜ecial“c¸èharacters,“to“²12“¹(other).Ž¦‘I®Ô40Ž‘]JÐ\let\do\@makeother‘¹N\dospecialsŽ¡‘I¹and–U switcš¸èh“to“the“fon˜t“to“bGe“used.Ž¦‘I®Ô41Ž‘]JÐ\verbatim@fontŽ¡‘I¹T‘ÿ*¸o›æîa•¸èv“oid˜a˜breakpGoin“t˜after˜the˜lab•Gels˜b“o•¸èx,˜w“e˜remo“v“e˜the˜pGenalt“y˜put˜there˜b“yŽ¤ ‘Ithe–U list“macros“:“another“use“of“Õ\unpenalty‘ª“¹!Ž¦‘I®Ô42Ž‘]JÐ\everypar–¹N\expandafter{\the\everypar“\unpenalty}}ŽŸþé‘Âô\verbatimŽŽ¡‘ ¦\verbatim*ŽŽŽŽŽ‘I¹No•¸èw›©Sw“e˜dene˜the˜toplev“el˜macros.˜Õ\verbatim˜¹is˜sligh“tly˜c“hanged˜:˜after˜settingŽ¡‘Iup–U things“propGerly“it“calls“Õ\verbatim@start¹.Ž¦‘I®Ô43Ž‘Sª®Ð\def\verbatim{\@verbatim‘¹N\frenchspacing\@vobeyspaces\verbatim@start}ŽŸTœ‘IÕ\verbatim*–U ¹is“dened“accordingly‘ÿ*¸.Ž¦‘I®Ô44Ž‘Sª®Ð\@namedef{verbatim*}{\@verbatim\verbatim@start}ŽŸþé‘— \endverbatimŽŽ¡‘ݼ\endverbatim*ŽŽŽŽŽ‘I¹T‘ÿ*¸o–Ê€end“the“Õverbatim“¹and“Õverbatim*“¹en•¸èvironmen“ts–Ê€it“is“only“necessary“to“nishŽ¡‘Ithe–U Õtrivlist“¹en•¸èvironmen“t–U started“in“Õ\@verbatim¹.Ž¦‘I®Ô45Ž‘Sª®Ð\let\endverbatim=\endtrivlistŽŸ ‘I®Ô46Ž‘Sª®Ð\expandafter\let\csname–¹Nendverbatim*\endcsname“=\endtrivlistŽŸîß‘IÙ3.3Ž‘g¾The–¸Écomment“Ùen• vironmen“tŽŸtî‘|BÐ\commentŽŽ¡‘ PX\endcommentŽŽŽŽŽ‘I¹The–ÈÕ\comment“¹macro“is“similar“to“Õ\verbatim*¹.“Ho•¸èw“ev“er,›Èw“e˜do˜not˜need˜to˜switc“hŽ¡‘Ifonš¸èts–«Ïor“set“spGecial“formatting“parameters“suc˜h“as“Õ\parindent“¹or“Õ\parskip¹.“W‘ÿ*¸eŽŽŽŒ‹ XO ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’F ¹9ŽŽ o ý´‘Ineed–¶only“set“the“category“cošGde“of“all“sp˜ecial“c¸èharacters“to“²12“¹(other)“and“thatŽ¤ ‘Iof–çšÕ^^M‘çu¹(the“end“of“line“cš¸èharacter)“to“²13“¹(activ˜e).“The“latter“is“needed“for“macroŽ¡‘Iparameter–ö2delimiter“matcš¸èhing“in“the“in˜ternal“macros“dened“bGelo˜w.“In“con˜trast“toŽ¡‘Ithe–>•default“denitions“used“bš¸èy“the“Õ\verbatim“¹and“Õ\verbatim*“¹macros,“w˜e“deneŽ¡‘IÕ\verbatim@addtoline–k¹to“throš¸èw“a˜w˜a˜y“its“argumen˜t“and“Õ\verbatim@processline¹,Ž¡‘IÕ\verbatim@startline¹,–Œtand“Õ\verbatim@finish“¹to“act“as“no-ops.“Then“w¸èe“callŽ¡‘IÕ\verbatim@¹.–F†But“the“rst“thing“wš¸èe“do“is“to“call“Õ\@bsphack“¹so“that“this“en˜vironmen˜tŽ¡‘Ihas–U no“inuence“whatsošGev¸èer“up˜on“the“spacing.Ž©q‘I®Ô47Ž‘Sª®Ð\def\comment{\@bsphackŽ¤ ‘I®Ô48Ž’‘¤Ð\let\do\@makeother\dospecials\catcode`\^^M\activeŽ¡‘I®Ô49Ž’‘¤Ð\let\verbatim@startline\relaxŽ¡‘I®Ô50Ž’‘¤Ð\let\verbatim@addtoline\@gobbleŽ¡‘I®Ô51Ž’‘¤Ð\let\verbatim@processline\relaxŽ¡‘I®Ô52Ž’‘¤Ð\let\verbatim@finish\relaxŽ¡‘I®Ô53Ž’‘¤Ð\verbatim@}ŽŸq‘IÕ\endcomment–k¹is“vš¸èery“simple“:“it“only“calls“Õ\@esphack“¹to“tak˜e“care“of“the“spacing.Ž¤ ‘IThe–IñÕ\end“¹macro“closes“the“group“and“therefore“takš¸èes“care“of“restoring“ev˜erythingŽ¡‘Iw•¸èe‘U c“hanged.Ž¦‘I®Ô54Ž‘Sª®Ð\let\endcomment=\@esphackŽŸýY‘IÙ3.4Ž‘g¾The–¸main“lo_úopŽŸtî‘X¹Here–ìõcomes“the“tricš¸èky“part“:“During“the“denition“of“the“macros“w˜e“need“toŽ¡‘Iuse–„jthe“spšGecial“c¸èharacters“Õ\¹,“Õ{¹,“and“Õ}“¹not“only“with“their“normal“category“co˜des,Ž¡‘Ibut–Øalso“with“category“coGde“²12“¹(other).“W‘ÿ*¸e“ac•¸èhiev“e–Øthis“bš¸èy“the“follo˜wing“tric˜k“:Ž¡‘Irst–—#wš¸èe“tell“T‘þUYŸ&úEŽ‘ã9X“that“Õ\¹,“Õ{¹,“and“Õ}“¹are“the“lo˜w˜ercase“v˜ersions“of“Õ!¹,“Õ[¹,“and“Õ]¹.“ThenŽ¡‘Iwš¸èe–áreplace“ev˜ery“ošGccurrence“of“Õ\¹,“Õ{¹,“and“Õ}“¹that“should“b˜e“read“with“category“co˜deŽ¡‘I²12–³u¹bš¸èy“Õ!¹,“Õ[¹,“and“Õ]¹,“respGectiv˜ely‘ÿ*¸,“and“giv˜e“the“whole“list“of“tok˜ens“to“Õ\lowercase¹,Ž¡‘Iknoš¸èwing–U that“category“coGdes“are“not“altered“b˜y“this“primitiv˜e‘ª“!Ž¡‘XBut–&grst“wš¸èe“ha˜v˜e“ensure“that“Õ!¹,“Õ[¹,“and“Õ]“¹themselv˜es“ha˜v˜e“the“correct“categoryŽ¡‘IcošGde‘ª“!–°T‘ÿ*¸o“allo¸èw“sp˜ecial“settings“of“these“co˜des“w¸èe“hide“their“setting“in“the“macroŽ¡‘IÕ\vrb@catcodes¹.–U If“it“is“already“dened“our“new“denition“is“skippGed.Ž¦‘I®Ô55Ž‘Sª®Ð\@ifundefined{vrb@catcodes}%Ž¤ ‘I®Ô56Ž‘]JÐ{\def\vrb@catcodes{%Ž¡‘I®Ô57Ž‘kI4Ð\catcode`\!12\catcode`\[12\catcode`\]12}}{}ŽŸq‘I¹This–©itricš¸èk“allo˜ws“us“to“use“this“cošGde“for“applications“where“other“category“co˜desŽ¤ ‘Iare–U in“eect.Ž¡‘XW‘ÿ*¸e–U start“a“group“to“kš¸èeep“the“category“coGde“c˜hanges“loGcal.Ž¦‘I®Ô58Ž‘Sª®Ð\begingroupŽ¤ ‘I®Ô59Ž‘XcüÐ\vrb@catcodesŽ¡‘I®Ô60Ž‘XcüÐ\lccode`\!=`\\–¹N\lccode`\[=`\{“\lccode`\]=`\}ŽŸq‘I¹W‘ÿ*¸e–›­also“need“the“end-of-line“cš¸èharacter“Õ^^M¹,“as“an“activ˜e“c˜haracter.“If“w˜e“w˜ereŽ¤ ‘Ito–²Xsimply“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“denitions.Ž¡‘ITherefore––wš¸èe“use“the“same“tric˜k“as“abGo˜v˜e“:“w˜e“write“a“tilde“Õ~“¹instead“of“Õ^^M‘•ï¹andŽ¡‘Ipretend–*úthat“the“latter“is“the“lo•¸èw“ercase›*úv‘ÿqÐarian“t˜of˜the˜former.˜Th“us˜w“e˜ha“v“e˜toŽ¡‘Iensure–U noš¸èw“that“the“tilde“c˜haracter“has“category“coGde“²13“¹(activ˜e).Ž¦‘I®Ô61Ž‘XcüÐ\catcode`\~=\active‘¹N\lccode`\~=`\^^MŽŽŽŒ‹ e© ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’ýF\¹10ŽŽ o ý´‘IThe–ë use“of“the“Õ\lowercase“¹primitivš¸èe“leads“to“one“problem“:“the“uppGercase“c˜ha-Ž¤ ‘Iracter–¤G`ÕC¹'‘¤2needs“to“bšGe“used“in“the“co˜de“b˜eloš¸èw“and“its“case“m˜ust“bGe“preserv˜ed.“SoŽ¡‘Iw¸èe–U add“the“command“:Ž©q‘I®Ô62Ž‘XcüÐ\lccode`\C=`\CŽŸq‘I¹No•¸èw›Ânw“e˜start˜the˜tok“en˜list˜passed˜to˜Õ\lowercase¹.˜W‘ÿ*¸e˜use˜the˜follo“wing˜little˜tric“kŽ¡‘I(propGosed–"hbš¸èy“Bernd“Raic˜hle)“:“The“v˜ery“rst“tok˜en“in“the“tok˜en“list“w˜e“giv˜e“toŽ¡‘IÕ\lowercase–›¹is“the“Õ\endgroup“¹primitivš¸èe.“This“means“that“it“is“proGcessed“b˜y“T‘þUYŸ&úEŽ‘ã9XŽ¡‘Iimmediately–ó after“Õ\lowercase“¹has“nished“its“opGeration,“th¸èus“ending“the“groupŽ¡‘Istarted–U bš¸èy“Õ\begingroup“¹abGo˜v˜e.“This“a˜v˜oids“the“global“denition“of“all“macros.Ž¦‘I®Ô63Ž‘XcüÐ\lowercase{\endgroupŽŸ*V‘øk \verbatim@startŽŽŽ‘I¹The–H7purpGose“of“Õ\verbatim@start“¹is“to“c•¸èhec“k–H7whether“there“are“anš¸èy“c˜haractersŽ¡‘Ion–ô"the“same“line“as“the“Õ\begin{verbatim}“¹and“to“pretend“that“they“w¸èere“on“aŽ¡‘Iline–ëbš¸èy“themselv˜es.“On“the“other“hand,“if“there“are“no“c˜haracters“remaining“on“theŽ¡‘Icurrenš¸èt–Êline“w˜e“shall“just“nd“an“end“of“line“c˜haracter.“Õ\verbatim@start“¹pGerformsŽ¡‘Iits–task“bš¸èy“rst“grabbing“the“follo˜wing“c˜haracter“(its“argumen˜t).“This“argumen˜t“isŽ¡‘Ithen–U compared“to“an“activš¸èe“Õ^^M¹,“the“end“of“line“c˜haracter.Ž¦‘I®Ô64Ž‘fæÐ\def\verbatim@start#1{%Ž¤ ‘I®Ô65Ž‘p‚Ð\verbatim@startlineŽ¡‘I®Ô66Ž‘p‚Ð\if\noexpand#1\noexpand~%Ž¤q‘I¹If–jüthis“is“true“wš¸èe“transfer“con˜trol“to“Õ\verbatim@“¹to“proGcess“the“next“line.“W‘ÿ*¸e“useŽŸ ‘IÕ\next–U ¹as“the“macro“whicš¸èh“will“con˜tin˜ue“the“w˜ork.Ž¦‘I®Ô67Ž‘yuÐ\let\next\verbatim@Ž¡‘I¹Otherwise,–8%wš¸èe“dene“Õ\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–Q0remaining“on“this“line“are“handled“as“if“they“formed“a“line“b˜y“themselv˜es.Ž¦‘I®Ô68Ž‘p‚Ð\else‘¹N\def\next{\verbatim@#1}\fiŽŸq‘I¹Finally–U w¸èe“call“Õ\next¹.Ž¦‘I®Ô69Ž‘p‚Ð\next}%ŽŸ*V‘ ¦\verbatim@ŽŽŽ‘I¹The–mµthree“macros“Õ\verbatim@¹,“Õ\verbatim@@¹,“and“Õ\verbatim@@@“¹form“the“mainŽ¡‘IlošGop‘¤–of–ÏNthe“Õverbatim“¹en•¸èvironmen“t.–ÏNThe“purp˜ose“of“Õ\verbatim@“¹is“to“read“exactlyŽ¡‘Ione–øÆline“of“input.“Õ\verbatim@@“¹and“Õ\verbatim@@@“¹w¸èork“together“to“nd“out“whe-Ž¡‘Ither–?4the“four“c¸èharacters“Õ\end“¹(all“with“category“cošGde“²12“¹(other))“o˜ccur“in“thatŽ¡‘Iline.–RÔIf“so,“Õ\verbatim@@@“¹will“call“Õ\verbatim@test“¹to“c•¸èhec“k–RÔwhether“this“Õ\end“¹isŽ¡‘Ipart–)Kof“Õ\end{verbatim}“¹and“will“terminate“the“en•¸èvironmen“t–)Kif“this“is“the“case.Ž¡‘IOtherwise–Fèwš¸èe“con˜tin˜ue“as“if“nothing“had“happGened.“So“let's“ha˜v˜e“a“loGok“at“theŽ¡‘Idenition–U of“Õ\verbatim@“¹:Ž¦‘I®Ô70Ž‘fæÐ\def\verbatim@#1~{\verbatim@@#1!end\@nil}%ŽŸq‘I¹Note–ÚSthat“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“denition“ofŽ¡‘Ithis–âîmacro“actually“takš¸èes“place.“That“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,–U and“then“calls“Õ\verbatim@@¹.ŽŸ*V‘ PXÐ\verbatim@@ŽŽŽ‘IÕ\verbatim@@–-¹takš¸èes“ev˜erything“up“to“the“next“oGccurrence“of“the“four“c˜haractersŽ¡‘IÕ\end–U ¹as“its“argumen¸èt.Ž¦‘I®Ô71Ž‘fæÐ\def\verbatim@@#1!end{%ŽŽŽŒ‹ së ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’ýF\¹11ŽŽ o ý´‘IThat–means“:“if“they“do“not“oGccur“in“the“original“line,“then“argumen¸èt“Õ#1“¹is“theŽ¤ ‘Iwhole–ËCinput“line,“and“Õ\@nil“¹is“the“next“tok¸èen“to“bšGe“pro˜cessed.“Ho•¸èw“ev“er,–ËCif“the“fourŽ¡‘Icš¸èharacters–AqÕ\end“¹are“part“of“the“original“line,“then“Õ#1“¹consists“of“the“c˜haractersŽ¡‘Iin–téfronš¸èt“of“Õ\end¹,“and“the“next“tok˜en“is“the“follo˜wing“c˜haracter“(alw˜a˜ys“remem˜bGerŽ¡‘Ithat–bæthe“line“wš¸èas“lengthened“b˜y“v˜e“tok˜ens).“Whatev˜er“Õ#1“¹ma˜y“bGe,“it“is“v˜erbatimŽ¡‘Itext,–U so“Õ#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–U ¹denes“Õ\next“¹to“bšGe“equal“to“it“b˜efore“calling“Õ\verbatim@@@¹.Ž¦‘I®Ô73Ž‘t»ÐÐ\futurelet\next\verbatim@@@}%ŽŸÿþ‘— \verbatim@@@ŽŽŽ‘IÕ\verbatim@@@–y­¹will“noš¸èw“read“the“rest“of“the“tok˜ens“on“the“curren˜t“line,“up“to“theŽ¡‘Inal–U Õ\@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,–U Õ#1“¹is“emptš¸èy“and“Õ\next“¹is“equal“to“Õ\@nil¹.“This“is“easily“c˜hec˜k˜ed.Ž¦‘I®Ô75Ž‘t»ÐÐ\ifx\next\@nilŽŸ‘I¹If–£so,“this“wš¸èas“a“simple“line.“W‘ÿ*¸e“nish“it“b˜y“proGcessing“the“line“w˜e“accum˜ulated“soŽ¡‘Ifar.–U Then“w¸èe“prepare“to“read“the“next“line.Ž¦‘I®Ô76Ž‘~.lÐ\verbatim@processlineŽ¤ ‘I®Ô77Ž‘~.lÐ\verbatim@startlineŽ¡‘I®Ô78Ž‘~.lÐ\let\next\verbatim@Ž¤‘I¹Otherwise–U wš¸èe“ha˜v˜e“to“c˜hec˜k“what“follo˜ws“these“Õ\end“¹tok˜ens.Ž¦‘I®Ô79Ž‘t»ÐÐ\elseŽ¡‘I¹Before–Þ8wš¸èe“con˜tin˜ue,“it's“a“go•Go“d–Þ8idea“to“stop“for“a“momen˜t“and“remem˜bGer“where“w˜eŽ¤ ‘Iare–a:“W‘ÿ*¸e“ha•¸èv“e–ajust“read“the“four“cš¸èharacter“tok˜ens“Õ\end“¹and“m˜ust“no˜w“c˜hec˜k“whetherŽ¡‘Ithe–¬5name“of“the“en•¸èvironmen“t–¬5(surrounded“bš¸èy“braces)“follo˜ws.“T‘ÿ*¸o“this“end“w˜e“deneŽ¡‘Ia–‚ macro“called“Õ\@tempa“¹that“reads“exactly“one“c¸èharacter“and“decides“what“to“doŽ¡‘Inext.–&xThis“macro“should“do“the“folloš¸èwing“:“skip“spaces“un˜til“it“encoun˜ters“either“aŽ¡‘Ileft–âbrace“or“the“end“of“the“line.“But“it“is“impGortanš¸èt“to“remem˜bGer“whic˜h“c˜haractersŽ¡‘Iare–µskippGed.“The“Õ\end¸hÖoptionalŽ‘*ësp–ÿ}/ac“es‘Ò¸iŽ‘IÉÉÕ{“¹cš¸èharacters“ma˜y“bGe“part“of“the“v˜erbatimŽ¡‘Itext,–U i.e.“these“cš¸èharacters“m˜ust“bGe“prin˜ted.Ž¡‘XAssume–U for“example“that“the“currenš¸èt“line“con˜tainsŽ¦‘IÐ \end {AVeryLongEnvironmentName}ŽŸ‘I¹As–4awš¸èe“shall“soGon“see,“the“scanning“mec˜hanism“implemen˜ted“here“will“not“nd“outŽ¡‘Ithat–2this“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–U tok¸èen“register“Õ\@temptokena“¹is“used“for“this“purpGose.Ž¡‘XBefore– >wš¸èe“do“this“w˜e“ha˜v˜e“to“get“rid“of“the“supGeruous“Õ\end“¹tok˜ens“at“the“endŽ¡‘Iof– Šthe“line.“T‘ÿ*¸o“this“end“wš¸èe“dene“a“tempGorary“macro“whose“argumen˜t“is“delimitedŽ¡‘Ibš¸èy–yîÕ\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.“(Note“that“thisŽ¡‘Itokš¸èen–|Ìcan“nev˜er“appGear“in“Õ#1¹.)“W‘ÿ*¸e“use“the“follo˜wing“denition“of“Õ\@tempa“¹to“getŽ¡‘Ithe–U rest“of“the“line“(after“the“rst“Õ\end¹).Ž¦‘I®Ô80Ž‘~.lÐ\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›U ha“v“e˜thro“wn˜a“w“a“y˜in˜the˜call˜to˜Õ\@tempa¹.Ž¦‘I®Ô81Ž‘~.lÐ\@temptokena{!end}%ŽŽŽŒ‹ ‚ƒ ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’ýF\¹12ŽŽ o ý´‘IW‘ÿ*¸e–nYshall“noš¸èw“call“Õ\verbatim@test“¹to“proGcess“the“c˜haracters“remaining“on“theŽ¤ ‘Icurrenš¸èt–* line.“But“w˜ait“a“momen˜t“:“w˜e“cannot“simply“call“this“macro“since“w˜e“ha˜v˜eŽ¡‘Ialready–þÉread“the“whole“line.“Therefore“wš¸èe“ha˜v˜e“to“rst“expand“the“macro“Õ\@tempaŽ¡‘I¹to–uJinsert“them“again“after“the“Õ\verbatim@test“¹tokš¸èen.“A–uÕ^^M“¹c˜haracter–uJis“appGendedŽ¡‘Ito–¤}denote“the“end“of“the“line.“(Rememš¸èbGer“that“this“c˜haracter“comes“disguised“asŽ¡‘Ia‘U tilde.)Ž¤H5‘I®Ô82Ž‘~.lÐ\def\next{\expandafter\verbatim@test\@tempa#1\@nil~}%Ž©H5‘I¹That's–U almost“all,“but“wš¸èe“still“ha˜v˜e“to“no˜w“call“Õ\next“¹to“do“the“w˜ork.Ž¡‘I®Ô83Ž‘t»ÐÐ\fi‘¹N\next}%ŽŸìM‘ý$n\verbatim@testŽŽŽ‘I¹W‘ÿ*¸e–U dene“Õ\verbatim@test“¹to“in•¸èv“estigate›U ev“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–U recursiv¸èely“in“order“to“skip“spaces.Ž¡‘I®Ô85Ž’‡¡Ð\let\next\verbatim@testŽ¦‘I¹W‘ÿ*¸e›U ha•¸èv“e˜to˜distinguish˜four˜cases˜:Ž©H4‘U9b1.ŽŽŽ‘bThe–Ô«next“tokš¸èen“is“a“Õ^^M¹,“i.e.“w˜e“reac˜hed“the“end“of“the“line.“That“means“thatŽ¤ ‘bnothing–e¨spGecial“wš¸èas“found.“Note“that“w˜e“use“Õ\if“¹for“the“follo˜wing“compari-Ž¡‘bsons–U so“that“the“category“coGde“of“the“cš¸èharacters“is“irrelev‘ÿqÐan˜t.ŽŸH5‘I®Ô86Ž’ ¡ Ð\if\noexpand#1\noexpand~%Ž¦‘b¹W‘ÿ*¸e–¯Xadd“the“cš¸èharacters“accum˜ulated“in“tok˜en“register“Õ\@temptokena“¹to“theŽ¡‘bcurrenš¸èt–¼óline.“Since“Õ\verbatim@addtoline“¹doGes“not“expand“its“argumen˜t,Ž¡‘bw•¸èe›.kha“v“e˜to˜do˜the˜expansion˜at˜this˜pGoin“t.˜Then˜w“e˜Õ\let˜\next˜¹equal˜toŽ¡‘bÕ\verbatim@–U ¹to“prepare“to“read“the“next“line.ŽŸH5‘I®Ô87Ž’ª¦Ð\expandafter\verbatim@addtolineŽ¤ ‘I®Ô88Ž’³†BÐ\expandafter{\the\@temptokena}%Ž¡‘I®Ô89Ž’ª¦Ð\verbatim@processlineŽ¡‘I®Ô90Ž’ª¦Ð\verbatim@startlineŽ¡‘I®Ô91Ž’ª¦Ð\let\next\verbatim@Ž¦‘U9b¹2.ŽŽŽ‘bA‘1Øspace–2cš¸èharacter“follo˜ws.“This“is“allo˜w˜ed,“so“w˜e“add“it“to“Õ\@temptokenaŽŸ ‘b¹and‘U con•¸ètin“ue.ŽŸH5‘I®Ô92Ž’ ¡ Ð\else‘¹N\if\noexpand#1Ž¡‘I®Ô93Ž’ª¦Ð\@temptokena\expandafter{\the\@temptokena#1}%Ž¦‘U9b¹3.ŽŽŽ‘bAn–x®opGen“brace“folloš¸èws.“This“is“the“most“in˜teresting“case.“W‘ÿ*¸e“m˜ust“no˜w“collectŽ¤ ‘bc•¸èharacters›\Åun“til˜w“e˜read˜the˜closing˜brace˜and˜c“hec“k˜whether˜they˜form˜theŽ¡‘ben•¸èvironmen“t–ÜÙname.“This“will“bGe“done“bš¸èy“Õ\verbatim@testend¹,“so“here“w˜e“letŽ¡‘bÕ\next–.¹equal“this“macro.“Again“wš¸èe“will“proGcess“the“rest“of“the“line,“c˜haracterŽ¡‘bb•¸èy›Óc“haracter.˜The˜c“haracters˜forming˜the˜name˜of˜the˜en“vironmen“t˜will˜bGeŽ¡‘baccum¸èulated–U in“Õ\@tempc¹.“W‘ÿ*¸e“initialize“this“macro“to“expand“to“nothing.ŽŸH5‘I®Ô94Ž’ ¡ Ð\else‘¹N\if\noexpand#1\noexpand[%Ž¤ ‘I®Ô95Ž’ª¦Ð\let\@tempc\@emptyŽ¡‘I®Ô96Ž’ª¦Ð\let\next\verbatim@testendŽ¦‘b¹Note–U that“the“Õ[“¹c¸èharacter“will“bGe“a“Õ{“¹when“this“macro“is“dened.ŽŸH0‘U9b4.ŽŽŽ‘bAnš¸èy–ªrother“c˜haracter“means“that“the“Õ\end“¹w˜as“part“of“the“v˜erbatim“text.“A˜ddŽ¤ ‘bthe– cš¸èharacters“to“the“curren˜t“line“and“prepare“to“call“Õ\verbatim@“¹to“proGcessŽ¡‘bthe–U rest“of“the“line.ŽŸH5‘I®Ô97Ž’ ¡ Ð\elseŽŽŽŒ‹ ’$ ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’ýF\¹13ŽŽ o ý´‘I®Ô98Ž’ª¦Ð\expandafter\verbatim@addtolineŽ¤ ‘I®Ô99Ž’³†BÐ\expandafter{\the\@temptokena}%Ž¡‘E|Ô100Ž’ª¦Ð\def\next{\verbatim@#1}%Ž¡‘E|Ô101Ž’ ¡ Ð\fi\fi\fiŽŸq‘I¹The–U last“thing“this“macro“došGes“is“to“call“Õ\next“¹to“con•¸ètin“ue‘U pro˜cessing.Ž©q‘E|Ô102Ž’‡¡Ð\next}%ŽŸ*V‘îø„\verbatim@testendŽŽŽ‘IÕ\verbatim@testend–øA¹is“called“when“Õ\end¸hÖoptionalŽ‘)Üwsp–ÿ}/ac“es‘Ò¸iŽ‘I$UÕ{“¹w¸èas“seen.“Its“task“is“toŽ¤ ‘Iscan–·Ôev¸èerything“up“to“the“next“Õ}“¹and“to“call“Õ\verbatim@@testend¹.“If“no“Õ}“¹is“foundŽ¡‘Iit–ãbmš¸èust“reinsert“the“c˜haracters“it“read“and“return“to“Õ\verbatim@¹.“The“follo˜wingŽ¡‘Idenition–«™is“similar“to“that“of“Õ\verbatim@test“¹:“it“takš¸èes“the“next“c˜haracter“andŽ¡‘Idecides–U what“to“do.Ž¦‘E|Ô103Ž‘fæÐ\def\verbatim@testend#1{%Ž¤q‘I¹Again,–U wš¸èe“ha˜v˜e“four“cases“:Ž¡‘U9b1.ŽŽŽ‘bÕ^^M–›g¹:“As“no“Õ}“¹is“found“in“the“currenš¸èt“line,“add“the“c˜haracters“to“the“buer.“T‘ÿ*¸oŽ¤ ‘ba•¸èv“oid–èža“complicated“construction“for“expanding“Õ\@temptokena“¹and“Õ\@tempcŽ¡‘b¹wš¸èe–MZdo“it“in“t˜w˜o“steps.“Then“w˜e“con˜tin˜ue“with“Õ\verbatim@“¹to“proGcess“theŽ¡‘bnext‘U line.Ž¦‘E|Ô104Ž’—.nÐ\if\noexpand#1\noexpand~%Ž¤ ‘E|Ô105Ž’ ¡ Ð\expandafter\verbatim@addtolineŽ¡‘E|Ô106Ž’ª¦Ð\expandafter{\the\@temptokena[}%Ž¡‘E|Ô107Ž’ ¡ Ð\expandafter\verbatim@addtolineŽ¡‘E|Ô108Ž’ª¦Ð\expandafter{\@tempc}%Ž¡‘E|Ô109Ž’ ¡ Ð\verbatim@processlineŽ¡‘E|Ô110Ž’ ¡ Ð\verbatim@startlineŽ¡‘E|Ô111Ž’ ¡ Ð\let\next\verbatim@ŽŸq‘U9b¹2.ŽŽŽ‘bÕ}–Êo¹:“Call“Õ\verbatim@@testend“¹to“c•¸èhec“k–Êoif“this“is“the“righš¸èt“en˜vironmen˜t“name.Ž¦‘E|Ô112Ž’—.nÐ\else\if\noexpand#1\noexpand]%Ž¡‘E|Ô113Ž’ ¡ Ð\let\next\verbatim@@testendŽŸq‘U9b¹3.ŽŽŽ‘bÕ\–p¹:“This“cš¸èharacter“m˜ust“not“oGccur“in“the“name“of“an“en˜vironmen˜t.“Th˜us“w˜eŽ¤ ‘bstop–Èðcollecting“cš¸èharacters.“In“principle,“the“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¹.“This“means“that“w˜e“ha˜v˜e“to“loGok“again“forŽ¡‘bÕ\end{¸hÖenvir‘ÿ}/onmentŽ‘>+°name‘ÀO¸iŽ‘ZPíÕ}¹.–>ºNote“that“wš¸èe“prexed“the“Õ!“¹b˜y“a“Õ\noexpandŽ¡‘b¹primitivš¸èe,–U to“protect“ourselv˜es“against“it“bGeing“an“activ˜e“c˜haracter.Ž¦‘E|Ô114Ž’—.nÐ\else\if\noexpand#1\noexpand!%Ž¤ ‘E|Ô115Ž’ ¡ Ð\expandafter\verbatim@addtolineŽ¡‘E|Ô116Ž’ª¦Ð\expandafter{\the\@temptokena[}%Ž¡‘E|Ô117Ž’ ¡ Ð\expandafter\verbatim@addtolineŽ¡‘E|Ô118Ž’ª¦Ð\expandafter{\@tempc}%Ž¡‘E|Ô119Ž’ ¡ Ð\def\next{\verbatim@!}%ŽŸq‘U9b¹4.ŽŽŽ‘bAnš¸èy–îÎother“c˜haracter“:“collect“it“and“con˜tin˜ue.“W‘ÿ*¸e“cannot“use“Õ\edef“¹to“deneŽŸ ‘bÕ\@tempc–U ¹since“its“replacemenš¸èt“text“migh˜t“con˜tain“activ˜e“c˜haracter“tok˜ens.Ž¦‘E|Ô120Ž’—.nÐ\else‘¹N\expandafter\def\expandafter\@tempc\expandafterŽ¡‘E|Ô121Ž’ ¡ Ð{\@tempc#1}\fi\fi\fiŽŸq‘I¹As–ÎbšGefore,“the“macro“ends“b¸èy“calling“itself,“to“pro˜cess“the“next“c¸èharacter“if“appro-ŽŸ ‘Ipriate.Ž¦‘E|Ô122Ž‘~.lÐ\next}%ŽŽŽŒ‹Ÿ€ ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’ýF\¹14ŽŽ o ý´‘ê?6Ð\verbatim@@testendŽŽŽ‘I¹Unlikš¸èe–~the“previous“macros“Õ\verbatim@@testend“¹is“simple“:“it“has“only“to“c˜hec˜kŽ¤ ‘Iif–U the“Õ\end{¹.–ª.“.Õ}–U ¹matc¸èhes“the“correspGonding“Õ\begin{¹.–ª.“.Õ}¹.Ž©q‘E|Ô123Ž‘fæÐ\def\verbatim@@testend{%ŽŸq‘I¹W‘ÿ*¸e–„Zuse“Õ\next“¹again“to“dene“the“things“that“are“to“bšGe“done.“Remem¸èb˜er“thatŽ¡‘Ithe–ȹname“of“the“currenš¸èt“en˜vironmen˜t“is“held“in“Õ\@currenvir¹,“the“c˜haracters“ac-Ž¡‘Icum•¸èulated›ë8b“y˜Õ\verbatim@testend˜¹are˜in˜Õ\@tempc¹.˜So˜w“e˜simply˜compare˜theseŽ¡‘Iand–÷¤prepare“to“execute“Õ\end{¸hÖcurr‘ÿ}/entŽ‘&H&envir‘ÿ}/onment‘òɸiŽ‘a'åÕ}“¹macro“if“they“matc¸èh.“BeforeŽ¡‘Iwš¸èe– edo“this“w˜e“call“Õ\verbatim@finish“¹to“proGcess“the“last“line.“W‘ÿ*¸e“dene“Õ\nextŽ¡‘I¹via–óùÕ\edef“¹so“that“Õ\@currenvir“¹is“replaced“bš¸èy“its“expansion.“Therefore“w˜e“needŽ¡‘IÕ\noexpand–U ¹to“inhibit“the“expansion“of“Õ\end“¹at“this“pGoin¸èt.Ž¦‘E|Ô124Ž‘t»ÐÐ\ifx\@tempc\@currenvirŽ¤ ‘E|Ô125Ž‘~.lÐ\verbatim@finishŽ¡‘E|Ô126Ž‘~.lÐ\edef\next{\noexpand\end{\@currenvir}%ŽŸq‘I¹Without–_¥this“tricš¸èk“the“Õ\end“¹command“w˜ould“not“bGe“able“to“correctly“c˜hec˜k“whetherŽ¤ ‘Iits–ëargumenš¸èt“matc˜hes“the“name“of“the“curren˜t“en˜vironmen˜t“and“y˜ou'd“get“anŽ¡‘Iinš¸èteresting–U LŸýï‘üf ÔAŽŽ‘Íz¹T‘þUYŸ&úEŽ‘ã9X“error“message“suc˜h“as“:Ž¦‘IÐ!–¹N\begin{verbatim*}“ended“by“\end{verbatim*}.ŽŸq‘I¹But–½7what“do“wš¸èe“do“with“the“rest“of“the“c˜haracters,“those“that“remain“on“that“line‘ª“?Ž¡‘IW‘ÿ*¸e–Eôcall“Õ\verbatim@rescan“¹to“takš¸èe“care“of“that.“Its“rst“argumen˜t“is“the“name“ofŽ¡‘Ithe›%Pen•¸èvironmen“t˜just˜ended,˜in˜case˜w“e˜need˜it˜again.˜Õ\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@@@¹.)“Since“w˜e“are“still“in“anŽ¡‘IÕ\edef–U ¹wš¸èe“protect“it“b˜y“means“ofÕ\noexpand¹.Ž¦‘E|Ô127Ž’²$ÆÐ\noexpand\verbatim@rescan{\@currenvir}}%ŽŸq‘I¹If–5mthe“names“do“not“matcš¸èh,“w˜e“reinsert“ev˜erything“read“up“to“no˜w“and“prepare“toŽ¡‘Icall–U Õ\verbatim@“¹to“proGcess“the“rest“of“the“line.Ž¦‘E|Ô128Ž‘t»ÐÐ\elseŽ¤ ‘E|Ô129Ž‘~.lÐ\expandafter\verbatim@addtolineŽ¡‘E|Ô130Ž’‡¡Ð\expandafter{\the\@temptokena[}%Ž¡‘E|Ô131Ž’‡¡Ð\expandafter\verbatim@addtolineŽ¡‘E|Ô132Ž’‘¤Ð\expandafter{\@tempc]}%Ž¡‘E|Ô133Ž‘~.lÐ\let\next\verbatim@Ž¡‘E|Ô134Ž‘t»ÐÐ\fiŽŸq‘I¹Finally–U w¸èe“call“Õ\next¹.Ž¦‘E|Ô135Ž‘t»ÐÐ\next}%ŽŸ*V‘ó±Ò\verbatim@rescanŽŽŽ‘I¹In–Û¤principle“Õ\verbatim@rescan“¹could“bGe“used“to“analyse“the“c¸èharacters“remainingŽ¤ ‘Iafter–the“Õ\end{...}“¹command“and“pretend“that“these“w¸èere“read“propGerly,“as-Ž¡‘Isuming–:-standard‘ucategory“cošGdes“are“in“force.Ÿü^ÿÔ1ŽŽ‘¶_¹But“this“is“not“alw•¸èa“ys‘:-p˜ossibleŽ¡‘I(when–Êthere“are“unmatcš¸èhed“curly“braces“in“the“rest“of“the“line).“Besides,“w˜e“thinkŽ¡‘Ithat–ƒfthis“is“not“wš¸èorth“the“eort“:“After“a“Õverbatim“¹or“Õverbatim*“¹en˜vironmen˜t“aŽ¡‘Inew–Xline“in“the“output“is“bšGegun“an•¸èyw“a“y‘ÿ*¸,–Xand“an“Õ\end{comment}“¹can“easily“b˜e“putŽ¡‘Ion–Ìéa“line“bš¸èy“itself.“So“there“is“no“reason“wh˜y“there“should“bGe“an˜y“text“here.“F‘ÿ*¸or“theŽ¡‘IbšGenet–Eáof“the“user“who“did“put“something“there“(a“commen¸èt,“p˜erhaps)“w¸èe“simplyŽ¡‘Iissue–˜Ha“w¸èarning“and“drop“them.“The“methošGd“of“testing“is“explained“in“App˜endix“D,Ž¡‘Ip.–376“of“the“T‘þUYŸ&úEŽ‘ã9Xb•Go“ok.–W‘ÿ*¸e“use“Õ^^M‘è¹instead“of“the“Õ!“¹c¸èharacter“used“there“sinceŽ‘IŸff‰ffÿrŸ E¼‘ !iŸý-:Ï1ŽŽŽ‘KÙó5¦÷²"ecrm0800àRememšÃ’b–¹NExpect“``characters“dropped''Ž¤ ‘E|Ô252Ž‘~.lÐwarning–¹Nmessages“in“this“test!“<====}Ž¡‘E|Ô253Ž‘Sª®Ð\typeout{}Ž¡‘E|Ô254ŽŽ¡‘E|255Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô256Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô257Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô258Ž‘]JÐ\begin{verbatim}Ž¡‘E|Ô259Ž‘fæÐtestŽ¡‘E|Ô260Ž‘fæÐ\end{verbatim*}Ž¡‘E|Ô261Ž‘fæÐtestŽ¡‘E|Ô262Ž‘fæÐ\end{verbatimŽ¡‘E|Ô263Ž‘fæÐtest–¹Nof“ligatures:“<`!`?`>Ž¡‘E|Ô264Ž‘fæÐ\endverbatimŽ¡‘E|Ô265Ž‘fæÐtestŽ¡‘E|Ô266Ž‘fæÐ\end‘ rœverbatimŽ¡‘E|Ô267Ž‘fæÐtestŽ¡‘E|Ô268Ž‘fæÐtest–¹Nof“end“of“line:Ž¡‘E|Ô269Ž‘fæÐ\endŽ¡‘E|Ô270Ž‘fæÐ{verbatim}Ž¡‘E|Ô271Ž‘]JÐ\end{verbatim}–¹NFurther“text“to“be“typeset:“$\alpha$.Ž¡‘E|Ô272Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô273Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô274Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô275Ž‘]JÐ\begin{verbatim*}Ž¡‘E|Ô276Ž‘fæÐtestŽ¡‘E|Ô277Ž‘fæÐtestŽ¡‘E|Ô278Ž‘]JÐ\end‘¹N{verbatim*}Ž¡‘E|Ô279Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô280Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô281Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô282Ž‘]JÐ\begin{verbatim*}‘ rœbla‘¹NblaŽ¡‘E|Ô283Ž‘fæÐtestŽ¡‘E|Ô284Ž‘fæÐtestŽ¡‘E|Ô285Ž‘]JÐ\end‘¹N{verbatim*}Ž¡‘E|Ô286Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô287Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô288Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô289Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô290ŽŽ¡‘E|291Ž‘Sª®ÐFirst–¹Nof“Chris“Rowley's“fiendish“tests:Ž¡‘E|Ô292Ž‘Sª®Ð\begin{verbatim}Ž¡‘E|Ô293Ž‘Sª®Ðthe–¹Ndouble“end“testŽ¡‘E|Ô294Ž‘Sª®Ð\end\end{verbatim}‘ rœor–¹Neven“\end“\end{verbatim}Ž¡‘E|Ô295Ž‘Sª®Ð%Ž¡‘E|Ô296Ž‘Sª®Ð%not‘¹N\end\ended??Ž¡‘E|Ô297Ž‘Sª®Ð%\end{verbatim}Ž¡‘E|Ô298ŽŽ¡‘E|299Ž‘Sª®ÐAnother–¹Nof“Chris'“devils:Ž¡‘E|Ô300Ž‘Sª®Ð\begin{verbatim}Ž¡‘E|Ô301Ž‘Sª®Ðthe–¹Nsingle“brace“testŽ¡‘E|Ô302Ž‘Sª®Ð\end{not–¹Nthe“end\end{verbatim}Ž¡‘E|Ô303Ž‘Sª®Ð%Ž¡‘E|Ô304Ž‘Sª®Ð%not‘¹N\end}ed??ŽŽŽŒ‹èÆ ª ýs‘IÚOptions–U de“V‘ÿ*¸erbatim’ýF\¹20ŽŽ o ý´‘E|Ô305Ž‘Sª®Ð%\end{verbatim}Ž¤ ‘E|Ô306Ž‘Sª®ÐBack–¹Nto“my“own“tests:Ž¡‘E|Ô307Ž‘]JÐ\begin{myverbatim}Ž¡‘E|Ô308Ž‘fæÐtestŽ¡‘E|Ô309Ž‘fæÐtestŽ¡‘E|Ô310Ž‘]JÐ\end–¹N{myverbatim}“rest“of“lineŽ¡‘E|Ô311Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô312Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô313Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô314ŽŽ¡‘E|315Ž‘Sª®ÐTest–¹Nof“empty“verbatim:Ž¡‘E|Ô316Ž‘Sª®Ð\begin{verbatim}Ž¡‘E|Ô317Ž‘Sª®Ð\end{verbatim}Ž¡‘E|Ô318Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô319Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô320Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô321Ž‘]JÐ\begin‘¹N{verbatimlisting}{verbtest.tex}Ž¡‘E|Ô322Ž‘fæÐAdditonal–¹Nverbatim“textŽ¡‘E|Ô323Ž‘p‚Ð...Ž¡‘E|Ô324Ž‘]JÐ\end{verbatimlisting}Ž¡‘E|Ô325Ž‘Sª®ÐAnd–¹Nhere“for“listing“a“file:Ž¡‘E|Ô326Ž‘]JÐ\verbatiminput{verbtest.tex}Ž¡‘E|Ô327Ž‘Sª®ÐAnd–¹Nagain,“with“explicit“spaces:Ž¡‘E|Ô328Ž‘]JÐ\verbatiminput*{verbtest.tex}Ž¡‘E|Ô329Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô330Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô331Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô332Ž‘]JÐ\begin{comment}Ž¡‘E|Ô333Ž‘fæÐtestŽ¡‘E|Ô334Ž‘fæÐ\end{verbatim*}Ž¡‘E|Ô335Ž‘fæÐtestŽ¡‘E|Ô336Ž‘fæÐ\end‘¹N{commentŽ¡‘E|Ô337Ž‘fæÐtestŽ¡‘E|Ô338Ž‘fæÐ\endverbatimŽ¡‘E|Ô339Ž‘fæÐtestŽ¡‘E|Ô340Ž‘fæÐ\end‘ rœverbatimŽ¡‘E|Ô341Ž‘fæÐtestŽ¡‘E|Ô342Ž‘]JÐ\end–¹N{comment}“Further“text“to“be“typeset:“$\alpha$.Ž¡‘E|Ô343Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô344Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô345Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô346Ž‘]JÐ\begin{comment}‘ rœbla‘¹NblaŽ¡‘E|Ô347Ž‘fæÐtestŽ¡‘E|Ô348Ž‘fæÐtestŽ¡‘E|Ô349Ž‘]JÐ\end‘¹N{comment}Ž¡‘E|Ô350Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô351Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô352Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô353Ž‘Sª®ÐText–¹NText“Text“Text“Text“Text“Text“Text“Text“Text“TextŽ¡‘E|Ô354ŽŽ¡‘E|355Ž‘Sª®Ð\begin{verbatimwrite}{verbtest.txt}Ž¡‘E|Ô356Ž‘Sª®ÐasfaG®G®ectt1728óÓ·å ecrm1200óUªsÉG®G®ecrm1728ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10óKñ`y cmr10ùýÃßßßßßß