From e7d22f9c3388947b1b1e5e8c8519c9ae0684a96f Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 28 Feb 2007 22:32:28 +0000 Subject: listings update (28feb07) git-svn-id: svn://tug.org/texlive/trunk@4002 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/latex/listings/Makefile | 37 + .../source/latex/listings/listings-1.3.dtx | 15958 ------------------ .../source/latex/listings/listings-1.3.ins | 48 - .../texmf-dist/source/latex/listings/listings.dtx | 16516 +++++++++++++++++++ .../texmf-dist/source/latex/listings/listings.ins | 48 + .../source/latex/listings/lstdrvrs-1.3.dtx | 5347 ------ .../texmf-dist/source/latex/listings/lstdrvrs.dtx | 6380 +++++++ .../texmf-dist/source/latex/listings/lstdrvrs.ins | 14 +- 8 files changed, 22988 insertions(+), 21360 deletions(-) create mode 100644 Master/texmf-dist/source/latex/listings/Makefile delete mode 100644 Master/texmf-dist/source/latex/listings/listings-1.3.dtx delete mode 100644 Master/texmf-dist/source/latex/listings/listings-1.3.ins create mode 100644 Master/texmf-dist/source/latex/listings/listings.dtx create mode 100644 Master/texmf-dist/source/latex/listings/listings.ins delete mode 100644 Master/texmf-dist/source/latex/listings/lstdrvrs-1.3.dtx create mode 100644 Master/texmf-dist/source/latex/listings/lstdrvrs.dtx (limited to 'Master/texmf-dist/source/latex/listings') diff --git a/Master/texmf-dist/source/latex/listings/Makefile b/Master/texmf-dist/source/latex/listings/Makefile new file mode 100644 index 00000000000..9ecf8b6f552 --- /dev/null +++ b/Master/texmf-dist/source/latex/listings/Makefile @@ -0,0 +1,37 @@ +# This file generates files required to use the listings package. +# +# (c) 2007 Brooks Moses +# +# This file is distributed under the terms of the LaTeX Project Public +# License from CTAN archives in directory macros/latex/base/lppl.txt. +# Either version 1.3 or, at your option, any later version. + +.PHONY: listings pdf pdf-devel all + +listings: listings.sty + +pdf: listings.pdf + +pdf-devel: listings-devel.pdf + +all: listings pdf pdf-devel + + +listings.sty: listings.dtx listings.ins lstdrvrs.dtx + tex listings.ins + +listings.pdf: listings.sty + rm -f ltxdoc.cfg + pdflatex listings.dtx + makeindex -s gind.ist listings + pdflatex listings.dtx + pdflatex listings.dtx + +listings-devel.pdf: listings.sty + rm -rf ltxdoc.cfg + echo "\AtBeginDocument{\AlsoImplementation}" > ltxdoc.cfg + pdflatex -jobname=listings-devel listings.dtx + makeindex -s gind.ist listings-devel + pdflatex -jobname=listings-devel listings.dtx + pdflatex -jobname=listings-devel listings.dtx + rm -rf ltxdoc.cfg diff --git a/Master/texmf-dist/source/latex/listings/listings-1.3.dtx b/Master/texmf-dist/source/latex/listings/listings-1.3.dtx deleted file mode 100644 index 2776eae2b54..00000000000 --- a/Master/texmf-dist/source/latex/listings/listings-1.3.dtx +++ /dev/null @@ -1,15958 +0,0 @@ -% \iffalse -% -% Trademarks appear throughout this documentation without any trademark -% symbol, so you can't assume that a name is free. There is no intention -% of infringement; the usage is to the benefit of the trademark owner. -% -% -% S O F T W A R E L I C E N S E -% ================================= -% -% The files listings.dtx and listings.ins and all files generated -% from only these two files are referred to as `the listings package' -% or simply `the package'. lstdrvrs.dtx and the files generated from -% that file are `drivers'. -% -% The listings package is copyright 1996--2004 Carsten Heinz, and -% continued maintenance on the package is copyright 2006 Brooks Moses. -% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004 any -% individual author listed in the driver files. -% -% The listings package and its drivers may be distributed and/or modified -% under the conditions of the LaTeX Project Public License, either version -% 1.3 of this license or (at your option) any later version. -% The latest version of this license is in -% http://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of LaTeX -% version 2003/12/01 or later. -% -% The package has the LPPL maintenance status "maintained". -% -% The Current Maintainer is Brooks Moses . -% -% end of software license -% -% -%<*driver> -\documentclass[a4paper]{ltxdoc} -\DisableCrossrefs -\OnlyDescription - -\usepackage{lstdoc,textcomp} -\makeindex - -\begin{document} - \DocInput{listings-1.3.dtx} -\end{document} -% -% \fi -% -%^^A -%^^A Command/key to aspect relation -%^^A ================================ -%^^A -%\lstisaspect[strings]{string,morestring,deletestring,stringstyle,showstringspaces} -%\lstisaspect[comments]{comment,morecomment,deletecomment,commentstyle} -%\lstisaspect[pod]{printpod,podcomment} -%\lstisaspect[escape]{texcl,escapebegin,escapeend,escapechar,escapeinside,mathescape} -%\lstisaspect[keywords]{sensitive,classoffset,keywords,morekeywords,deletekeywords,keywordstyle,ndkeywords,morendkeywords,deletendkeywords,ndkeywordstyle,keywordsprefix,otherkeywords} -%\lstisaspect[emph]{emph,moreemph,deleteemph,emphstyle} -%\lstisaspect[tex]{texcs,moretexcs,deletetexcs,texcsstyle} -%\lstisaspect[directives]{directives,moredirectives,deletedirectives,directivestyle} -%\lstisaspect[html]{tag,usekeywordsintag,tagstyle,markfirstintag} -%\lstisaspect[keywordcomments]{keywordcomment,morekeywordcomment,deletekeywordcomment,keywordcommentsemicolon} -%\lstisaspect[index]{index,moreindex,deleteindex,indexstyle,\string\lstindexmacro} -%\lstisaspect[procnames]{procnamestyle,indexprocnames,procnamekeys,moreprocnamekeys,deleteprocnamekeys} -%\lstisaspect[style]{style,\string\lstdefinestyle,\string\lst@definestyle,\string\lststylefiles} -%\lstisaspect[language]{language,alsolanguage,defaultdialect,\string\lstalias,\string\lstdefinelanguage,\string\lst@definelanguage,\string\lstloadlanguages,\string\lstlanguagefiles} -%\lstisaspect[formats]{format,fmtindent,\string\lstdefineformat,\string\lst@defineformat,\string\lstformatfiles} -%\lstisaspect[labels]{numbers,numberstyle,numbersep,stepnumber,numberblanklines,firstnumber,\string\thelstnumber,numberfirstline} -%\lstisaspect[lineshape]{xleftmargin,xrightmargin,resetmargins,linewidth,lineskip,breaklines,breakindent,breakautoindent,prebreak,postbreak,breakatwhitespace} -%\lstisaspect[frames]{framexleftmargin,framexrightmargin,framextopmargin,framexbottommargin,backgroundcolor,fillcolor,rulecolor,rulesepcolor,rulesep,framerule,framesep,frameshape,frameround,frame} -%\lstisaspect[make]{makemacrouse} -%\lstisaspect[fancyvrb]{fancyvrb,fvcmdparams,morefvcmdparams} -%\lstisaspect[lgrind]{lgrindef,\string\lstlgrindeffile} -%\lstisaspect[hyper]{hyperref,morehyperref,deletehyperref,hyperanchor,hyperlink} -%\lstisaspect[kernel]{basewidth,fontadjust,columns,flexiblecolumns,identifierstyle,^^A -% tabsize,showtabs,tab,showspaces,keepspaces,formfeed,SelectCharTable,^^A -% MoreSelectCharTable,extendedchars,alsoletter,alsodigit,alsoother,excludedelims,^^A -% literate,basicstyle,print,firstline,lastline,linerange,nolol,captionpos,abovecaptionskip,^^A -% belowcaptionskip,label,title,caption,\string\lstlistingname,boxpos,float,^^A -% floatplacement,aboveskip,belowskip,everydisplay,showlines,emptylines,gobble,name,^^A -% \string\lstname,\string\lstlistlistingname,\string\lstlistoflistings,^^A -% \string\lstnewenvironment,\string\lstinline,\string\lstinputlisting,lstlisting,^^A -% \string\lstloadaspects,\string\lstset,\string\thelstlisting,\string\lstaspectfiles,^^A -% inputencoding,delim,moredelim,deletedelim,upquote} -%\lstisaspect[doc]{lstsample,lstxsample}^^A environment -%\lstisaspect[experimental]{includerangemarker,rangebeginprefix,rangebeginsuffix,rangeendprefix,rangeendsuffix,rangeprefix,rangesuffix} -% -%^^A -%^^A The long awaited beginning of documentation -%^^A ============================================= -%^^A -%\newbox\abstractbox -%\setbox\abstractbox=\vbox{ -% \begin{abstract} -% The \packagename{listings} package is a source code printer for \LaTeX. -% You can typeset stand alone files as well as listings with an environment -% similar to \texttt{verbatim} as well as you can print code snippets using -% a command similar to |\verb|. -% Many parameters control the output and if your preferred programming -% language isn't already supported, you can make your own definition. -% \end{abstract}} -% -% \title{\vspace*{-2\baselineskip}The \textsf{Listings} Package} -% \author{Copyright 1996--2004, Carsten Heinz% -% \\ Maintainer: Brooks Moses% -% \thanks{Brooks Moses became the maintainer of the \packagename{listings} -% package in 2006; see the Preface for details.} % -% \textless\lstemail\textgreater} -% \date{2006/05/08\enspace\enspace Version 1.3c\\ \box\abstractbox} -% \def\lstemail{\href{mailto:bmoses@dpdx.net}{\texttt{bmoses@dpdx.net}}} -% \ifhyper -% \hypersetup{pdfsubject=Package guide,pdfauthor=Brooks Moses } -% \fi -% -% \csname @twocolumntrue\endcsname -% \maketitle -%^^A \enlargethispage{2\baselineskip} -% \csname @starttoc\endcsname{toc} -% \onecolumn -% -% -% \section*{Preface} -% -% \paragraph{Transition of package maintenance} -% The \TeX\ world lost contact with Carsten Heinz in late 2004, shortly after -% he released version 1.3b of the \packagename{listings} package. After many -% attempts to reach him had failed, Hendri Adriaens took over maintenance of -% the package in accordance with the LPPL's procedure for abandoned packages. -% He then passed the maintainership of the package to Brooks Moses, who had -% volunteered for the position while this procedure was going through. -% -% This release, version 1.3c, is not yet a long-awaited bugfix release, as I -% have neither a list of bugs that have been reported since 1.3b, nor a good -% comprehensive test suite to make sure that my fixes don't break things. -% (It does have some very minor corrections to the Erlang and Octave language -% definitions that were reported to the Debian bug system, and a minor -% internal spped improvement placed in \texttt{lstpatch.sty}, but other than that -% the only changes are the alteration of the maintanence information and the -% inclusion of this prefatory note.) I would very much appreciate it if users -% would email any outstanding bug reports to me at \lstemail, along with any -% examples of tricky uses of the package that should be included in the test -% suite. -% -% \paragraph{Reading this manual} -% If you are experienced with the \packagename{listings} package, you should -% read the next paragraph ``\emph{News and changes}''. Otherwise read section -% \lstref{uGettingStarted} step by step and go on with section -% \ref{uTheNextSteps}. -% -% \paragraph{News and changes} -% Version 1.3 is the third bugfix release. The most noteworthy news for the -% tortured\,---\,I mean experienced\,---\,user is a new |\output| routine, -% which improves the compatibility to other packages. Therefore the temporary -% key |noxoutput| has been removed. -% -% |texcs| became a family, i.e.~you can highlight your own control sequences -% diffently from the already defined ones: |texcsstyle=|[|*|]\oarg{class number}\ldots\space -% and |texcs=|\oarg{classnumber}\ldots\space -% Note the added optional star, which also highlights the backslash in front of -% the control sequence name. And don't forget to check page \pageref{roption:texcsstyle} -% for a bug. -% -% |keywordstyle| has a small add-on (see page \pageref{roption:keywordstyle}) -% and |extendedchars| is turned on by default. -% -%^^A undocumented: -%^^A inputpath= -%^^A useoutput=0|1|2 -%^^A uses no (0), old (1), or new (2) output routine -%\iffalse -% \begin{table}[hbp] -% \footnotesize -% \begin{center} -% \begin{tabular}{@{}rlrl@{}} -% \emph{new to 1.2}&&&\\[1ex] -% \multicolumn{4}{l}{\texttt{breakatwhitespace} (page \pageref{uoption:breakatwhitespace})}\\ -% \multicolumn{4}{l}{\texttt{linerange} (page \pageref{uoption:linerange})}\\ -% & & \\ -% \emph{1.0}&\emph{1.1 and later}&\emph{1.0}&\emph{1.1 and later}\\[1ex] -% \texttt{keywordsinside} & \texttt{tag} (page \pageref{uoption:tag}) -% & --- & \texttt{final}$^*$ (p.\,\pageref{uoption:final})\\ -% --- & \texttt{tagstyle} (p.\,\pageref{uoption:tagstyle}) -% & --- & \texttt{numberfirstline} (p.\,\pageref{uoption:numberfirstline})\\ -% --- & \texttt{markfirstintag} (p.\,\pageref{uoption:markfirstintag}) -% & --- & \texttt{upquote} (p.\,\pageref{uoption:upquote})\\ -% \texttt{usekeywordsinside}& \texttt{usekeywordsintag} (p.\,\pageref{uoption:usekeywordsintag}) -% & & \\ -% & & --- & \texttt{fvcmdparams} (p.\,\pageref{uoption:fvcmdparams})\\ -% & & --- & \texttt{morefvcmdparams} (p.\,\pageref{uoption:morefvcmdparams})\\[2ex] -% \emph{0.21}&\emph{1.x}&\emph{0.21}&\emph{1.x}\\[1ex] -% \texttt{first} & \texttt{firstline} & --- & \texttt{numbers}\\ -% \texttt{last} & \texttt{lastline} & \texttt{labelstep} & \texttt{stepnumber}\\ -% \texttt{stringspaces} & \texttt{showstringspaces} & \texttt{labelstyle} & \texttt{numberstyle}\\ -% \texttt{visiblespaces} & \texttt{showspaces} & \cs{thelstlabel} & \cs{thelstnumber}\\ -% \texttt{visibletabs} & \texttt{showtabs} & \texttt{labelsep} & \texttt{numbersep}\\ -% \texttt{framerulewidth} & \texttt{framerule} & \texttt{firstlabel} & \texttt{firstnumber}\\ -% \texttt{framerulesep} & \texttt{rulesep} & \texttt{advancelabel} & ---\\ -% \texttt{frametextsep} & \texttt{framesep} & \texttt{spread} & ---\\ -% \texttt{framespread} & superceded by & \texttt{indent} & \texttt{xleftmargin}$^3$\\ -% & \texttt{framexleftmargin} & --- & \texttt{xrightmargin}\\ -% & \texttt{framexrightmargin} & \texttt{wholeline} & \texttt{resetmargins}\\ -% & \texttt{framextopmargin} & \texttt{defaultclass} & \texttt{classoffset}\\ -% & \texttt{framexbottommargin} & \texttt{stringtest} & ---\\ -% \texttt{framerulecolor} & \texttt{rulecolor}$^1$ & \texttt{outputpos} & ---\\ -% --- & \texttt{columns}$^2$ -% \end{tabular} -% \end{center} -% \parindent=20pt\relax -% \par\indent $^*$ This is an option for package loading only. -% \par\indent $^1$ \emph{All} color-keys require now an explicit \cs{color} command in the value. -% \par\indent $^2$ Please look at section \ref{uFixedAndFlexibleColumns}. -% \par\indent $^3$ Now frames are also moved! -% \end{table} -%\fi -% The following languages were added: Awk (Gnu and Posix), Gnuplot, Handel-C, -% ByteCode Java (\texttt{JVMIS}), Plasm, Promella, and RSL, refer table~ref{uPredefinedLanguages}. -% Moreover, {\small HTML}, AspectJ, and MetaPost have been improved. -% Thanks go to the contributers. -% -% \vfill -% \paragraph{Thanks} -% There are many people I have to thank for fruitful communication, posting -% their ideas, giving error reports, adding programming languages to -% \texttt{lstdrvrs.dtx}, and so on. Their names are listed in section -% \ref{uClosingAndCredits}. -% -% \paragraph{Trademarks} -% Trademarks appear throughout this documentation without any trademark -% symbol; they are the property of their respective trademark owner. -% There is no intention of infringement; the usage is to the benefit of the -% trademark owner. -% -% -% \clearpage -% -% -% \part{User's guide} -% -% -% \section{Getting started}\label{uGettingStarted} -% -% -% \subsection{A minimal file}\label{uAMinimalFile} -% -% Before using the \packagename{listings} package, you should be familiar with -% the \LaTeX\ typesetting system. You need not to be an expert. -% Here is a minimal file for \packagename{listings}. -% \begin{verbatim} -% \documentclass{article} -% \usepackage{listings} -% -% \begin{document} -% \lstset{language=Pascal} -% -% % Insert Pascal examples here. -% -% \end{document}\end{verbatim} -% Now type in this first example and run it through \LaTeX. -% \begin{advise} -% \item Must I do that really? -% \advisespace -% Yes and no. Some books about programming say this is good. -% What a mistake! Typing takes time---wasted if the code is clear to -% you. And if you need that time to understand what is going on, the -% author of the book should reconsider the concept of presenting the -% crucial things---you might want to say that about this guide even---or -% you're simply unexperienced with programming. If only the latter case -% applies, you should spend more time on reading (good) books about -% programming, (good) documentations, and (good) source code from other -% people. Of course you should also make your own experiments. -% You will learn a lot. However, running the example through \LaTeX\ -% shows whether the \packagename{listings} package is installed. -% \item The example doesn't work. -% \advisespace -% Are the two packages \packagename{listings} and \packagename{keyval} -% installed on your system? Consult the administration tool of your -% \TeX\ distribution, your system administrator, the local \TeX\ and -% \LaTeX\ guides, a \TeX\ FAQ, and section \ref{rInstallation}---in -% the given order. If you've checked \emph{all} these sources and are -% still helpless, you might want to write a post to a \TeX\ newsgroup -% like \texttt{comp.text.tex}. -% \item Should I read the software license before using the package? -% \advisespace -% Yes, but read this \emph{Getting started} section first to decide -% whether you are willing to use the package.^^A ;-) -% \end{advise} -% -% -% \subsection{Typesetting listings} -% -% Three types of source codes are supported: code snippets, code segments, and -% listings of stand alone files; snippets are placed inside paragraphs and the -% others as separate paragraphs---the difference is the same as between text -% style and display style formulas. -% \begin{advise} -% \item No matter what kind of source you have, if a listing contains national -% characters like \'e, \L, \"a, or whatever, you must tell it the -% package! Section \lstref{uSpecialCharacters} discusses this issue. -% \end{advise} -% -% \paragraph{Code snippets} -% The well-known \LaTeX\ command |\verb| typesets code snippets verbatim. -% The new command |\lstinline| pretty-prints the code, for example -%`\lstinline!var i:integer;!' is typeset by -%`{\rstyle|\lstinline|}|!var i:integer;!|'. The exclamation marks delimit -% the code and can be replaced by any character not in the code; -% |\lstinline$var i:integer;$| gives the same result. -% -% \paragraph{Displayed code} -% The \texttt{lstlisting} environment typesets the enclosed source code. Like -% most examples, the following one shows verbatim \LaTeX\ code on the right -% and the result on the left. You might take the right-hand side, put it into -% the minimal file, and run it through \LaTeX. -% \begin{lstsample}[lstlisting]{}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% It can't be easier. -% \begin{advise} -% \item That's not true. The name `\texttt{listing}' is shorter. -% \advisespace -% Indeed. But other packages already define environments with that name. -% To be compatible with such packages, all commands and environments of -% the \packagename{listings} package use the prefix `\texttt{lst}'. -% \end{advise} -% The environment provides an optional argument. It tells the package to -% perform special tasks, for example, to print only the lines 2--5: -% \begin{lstsample}{\lstset{frame=trbl,framesep=0pt}\label{gFirstKey=ValueList}}{} -% \begin{lstlisting}[firstline=2, -% lastline=5] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item Hold on! Where comes the frame from and what is it good for? -% \advisespace -% You can put frames around all listings except code snippets. -% You will learn it later. The frame shows that empty lines at the end -% of listings aren't printed. This is line 5 in the example. -% \item Hey, you can't drop my empty lines! -% \advisespace -% You can tell the package not to drop them: -% The key `\ikeyname{showlines}' controls these empty lines and is -% described in section \ref{rTypesettingListings}. Warning: First -% read ahead on how to use keys in general. -% \item I get obscure error messages when using `\ikeyname{firstline}'. -% \advisespace -% That shouldn't happen. Make a bug report as described in section -% \lstref{uTroubleshooting}. -% \end{advise} -% -% \paragraph{Stand alone files} -% Finally we come to |\lstinputlisting|, the command used to pretty-print -% stand alone files. It has one optional and one file name argument. -% Note that you possibly need to specify the relative path to the file. -% Here now the result is printed below the verbatim code since both together -% don't fit the text width. -% \begin{lstsample}{\lstset{comment=[l]\%,columns=fullflexible}}{\lstset{alsoletter=\\,emph=\\lstinputlisting,emphstyle=\rstyle}\lstaspectindex{\lstinputlisting}{}} -% \lstinputlisting[lastline=4]{listings.sty} -% \end{lstsample} -% \begin{advise} -% \item The spacing is different in this example. -% \advisespace -% Yes. The two previous examples have aligned columns, i.e.~columns with -% identical numbers have the same horizontal position---this package -% makes small adjustments only. The columns in the example here are not -% aligned. This is explained in section \ref{uFixedAndFlexibleColumns} -% (keyword: full flexible column format). -% \end{advise} -% -% Now you know all pretty-printing commands and environments. It remains -% to learn the parameters which control the work of the \packagename{listings} -% package. This is, however, the main task. Here are some of them. -% -% -% \subsection{Figure out the appearance}\label{gFigureOutTheAppearance} -% -% Keywords are typeset bold, comments in italic shape, and spaces in strings -% appear as \textvisiblespace. You don't like these settings? Look at this: -%\ifcolor -% \begin{lstxsample}[basicstyle,keywordstyle,identifierstyle,commentstyle,stringstyle,showstringspaces] -% \lstset{% general command to set parameter(s) -% basicstyle=\small, % print whole listing small -% keywordstyle=\color{black}\bfseries\underbar, -% % underlined bold black keywords -% identifierstyle=, % nothing happens -% commentstyle=\color{white}, % white comments -% stringstyle=\ttfamily, % typewriter type for strings -% showstringspaces=false} % no special string spaces -% \end{lstxsample} -%\else -% \begin{lstxsample}[basicstyle,keywordstyle,identifierstyle,commentstyle,stringstyle,showstringspaces] -% \lstset{% general command to set parameter(s) -% basicstyle=\small, % print whole listing small -% keywordstyle=\bfseries\underbar, -% % underlined bold keywords -% identifierstyle=, % nothing happens -% commentstyle=\itshape, % default -% stringstyle=\ttfamily, % typewriter type for strings -% showstringspaces=false} % no special string spaces -% \end{lstxsample} -%\fi -% \begin{lstsample}{}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -%\ifcolor -% \begin{advise} -% \item You've requested white coloured comments, but I can see the comment -% on the left side. -% \advisespace -% There are a couple of possible reasons: -% (1) You've printed the documentation on nonwhite paper. -% (2) If you are viewing this documentation as a \texttt{.dvi}-file, your -% viewer seems to have problems with colour specials. Try to print -% the page on white paper. -% (3) If a printout on white paper shows the comment, the colour -% specials aren't suitable for your printer or printer driver. -% Recreate the documentation and try it again---and ensure that -% the \packagename{color} package is well-configured. -% \end{advise} -%\fi -% The styles use two different kinds of commands. |\ttfamily| and |\bfseries| -% both take no arguments but |\underbar| does; it underlines the following -% argument. In general, the \emph{very last} command might read exactly one -% argument, namely some material the package typesets. There's one exception. -% The last command of \ikeyname{basicstyle} \emph{must not} read any -% tokens---or you will get deep in trouble. -% \begin{advise} -% \item `|basicstyle=\small|' looks fine, but comments look really bad with -% `|commentstyle=\tiny|' and empty basic style, say. -% \advisespace -% Don't use different font sizes in a single listing. -% \item But I really want it! -% \advisespace -% No, you don't. -%^^A The package adjusts internal data after selecting the basic style at -%^^A the beginning of each listing. This is a problem if you change the -%^^A font size for comments or strings, for example. -%^^A Section \ref{rColumnAlignment} shows how to overcome this. -%^^A But once again: Don't use different font sizes in a single listing -%^^A unless you really know what you are doing. -% \end{advise} -% -% \paragraph{Warning}\label{wStrikingStyles} -% You should be very careful with striking styles; the recent example is rather -% moderate---it can get horrible. \emph{Always use decent highlighting.} -% Unfortunately it is difficult to give more recommendations since they depend -% on the type of document you're creating. Slides or other presentations often -% require more striking styles than books, for example. -% In the end, it's \emph{you} who have to find the golden mean! -% -% -% \subsection{Seduce to use}\label{gSeduceToUse} -% -% You know all pretty-printing commands and some main parameters. Here now -% comes a small and incomplete overview of other features. The table of -% contents and the index also provide information. -% -% \paragraph{Line numbers} -% are available for all displayed listings, e.g.~tiny numbers on the left, each -% second line, with 5pt distance to the listing: -% \begin{lstxsample}[numbers,numberstyle,stepnumber,numbersep] -% \lstset{numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=5pt} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item I can't get rid of line numbers in subsequent listings. -% \advisespace -% `|numbers=none|' turns them off. -% \item Can I use these keys in the optional arguments? -% \advisespace -% Of course. Note that optional arguments modify values for one -% particular listing only: you change the appearance, step or distance -% of line numbers for a single listing. The previous values are -% restored afterwards. -% \end{advise} -% The environment allows you to interrupt your listings: you can end a listing -% and continue it later with the correct line number even if there are other -% listings in between. Read section \ref{uLineNumbers} for a thorough -% discussion. -% -% \paragraph{Floating listings} -% Displayed listings may float: -% \begin{lstsample}{\lstset{frame=tb}}{} -% \begin{lstlisting}[float,caption=A floating example] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% Don't care about the parameter \ikeyname{caption} now. And if you put the -% example into the minimal file and run it through \LaTeX, please don't wonder: -% you'll miss the horizontal rules since they are described elsewhere. -% \begin{advise} -% \item \LaTeX's float mechanism allows to determine the placement of floats. -% What's about that? -% \advisespace -% You can write `|float=tp|', for example. -% \end{advise} -% -% \paragraph{Other features} -% There are still features not mentioned so far: automatic breaking of long -% lines, the possibility to use \LaTeX\ code in listings, automated indexing, -% or personal language definitions. -% One more little teaser? Here you are. But note that the result is not -% produced by the \LaTeX\ code on the right alone. The main parameter is -% hidden. -% \begin{lstsample}{\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}}{} -% \begin{lstlisting} -% if (i<=0) then i := 1; -% if (i>=0) then i := 0; -% if (i<>0) then i := 0; -% \end{lstlisting} -% \end{lstsample} -% -% You're not sure whether you should use \packagename{listings}? -% Read the next section! -% -% -% \subsection{Alternatives} -% -% \begin{advise} -% \item Why do you list alternatives? -% \advisespace -% Well, it's always good to know the competitors.^^A :-) -% \item I've read the descriptions below and the \packagename{listings} package -% seems to incorporate all the features. Why should I use one of the -% other programs? -% \advisespace -% Firstly, the descriptions give a taste and not a complete overview, -% secondly, \packagename{listings} lacks some properties, and, eventually, -% you should use the program matching your needs most precisely. -% \end{advise} -% This package is certainly not the final utility for typesetting source code. -% Other programs do their job very well---if you are not satisfied with -% \packagename{listings}. Some are independent of \LaTeX, other come as -% separate program plus \LaTeX\ package, and other more are packages which -% don't pretty-print the source code. The second type inlcudes converters, -% cross compilers, and preprocessors. Such programs create \LaTeX\ files -% you can use in your document or stand alone ready-to-run \LaTeX\ files. -% -% Note that I'm not dealing with any literate programming tool here, which -% could also be an alternative. However, you should have heard of the -% \texttt{WEB} system, the tool Prof.~Donald E.~Knuth developed and made use -% of to document and implement \TeX. -% -% \paragraph{\href{http://www.infres.enst.fr/~demaille/a2ps}{\packagename{a2ps}}} -% started as `ASCII to PostScript' converter, but today you can invoke the -% program with \texttt{--pretty-print=}\meta{language} option. If your -% favourite programming language is not already supported, you can write your -% own so-called style sheet. You can request line numbers, borders, headers, -% multiple pages per sheet, and many more. You can even print symbols like -% $\forall$ or $\alpha$ instead of their verbose forms. If you just want -% program listings and not a document with some listings, this is the best -% choice. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/nonfree/support/lgrind}{\packagename{LGrind}}} -% is a cross compiler and comes with many predefined programming languages. -% For example, you can put the code on the right in your document, invoke -% \packagename{LGrind} with \texttt{-e} option (and file names), and run the -% created file through \LaTeX. You should get a result similar to the -% left-hand side: -% \begin{center} -% \begin{minipage}{0.45\linewidth} -%\iflgrind -% \LGindent=0pt -% \LGinlinefalse\LGbegin\lgrinde -% \L{\LB{\K{for}_\V{i}:=\V{maxint}_\K{to}_\N{0}_\K{do}}} -% \L{\LB{\K{begin}}} -% \L{\LB{____\C{}\{_do_nothing_\}\CE{}}} -% \L{\LB{\K{end};}} -% \L{\LB{}} -% \L{\LB{\V{Write}(\S{}{'}Case_insensitive_{'}\SE{});}} -% \L{\LB{\V{WritE}(\S{}{'}Pascal_keywords.{'}\SE{});}} -% \endlgrinde\LGend -%\else -% \packagename{LGrind} not installed. -%\fi -% \end{minipage} -% \begin{minipage}{0.45\linewidth} -% \begin{verbatim} -% %[ -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% %]\end{verbatim} -% \end{minipage} -% \end{center} -% If you use |%(| and |%)| instead of |%[| and |%]|, you get a code snippet -% instead of a displayed listing. Moreover you can get line numbers to the -% left or right, use arbitrary \LaTeX\ code in the source code, print symbols -% instead of verbose names, make font setup, and more. You will (have to) -% like it (if you don't like \packagename{listings}). -% -% Note that \packagename{LGrind} contains code with a no-sell license and is -% thus nonfree software. -% -% \paragraph{\href{ftp://axp3.sv.fh-mannheim.de/cvt2latex}{\packagename{cvt2ltx}}} -% is a family of `source code to \LaTeX' converters for C, Objective C, \Cpp, -% IDL and Perl. Different styles, line numbers and other qualifiers can be -% chosen by command-line option. Unfortunately it isn't documented how other -% programming languages can be added. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/support/C++2LaTeX-1_1pl1}{\packagename{\Cpp2\LaTeX}}} -% is a C/\Cpp\ to \LaTeX\ converter. You can specify the fonts for comments, -% directives, keywords, and strings, or the size of a tabulator. But as far as -% I know you can't number lines. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/support/slatex}{\packagename{S\LaTeX}}} -% is a pretty-printing Scheme program (invokes \LaTeX\ automatically) -% especially designed for Scheme and other Lisp dialects. It supports stand -% alone files, text and display listings, and you can even nest the -% commands/environments if you use \LaTeX\ code in comments, for example. -% Keywords, constants, variables, and symbols are definable and use of -% different styles is possible. No line numbers. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/support/tiny_c2l}{\packagename{tiny\textunderscore c2ltx}}} -% is a C/\Cpp/Java to \LaTeX\ converter based on \packagename{cvt2ltx} (or the -% other way round?). It supports line numbers, block comments, \LaTeX\ code -% in/as comments, and smart line breaking. Font selection and tabulators are -% hard-coded, i.e.~you have to rebuild the program if you want to change the -% appearance. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/misc}{\packagename{listing}}} -% ---note the missing \packagename{s}---is not a pretty-printer and the -% aphorism about documentation at the end of \texttt{listing.sty} is not -% true.\space ^^A :-) -% It defines |\listoflistings| and a nonfloating environment for listings. -% All font selection and indention must be done by hand. However, it's -% useful if you have another tool doing that work, e.g.~\packagename{LGrind}. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/alg}{\packagename{alg}}} -% provides essentially the same functionality as \packagename{algorithms}. -% So read the next paragraph and note that the syntax will be different. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/algorithms}{\packagename{algorithms}}} -% goes a quite different way. You describe an algorithm and the package -% formats it, for example -% \begin{center} -% \begin{minipage}{0.45\linewidth} -%\ifalgorithmic -% \begin{algorithmic} -% \IF {$i\leq0$} -% \STATE $i\gets1$ -% \ELSE\IF {$i\geq0$} -% \STATE $i\gets0$ -% \ENDIF\ENDIF -% \end{algorithmic} -%\else -% \packagename{algorithms} not installed. -%\fi -% \end{minipage} -% \begin{minipage}{0.45\linewidth} -% \begin{verbatim} -%\begin{algorithmic} -%\IF{$i\leq0$} -%\STATE $i\gets1$ -%\ELSE\IF{$i\geq0$} -%\STATE $i\gets0$ -%\ENDIF\ENDIF -%\end{algorithmic}\end{verbatim} -% \end{minipage} -% \end{center} -% As this example shows, you get a good looking algorithm even from a bad -% looking input. The package provides a lot more constructs like |for|-loops, -% |while|-loops, or comments. You can request line numbers, `ruled', `boxed' -% and floating algorithms, a list of algorithms, and you can customize the -% terms \textbf{if}, \textbf{then}, and so on. -% -% \paragraph{\href{http://www.mimuw.edu.pl/~wolinski/pretprin.html}{\packagename{pretprin}}} -% is a package for pretty-printing texts in formal languages---as the title -% in TUGboat, Volume 19 (1998), No.~3 states. It provides environments which -% pretty-print \emph{and} format the source code. Analyzers for Pascal and -% Prolog are defined; adding other languages is easy---if you are or get a bit -% familiar with automatons and formal languages. -% -% \paragraph{\packagename{alltt}} -% defines an environment similar to \texttt{verbatim} except that |\|, |{| and -% |}| have their usual meanings. This means that you can use commands in the -% verbatims, e.g.~select different fonts or enter math mode. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/moreverb}{\packagename{moreverb}}} -% requires \packagename{verbatim} and provides verbatim output to a file, -% `boxed' verbatims and line numbers. -% -% \paragraph{\packagename{verbatim}} -% defines an improved version of the standard \texttt{verbatim} environment and -% a command to input files verbatim. -% -% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/fancyvrb}{\packagename{fancyvrb}}} -% is, roughly spoken, a super set of \packagename{alltt}, -% \packagename{moreverb}, and \packagename{verbatim}, but many more parameters -% control the output. The package provides frames, line numbers on the left or -% on the right, automatic line breaking (difficult), and more. For example, an -% interface to \packagename{listings} exists, i.e.~you can pretty-print source -% code automatically. -% The package \packagename{fvrb-ex} builds above \packagename{fancyvrb} and -% defines environments to present examples similar to the ones in this guide. -% -% -% \section{The next steps}\label{uTheNextSteps} -% -% Now, before actually using the \packagename{listings} package, you should -% \emph{really} read the software license. It does not cost much time and -% provides information you probably need to know. -% -% -% \subsection{Software license}\label{uSoftwareLicense} -% -% The files \texttt{listings.dtx} and \texttt{listings.ins} and all -% files generated from only these two files are referred to as `the -% \packagename{listings} package' or simply `the package'. -% \texttt{lstdrvrs.dtx} and the files generated from that file are -% `drivers'. -% -% \paragraph{Copyright} -% The \packagename{listings} package is copyright 1996--2004 Carsten Heinz, -% and copyright 2006 Brooks Moses. The drivers are copyright any individual -% author listed in the driver files. -% -% \paragraph{Distribution and modification} -% The \packagename{listings} package and its drivers may be distributed -% and/or modified under the conditions of the LaTeX Project Public License, -% either version 1.3 of this license or (at your option) any later version. -% The latest version of this license is in -% \href{http://www.latex-project.org/lppl.txt}{http://www.latex-project.org/lppl.txt} -% and version 1.3 or later is part of all distributions of LaTeX version -% 2003/12/01 or later. -% -% \paragraph{Contacts} -% Read section \lstref{uTroubleshooting} on how to submit a bug report. -% Send all other comments, ideas, and additional programming languages to -% \lstemail\ using \texttt{listings} as part of the subject. -% -% -% \subsection{Package loading}\label{uPackageLoading} -% -% As usual in \LaTeX, the package is loaded by -% |\usepackage[|\meta{options}|]{listings}|, -% where |[|\meta{options}|]| is optional and gives a comma separated list of -% options. Each either loads an additional \packagename{listings} aspect, or -% changes default properties. Usually you don't have to take care of such -% options. But in some cases it could be necessary: if you want to compile -% documents created with an earlier version of this package or if you use -% special features. Here's an incomplete list of possible options. -% \begin{advise} -% \item Where is a list of all options? -% \advisespace -% In the developer's guide since they were introduced to debug the -% package more easily. Read section \ref{uHowTos} on how to get that -% guide. -% \end{advise} -% \begin{description} -% \item[\normalfont\texttt{0.21}]\leavevmode -% -% compiles a document created with version 0.21. -% -% \item[\normalfont\texttt{draft}]\leavevmode -% -% The package prints no stand alone files, but shows the captions and -% defines the corresponding labels. -% Note that a global |\documentclass|-option \texttt{draft} is -% recognized, so you don't need to repeat it as a package option. -% -% \item[\normalfont\texttt{final}]\leavevmode\label{uoption:final} -% -% Overwrites a global \texttt{draft} option. -% -% \item[\normalfont\texttt{savemem}]\leavevmode -% -% tries to save some of \TeX's memory. If you switch between languages -% often, it could also reduce compile time. But all this depends on the -% particular document and its listings. -% \end{description} -% Note that various experimental features also need explicit loading via -% options. Read the respective lines in section \ref{rExperimentalFeatures}. -% -% \medbreak -% After package loading it is recommend to load all used dialects of programming -% languages with the following command. It is faster to load several languages -% with one command than loading each language on demand. -% \begin{syntax} -% \item {\rstyle\icmdname\lstloadlanguages}\marg{comma separated list of languages} -% -% Each language is of the form \oarg{dialect}\meta{language}. Without -% the optional \oarg{dialect} the package loads a default dialect. So -% write `|[Visual]C++|' if you want Visual \Cpp\ and `|[ISO]C++|' for -% ISO \Cpp. Both together can be loaded by the command -% |\lstloadlanguages{[Visual]C++,[ISO]C++}|. -% -% Table \ref{uPredefinedLanguages} on page \pageref{uPredefinedLanguages} -% shows all defined languages and their dialects. -% \end{syntax} -%^^A After or even before language loading, you might want to define default -%^^A dialects---just to be independent of configuration files. -% -% -% \subsection{The key=value interface}\label{uTheKey=ValueInterface} -% -% This package uses the \packagename{keyval} package from the -% \packagename{graphics} bundle by David Carlisle. Each parameter is -% controlled by an associated key and a user supplied value. For example, -% \ikeyname{firstline} is a key and |2| a valid value for this key. -% -% The command {\rstyle\icmdname\lstset} gets a comma separated list of -% ``key|=|value'' pairs. The first list with more than a single entry is on -% page \pageref{gFirstKey=ValueList}: |firstline=2,lastline=5|. -% \begin{advise} -% \item So I can write `|\lstset{firstline=2,lastline=5}|' once for all? -% \advisespace -% No. `\ikeyname{firstline}' and `\ikeyname{lastline}' belong to a small -% set of -% keys which are used on individual listings. However, your command is -% not illegal---it has no effect. You have to use these keys inside the -% optional argument of the environment or input command. -% \item What's about a better example of a key|=|value list? -% \advisespace -% There is one in section \ref{gFigureOutTheAppearance}. -% \item `|language=[77]Fortran|' does not work inside an optional argument. -% \advisespace -% You must put braces around the value if a value with optional argument -% is used inside an optional argument. In the case here write -% `|language={[77]Fortran}|' to select Fortran 77. -% \item If I use the `\ikeyname{language}' key inside an optional argument, the -% language isn't active when I typeset the next listing. -% \advisespace -% All parameters set via `|\lstset|' keep their values up to the end of -% the current environment or group. Afterwards the previous values are -% restored. The optional parameters of the two pretty-printing commands -% and the `\texttt{lstlisting}' environment take effect on the particular -% listing only, i.e.~values are restored immediately. For example, you -% can select a main language and change it for special listings. -% \item \icmdname\lstinline\ has an optional argument? -% \advisespace -% Yes. And from this fact comes a limitation: you can't use the left -% bracket `|[|' as delimiter except you specify at least an empty -% optional argument as in `|\lstinline[][var i:integer;[|'. -% If you forget this, you will either get a ``runaway argument'' error -% from \TeX, or an error message from the \packagename{keyval} package. -% \end{advise} -% -% -% \subsection{Programming languages}\label{uProgrammingLanguages} -% -% You already know how to activate programming languages---at least Pascal. -% An optional parameter selects particular dialects of a language. For example, -% |language=[77]Fortran| selects Fortran 77 and |language=[XSC]Pascal| does the -% same for Pascal XSC. The general form is -% {\rstyle\ikeyname{language}}|=|\oarg{dialect}\meta{language}. -% If you want to get rid of keyword, comment, and string detection, use -% |language={}| as argument to |\lstset| or as optional argument. -% -% Table \ref{uPredefinedLanguages} shows all predefined languages and dialects. -% Use the listed names as \meta{language} and \meta{dialect}, respectively. If -% no dialect or `empty' is given in the table, just don't specify a dialect. -% Each underlined dialect is default; it is selected if you leave out -% the optional argument. The predefined defaults are the newest language -% versions or standard dialects. -%^^A -%^^A Make table of predefined languages. -%^^A -%\let\lstlanguages\empty -%\makeatletter -%\@for\lst@temp:={lstlang1.sty,lstlang2.sty,lstlang3.sty}\do -% {\IfFileExists\lst@temp{}{\let\lstlanguages\relax}} -%\makeatother -%\ifx\lstlanguages\relax -% \PackageWarningNoLine{Listings} -% {Standard drivers not available.\MessageBreak -% Please check your installation.\MessageBreak -% Compilation aborted} -% \csname @@end\expandafter\endcsname -%\fi -%\lstscanlanguages\lstlanguages{lstlang1.sty,lstlang2.sty,lstlang3.sty}{}^^A -%\def\topfigrule{\hrule\kern-0.4pt\relax}^^A -%\let\botfigrule\topfigrule -%\belowcaptionskip=\smallskipamount -% \begin{table}[tbhp] -% \small -% \caption{Predefined languages. -% Note that some definitions are preliminary, for example HTML and XML. -% Each underlined dialect is default dialect}\label{uPredefinedLanguages}^^A -% \makeatletter -% \setbox\@tempboxa\hbox{^^A -% \InputIfFileExists{listings.cfg}{\lst@InputCatcodes}{}}^^A -% \lstprintlanguages\lstlanguages -% \end{table} -%^^A -%^^A end of table -%^^A -%\lstset{defaultdialect=[doc]Pascal}^^A restore -% \begin{advise} -% \item How can I define default dialects? -% \advisespace -% Check section \ref{rLanguagesAndStyles} for `\keyname{defaultdialect}'. -% \item I have C code mixed with assembler lines. Can \packagename{listings} -% pretty-print such source code, i.e.~highlight keywords and comments of -% both languages? -% \advisespace -% `\ikeyname{alsolanguage}|=|\oarg{dialect}\meta{language}' selects a -% language additionally to the active one. So you only have to write a -% language definition for your assembler dialect, which doesn't interfere -% with the definition of C, say. Moreover you might want to use the key -% `\keyname{classoffset}' described in section \ref{rLanguagesAndStyles}. -% \item How can I define my own language? -% \advisespace -% This is discussed in section \ref{rLanguageDefinitions}. And if you -% think that other people could benefit by your definition, you might -% want to send it to the address in section \ref{uSoftwareLicense}. -% Then it will be published under the \LaTeX\ Project Public License. -% \end{advise} -% Note that the arguments \meta{language} and \meta{dialect} are case -% insensitive and that spaces have no effect. -% -% -% \subsection{Special characters}\label{uSpecialCharacters} -% -% -% \paragraph{Tabulators} -% You might get unexpected output if your sources contain tabulators. -% The package assumes tabulator stops at columns 9, 17, 25, 33, and so on. -% This is predefined via |tabsize=8|. If you change the eight to the number -% $n$, you will get tabulator stops at columns $n+1,2n+1,3n+1,$ and so on. -% \begin{lstsample}[tabsize]{}{} -% \lstset{tabsize=2} -% \begin{lstlisting} -% 123456789 -% { one tabulator } -% { two tabs } -% 123 { 123 + two tabs } -% \end{lstlisting} -% \end{lstsample} -% For better illustration, the left-hand side uses |tabsize=2| but the verbatim -% code |tabsize=4|. Note that |\lstset| modifies the values for all following -% listings in the same environment or group. This is no problem here since the -% examples are typeset inside minipages. If you want to change settings for a -% single listing, use the optional argument. -% -% -% \paragraph{Visible tabulators and spaces} -% One can make spaces and tabulators visible: -% \begin{lstsample}[showspaces,showtabs,tab]{}{} -% \lstset{showspaces=true, -% showtabs=true, -% tab=\rightarrowfill} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% If you request \ikeyname{showspaces} but no \ikeyname{showtabs}, -% tabulators are converted to visible spaces. -% The default definition of \ikeyname{tab} produces a `wide visible space' -% \lstinline[showtabs]! !. So you might want to use |$\to$|, |$\dashv$| -% or something else instead. -% \begin{advise} -% \item Some sort of advice: (1) You should really indent lines of source code -% to make listings more readable. (2) Don't indent some lines with -% spaces and others via tabulators. Changing the tabulator size (of your -% editor or pretty-printing tool) completely disturbs the columns. -% (3) As a consequence, never share your files with differently tab sized -% people!^^A true only if you use tabulators, just :-) -% \item To make the \LaTeX\ code more readable, I indent the environments' -% program listings. How can I remove that indention in the output? -% \advisespace -% Read `How to gobble characters' in section \ref{uHowTos}. -% \end{advise} -% -% -% \paragraph{Form feeds} -% Another special character is a form feed causing an empty line by default. -% {\rstyle\ikeyname{formfeed}}|=\newpage| would result in a new page every -% form feed. Please note that such definitions (even the default) might get -% in conflict with frames. -% -% -% \paragraph{National characters} -% If you type in such characters directly as characters of codes 128--255 and -% use them also in listings, let the package know it---or you'll get really -% funny results. {\rstyle\ikeyname{extendedchars}}|=true| allows and -% |extendedchars=false| prohibits extended characters in listings. If you use -% them, you should load \packagename{fontenc}, \packagename{inputenc} and/or -% any other package which defines the characters. -% \begin{advise} -% \item I have problems using \packagename{inputenc} together with -% \packagename{listings}. -% \advisespace -% This could be a compatibility problem. Make a bug report as described -% in section \lstref{uTroubleshooting}. -% \end{advise} -% The extended characters don't cover Arabic, Chinese, Hebrew, Japanese, and so -% on. Read section \ref{uNationalCharacters} for details on work-arounds. -% -% -% \subsection{Line numbers}\label{uLineNumbers} -% -% You already know the keys \ikeyname{numbers}, \ikeyname{numberstyle}, -% \ikeyname{stepnumber}, and \ikeyname{numbersep} from section -% \ref{gSeduceToUse}. Here now we deal with continued listings. -% You have two options to get consistent line numbering across listings. -% -% \begin{lstsample}[firstnumber]{\lstset{numbers=left,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} -% \begin{lstlisting}[firstnumber=100] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% \end{lstlisting} -% And we continue the listing: -% \begin{lstlisting}[firstnumber=last] -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% In the example, \ikeyname{firstnumber} is initially set to 100; some lines -% later the value is \texttt{last}, which continues the numbering of the last -% listing. Note that the empty line at the end of the first part is not printed -% here, but it counts for line numbering. You should also notice that you can -% write |\lstset{firstnumber=last}| once and get consecutively numbered code -% lines---except you specify something different for a particular listing. -% -% On the other hand you can use |firstnumber=auto| and name your listings. -% Listings with identical names (case sensitive!) share a line counter. -% \begin{lstsample}[name]{\lstset{numbers=left,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} -% \begin{lstlisting}[name=Test] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% -% \end{lstlisting} -% And we continue the listing: -% \begin{lstlisting}[name=Test] -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% The next |Test| listing goes on with line number {\makeatletter\lstno@Test}, -% no matter whether there are other listings in between. -% \begin{advise} -% \item Okay. And how can I get decreasing line numbers? -% \advisespace -% Sorry, what? -% \advisespace -% Decreasing line numbers as on page \pageref{rDecreasingLabels}. -% \advisespace -% May I suggest to demonstrate your individuality by other means? -% If you differ, you should try a negative `\ikeyname{stepnumber}' -% (together with `\ikeyname{firstnumber}'). -% \end{advise} -% -% Read section \ref{uHowTos} on how to reference line numbers. -% -% -% \subsection{Layout elements} -% -% It's always a good idea to structure the layout by vertical space, -% horizontal lines, or different type sizes and typefaces. The best to stress -% whole listings are---not all at once---colours, frames, vertical space, and -% captions. The latter are also good to refer to listings, of course. -% -% \paragraph{Vertical space} -% The keys {\rstyle\ikeyname{aboveskip}} and {\rstyle\ikeyname{belowskip}} -% control the vertical space above and below displayed listings. Both keys get -% a dimension or skip as value and are initialized to |\medskipamount|. -% -% \paragraph{Frames} -% The key \ikeyname{frame} takes the verbose values \keyvalue{none}, -% \keyvalue{leftline}, \keyvalue{topline}, \keyvalue{bottomline}, -% \keyvalue{lines} (top and bottom), \keyvalue{single} for single frames, or -% \keyvalue{shadowbox}. -% \begin{lstsample}[frame]{}{} -% \begin{lstlisting}[frame=single] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item The rules aren't aligned. -% \advisespace -% This could be a bug of this package or a problem with your -% \texttt{.dvi} driver. \emph{Before} sending a bug report to the package -% author, modify the parameters described in section \ref{rFrames} -% heavily. And do this step by step! -% For example, begin with `|framerule=10mm|'. If the rules are -% misaligned by the same (small) amount as before, the problem does not -% come from the rule width. So continue with the next parameter. -% \end{advise} -% Alternatively you can control the rules at the \texttt{t}op, \texttt{r}ight, -% \texttt{b}ottom, and \texttt{l}eft directly by using the four initial letters -% for single rules and their upper case versions for double rules. -% \begin{lstsample}[frame]{}{} -% \begin{lstlisting}[frame=trBL] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% Note that a corner is drawn if and only if both adjacent rules are requested. -% You might think that the lines should be drawn up to the edge, but what's -% about round corners? The key \ikeyname{frameround} must get exactly four -% characters as value. The first character is attached to the upper right -% corner and it continues clockwise. `\texttt{t}' as character makes the -% corresponding corner round. -% \begin{lstsample}[frameround]{}{} -% \lstset{frameround=fttt} -% \begin{lstlisting}[frame=trBL] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% Note that \ikeyname{frameround} has been used together with |\lstset| and thus -% the value affects all following listings in the same group or environment. -% Since the listing is inside a \texttt{minipage} here, this is no problem. -% \begin{advise} -% \item Dont' use frames all the time, in particular not with short listings. -% This would emphasize nothing. Use frames for $10\%$ or even less of -% your listings, for your most important ones. -% \item If you use frames on floating listings, do you really want frames? -% \advisespace -% No, I want to separate floats from text. -% \advisespace -% Then it is better to redefine \LaTeX's `|\topfigrule|' and -% `|\botfigrule|'. For example, you could write -% `|\renewcommand*\topfigrule{\hrule\kern-0.4pt\relax}|' and make the -% same definition for |\botfigrule|. -% \end{advise} -% -% \paragraph{Captions} -% Now we come to \ikeyname{caption} and \ikeyname{label}. You might guess that -% they can be used in the same manner as \LaTeX's |\caption| and |\label| -% commands: -% \begin{lstsample}[caption,label]{\lstset{xleftmargin=.05\linewidth}}{} -% \begin{lstlisting}[caption={Useless code},label=useless] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% Afterwards you could refer to the listing via |\ref{useless}|. By default -% such a listing gets an entry in the list of listings, which can be printed -% with the command {\rstyle\icmdname\lstlistoflistings}. The key -% {\rstyle\ikeyname{nolol}} suppresses an entry for both the environment or -% the input command. Moreover, you can specify a short caption for the list -% of listings: -% \keyname{caption}|={|\oarg{short}\meta{long}|}|. -% Note that the whole value is enclosed in braces since an optional value is -% used in an optional argument. -% -% If you don't want the label \texttt{\lstlistingname} plus number, you should -% use \ikeyname{title}: -% \begin{lstsample}[title]{\lstset{xleftmargin=.05\linewidth}}{} -% \begin{lstlisting}[title={`Caption' without label}] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item Something goes wrong with `\keyname{title}' in my document: in front of -% the title is a delimiter. -% \advisespace -% The result depends on the document class; some are not compatible. -% Contact the package author for a work-around. -% \end{advise} -% -% \paragraph{Colours} -% One more element. You need the \packagename{color} package and can then -% request coloured background via -% \ikeyname{backgroundcolor}|=|\meta{color command}. -% \begin{advise} -% \item Great! I love colours. -% \advisespace -% Fine, yes, really. And I like to remind you of the warning about -% striking styles on page \pageref{wStrikingStyles}. -% \end{advise} -%\ifcolor -% \begin{lstxsample}[backgroundcolor] -% \lstset{backgroundcolor=\color{yellow}} -% \end{lstxsample} -%\else -% \begin{verbatim} -% color package not installed\end{verbatim} -%\fi -% \begin{lstsample}{}{} -% \begin{lstlisting}[frame=single, -% framerule=0pt] -% for i:=maxint to 0 do -% begin -% j:=square(root(i)); -% end; -% \end{lstlisting} -% \end{lstsample} -% The example also shows how to get coloured space around the whole listing: -% use a frame whose rules has no width. -% -% -% \subsection{Emphasize identifiers}\label{uEmphasizeIdentifiers} -% -% Recall the pretty-printing commands and environment. |\lstinline| prints -% code snippets, |\lstinputlisting| whole files, and \texttt{lstlisting} -% pieces of code which reside in the \LaTeX\ file. And what are these -% different `types' of source code good for? Well, it just happens that a -% sentence contains a code fragment. Whole files are typically included in or -% as an appendix. Nevertheless some books about programming also include such -% listings in normal text sections---to increase the number of pages. -% Nowadays source code should be shipped on disk or CD-ROM and only the main -% header or interface files should be typeset for reference. So, please, don't -% misuse the \packagename{listings} package. But let's get back to the topic. -% -% Obviously `\texttt{lstlisting} source code' isn't used to make an executable -% program from. Such source code has some kind of educational purpose or even -% didactic. -% \begin{advise} -% \item What's the difference between educational and didactic? -% \advisespace -% Something educational can be good or bad, true or false. -% Didactic is true by definition.^^A :-) -% \end{advise} -% Usually \emph{keywords} are highlighted when the package typesets a piece of -% source code. This isn't necessary for readers knowing the programming -% language well. The main matter is the presentation of interface, library or -% other functions or variables. If this is your concern, here come the right -% keys. Let's say, you want to emphasize the functions |square| and |root|, -% for example, by underlining them. Then you could do it like this: -% \begin{lstxsample}[emph,emphstyle] -% \lstset{emph={square,root},emphstyle=\underbar} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% j:=square(root(i)); -% end; -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item Note that the list of identifiers |{square,root}| is enclosed in -% braces. Otherwise the \packagename{keyval} package would complain -% about an undefined key \keyname{root} since the comma finishes the -% key=value pair. -% Note also that you \emph{must} put braces around the value if you -% use an optional argument of a key inside an optional argument of a -% pretty-printing command. Though it is not necessary, the following -% example uses these braces. They are typically forgotten when they -% become necessary, -% \end{advise} -% -% Both keys have an optional \meta{class number} argument for multiple -% identifier lists: -%\ifcolor -% \begin{lstxsample}[emph,emphstyle] -% \lstset{emph={square}, emphstyle=\color{red}, -% emph={[2]root,base},emphstyle={[2]\color{blue}}} -% \end{lstxsample} -%\else -% \begin{lstxsample}[emph,emphstyle] -% \lstset{emph={square}, emphstyle=\underbar, -% emph={[2]root,base},emphstyle={[2]\fbox}} -% \end{lstxsample} -%\fi -% \begin{lstsample}{}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% j:=square(root(i)); -% end; -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item What is the maximal \meta{class number}? -% \advisespace -% $2^{31}-1=2\,147\,483\,647$. But \TeX's memory will exceed before you -% can define so many different classes. -% \end{advise} -% -% One final hint: Keep the lists of identifiers disjoint. Never use a keyword -% in an `emphasize' list or one name in two different lists. Even if your -% source code is highlighted as expected, there is no guarantee that it is -% still the case if you change the order of your listings or if you use the -% next release of this package. -% -% -%\iffalse -% \subsection{*Listing alignment}\label{uListingAlignment} -% -% The examples are typeset with centered \texttt{minipage}s. That's the reason -% why you can't see that line numbers are printed in the margin. Now we -% separate the minipage margin and the minipage by a vertical rule: -% \begin{lstsample}{\lstset{frame=l,framesep=0pt,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} -% Some text before -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% The listing is lined up with the normal text. The parameter \ikeyname{xleftmargin} -% moves the listing to the right (or left if the dimension is negative). -% \begin{lstsample}{\lstset{frame=l,framesep=0pt,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} -% Some text before -% \begin{lstlisting}[xleftmargin=15pt] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% -% \begin{lstlisting}{ } -% Write('Insensitive'); -% WritE('keywords.'); -% \end{lstlisting} -% \end{lstsample} -% Note again that optional arguments change settings for single listings. -% -% If you use environments like \texttt{itemize} or \texttt{enumerate}, there -% is `natural' indention coming from these environments. By default the -% \packagename{listings} package respects this. But you might use -% |resetmargins=true| (or |false|) to make your own decision. You can use it -% together with |xleftmargin|, of course. -% \begin{advise} -% \item I get heavy overfull |\hbox|es from some listings. -% \advisespace -% This comes from long lines in your listings. You have some options -% to get rid of the overful |\hbox|es. Firstly I recommend to typeset -% listings in smaller fonts than the surrounding text, for example -% `|basicstyle=\small|'. Secondly you might want to use the flexible -% column format. Thirdly you can increase the line width or set it -% explicitly, refer section \ref{rMarginsAndLineShape}. -% If all this doesn't help, you might want to change -% `\ikeyname{basewidth}', but be careful! The two unknown items are -% explained in the next section. -% \end{advise} -% -% You might need to control the vertical position of listings with the -% \ikeyname{boxpos} key, for example, if you use them in \texttt{minipage} or -% \texttt{tabular} environments. Here `listings' means \texttt{lstlisting} or -% |\lstinputlisting|. As the following example shows, you can even place such -% listings inside paragraphs, but you must force the package to do this by -% enclosing the listing in |\hbox{| and |}|. -% \begin{advise} -% \item Is it good form to use the \TeX-primitive `|\hbox|' in a \LaTeX\ -% document? -% \advisespace -% No, it's not. But \LaTeX's `|\mbox|' does not work in this example: -% \end{advise} -% \begin{lstsample}{}{} -% Here are some multi-line listings inside a paragraph. -% The `boxpos' key controls their vertical alignment: -% \hbox{\begin{lstlisting}[boxpos=c] -% center -% center -% \end{lstlisting}} -% \hbox{\begin{lstlisting}[boxpos=b] -% bottom baseline -% bottom baseline -% \end{lstlisting}} -% \hbox{\begin{lstlisting}[boxpos=t] -% top baseline -% top baseline -% \end{lstlisting}} -% \end{lstsample} -%\fi -% -% -% \subsection{Indexing}\label{uIndexing} -% -% is just like emphasizing identifiers---I mean the usage: -% \begin{lstxsample}[index] -% \lstset{index={square},index={[2]root}} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% j:=square(root(i)); -% end; -% \end{lstlisting} -% \end{lstsample} -% Of course, you can't see anything here. You will have to look at the index. -% \begin{advise} -% \item Why the `\ikeyname{index}' key is able to work with multiple identifier -% lists? -% \advisespace -% This question is strongly related to the `{\rstyle\ikeyname{indexstyle}}' -% key. Someone might want to create multiple indexes or want to insert -% prefixes like `|constants|', `|functions|', `|keywords|', and so on. -% The `\ikeyname{indexstyle}' key works like the other style keys except -% that the last token \emph{must} take an argument, namely the -% (printable form of the) current identifier. -% -% You can define `|\newcommand\indexkeywords[1]{\index{keywords, #1}}|' -% and make similar definitions for constant or function names. Then -% `|indexstyle=[1]\indexkeywords|' might meet your purpose. This becomes -% easier if you want to create multiple indexes with the -% \href{http://www.ctan.org/tex-archive/macros/latex/contrib/camel} -% {\packagename{index}} package. -% If you have defined appropriate new indexes, it is possible to write -% `|indexstyle=\index[keywords]|', for example. -% -% \item Let's say, I want to index all keywords. It would be annoying to -% type in all the keywords again, specifically if the used programming -% language changes frequently. -% \advisespace -% Just read ahead. -% \end{advise} -% The \ikeyname{index} key has in fact two optional arguments. The first is the -% well-known \meta{class number}, the second is a comma separated list of other -% keyword classes whose identifiers are indexed. The indexed identifiers then -% change automatically with the defined keywords---not automagically, it's not -% an illusion.^^A :-) -% -% Eventually you need to know the names of the keyword classes. It's usually -% the key name followed by a class number, for example, |emph2|, |emph3|, -% \ldots, |keywords2| or |index5|. But there is no number for the first order -% classes |keywords|, |emph|, |directives|, and so on. -% \begin{advise} -% \item `|index=[keywords]|' does not work. -% \advisespace -% The package can't guess which optional argument you mean. Hence you -% must specify both if you want to use the second one. You should try -% `|index=[1][keywords]|'. -% \end{advise} -% -% -% \subsection{Fixed and flexible columns}\label{uFixedAndFlexibleColumns} -% -% The first thing a reader notices---except different styles for keywords, -% etc.---is the column alignment. Arne John Glenstrup invented the flexible -% column format in 1997. Since then some efforts were made to develop this -% branch farther. Currently three column formats are provided: fixed, flexible, -% and full flexible. Take a close look at the following examples. -% \begin{center} -% \lstset{style={},language={}} -% \def\sample{\begin{lstlisting}^^J WOMEN\ \ are^^A -% ^^J \ \ \ \ \ \ \ MEN^^A -% ^^J WOMEN are^^A -% ^^J better MEN^^J \end{lstlisting}} -% \begin{tabular}{@{}c@{\qquad\quad}c@{\qquad\quad}c@{\qquad\quad}c@{}} -% {\rstyle\ikeyname{columns}}|=| & \texttt{fixed} & \texttt{flexible} & \texttt{fullflexible}\\ -% & (at {\makeatletter\lst@widthfixed}) -% & (at {\makeatletter\lst@widthflexible}) -% & (at {\makeatletter\lst@widthflexible})\\ -% \noalign{\medskip} -% \lstset{basicstyle=\ttfamily,basewidth=0.51em}\sample -% & \lstset{columns=fixed}\sample -% & \lstset{columns=flexible}\sample -% & \lstset{columns=fullflexible}\sample -% \end{tabular} -% \end{center} -% \begin{advise} -% \item Why are women better men? -% \advisespace -% Do you want to philosophize? Well, have I ever said that the -% statement ``women are better men'' is true? I can't even remember this -% about ``women are men'' \ldots ^^A ;-)) -% \end{advise} -% In the abstract one can say: The fixed column format ruins the spacing -% intended by the font designer, while the flexible formats ruin the column -% alignment (possibly) intended by the programmer. Common to all is that the -% input characters are translated into a sequence of basic output units like -% \begingroup \lstset{gobble=6,xleftmargin=\leftmargini} -% \makeatletter -%^^A Make \fbox around each output unit. -% \fboxsep=0pt -% \def\lst@alloverstyle#1{\fbox{\kern-\fboxrule\strut#1}\kern-\fboxrule} -% \begin{lstlisting}[basewidth=1em] -% if x=y then write('align') -% else print('align'); -% \end{lstlisting} -% Now, the fixed format puts $n$ characters into a box of width $n\times{} -% $`base width', where the base width is {\makeatletter\lst@widthfixed} in the -% example. The format shrinks and stretches the space between the characters -% to make them fit the box. As shown in the example, some character strings look -% \hbox to 2em{b\hss a\hss d} -% or -% \hbox to 2em{w\hss o\hss r\hss s\hss e}, -% but the output is vertically aligned. -% \endgroup -% -% If you don't need or like this, you should use a flexible format. All -% characters are typeset at their natural width. In particular, they never -% overlap. If a word requires more space than reserved, the rest of the line -% simply moves to the right. The difference between the two formats is that the -% full flexible format cares about nothing else and the normal flexible format -% tries to fix the column alignment if a character string needs less space -% than `reserved'. In the flexible example above, the two MENs are vertically -% aligned since some space has been inserted in the fourth line to fix the -% alignment. In the full flexible format, the two MENs are not aligned. -% -% Note that both flexible modes printed the two blanks in the first line as a -% single blank, but for different reasons: the normal flexible format fixes -% the column alignment and the full flexible format doesn't care about the -% second space. -% -% -% \section{Advanced techniques}\label{uAdvancedTechniques} -% -% -% \subsection{Style definitions} -% -% It is obvious that a pretty-printing tool like this requires some kind of -% language selection and definition. The first has already been described and -% the latter is convered by the next section. However, it is very convenient -% to have the same for printing styles: at a central place of your document -% they can be modified easily and the changes take effect on all listings. -% -% Similar to languages, -% {\rstyle\ikeyname{style}}|=|\meta{style name} -% activates a previously defined style. A definition is as easy: -% {\rstyle|\lstdefinestyle|}\marg{style name}\marg{key=value list}. -% Keys not used in such a definition are untouched by the corresponding style -% selection, of course. For example, you could write -% \begin{verbatim} -% \lstdefinestyle{numbers} -% {numbers=left, stepnumber=1, numberstyle=\tiny, numbersep=10pt} -% \lstdefinestyle{nonumbers} -% {numbers=none}\end{verbatim} -% and switch from listings with line numbers to listings without ones and vice -% versa simply by |style=nonumbers| and |style=numbers|, respectively. -% \begin{advise} -% \item You could even write -% `|\lstdefinestyle{C++}{language=C++,style=numbers}|'. -% Style and language names are independent of each other and so might -% coincide. Moreover it is possible to activate other styles. -% -% \item It's easy to crash the package using styles. Write -% '|\lstdefinestyle{crash}{style=crash}|' and '|\lstset{style=crash}|'. -% \TeX's capacity will exceed, sorry [parameter stack size]. Only bad -% boys use such recursive calls, but only good girls use this package. -% Thus the problem is of minor interest.^^A :-) -% \end{advise} -% -% -% \subsection{Language definitions}\label{uLanguageDefinitions} -% -% This is like style definitions except for an optional dialect name and an -% optional base language---and, of course, a different command name and -% specialized keys. In the simple case it's -% {\rstyle|\lstdefinelanguage|}\marg{language name}\marg{key=value list}. -% For many programming languages it is sufficient to specify keywords and -% standard function names, comments, and strings. Let's look at an example. -% \begin{lstxsample}[morekeywords,sensitive,morecomment,morestring] -% \lstdefinelanguage{rock} -% {morekeywords={one,two,three,four,five,six,seven,eight, -% nine,ten,eleven,twelve,o,clock,rock,around,the,tonight}, -% sensitive=false, -% morecomment=[l]{//}, -% morecomment=[s]{/*}{*/}, -% morestring=[b]", -% } -% \end{lstxsample} -% \begingroup \csname lst@EndWriteFile\endcsname -% \bigbreak -% -% \noindent -% There isn't much to say about keywords. They are defined like identifiers -% you want to emphasize. Additionally you need to specify whether they are -% case sensitive or not. And yes: you could insert |[2]| in front of the -% keyword \texttt{one} to define the keywords as `second order' and print them -% in |keywordstyle={[2]...}|. -% \begin{advise} -% \item I get a `\texttt{Missing = inserted for }|\ifnum|' error when I select -% my language. -% \advisespace -% Did you forget the comma after `|keywords={...}|'? And if you encounter -% unexpected characters after selecting a language (or style), you have -% probably forgotten a different comma or you have given to many -% arguments to a key, for example, |morecomment=[l]{--}{!}|. -% \end{advise} -% -% So let's turn to comments and strings. Each value starts with a -% \emph{mandatory} \oarg{type} argument followed by a changing number of -% opening and closing delimiters. Note that each delimiter (pair) requires a -% key=value on its own, even if types are equal. Hence, you'll need to insert -% \texttt{morestring=[b]'} if single quotes open and close string or character -% literals in the same way as double quotes do in the example. -% -% Eventually you need to know the types and their numbers of delimiters. The -% reference guide contains full lists, here we discuss only the most common. -% For strings these are {\rstyle\texttt{b}} and {\rstyle\texttt{d}} with one -% delimiter each. This delimiter opens and closes the string and inside a -% string it is either escaped by a \texttt backslash or it is \texttt doubled. -% The comment type {\rstyle\texttt{l}} requires exactly one delimiter, which -% starts a comment on any column. This comment goes up to the end of line. -% The other two most common comment types are {\rstyle\texttt{s}} and -% {\rstyle\texttt{n}} with two delimiters each. The first delimiter opens a -% comment which is terminated by the second delimiter. In contrast to the -% \texttt s-type, \texttt n-type comments can be nested. -% \begin{lstxsample}[b,d,l,s,n] -% \lstset{morecomment=[l]{//}, -% morecomment=[s]{/*}{*/}, -% morecomment=[n]{(*}{*)}, -% morestring=[b]", -% morestring=[d]'} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% "str\"ing " not a string -% 'str''ing ' not a string -% // comment line -% /* comment/**/ not a comment -% (* nested (**) still comment -% comment *) not a comment -% \end{lstlisting} -% \end{lstsample} -% \begin{advise} -% \item Is it \emph{that} easy? -% \advisespace -% Almost. There are some troubles you can run into. For example, if -% `\texttt{-*}' starts a comment line and `\texttt{-*-}' a string -% (unlikely but possible), then you must define the shorter delimiter -% first. -% Another problem: by default some characters are not allowed inside -% keywords, for example `\texttt{-}', `\texttt{:}', `\texttt{.}', and -% so on. The reference guide covers this problem by introducing some -% more keys, which let you adjust the standard character table -% appropriately. But note that white space characters are prohibited -% inside keywords. -% \end{advise} -% Finally remember that this section is only an introduction to language -% definitions. There are more keys and possibilities. -% -% -% \subsection{Delimiters}\label{uDelimiters} -% -% You already know two special delimiter classes: comments and strings. -% However, their full syntax hasn't been described so far. For example, -% \ikeyname{commentstyle} applies to all comments---except you specify -% something different. The \emph{optional} \oarg{style} argument follows the -% \emph{mandatory} \oarg{type} argument. -%\ifcolor -% \begin{lstxsample} -% \lstset{morecomment=[l][keywordstyle]{//}, -% morecomment=[s][\color{white}]{/*}{*/}} -% \end{lstxsample} -%\else -% \begin{lstxsample} -% \lstset{morecomment=[l][keywordstyle]{//}, -% morecomment=[s][\underbar]{/*}{*/}} -% \end{lstxsample} -%\fi -% \begin{lstsample}{}{} -% \begin{lstlisting} -% // bold comment line -% a single /* comment */ -% \end{lstlisting} -% \end{lstsample} -% As you can see, you have the choice between specifying the style explicitly -% by \LaTeX\ commands or implicitly by other style keys. But, you're right, -% some implicitly defined styles have no seperate keys, for example the second -% order keyword style. Here---and never with the number 1---you just append -% the order to the base key: \texttt{keywordstyle2}. -% -% You ask for an application? Here you are: one can define different printing -% styles for `subtypes' of a comment, for example -%\ifcolor -% \begin{lstxsample} -% \lstset{morecomment=[s][\color{blue}]{/*+}{*/}, -% morecomment=[s][\color{red}]{/*-}{*/}} -% \end{lstxsample} -%\else -% \begin{lstxsample} -% \lstset{morecomment=[s][\upshape]{/*+}{*/}, -% morecomment=[s][\bfseries]{/*-}{*/}} -% \end{lstxsample} -%\fi -% \begin{lstsample}{\lstset{morecomment=[s]{/*}{*/}}}{} -% \begin{lstlisting} -% /* normal comment */ -% /*+ keep cool */ -% /*- danger! */ -% \end{lstlisting} -% \end{lstsample} -% Here, the comment style is not applied to the second and third line. -% \begin{advise} -% \item Please remember that both `extra' comments must be defined \emph{after} -% the normal comment, since the delimiter `\texttt{/*}' is a substring of -% `\texttt{/*+}' and `\texttt{/*-}'. -% -% \item I have another question. Is `\texttt{language=}\meta{different -% language}' the only way to remove such additional delimiters? -% \advisespace -% Call {\rstyle\ikeyname{deletecomment}} and/or -% {\rstyle\ikeyname{deletestring}} with the same arguments to remove -% the delimiters (but you don't need to provide the optional style -% argument). -% \end{advise} -% Eventually, you might want to use the prefix \texttt{i} on any comment type. -% Then the comment is not only invisible, it is completely discarded from the -% output! -% \begin{lstxsample}[is] -% \lstset{morecomment=[is]{/*}{*/}} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% begin /* comment */ end -% begin/* comment */end -% \end{lstlisting} -% \end{lstsample} -% -% Okay, and now for the real challenges. More general delimiters can be defined -% by the key {\rstyle\ikeyname{moredelim}}. Legal types are {\rstyle\texttt{l}} -% and {\rstyle\texttt{s}}. These types can be preceded by an \texttt{i}, but -% this time \emph{only the delimiters} are discarded from the output. This way -% you can select styles by markers. -% \begin{lstxsample} -% \lstset{moredelim=[is][\ttfamily]{|}{|}} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% roman |typewriter| -% \end{lstlisting} -% \end{lstsample} -% You can even let the package detect keywords, comments, strings, and other -% delimiters inside the contents. -% \begin{lstxsample} -% \lstset{moredelim=*[s][\itshape]{/*}{*/}} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% /* begin -% (* comment *) -% ' string ' */ -% \end{lstlisting} -% \end{lstsample} -% Moreover, you can force the styles being applied cumulative. -% \begin{lstxsample} -% \lstset{moredelim=**[is][\ttfamily]{|}{|}, % cumulative -% moredelim=*[s][\itshape]{/*}{*/}} % not so -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting} -% /* begin -% ' string ' -% |typewriter| */ -% -% | begin -% ' string ' -% /*typewriter*/ | -% \end{lstlisting} -% \end{lstsample} -% Look carefully at the output and note the differences. The second -% \texttt{begin} is not printed in bold typewriter type since standard -% \LaTeX\ has no such font. -% -% This suffices for an introduction. Now go and find some more applications. -% -% -% \subsection{Closing and credits}\label{uClosingAndCredits} -% -% You've seen a lot of keys but you are far away from knowing all of them. -% The next step is the real use of the \packagename{listings} package. -% Please take the following advices. Firstly, look up the known commands and -% keys in the reference guide to get a notion of the notation there. Secondly, -% poke about around these keys to learn some other parameters. Then, hopefully, -% you'll be prepared if you encounter any problems or need some special things. -% -% \begin{advise} -% \item -% There is one question `you' haven't asked all the last pages: who is to -% blame. The author has written the guides, coded the \packagename{listings} -% package and some language drivers. Other people defined more languages or -% contributed their ideas; many others made bug reports, but only the first -% bug finder is listed. -%^^A -%^^A Thanks for error reports (first bug finder only), new programming -%^^A languages, etc. -%^^A Special thanks for communication which lead to kernel extensions. -%^^A -% Special thanks go to (alphabetical order) -% \begin{quote} -% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth -% \lstthanks{Andreas~Bartelt}{Andreas.Bartelt@Informatik.Uni-Oldenburg.DE}, -% \lstthanks{Jan~Braun}{Jan.Braun@tu-bs.de}, -% \lstthanks{Denis~Girou}{Denis.Girou@idris.fr}, -% \lstthanks{Arne~John~Glenstrup}{panic@diku.dk}, -% \lstthanks{Frank~Mittelbach}{frank.mittelbach@latex-project.org}, -% \lstthanks{Rolf~Niepraschk}{niepraschk@PTB.DE}, -% \lstthanks{Rui~Oliveira}{rco@di.uminho.pt}, -% \lstthanks{Jens~Schwarzer}{schwarzer@schwarzer.dk}, and -% \lstthanks{Boris~Veytsman}{boris@plmsc.psu.edu}. -% \end{quote} -% Moreover I wish to thank -% \begin{quote} -% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth -% \lstthanks{Bj{\o}rn~{\AA}dlandsvik}{bjorn@imr.no}, -% \lstthanks{Gaurav~Aggarwal}{gaurav@ics.uci.edu}, -% \lstthanks{Jason~Alexander}{jalex@ea.oac.uci.edu}, -% \lstthanks{Holger~Arndt}{-}, -% \lstthanks{Donald~Arseneau}{ASND@erich.triumf.ca}, -% \lstthanks{David~Aspinall}{David.Aspinall@ed.ac.uk}, -% \lstthanks{Claus~Atzenbeck}{Claus.Atzenbeck@stud.uni-regensburg.de}, -% \lstthanks{Michael~Bachmann}{-}, -% \lstthanks{Luca~Balzerani}{-}, -% \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de} (big thankyou), ^^A beta tester -% \lstthanks{Heiko~Bauke}{-}, -% \lstthanks{Oliver~Baum}{oli.baum@web.de}, -% \lstthanks{Ralph~Becket}{rbeck@microsoft.com}, -% \lstthanks{Andres~Becerra~Sandoval}{abecerra@univalle.edu.co}, -% \lstthanks{Kai~Below}{below@tu-harburg.de}, -% \lstthanks{Matthias~Bethke}{-}, -% \lstthanks{Javier~Bezos}{javier.bezos@bancoval.es}, -% \lstthanks{Olaf~Trygve~Berglihn}{olafb@pvv.org}, ^^A {1999/11/29}{3-char comment delimiter don't work (Python)} -% \lstthanks{Geraint~Paul~Bevan}{geraint@users.sf.net}, -% \lstthanks{Peter~Biechele}{peter.biechele@physik.uni-freiburg.de}, -% \lstthanks{Beat~Birkhofer}{beat@birkhofer.ch}, -% \lstthanks{Fr\'ed\'eric~Boulanger}{Frederic.Boulanger@supelec.fr}, -% \lstthanks{Martin~Brodbeck}{Martin.Brodbeck@gmx.de}, -% \lstthanks{Walter~E.~Brown}{WB@fnal.gov}, -% \lstthanks{Achim~D.~Brucker}{brucker@informatik.uni-freiburg.de}, -% \lstthanks{J\'an Bu\v{s}a}{-}, -% \lstthanks{David~Carlisle}{davidc@nag.co.uk}, -% \lstthanks{Bradford~Chamberlain}{brad@cs.washington.edu}, -% \lstthanks{Brian~Christensen}{-}, -% \lstthanks{Neil~Conway}{-}, -% \lstthanks{Patrick~Cousot}{Patrick.Cousot@wanadoo.fr}, -% \lstthanks{Xavier~Cr\'egut}{cregut@enseeiht.fr}, -% \lstthanks{Christopher~Creutzig}{-}, -% \lstthanks{Holger~Danielsson}{dani@fbg.schwerte.de}, -% \lstthanks{Andreas~Deininger}{deininger@uni-kassel.de}, -% \lstthanks{Robert~Denham}{Robert.Denham@dnr.qld.gov.au}, -% \lstthanks{Detlev~Dr\"oge}{droege@informatik.uni-koblenz.de}, -% \lstthanks{Anders~Edenbrandt}{Anders.Edenbrandt@dna.lth.se}, -% \lstthanks{Mark~van~Eijk}{mark@luon.net}, -% \lstthanks{Norbert~Eisinger}{Norbert.Eisinger@informatik.uni-muenchen.de}, -% \lstthanks{Brian~Elmegaard}{-}, -% \lstthanks{Jon~Ericson}{Jon.Ericson@jpl.nasa.gov}, -% \lstthanks{Thomas~Esser}{te@dbs.uni-hannover.de}, -% \lstthanks{Chris~Edwards}{edwch00p@infoscience.otago.ac.nz}, -% \lstthanks{David~John~Evans}{Matrix.Software@dial.pipex.com}, -% \lstthanks{Tanguy~Fautr\'e}{tfautre@pandora.be}, -% \lstthanks{Ulrike~Fischer}{-}, -% \lstthanks{Robert~Frank}{rf7@ukc.ac.uk}, -% \lstthanks{Martine~Gautier}{-} -% \lstthanks{Daniel~Gazard}{gazard_d@epita.fr}, -% \lstthanks{Daniel~Gerigk}{Daniel.Gerigk@ePost.de}, -% \lstthanks{Dr.~Christoph~Giess}{-}, -% \lstthanks{KP~Gores}{kp.gores@web.de}, -% \lstthanks{Adam~Grabowski}{adam@mizar.org}, -% \lstthanks{Jean-Philippe~Grivet}{grivet@cnrs-orleans.fr}, -% \lstthanks{Christian~Gudrian}{Christian.Gudrian@kawo1.rwth-aachen.de}, -% \lstthanks{Jonathan~de~Halleux}{dehalleux@auto.ucl.ac.be}, -% \lstthanks{Carsten~Hamm}{carsten.hamm@siemens.com}, -% \lstthanks{Martina~Hansel}{Martina.Hansel@fhtw-berlin.de}, -% \lstthanks{Harald~Harders}{h.harders@tu-bs.de}, -% \lstthanks{Christian~Haul}{haul@dvs1.informatik.tu-darmstadt.de}, -% \lstthanks{Aidan~Philip~Heerdegen}{Aidan.Heerdegen@anu.edu.au}, -% \lstthanks{Jim~Hefferon}{Hefferon9@aol.com}, -% \lstthanks{Heiko~Heil}{info@heiko-heil.de}, -% \lstthanks{J\"urgen~Heim}{heim@astro.uni-tuebingen.de}, -% \lstthanks{Alvaro~Herrera}{alvherre@dcc.uchile.cl}, -% \lstthanks{Richard~Hoefter}{hoefter@gmx.de}, -% \lstthanks{Dr.~Jobst~Hoffmann}{HOFFMANN@rz.rwth-aachen.de}, -% \lstthanks{Torben~Hoffmann}{toho@it.dtu.dk}, -% \lstthanks{Morten~H\o gholm}{-}, -% \lstthanks{Berthold~H\"ollmann}{bhoel@starship.python.net}, -% \lstthanks{G\'erard~Huet}{-}, -% \lstthanks{Hermann~H\"uttler}{hermann.huettler@gmx.net}, -% \lstthanks{Ralf~Imh\"auser}{snoopy@tribal.line.org}, -% \lstthanks{R.~Isernhagen}{R.Isernhagen@FH-Wolfenbuettel.DE}, -% \lstthanks{Oldrich~Jedlicka}{ojedlick@students.zcu.cz}, -% \lstthanks{Dirk~Jesko}{jesko@iti.cs.uni-magdeburg.de}, -% \lstthanks{Lo\"\i c~Joly}{-}, -% \lstthanks{Christian~Kaiser}{chk@combit.net}, -% \lstthanks{Bekir~Karaoglu}{karabekirus@yahoo.com}, -% \lstthanks{Marcin~Kasperski}{Marcin.Kasperski@softax.com.pl}, -% \lstthanks{Christian~Kindinger}{chkind@uni-wuppertal.de}, -% \lstthanks{Steffen~Klupsch}{steffen@vlsi.informatik.tu-darmstadt.de}, -% \lstthanks{Peter~K\"oller}{pkoeller@metaprojekt.de} (big thankyou), ^^A beta tester -% \lstthanks{Reinhard~Kotucha}{Reinhard.Kotucha@web.de}, -% \lstthanks{Stefan~Lagotzki}{info@lagotzki.de}, -% \lstthanks{Tino~Langer}{langer@tournex.de}, -% \lstthanks{Rene~H.~Larsen}{rhl@traceroute.dk}, -% \lstthanks{Olivier~Lecarme}{ol@i3s.unice.fr}, -% \lstthanks{Thomas~Leduc}{Thomas.Leduc@lsv.ens-cachan.fr}, -% \lstthanks{Dr.~Peter~Leibner}{Peter.Leibner@sta.siemens.de}, -% \lstthanks{Thomas~Leonhardt}{leonhardt@informatik.tu-darmstadt.de} (big thankyou), ^^A beta tester -% \lstthanks{Magnus~Lewis-Smith}{Magnus.Lewis-Smith@pace.co.uk}, -% \lstthanks{Knut~Lickert}{knut.lickert@gmx.de}, -% \lstthanks{Dan~Luecking}{luecking@uark.edu}, -% \lstthanks{Peter~L\"offler}{-}, -% \lstthanks{Kris~Luyten}{no email available}, -% \lstthanks{Jos\'e~Romildo~Malaquias}{romildo@urano.iceb.ufop.br}, -% \lstthanks{Andreas~Matthias}{amat@kabsi.at}, -% \lstthanks{Patrick~TJ~McPhee}{ptjm@interlog.com}, -% \lstthanks{Brooks~Moses}{-}, -% \lstthanks{Riccardo~Murri}{riccardo.murri@gmx.it}, -% \lstthanks{Knut~M\"uller}{knut@physik3.gwdg.de}, -% \lstthanks{Svend~Tollak~Munkejord}{svendm@efisms.energy.sintef.no}, -% \lstthanks{Gerd~Neugebauer}{gerd.neugebauer@gmx.de}, -% \lstthanks{Torsten~Neuer}{tneuer@inwise.de}, -% \lstthanks{Michael~Niedermair}{m.g.n@gmx.de}, -% \lstthanks{Xavier~Noria}{fxn@hashref.com}, -% \lstthanks{Heiko~Oberdiek}{oberdiek@ruf.uni-freiburg.de}, -% \lstthanks{Xavier~Olive}{-}, -% \lstthanks{Alessio~Pace}{-}, -% \lstthanks{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}, -% \lstthanks{Morten~H~Pedersen}{mhp@dadlnet.dk}, -% \lstthanks{Zvezdan~V.~Petkovic}{zpetkovic@acm.org}, -% \lstthanks{Michael~Piefel}{piefel@informatik.hu-berlin.de}, -% \lstthanks{Michael~Piotrowski}{mxp@linguistik.uni-erlangen.de}, -% \lstthanks{Manfred~Piringer}{sz0490@rrze.uni-erlangen.de}, -% \lstthanks{Vincent~Poirriez}{Vincent.Poirriez@univ-valenciennes.fr}, -% \lstthanks{Adam~Prugel-Bennett}{apb@ecs.soton.ac.uk}, -% \lstthanks{Ralf~Quast}{rquast@hs.uni-hamburg.de}, -% \lstthanks{Aslak~Raanes}{araanes@ifi.ntnu.no}, -% \lstthanks{Venkatesh~Prasad~Ranganath}{vranganath@cox.net}, -% \lstthanks{Jeffrey~Ratcliffe}{-}, -% \lstthanks{Georg~Rehm}{Georg.Rehm@germanistik.uni-giessen.de}, -% \lstthanks{Fermin~Reig}{reig@ics.uci.edu}, -% \lstthanks{Detlef~Reimers}{dreimers@aol.com}, -% \lstthanks{Stephen~Reindl}{stephen.reindl@vodafone.com}, -% \lstthanks{Franz~Rinnerthaler}{-}, -% \lstthanks{Peter~Ruckdeschel}{Peter.Ruckdeschel@uni-bayreuth.de}, -% \lstthanks{Magne~Rudshaug}{magne@ife.no}, -% \lstthanks{Jonathan~Sauer}{jonathan.sauer@gmx.de}, -% \lstthanks{Vespe~Savikko}{vespe@cs.tut.fi}, -% \lstthanks{Gunther~Schmidl}{gschmidl@gmx.at}, -% \lstthanks{Andreas~Schmidt}{-}, -% \lstthanks{Walter~Schmidt}{wschmi@arcor.de}, -% \lstthanks{Jochen~Schneider}{jschneider@ds3.etech.haw-hamburg.de}, -% \lstthanks{Benjamin~Schubert}{benjamin.schubert@berlin.de}, -% \lstthanks{Uwe~Siart}{uwe.siart@ei.tum.de}, -% \lstthanks{Axel~Sommerfeldt}{axel@sommerfeldt.net}, -% \lstthanks{Richard~Stallman}{no address}, -% \lstthanks{Nigel~Stanger}{nstanger@infoscience.otago.ac.nz}, -% \lstthanks{Martin~Steffen}{ms@informatik.uni-kiel.de}, -% \lstthanks{Andreas~Stephan}{Andreas.Stephan@victoria.de}, -% \lstthanks{Stefan~Stoll}{stoll@phys.chem.ethz.ch}, -% \lstthanks{Enrico~Straube}{no email available}, -% \lstthanks{Werner~Struckmann}{struck@ips.cs.tu-bs.de}, -% \lstthanks{Martin~S\"u\ss kraut}{Edon.Myder@web.de}, -% \lstthanks{Gabriel~Tauro}{gabriel@informatik.uni-jena.de}, -% \lstthanks{Winfried~Theis}{theis@statistik.uni-dortmund.de}, -% \lstthanks{Jens~T.~Berger~Thielemann}{jensthi@ifi.uio.no}, -% \lstthanks{William~Thimbleby}{-}, -% \lstthanks{Arnaud~Tisserand}{arnaud.tisserand@ens-lyon.fr}, -% \lstthanks{Jens~Troeger}{-}, -% \lstthanks{Kalle~Tuulos}{kalle.tuulos@nic.fi}, -% \lstthanks{Gregory~Van~Vooren}{Gregory.VanVooren@rug.ac.be}, -% \lstthanks{Timothy~Van~Zandt}{tvz@econ.insead.edu}, -% \lstthanks{J\"org~Viermann}{-}, -% \lstthanks{Thorsten~Vitt}{vitt@informatik.hu-berlin.de}, -% \lstthanks{Herbert~Voss}{voss@perce.de} (big thankyou), ^^A beta tester -% \lstthanks{Edsko~de~Vries}{devriese@tcd.ie}, -% \lstthanks{Herfried~Karl~Wagner}{hirf@gmx.at}, -% \lstthanks{Dominique~de~Waleffe}{ddw@miscrit.be}, -% \lstthanks{Bernhard~Walle}{-}, -% \lstthanks{Jared~Warren}{warren@cs.queensu.ca}, -% \lstthanks{Michael~Weber}{mweber@informatik.hu-berlin.de}, -% \lstthanks{Sonja~Weidmann}{Sonja.Weidmann@gmx.de}, -% \lstthanks{Andreas~Weidner}{-}, -% \lstthanks{Herbert~Weinhandl}{weinhand@grz08u.unileoben.ac.at}, -% \lstthanks{Robert~Wenner}{robert.wenner@gmx.de}, -% \lstthanks{Michael~Wiese}{wiese@itwm.uni-kl.de}, -% \lstthanks{James~Willans}{-}, -% \lstthanks{J\"orn~Wilms}{wilms@rocinante.colorado.edu}, -% \lstthanks{Kai~Wollenweber}{kai@ece.WPI.EDU}, -% \lstthanks{Ulrich~G.~Wortmann}{uliw@erdw.ethz.ch}, -% \lstthanks{Cameron~H.G.~Wright}{-}, and -% \lstthanks{Andrew~Zabolotny}{-}. -% \end{quote} -% There are probably other people who contributed to this package. -% If I've missed your name, send an email. -% \end{advise} -% -% -% \part{Reference guide} -% -% -% \section{Main reference}\label{rMainReference} -% -% Your first training is completed. Now that you've left the User's guide, the -% friend telling you what to do has gone. Get more practice and become a -% journeyman!^^A :-) -% \begin{advise} -% \item Actually, the friend hasn't gone. There are still some advices, but -% only from time to time. -% \end{advise} -% -% -% \subsection{How to read the reference} -% -% Commands, keys and environments are presented as follows. -% \begin{syntax} -% \item[1.0,default,hints] \texttt{command}, \texttt{environment} or -% \keyname{key} with \meta{parameters} -% -% This field contains the explanation; here we describe the other fields. -% -% If present, the label in the left margin provides extra information: -% `\textit{addon}' indicates additionally introduced functionality, -% `\textit{changed}' a modified key, `\textit{data}' a command just -% containing data (which is therefore adjustable via |\renewcommand|), -% and so on. Some keys and functionality are `\emph{bug}'-marked or -% with a \dag-sign. These features might change in future or could be -% removed, so use them with care. -% -% If there is verbatim text touching the right margin, it is the -% predefined value. Note that some keys default to this value every -% listing, namely the keys which can be used on individual listings only. -% -% The label in the right margin is the current version number and marks -% newly introduced features. -% \end{syntax} -% Regarding the parameters, please keep in mind the following: -% \begin{enumerate} -% \item A list always means a comma separated list. You must put braces around -% such a list. Otherwise you'll get in trouble with the -% \packagename{keyval} package; it complains about an undefined key. -% \item You must put parameter braces around the whole value of a key if you -% use an \oarg{optional argument} of a key inside an optional -% \oarg{key=value list}: -% |\begin{lstlisting}[caption=|{\rstyle|{|}|[one]two|{\rstyle|}|}|]|. -% \item Brackets `|[ ]|' usually enclose optional arguments and must be typed -% in verbatim. Normal brackets `[ ]' always indicate an optional argument -% and must not be typed in. Thus |[*]| must be typed in exactly as is, -% but [|*|] just gets |*| if you use this argument. -% \item A vertical rule indicates an alternative, e.g.~^^A -% \meta{\alternative{true,false}} allows either \texttt{true} or -% \texttt{false} as arguments. -% \item If you want to enter one of the special characters |{}#%\|, this -% character must be escaped with a backslash. This means that you must -% write |\}| for the single character `right brace'---but of course not -% for the closing paramater character. -% \end{enumerate} -% -% -% \subsection{Typesetting listings}\label{rTypesettingListings} -% -% \begin{syntax} -% \item[0.19] \rcmdname\lstset\marg{key=value list} -% -% sets the values of the specified keys, see also section -% \ref{uTheKey=ValueInterface}. -% The parameters keep their values up to the end of the current group. -% In opposition, all optional \meta{key=value list}s below modify the -% parameters for single listings only. -% -% \item[0.18] \rcmdname\lstinline\oarg{key=value list}\meta{character}\meta{source code}\meta{same character} -% -% works like |\verb| but respects the active language and style. These -% listings use flexible columns except requested differently in the -% optional argument. You can write `|\lstinline!var i:integer;!|' and -% get `\lstinline!var i:integer;!'. -% -% Since the command first looks ahead for an optional argument, you must -% provide at least an empty one if you want to use |[| as -% \meta{character}. -% -% \dag\ An experimental implementation has been done to support the -% syntax |\lstinline|\oarg{key=value list}\marg{source code}. Try it if -% you want and report success and failure. A known limitation is that -% inside another argument the last source code token must not be an -% explicit space token---and, of course, using a listing inside another -% argument is itself experimental, see section \ref{rListingsInsideArguments}. -% -% \item[0.15] |\begin{|\texttt{\rstyle lstlisting}|}|\oarg{key=value list} -% -% \leavevmode\hspace*{-\leftmargini}|\end{|\texttt{\rstyle lstlisting}|}| -% -% typesets the code in between as a displayed listing. -% -% In contrast to the environment of the \packagename{verbatim} package, -% \LaTeX\ code on the same line and after the end of environment is -% typeset respectively executed. -% -% \item[0.1] \rcmdname\lstinputlisting\oarg{key=value list}\marg{file name} -% -% typesets the stand alone source code file as a displayed listing. -% \end{syntax} -% -% -% \subsection{Space and placement} -% -% \begin{syntax} -% \item[0.20,floatplacement] \rkeyname{float}|=|[|*|]\meta{subset of \textup{\texttt{tbph}}}\syntaxor\rkeyname{float} -% -% makes sense on individual displayed listings only and lets them float. -% The argument controls where \LaTeX\ is \emph{allowed} to put the float: -% at the top or bottom of the current/next page, on a separate page, or -% here where the listing is. -% -% The optional star can be used to get a double-column float in a -% two-column document. -% -% \item[0.21,tbp] \rkeyname{floatplacement}|=|\meta{place specifiers} -% -% is used as place specifier if \keyname{float} is used without value. -% -% \item[0.21,\medskipamount] \rkeyname{aboveskip}|=|\meta{dimension} -% \item[0.21,\medskipamount] \rkeyname{belowskip}|=|\meta{dimension} -% -% define the space above and below displayed listings. -% -% \item[0.17,0pt,\dag] \rkeyname{lineskip}|=|\meta{dimension} -% -% specifies additional space between lines in listings. -% -% \item[0.18,c,\dag] \rkeyname{boxpos}|=|\meta{\alternative{b,c,t}} -% -% Sometimes the \packagename{listings} package puts a |\hbox| around a -% listing---or it couldn't be printed or even processed correctly. -% The key determines the vertical alignment to the surrounding material: -% bottom baseline, centered or top baseline. -% \end{syntax} -% -% -% \subsection{The printed range} -% -% \begin{syntax} -% \item[0.12,true] \rkeyname{print}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{print} -% -% controls whether an individual displayed listing is typeset. Even if -% set false, the respective caption is printed and the label is defined. -% -% Note: If the package is loaded without the \texttt{draft} option, you -% can use this key together with |\lstset|. In the other case the key -% can only be used to typeset particular listings despite of the -% \texttt{draft} option. -% -% \item[0.1,1] \rkeyname{firstline}|=|\meta{number} -% \item[0.1,9999999] \rkeyname{lastline}|=|\meta{number} -% -% can be used on individual listings only. They determine the physical -% input lines used to print displayed listings. -% -% \item[1.2] \rkeyname{linerange}|={|\meta{first1}\texttt-\meta{last1}\texttt,\meta{first2}\texttt-\meta{last2}\texttt, and so on|}|\label{uoption:linerange} -% -% can be used on individual listings only. The given line ranges -% of the listing are displayed. The intervals must be sorted and must -% not intersect. -% -% \item[0.20,false] \rkeyname{showlines}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{showlines} -% -% If true, the package prints empty lines at the end of listings. -% Otherwise these lines are dropped (but they count for line numbering). -% -% \item[1.0] \rkeyname{emptylines}|=|[|*|]\meta{number} -% -% sets the maximum of empty lines allowed. If there is a block of more -% than \meta{number} empty lines, only \meta{number} ones are printed. -% Without the optional star, line numbers can be disturb when blank -% lines are omitted; with the star, the lines keep their original -% numbers. -% -% \item[0.19,0] \rkeyname{gobble}|=|\meta{number} -% -% gobbles \meta{number} characters at the beginning of each -% \emph{environment} code line. This key has no effect on \cs{lstinline} -% or \cs{lstinputlisting}. -% -% Tabulators expand to \ikeyname{tabsize} spaces before they are gobbled. -% Code lines with less than \ikeyname{gobble} characters are considered -% empty, but never indent the end of environment by more characters. -% \end{syntax} -% -% -% \subsection{Languages and styles}\label{rLanguagesAndStyles} -% -% Please note that the arguments \meta{language}, \meta{dialect}, and -% \meta{style name} are case insensitive and that spaces have no effect. -% \begin{syntax} -% \item[0.18,{{}}] \rkeyname{style}|=|\meta{style name} -% -% activates the key=value list stored with |\lstdefinestyle|. -% -% \item[0.19] \rcmdname\lstdefinestyle\marg{style name}\marg{key=value list} -% -% stores the key=value list. -% -% \item[0.17,{{}}] \rkeyname{language}|=|\oarg{dialect}\meta{language} -% -% activates a (dialect of a) programming language. The `empty' default -% language detects no keywords, no comments, no strings, and so on. -% Without specifying \meta{dialect}, the package chooses a default -% dialect. -% -% Table \ref{uPredefinedLanguages} on page \pageref{uPredefinedLanguages} -% lists all languages and dialects provided by \texttt{lstdrvrs.dtx}. -% The predefined default dialects are underlined. -% -% \item[0.21] \rkeyname{alsolanguage}|=|\oarg{dialect}\meta{language} -% -% selects the (dialect of a) programming language additionally to the -% current active one. Note that some language definitions interfere with -% each other and are plainly incompatible. -% -% Take a look at the \ikeyname{classoffset} key in section -% \ref{rFigureOutTheAppearance} if you want to highlight the keywords -% of the languages differently. -% -% \item[0.19] \rkeyname{defaultdialect}|=|\oarg{dialect}\meta{language} -% -% defines \meta{dialect} as default dialect for \meta{language}. -% If you have defined a default dialect other than empty, for example -% |defaultdialect=[iama]fool|, you can't select the empty dialect, even -% not with |language=[]fool|. -% \end{syntax} -% -% Eventually here's a small list of language specific keys. -% \begin{syntax} -% \item[0.19,false,optional] \rkeyname{printpod}|=|\meta{\alternative{true,false}} -% -% prints or drops PODs in Perl. -% -% \item[0.20,true,{renamed,optional}] \rkeyname{usekeywordsintag}|=|\meta{\alternative{true,false}}\label{uoption:usekeywordsintag} -% -% The package either use the first order keywords in tags or prints all -% identifiers inside |<>| in keyword style. -% -% \item[1.1,{{}},optional] \rkeyname{tagstyle}|=|\meta{style}\label{uoption:tagstyle} -% -% determines the style in which tags and their content is printed. -% -% \item[1.1,false,optional] \rkeyname{markfirstintag}|=|\meta{style}\label{uoption:markfirstintag} -% -% prints the first name in tags with keyword style. -% -% \item[0.20,true,optional] \rkeyname{makemacrouse}|=|\meta{\alternative{true,false}} -% -% Make specific: Macro use of identifiers, which are defined as first -% order keywords, also prints the surrounding |$(| and |)| in keyword -% style. e.g.~you could get -% \textbf{\textdollar(}\textbf{strip} \textdollar(BIBS)\textbf{)}. -% If deactivated you get -% \textdollar(\textbf{strip} \textdollar(BIBS)). -% \end{syntax} -% -% -% \subsection{Figure out the appearance}\label{rFigureOutTheAppearance} -% -% \begin{syntax} -% \item[0.18,{{}}] \rkeyname{basicstyle}|=|\meta{basic style} -% -% is selected at the beginning of each listing. You could use -% |\footnotesize|, |\small|, |\itshape|, |\ttfamily|, or something like -% that. The last token of \meta{basic style} must not read any following -% characters. -% -% \item[0.18,{{}}] \rkeyname{identifierstyle}|=|\meta{style} -% \item[0.11,\itshape] \rkeyname{commentstyle}|=|\meta{style} -% \item[0.12,{{}}] \rkeyname{stringstyle}|=|\meta{style} -% -% determine the style for non-keywords, comments, and strings. The -% \emph{last} token might be an one-parameter command like |\textbf| or -% |\underbar|. -% -% \item[0.11,\bfseries,addon] \rkeyname{keywordstyle}|=|\oarg{number}[\textasteriskcentered]\meta{style}\label{roption:keywordstyle} -% \item[0.19,keywordstyle,deprecated] \rkeyname{ndkeywordstyle}|=|\meta{style} -% -% are used to print keywords and second order keywords (if defined). -% The optional \meta{number} argument is the class number to which the -% style should be applied. -% |ndkeywordstyle| has the fixed class number 2. -% -% Add-on: If you use the optional star after the (optional) class number, the -% keywords are printed uppercase\,---\,even if a language is case -% sensitive and defines lowercase keywords only. Maybe there should also be an -% option for lowercase keywords \ldots -% -% \item[1.0,0] \rkeyname{classoffset}|=|\meta{number} -% -% is added to all class numbers before the styles, keywords, identifiers, -% etc.~are assigned. The example below defines the keywords directly; -% you could do it indirectly by selection two different languages. -% \end{syntax} -%\ifcolor -% \begin{lstxsample} -% \lstset{classoffset=0, -% morekeywords={one,three,five},keywordstyle=\color{red}, -% classoffset=1, -% morekeywords={two,four,six},keywordstyle=\color{blue}, -% classoffset=0}% restore default -% \end{lstxsample} -%\else -% \begin{lstxsample} -% \lstset{classoffset=0, -% morekeywords={one,three,five},keywordstyle=\itshape, -% classoffset=1, -% morekeywords={two,four,six},keywordstyle=\bfseries}, -% classoffset=0}% restore default -% \end{lstxsample} -%\fi -% \begin{lstsample}{}{} -% \begin{lstlisting} -% one two three -% four five six -% \end{lstlisting} -% \end{lstsample} -% -% \begin{syntax} -% \item[0.20,keywordstyle,{addon,bug,optional}] \rkeyname{texcsstyle}|=|[|*|]\oarg{class number}\meta{style}\label{roption:texcsstyle} -% \item[0.20,keywordstyle,optional] \rkeyname{directivestyle}|=|\meta{style} -% -% determine the style of \TeX\ control sequences and directives. -% Note that these key are present only if you've chosen an appropriate -% language. -% -% The optional star of |texcsstyle| also highlights the backslash in -% front of the control sequence name. Note that this option is set for -% all |texcs| lists. -% -% Bug: \texttt{texcs\ldots} interferes with other keyword lists. If, for -% example, \texttt{emph} contains the word \texttt{foo}, then the control -% sequence |\foo| will show up in \texttt{emphstyle}. -% -% \item[0.21] \rkeyname{emph}|=|\oarg{number}\marg{identifier list} -% \item[0.21] \rkeyname{moreemph}|=|\oarg{number}\marg{identifier list} -% \item[0.21] \rkeyname{deleteemph}|=|\oarg{number}\marg{identifier list} -% \item[0.21] \rkeyname{emphstyle}|=|\oarg{number}\marg{style} -% -% define, add and remove the \meta{identifier list} from `emphasize -% class \meta{number}' respectively define the style for that class. -% If you don't give an optional argument, the package assumes -% \meta{number}$\,=1$. -% -% These keys are described more detailed in section -% \ref{uEmphasizeIdentifiers}. -% -% \item[1.0] \rkeyname{delim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)} -% \item[1.0] \rkeyname{moredelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)} -% \item[1.0] \rkeyname{deletedelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt]\meta{delimiter\textup(s\textup)} -% -% deletes all previously defined delimiters (but neither strings nor -% comments) and defines the user supplied delimiter, adds the specified -% delimiter, or removes it. -% -% In the first two cases \meta{style} is used to print the delimited -% code (and the delimiters). Here, \meta{style} could be something like -% |\bfseries| or |\itshape|, or it could refer to other styles via -% \texttt{keywordstyle}, \texttt{keywordstyle2}, \texttt{emphstyle}, -% etc. -% -% Supported types are \texttt{l} and \texttt{s}, see the comment keys in -% section \ref{uLanguageDefinitions} for an explanation. If you use the -% prefix \texttt i, i.e.~\texttt{il} or \texttt{is}, the delimiters are -% not printed, which is some kind of invisibility. -% -% If you use one optional star, the package will detect keywords, -% comments, and strings inside the delimited code. With both optional -% stars, aditionally the style is applied cumulative, see section -% \ref{uDelimiters}. -% \end{syntax} -% -% -% \subsection{Getting all characters right} -% -% \begin{syntax} -% \item[0.18,true] \rkeyname{extendedchars}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{extendedchars} -% -% allows or prohibits extended characters in listings, that means -% (national) characters of codes 128--255. If you use extended -% characters, you should load \packagename{fontenc} and/or -% \packagename{inputenc}, for example. -% -% \item[1.0,{{}}] \rkeyname{inputencoding}|=|\meta{encoding} -% -% determines the input encoding. The usage of this key requires the -% \packagename{inputenc} package; nothing happens if it's not loaded. -% -% \item[1.1,false] \rkeyname{upquote}|=|\meta{\alternative{true,false}}\label{uoption:upquote} -% -% determines whether the left and right quote are printed |`'| or -% \texttt{\textasciigrave\textquotesingle}. -% This key requires the \packagename{textcomp} package. -% -% \item[0.12,8] \rkeyname{tabsize}|=|\meta{number} -% -% sets tabulator stops at columns $\meta{number}+1$, $2\cdot\meta{number}+1$, $3\cdot\meta{number}+1$, and so on. -% Each tabulator in a listing moves the current column to the next -% tabulator stop. -% -% \item[0.20,false] \rkeyname{showtabs}|=|\meta{\alternative{true,false}} -% -% make tabulators visible or invisible. A visible tabulator looks like -% \lstinline[showtabs]! !, but that can be changed. If you choose -% invisible tabulators but visible spaces, tabulators are converted to -% an appropriate number of spaces. -% -% \item[0.20] \rkeyname{tab}|=|\meta{tokens} -% -% \meta{tokens} is used to print a visible tabulator. You might want to use |$\to$|, |$\mapsto$|, |$\dashv$| or something like that instead of the strange default definition. -% -% \item[0.20,false] \rkeyname{showspaces}|=|\meta{\alternative{true,false}} -% -% lets all blank spaces appear {\textvisiblespace} or as blank spaces. -% -% \item[0.12,true] \rkeyname{showstringspaces}|=|\meta{\alternative{true,false}} -% -% lets blank spaces in strings appear {\textvisiblespace} or as blank -% spaces. -% -% \item[0.19,\bigbreak] \rkeyname{formfeed}|=|\meta{tokens} -% -% Whenever a listing contains a form feed \meta{tokens} is executed. -% \end{syntax} -% -% -% \subsection{Line numbers}\label{rLineNumbers} -% -% \begin{syntax} -% \item[1.0,none] \rkeyname{numbers}|=|\meta{\alternative{none,left,right}} -% -% makes the package either print no line numbers, or put them on the -% left or the right side of a listing. -% -% \item[0.16,1] \rkeyname{stepnumber}|=|\meta{number} -% -% All lines with ``line number $\equiv 0$ modulo \meta{number}'' get a -% line number. -% If you turn line numbers on and off with \keyname{numbers}, the -% parameter \keyname{stepnumber} will keep its value. Alternatively you -% can turn them off via |stepnumber=0| and on with a nonzero number and -% keep the value of \keyname{numbers}. -% -% \item[1.1,false] \rkeyname{numberfirstline}|=|\meta{\alternative{true,false}}\label{uoption:numberfirstline} -% -% The first line of each listing gets numbered (if numbers are on at all) -% even if the line number is not divisible by \keyname{stepnumber}. -% -% \item[0.16,{{}}] \rkeyname{numberstyle}|=|\meta{style} -% -% determines the font and size of the numbers. -% -% \item[0.19,10pt] \rkeyname{numbersep}|=|\meta{dimension} -% -% is the distance between number and listing. -% -% \item[1.0,true] \rkeyname{numberblanklines}|=|\meta{\alternative{true,false}} -% -% If this is set to false, blank lines get no printed line number. -% -% \item[0.20,auto] \rkeyname{firstnumber}|=|\meta{\alternative{auto,last,\normalfont\meta{number}}} -% -% \texttt{auto} lets the package choose the first number: a new listing -% starts with number one, a named listing continues the most recent -% same-named listing (see below), and a stand alone file begins with -% the number corresponding to the first input line. -% -% \texttt{last} continues the numbering of the most recent listing and -% \meta{number} sets it to the number. -% -% \item[1.0] \rkeyname{name}|=|\meta{name} -% -% names a listing. Displayed environment-listings with the same name -% share a line counter. -% -% \item[0.20,\arabic{lstnumber},data] \rcmdname\thelstnumber -% -% prints the lines' numbers. -% \end{syntax} -% We show an example on how to redefine |\thelstnumber|. But if you test it, -% you won't get the result shown on the left. -% \begin{lstxsample} -% \renewcommand*\thelstnumber{\oldstylenums{\the\value{lstnumber}}} -% \end{lstxsample} -% \begin{lstsample}{\lstset{stepnumber=-1}\label{rDecreasingLabels}}{} -% \begin{lstlisting}[numbers=left, -% firstnumber=753] -% begin { empty lines } -% -% -% -% -% -% -% end; { empty lines } -% \end{lstlisting} -% \end{lstsample} -% -% \begin{advise} -% \item -% The example shows a sequence $n,n+1,\ldots,n+7$ of 8 three-digit figures such that the sequence contains each digit $0,1,\ldots,9$. -% But 8 is not minimal with that property. -% Find the minimal number and prove that it is minimal. -% How many minimal sequences do exist? -% -% Now look at the generalized problem: -% Let $k\in\{1,\ldots,10\}$ be given. -% Find the minimal number $m\in\{1,\ldots,10\}$ such that there is a sequence $n,{n+1},\ldots,\allowbreak{n+m-1}$ of $m$ $k$-digit figures which contains each digit $\{0,\ldots,9\}$. -% Prove that the number is minimal. -% How many minimal sequences do exist? -% -% If you solve this problem with a computer, write a \TeX\ program! -% \end{advise} -% -% -% \subsection{Captions} -% -% In despite of \LaTeX\ standard behaviour, captions and floats are independent -% from each other here; you can use captions with non-floating listings. -% \begin{syntax} -% \item[0.21] \rkeyname{title}|=|\meta{title text} -% -% is used for a title without any numbering or label. -% -% \item[0.20] \rkeyname{caption}|={|\oarg{short}\meta{caption text}|}| -% -% The caption is made of \cs{lstlistingname} followed by a running -% number, a seperator, and \meta{caption text}. Either the caption text -% or, if present, \meta{short} will be used for the list of listings. -% -% \item[0.21] \rkeyname{label}|=|\meta{name} -% -% makes a listing referable via |\ref|\marg{name}. -% -% \item[0.16] \rcmdname\lstlistoflistings -% -% prints a list of listings. Each entry is with descending priority -% either the short caption, the caption, the file name or the name of the -% listing, see also the key \keyname{name} in section \ref{rLineNumbers}. -% -% \item[1.0] \rkeyname{nolol}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{nolol} -% -% If true, the listing does not make it into the list of listings. -% -% \item[0.16,Listings,data] \rcmdname\lstlistlistingname -% -% The header name for the list of listings. -% -% \item[0.20,Listing,data] \rcmdname\lstlistingname -% -% The caption label for listings. -% -% \item[0.20,\arabic{lstlisting},data] \rcmdname\thelstlisting -% -% prints the running number of the caption. -% -% \item[0.19] \rcmdname\lstname -% -% prints the name of the current listing which is either the file name or -% the name defined by the \keyname{name} key. This command can be used to -% define a caption or title template, for example by -% |\lstset{caption=\lstname}|. -% -% \item[0.20,t] \rkeyname{captionpos}|=|\meta{subset of \textup{\texttt{tb}}} -% -% specifies the positions of the caption: top and/or bottom of the -% listing. -% -% \item[0.20,\smallskipamount] \rkeyname{abovecaptionskip}|=|\meta{dimension} -% \item[0.20,\smallskipamount] \rkeyname{belowcaptionskip}|=|\meta{dimension} -% -% is the vertical space above respectively below each caption. -% \end{syntax} -% -% -% \subsection{Margins and line shape}\label{rMarginsAndLineShape} -% -% \begin{syntax} -% \item[0.21,\linewidth] \rkeyname{linewidth}|=|\meta{dimension} -% -% defines the base line width for listings. The following three keys are -% taken into account additionally. -% -% \item[0.19,0pt] \rkeyname{xleftmargin}|=|\meta{dimension} -% \item[1.0,0pt] \rkeyname{xrightmargin}|=|\meta{dimension} -% -% The dimensions are used as extra margins on the left and right. Line -% numbers and frames both move respectively shrink or grow accordingly. -% -% \item[0.19,false] \rkeyname{resetmargins}|=|\meta{\alternative{true,false}} -% -% If true indention from list environments like \texttt{enumerate} or -% \texttt{itemize} is reset, i.e.~not used. -% -% \item[0.20,false] \rkeyname{breaklines}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breaklines} -% -% activates or deactivates automatic line breaking of long lines. -% -% \item[1.2,false] \rkeyname{breakatwhitespace}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breakatwhitespace}\label{uoption:breakatwhitespace} -% -% If true, it allows line breaks only at white space. -% -% \item[0.20,{{}}] \rkeyname{prebreak}|=|\meta{tokens} -% \item[0.20,{{}}] \rkeyname{postbreak}|=|\meta{tokens} -% -% \meta{tokens} appear at the end of the current line respectively at the beginning of the next (broken part of the) line. -% -% You must not use dynamic space (in particular spaces) since internally we use |\discretionary|. -% However |\space| is redefined to be used inside \meta{tokens}. -% -% \item[0.20,20pt] \rkeyname{breakindent}|=|\meta{dimension} -% -% is the indention of the second, third, \ldots\ line of broken lines. -% -% \item[0.20,true] \rkeyname{breakautoindent}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breakautoindent} -% -% activates or deactivates automatic indention of broken lines. This -% indention is used additionally to \ikeyname{breakindent}, see the -% example below. -% Visible spaces or visible tabulators might set this auto -% indention to zero. -% \end{syntax} -% In the following example we use tabulators to create long lines, but the -% verbatim part uses |tabsize=1|. -% \begin{lstxsample} -% \lstset{postbreak=\space, breakindent=5pt, breaklines} -% \end{lstxsample} -% \begin{lstsample}{\lstset{string=[d]",tabsize=6}}{\lstset{tabsize=1}\hfuzz=1in} -% \begin{lstlisting} -% "A long string is broken!" -% "Another long line." -% \end{lstlisting} -% -% \begin{lstlisting}[breakautoindent -% =false] -% { Now auto indention is off. } -% \end{lstlisting} -% \end{lstsample} -% -% -% \subsection{Frames}\label{rFrames} -% -% \begin{syntax} -% \item[1.0,none] \rkeyname{frame}|=|\meta{\alternative{none,leftline,topline,bottomline,lines,single,shadowbox}} -% -% draws either no frame, a single line on the left, at the top, at the -% bottom, at the top and bottom, a whole single frame, or a shadowbox. -% -% Note that \packagename{fancyvrb} supports the same frame types except -% \texttt{shadowbox}. The shadow color is \keyname{rulesepcolor}, see -% below. -% -% \item[0.19,{{}}] \rkeyname{frame}|=|\meta{subset of \textup{\texttt{trblTRBL}}} -% -% The characters \texttt{trblTRBL} are attached to lines at the top and -% bottom of a listing and to lines on the right and left. Upper case -% characters are used to draw double rules. So |frame=tlrb| draws a -% single frame and |frame=TL| double lines at the top and on the left. -% -% Note that frames usually reside outside the listing's space. -% -% \item[0.20,ffff] \rkeyname{frameround}|=|\meta{\alternative{t,f}}\meta{\alternative{t,f}}\meta{\alternative{t,f}}\meta{\alternative{t,f}} -% -% The four letters are attached to the top right, bottom right, bottom -% left and top left corner. In this order. \texttt{t} makes the -% according corner round. If you use round corners, the rule width is -% controlled via |\thinlines| and |\thicklines|. -% -% Note: The size of the quarter circles depends on \keyname{framesep} -% and is independent of the extra margins of a frame. The size is -% possibly adjusted to fit \LaTeX's circle sizes. -% -% \item[0.19,3pt] \rkeyname{framesep}|=|\meta{dimension} -% \item[0.19,2pt] \rkeyname{rulesep}|=|\meta{dimension} -% -% control the space between frame and listing and between double rules. -% -% \item[0.19,0.4pt] \rkeyname{framerule}|=|\meta{dimension} -% -% controls the width of the rules. -% -% \item[1.0,0pt] \rkeyname{framexleftmargin}|=|\meta{dimension} -% \item[1.0,0pt] \rkeyname{framexrightmargin}|=|\meta{dimension} -% \item[1.0,0pt] \rkeyname{framextopmargin}|=|\meta{dimension} -% \item[1.0,0pt] \rkeyname{framexbottommargin}|=|\meta{dimension} -% -% are the dimensions which are used additionally to \keyname{framesep} -% to make up the margin of a frame. -% -% \item[0.21] \rkeyname{backgroundcolor}|=|\meta{color command} -% \item[0.21] \rkeyname{rulecolor}|=|\meta{color command} -% \item[1.0] \rkeyname{fillcolor}|=|\meta{color command} -% \item[1.0] \rkeyname{rulesepcolor}|=|\meta{color command} -% -% specify the colour of the background, the rules, the space between -% `text box' and first rule, and of the space between two rules, -% respectively. -% Note that the value requires a |\color| command, for example -% \keyname{rulecolor}|=\color{blue}|. -% \end{syntax} -% \ikeyname{frame} does not work with |fancyvrb=true| or when the package -% internally makes a |\hbox| around the listing! And there are certainly more -% problems with other commands. Take the time to make a (bug) report. -%\ifcolor -% \begin{lstxsample} -% \lstset{framexleftmargin=5mm, frame=shadowbox, rulesepcolor=\color{blue}} -% \end{lstxsample} -%\else -% \lstset{framexleftmargin=5mm, frame=shadowbox} -%\fi -% \begin{lstsample}{}{} -% \begin{lstlisting}[numbers=left] -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% -% Do you want exotic frames? -% Try the following key if you want for example -% \begin{lstsample}{\lstset{frameshape={RYRYNYYYY}{yny}{yny}{RYRYNYYYY}}}{} -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% \begin{syntax} -% \item[0.20,,\dag] \rkeyname{frameshape}|=|\marg{top shape}\marg{left shape}\marg{right shape}\marg{bottom shape} -% -% gives you full control over the drawn frame parts. -% The arguments are not case sensitive. -% -% Both \meta{left shape} and \meta{right shape} are `left-to-right' -% \alternative{y,n} character sequences (or empty). Each |y| lets the -% package draw a rule, otherwise the rule is blank. These vertical rules -% are drawn `left-to-right' according to the specified shapes. -% The example above uses |yny|. -% -% \meta{top shape} and \meta{bottom shape} are `left-rule-right' -% sequences (or empty). The first `left-rule-right' sequence is attached -% to the most inner rule, the second to the next, and so on. -% Each sequence has three characters: `rule' is either |y| or |n|; -% `left' and `right' are |y|, |n| or |r| (which makes a corner round). -% The example uses |RYRYNYYYY| for both shapes: -% |RYR| describes the most inner (top and bottom) frame shape, |YNY| -% the middle, and |YYY| the most outer. -% \end{syntax} -% To summarize, the example above used -% \begin{verbatim} -% \lstset{frameshape={RYRYNYYYY}{yny}{yny}{RYRYNYYYY}}\end{verbatim} -% Note that you are not resticted to two or three levels. -% However you'll get in trouble if you use round corners when they are too big. -% -% -% \subsection{Indexing} -% -% \begin{syntax} -% \item[0.19] \rkeyname{index}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers} -% \item[0.21] \rkeyname{moreindex}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers} -% \item[0.21] \rkeyname{deleteindex}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers} -% -% define, add and remove \meta{identifiers} and \meta{keyword classes} -% from the index class list \meta{number}. If you don't specify the -% optional number, the package assumes \meta{number} $=1$. -% -% Each appearance of the explicitly given identifiers and each appearance -% of the identifiers of the specified \meta{keyword classes} is indexed. -% For example, you could write |index=[1][keywords]| to index all -% keywords. Note that |[1]| is required here---otherwise we couldn't use -% the second optional argument. -% -% \item[0.19,\lstindexmacro] \rkeyname{indexstyle}|=|\oarg{number}\meta{tokens \textup(one-parameter command\textup)} -% -% \meta{tokens} actually indexes the identifiers for the list -% \meta{number}. In contrast to the style keys, \meta{tokens} -% \emph{must} read exactly one parameter, namely the identifier. -% Default definition is\icmdname{\lstindexmacro}\vspace*{-\itemsep} -% \begin{verbatim} -% \newcommand\lstindexmacro[1]{\index{{\ttfamily#1}}}\end{verbatim} -% \vspace*{-\itemsep}which you shouldn't modify. -% Define your own indexing commands and use them as argument to this key. -% \end{syntax} -% Section \ref{uIndexing} describes this feature in detail. -% -% -% \subsection{Column alignment}\label{rColumnAlignment} -% -% \begin{syntax} -% \item[1.0,{[c]fixed}] \rkeyname{columns}|=|\oarg{\alternative{c,l,r}}\meta{\alternative{fixed,flexible,fullflexible}} -% -% selects the respective column format, refer section -% \ref{uFixedAndFlexibleColumns}. -% -% The optional |c|, |l|, or |r| controls the horizontal orientation of -% smallest output units (keywords, identifiers, etc.). The arguments work -% as follows, where vertical bars visualize the effect: -% $\vert$\lstinline[columns={[c]fixed}]!listing!$\vert$, -% $\vert$\lstinline[columns={[l]fixed}]!listing!$\vert$, and -% $\vert$\lstinline[columns={[r]fixed}]!listing!$\vert$ -% in fixed column mode, -% $\vert$\lstinline[columns={[c]flexible}]!listing!$\vert$, -% $\vert$\lstinline[columns={[l]flexible}]!listing!$\vert$, and -% $\vert$\lstinline[columns={[r]flexible}]!listing!$\vert$ -% with flexible columns, and -% $\vert$\lstinline[columns={[c]fullflexible}]!listing!$\vert$, -% $\vert$\lstinline[columns={[l]fullflexible}]!listing!$\vert$, and -% $\vert$\lstinline[columns={[r]fullflexible}]!listing!$\vert$ -% with full flexible columns. -% -% \item[0.18,false] \rkeyname{flexiblecolumns}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{flexiblecolumns} -% -% selects the most recently selected flexible or fixed column format, -% refer to section \ref{uFixedAndFlexibleColumns}. -% -% \item[0.21,false,\dag] \rkeyname{keepspaces}|=|\meta{\alternative{true,false}} -% -% |keepspaces=true| tells the package not to drop spaces to fix column -% alignment and always converts tabulators to spaces. -% -% \item[0.16] \rkeyname{basewidth}|=|\meta{dimension}\syntaxor -% \item[0.18,{{0.6em,0.45em}}] \rkeyname{basewidth}|={|\meta{fixed}|,|\meta{flexible mode}|}| -% -% sets the width of a single character box for fixed and flexible column -% mode (both to the same value or individually). -% -% \item[0.20,false] \rkeyname{fontadjust}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{fontadjust} -% -% If true the package adjusts the base width every font selection. -% This makes sense only if \ikeyname{basewidth} is given in font specific -% units like `em' or `ex'---otherwise this boolean has no effect. -% -% After loading the package, it doesn't adjust the width every font -% selection: it looks at \ikeyname{basewidth} each listing and uses the -% value for the whole listing. This is possibly inadequate if the style -% keys in section \ref{rFigureOutTheAppearance} make heavy font size -% changes, see the example below. -% -% Note that this key might disturb the column alignment and might have an -% effect on the keywords' appearance! -% \end{syntax} -% \begin{lstsample}{\lstset{basicstyle=\normalsize}}{} -% \lstset{commentstyle=\scriptsize} -% \begin{lstlisting} -% { scriptsize font -% doesn't look good } -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% \begin{lstsample}{\lstset{basicstyle=\normalsize,commentstyle=\scriptsize}}{} -% \begin{lstlisting}[fontadjust] -% { scriptsize font -% looks better now } -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{lstlisting} -% \end{lstsample} -% -% -% \subsection{Escaping to \LaTeX}\label{rEscapingToLaTeX} -% -% \textbf{Note:} {\itshape Any escape to \LaTeX\ may disturb the column -% alignment since the package can't control the spacing there.} -% \begin{syntax} -% \item[0.18,false] \rkeyname{texcl}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{texcl} -% -% activates or deactivates \LaTeX\ comment lines. If activated, comment -% line delimiters are printed as usual, but the comment line text (up to -% the end of line) is read as \LaTeX\ code and typeset in comment style. -% \end{syntax} -% The example uses \Cpp\ comment lines (but doesn't say how to define them). -% Without |\upshape| we would get \textit{calculate} since the comment style -% is |\itshape|. -% \begin{lstsample}{\lstset{morecomment=[l]//}}{} -% \begin{lstlisting}[texcl] -% // \upshape calculate $a_{ij}$ -% A[i][j] = A[j][j]/A[i][j]; -% \end{lstlisting} -% \end{lstsample} -% -% \begin{syntax} -% \item[0.19,false] \rkeyname{mathescape}|=|\meta{\alternative{true,false}} -% -% activates or deactivates special behaviour of the dollar sign. -% If activated a dollar sign acts as \TeX's text math shift. -% -% This key is useful if you want to typeset formulas in listings. -% -% \item[0.19,{{}}] \rkeyname{escapechar}|=|\meta{character}\syntaxor\rkeyname{escapechar}|={}| -% -% If not empty the given character escapes the user to \LaTeX: all code -% between two such characters is interpreted as \LaTeX\ code. Note that -% \TeX's special characters must be entered with a preceding backslash, -% e.g.~|escapechar=\%|. -% -% \item[0.20,{{}}] \rkeyname{escapeinside}|=|\meta{character}\meta{character}\syntaxor\rkeyname{escapeinside}|={}| -% -% Is a generalization of \ikeyname{escapechar}. If the value is not -% empty, the package escapes to \LaTeX\ between the first and second -% character. -% -% \item[0.20,{{}}] \rkeyname{escapebegin}|=|\meta{tokens} -% \item[0.20,{{}}] \rkeyname{escapeend}|=|\meta{tokens} -% -% The tokens are executed at the beginning respectively at the end of -% each escape, in particular for \ikeyname{texcl}. -% See section \ref{uNationalCharacters} for an application. -% \end{syntax} -% -% \begin{lstsample}{\lstset{morecomment=[l]//}}{} -% \begin{lstlisting}[mathescape] -% // calculate $a_{ij}$ -% $a_{ij} = a_{jj}/a_{ij}$; -% \end{lstlisting} -% \end{lstsample} -% -% \begin{lstsample}{\lstset{morecomment=[l]//}}{} -% \begin{lstlisting}[escapechar=\%] -% // calc%ulate $a_{ij}$% -% %$a_{ij} = a_{jj}/a_{ij}$%; -% \end{lstlisting} -% \end{lstsample} -% -% \begin{lstsample}{\lstset{morecomment=[l]//}}{} -% \lstset{escapeinside=`'} -% \begin{lstlisting} -% // calc`ulate $a_{ij}$' -% `$a_{ij} = a_{jj}/a_{ij}$'; -% \end{lstlisting} -% \end{lstsample} -% In the first example the comment line up to $a_{ij}$ has been typeset by the -% \packagename{listings} package in comment style. The $a_{ij}$ itself is -% typeset in `\TeX\ math mode' without comment style. About the half -% comment line of the second example has been typeset by this package. -% The rest is in `\LaTeX\ mode'. -% -% To avoid problems with the current and future version of this package: -% \begin{enumerate} -% \item Don't use any command of the \packagename{listings} package when you -% have escaped to \LaTeX. -% \item Any environment must start and end inside the same escape. -% \item You might use |\def|, |\edef|, etc., but do not assume that the -% definitions are present later---except they are |\global|. -% \item |\if \else \fi|, groups, math shifts |$| and |$$|, \ldots\ must be -% balanced each escape. -% \item \ldots -% \end{enumerate} -% Expand that list yourself and mail me about new items. -% -% -% \subsection{Interface to \textsf{fancyvrb}} -% -% The \packagename{fancyvrb} package---fancy verbatims---from Timothy van Zandt -% provides macros for reading, writing and typesetting verbatim code. It has -% some remarkable features the \packagename{listings} package doesn't have. -% (Some are possible, but you must find somebody who implements them ; -- ). -% \begin{syntax} -% \item[0.19] \rkeyname{fancyvrb}|=|\meta{\alternative{true,false}} -% -% activates or deactivates the interface. If active, verbatim code is -% read by \packagename{fancyvrb} but typeset by \packagename{listings}, -% i.e.~with emphasized keywords, strings, comments, and so on. -% Internally we use a very special definition of |\FancyVerbFormatLine|. -% -% This interface works with |Verbatim|, |BVerbatim| and |LVerbatim|. -% But you shouldn't use \packagename{fancyvrb}'s \keyname{defineactive}. -% (As far as I can see it doesn't matter since it does nothing at all, -% but for safety \ldots) -% If \packagename{fancyvrb} and \packagename{listings} provide similar -% functionality, you should use \packagename{fancyvrb}'s. -% -% \item[1.1,{\overlay 1}] \rkeyname{fvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}\ldots\label{uoption:fvcmdparams} -% \item[1.1] \rkeyname{morefvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}\ldots\label{uoption:morefvcmdparams} -% -% If you use \packagename{fancyvrb}'s \keyname{commandchars}, you must -% tell the \packagename{listings} package how many arguments each command -% takes. If a command takes no arguments, there is nothing to do. -% -% The first (third, fifth, \ldots) parameter to the keys is the command -% and the second (fourth, sixth, \ldots) is the number of arguments -% that command takes. So, if you want to use |\textcolor{red}{keyword}| -% with the \packagename{fancyvrb}-\packagename{listings} interface, you -% should write |\lstset{morefvcmdparams=\textcolor 2}|. -% \end{syntax} -% -% \iffancyvrb -% \begin{lstsample}{}{} -% \lstset{morecomment=[l]\ }% :-) -% \fvset{commandchars=\\\{\}} -% -% \begin{BVerbatim} -% First verbatim line. -% \fbox{Second} verbatim line. -% \end{BVerbatim} -% -% \par\vspace{72.27pt} -% -% \lstset{fancyvrb} -% \begin{BVerbatim} -% First verbatim line. -% \fbox{Second} verbatim line. -% \end{BVerbatim} -% \lstset{fancyvrb=false} -% \end{lstsample} -% The lines typeset by the \packagename{listings} package are wider since the -% default \ikeyname{basewidth} equals not the width of a single typewriter type -% character. Moreover note that the first space begins a comment as defined at -% the beginning of the example. -% \else -% \begin{center} -% \packagename{fancyvrb} seems to be unavailable on your platform, thus the -% example couldn't be printed here. -% \end{center} -% \fi -% -% -% \subsection{Environments}\label{rEnvironments} -% -% If you want to define your own pretty-printing environments, try the -% following command. The syntax comes from \LaTeX's |\newenvironment|. -% \begin{syntax} -% \item[0.19] \rcmdname\lstnewenvironment\\ -% \marg{name}\oarg{number}\oarg{opt.~default~arg.}\\ -% |{|\meta{starting code}|}|\\ -% |{|\meta{ending code}|}| -% \end{syntax} -% As a simple example we could just select a particular language. -% \begin{lstxsample} -% \lstnewenvironment{pascal} -% {\lstset{language=pascal}} -% {} -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{pascal} -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% \end{pascal} -% \end{lstsample} -% Doing other things is as easy, for example, using more keys and adding an -% optional argument to adjust settings each listing: -% \begin{verbatim} -%\lstnewenvironment{pascalx}[1][] -% {\lstset{language=pascal,numbers=left,numberstyle=\tiny,float,#1}} -% {}\end{verbatim} -% -% -% \subsection{Language definitions}\label{rLanguageDefinitions} -% -% You should first read section \ref{uLanguageDefinitions} for an introduction -% to language definitions. Otherwise you're probably unprepared for the full -% syntax of |\lstdefinelanguage|. -% \begin{syntax} -% \item[0.19] \rcmdname\lstdefinelanguage\syntaxnewline[\oarg{dialect}]\marg{language}\syntaxnewline[\oarg{base dialect}\marg{and base language}]\syntaxnewline\marg{key=value list}\syntaxnewline[\oarg{list of required aspects \textup(keywordcomments,texcs,etc.\textup)}] -% -% defines the (given dialect of the) programming language \meta{language}. -% If the language definition is based on another definition, you must -% specify the whole \oarg{base dialect}\marg{and base language}. Note -% that an empty \meta{base dialect} uses the default dialect! -% -% The last optional argument should specify all required aspects. This is -% a delicate point since the aspects are described in the developer's -% guide. You might use existing languages as templates. For example, -% ANSI C uses \aspectname{keywords}, \aspectname{comments}, -% \aspectname{strings} and \aspectname{directives}. -% -% \icmdname{\lst@definelanguage} has the same syntax and is used to -% define languages in the driver files. -% -% \begin{advise} -% \item Where should I put my language definition? -% \advisespace -% If you need the language for one particular document, put it into -% the preamble of that document. Otherwise create the local file -% `\texttt{lstlang0.sty}' or add the definition to that file, but use -% `|\lst@definelanguage|' instead of `|\lstdefinelanguage|'. -% However, you might want to send the definition to the address in -% section \ref{uSoftwareLicense}. Then it will be published under the -% \LaTeX\ Project Public License. -% \end{advise} -% -% \item[0.18] \rcmdname\lstalias\marg{alias}\marg{language} -% -% defines an alias for a programming language. Each \meta{alias} is -% redirected to the same dialect of \meta{language}. -% It's also possible to define an alias for one particular dialect only: -% -% \item[0.18] \rcmdname\lstalias\oarg{alias dialect}\marg{alias}\oarg{dialect}\marg{language} -% -% Here all four parameters are \emph{nonoptional} and an alias with empty -% \meta{dialect} will select the default dialect. Note that aliases -% can't be nested: The two aliases `|\lstalias{foo1}{foo2}|' and -% `|\lstalias{foo2}{foo3}|' redirect |foo1| \emph{not} to |foo3|. -% \end{syntax} -% All remaining keys in this section are intended to build language -% definitions. \emph{No other key should be used in such a definition!} -% -% -% \paragraph{Keywords} -% We begin with keyword building keys. Note: {\itshape If you want to enter -% {\upshape|\|, |{|, |}|, |%|, |#|} or {\upshape|&|} inside or as an argument -% here or below, you must do it with a preceding backslash!} -% \begin{syntax} -% \item[1.0,,{\dag bug}] \rkeyname{keywordsprefix}|=|\meta{prefix} -% -% All identifiers starting with \meta{prefix} will be printed as first -% order keywords. -% -% Bugs: Currently there are several limitations. -% (1) The prefix is always case sensitive. -% (2) Only one prefix can be defined at the same time. -% (3) If used `standalone', the key might work only after selecting a -% nonempty language (and switching back to the empty language if -% necessary). -% (4) The key does not respect the value of \keyname{classoffset} and -% has no optional class \meta{number} argument. -% -% \item[0.11] \rkeyname{keywords}|=|\oarg{number}\marg{list of keywords} -% \item[0.11] \rkeyname{morekeywords}|=|\oarg{number}\marg{list of keywords} -% \item[0.18] \rkeyname{deletekeywords}|=|\oarg{number}\marg{list of keywords} -% -% define, add to or remove the keywords from keyword list \meta{number}. -% The use of \keyname{keywords} is discouraged since it deletes all -% previously defined keywords in the list and is thus incompatible with -% the \keyname{alsolanguage} key. -% -% Please note the keys \ikeyname{alsoletter} and \ikeyname{alsodigit} -% below if you use unusual charaters in keywords. -% -% \item[0.19,,deprecated] \rkeyname{ndkeywords}|=|\marg{list of keywords} -% \item[0.19,,deprecated] \rkeyname{morendkeywords}|=|\marg{list of keywords} -% \item[0.19,,deprecated] \rkeyname{deletendkeywords}|=|\marg{list of keywords} -% -% define, add to or remove the keywords from keyword list 2. -% The use of \keyname{ndkeywords} is strongly discouraged. -% -% \item[0.19,,{addon,optional}] \rkeyname{texcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)} -% \item[0.20,,{addon,optional}] \rkeyname{moretexcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)} -% \item[0.21,,{addon,optional}] \rkeyname{deletetexcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)} -% -% Ditto for control sequences in \TeX\ and \LaTeX. -% -% \item[0.18,,optional] \rkeyname{directives}|=|\marg{list of compiler directives} -% \item[0.21,,optional] \rkeyname{moredirectives}|=|\marg{list of compiler directives} -% \item[0.21,,optional] \rkeyname{deletedirectives}|=|\marg{list of compiler directives} -% -% defines compiler directives in C, \Cpp, Objective-C, and POV. -% -% \item[0.14] \rkeyname{sensitive}|=|\meta{\alternative{true,false}} -% -% makes the keywords, control sequences, and directives case sensitive -% and insensitive, respectively. This key affects the keywords, control -% sequences, and directives only when a listing is processed. In all -% other situations they are case sensitive, for example, -% |deletekeywords={save,Test}| removes `save' and `Test', but neither -% `SavE' nor `test'. -% -% \item[0.19] \rkeyname{alsoletter}|=|\marg{character sequence} -% \item[0.19] \rkeyname{alsodigit}|=|\marg{character sequence} -% \item[0.19] \rkeyname{alsoother}|=|\marg{character sequence} -% -% All identifiers (keywords, directives, and such) begin with a letter -% and goes on with alpha-numeric characters (letters and digits). -% For example, if you write -% |keywords={one-two,\#include}|, -% the minus must become a digit and the sharp a letter since the -% keywords can't be detected otherwise. -% -% Table \ref{rStdCharTable} show the standard configuration of the -% \packagename{listings} package. The three keys overwrite the default -% behaviour. Each character of the sequence becomes a letter, digit -% and other, respectively. -% -% \item[0.20] \rkeyname{otherkeywords}|=|\marg{keywords} -% -% Each given `keyword' is printed in keyword style, but without changing -% the `letter', `digit' and `other' status of the characters. This key -% is designed to define keywords like |=>|, |->|, |-->|, |--|, |::|, and -% so on. If one keyword is a subsequence of another (like |--| and -% |-->|), you must specify the shorter first. -% -% \item[0.20,,{renamed,optional}] \rkeyname{tag}|=|\meta{character}\meta{character}\syntaxor\rkeyname{tag}|={}|\label{uoption:tag} -% -% The first order keywords are active only between the first and second -% character. This key is used for HTML. -% \end{syntax} -% -% \begin{table}[tb] -% \caption{Standard character table}\label{rStdCharTable} -% \begin{tabular}{ll} -% class & characters\\ -% \noalign{\smallskip} -% letter & \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\ -% & \texttt{a b c d e f g h i j k l m n o p q r s t u v w x y z}\\ -% & \texttt{@ \textdollar\ } |_|\\ -% digit & \texttt{0 1 2 3 4 5 6 7 8 9}\\ -% other & \texttt{!\ " \#\ \%\ \&\ ' ( ) * + , - .\ / :\ ; < = > ?}\\ -% & {\catcode`\|=12\texttt{[ \char92\ ] \textasciicircum\ \char123\ | \char125\ \textasciitilde}}\\ -% space & chr(32)\\ -% tabulator & chr(9)\\ -% form feed & chr(12)\\ -% \noalign{\smallskip} -% \end{tabular} -% \par\noindent -% Note: Extended characters of codes 128--255 (if defined) are \emph{currently} -% letters. -% \end{table} -% -% -% \paragraph{Strings} -% \begin{syntax} -% \item[0.12] \rkeyname{string}|=|\oarg{\alternative{b,d,m,bd}}\marg{delimiter \textup(character\textup)} -% \item[0.21] \rkeyname{morestring}|=|\oarg{\alternative{b,d,m,bd}}\marg{delimiter} -% \item[0.21] \rkeyname{deletestring}|=|\oarg{\alternative{b,d,m,bd}}\marg{delimiter} -% -% define, add to or delete the delimiter from the list of string -% delimiters. Starting and ending delimiters are the same, i.e.~in the -% source code the delimiters must match each other. -% -% The optional argument is the type and controls how the delimiter itself -% is represented in a string or character literal: it is escaped by a -% |b|ackslash, |d|oubled (or both is allowed via |bd|) or it is -% `|m|atlabed'. -% The latter one is a special type for Ada and Matlab and possibly more -% languages where the string delimters are also used for other purposes. -% In general the delimiter is also doubled, but a string does not start -% after a letter, a right parenthesis, or a right bracket. -% \end{syntax} -% -% -% \paragraph{Comments} -% \begin{syntax} -% \item[0.13] \rkeyname{comment}|=|\oarg{type}\meta{delimiter\textup(s\textup)} -% \item[0.21] \rkeyname{morecomment}|=|\oarg{type}\meta{delimiter\textup(s\textup)} -% \item[0.21] \rkeyname{deletecomment}|=|\oarg{type}\meta{delimiter\textup(s\textup)} -% -% Ditto for comments, but some types require more than a single -% delimiter. The following overview uses \keyname{morecomment} as the -% only example. -% -% \item[0.13] \keyname{morecomment}|=[l]|\meta{delimiter} -% -% The delimiter starts a comment line, which in general starts with the -% delimiter and ends at end of line. If the character sequence |//| -% should start a comment line (like in \Cpp, Comal 80 or Java), -% |morecomment=[l]=//| is the correct declaration. For Matlab it -% would be |morecomment=[l]\%|---note the preceding backslash. -% -% \item[0.13] \keyname{morecomment}|=[s]|\marg{delimiter}\marg{delimiter} -% -% Here we have two delimiters. The second ends a comment starting with -% the first delimiter. If you require two such comments you can use this -% type twice. C, Java, PL/I, Prolog and SQL all define single comments -% via |morecomment=[s]{/*}{*/}|, and Algol does it with -% |morecomment=[s]{\#}{\#}|, which means that the sharp delimits both -% beginning and end of a single comment. -% -% \item[0.13] \keyname{morecomment}|=[n]|\marg{delimiter}\marg{delimiter} -% -% is similar to type |s|, but comments can be nested. Identical arguments -% are not allowed---think a while about it! -% Modula-2 and Oberon-2 use |morecomment=[n]{(*}{*)}|. -% -% \item[0.18] \keyname{morecomment}|=[f][]|\oarg{n=preceding columns}\meta{delimiter} -% -% The delimiter starts a comment line if and only if it appears on a -% fixed column-number, namely if it is in column $n$ (zero based). -% -% \item[0.17,,optional] \rkeyname{keywordcomment}|=|\marg{keywords} -% \item[0.21,,optional] \rkeyname{morekeywordcomment}|=|\marg{keywords} -% \item[0.21,,optional] \rkeyname{deletekeywordcomment}|=|\marg{keywords} -% -% A keyword comment begins with a keyword and ends with the same keyword. -% Consider |keywordcomment={comment,co}|. Then -% `\textbf{comment}\allowbreak\ldots\textbf{comment}' and -% `\textbf{co}\ldots\textbf{co}' are comments. -% -% \item[0.17,,optional] \rkeyname{keywordcommentsemicolon}|=|\marg{keywords}\marg{keywords}\marg{keywords} -% -% The definition of a `keyword comment semicolon' requires three keyword -% lists, e.g.~|{end}{else,end}{comment}|. A semicolon always ends such a -% comment. Any keyword of the first argument begins a comment and any -% keyword of the second argument ends it (and a semicolon also); -% a comment starting with any keyword of the third argument is terminated -% with the next semicolon only. In the example all possible comments are -% `\textbf{end}\ldots\textbf{else}', `\textbf{end}\ldots\textbf{end}' -% (does not start a comment again) and `\textbf{comment}\ldots;' and -% `\textbf{end}\ldots;'. -% Maybe a curious definition, but Algol and Simula use such comments. -% -% Note: The keywords here need not to be a subset of the defined -% keywords. They won't appear in keyword style if they aren't. -% -% \item[0.17,,optional] \rkeyname{podcomment}|=|\meta{\alternative{true,false}} -% -% activates or deactivates PODs---Perl specific. -% \end{syntax} -% -% -% \subsection{Installation}\label{rInstallation} -% -% \paragraph{Software installation} -% \begin{enumerate} -% \item Following the \TeX\ directory structure (TDS), you should put the files -% of the \packagename{listings} package into directories as follows: -% \begin{center} -% \begin{tabular}{lcl} -% \texttt{listings.pdf}&$\to$&\texttt{texmf/doc/latex/listings}\\ -% \texttt{listings.dtx}, \texttt{listings.ins},\\ -% \texttt{listings.ind}, \texttt{lstpatch.sty},\\ -% \texttt{lstdrvrs.dtx}&$\to$&\texttt{texmf/source/latex/listings} -% \end{tabular} -% \end{center} -% Note that you possibly don't have a patch file \texttt{lstpatch.sty}. -% If you don't use the TDS, simply adjust the directories below. -% \item Create the directory \texttt{texmf/tex/latex/listings} or remove all -% files except \texttt{lst}\meta{whatever}\texttt{0.sty} and -% \texttt{lstlocal.cfg} from that directory. -% \item Change the working directory to \texttt{texmf/source/latex/listings} -% and run \texttt{listings.ins} through \TeX. -% \item Move the generated files to \texttt{texmf/tex/latex/listings} if this -% is not already done. -% \begin{center} -% \begin{tabular}{lcl} -% \texttt{listings.sty}, \texttt{lstmisc.sty}, -% &&\qquad(kernel and add-ons)\\ -% \texttt{listings.cfg}, -% &&\qquad(configuration file)\\ -% \texttt{lstlang}\meta{number}\texttt{.sty}, -% &&\qquad(language drivers)\\ -% \texttt{lstpatch.sty}&$\to$&\texttt{texmf/tex/latex/listings} -% \end{tabular} -% \end{center} -% \item If your \TeX\ implementation uses a file name database, update it. -% \item If you receive a patch file later on, put it where -% \texttt{listings.sty} is (and update file name database). -% \end{enumerate} -% Note that \packagename{listings} requires at least version 1.10 of the -% \packagename{keyval} package included in the \packagename{graphics} bundle by -% David Carlisle. -% -% -% \paragraph{Software configuration} -% Read this only if you encounter problems with the standard configuration or -% if you want the package to suit foreign languages, for example. -% -% Never modify a file from the \packagename{listings} package, in particular -% not the configuration file. Each new installation or new version overwrites -% it. The software license allows modification, but I can't recommend it. -% It's better to create one or more of the files -% \begin{center} -% \begin{tabular}{lcl} -% \texttt{lstmisc0.sty} & for & local add-ons -% (see developer's guide),\\ -% \texttt{lstlang0.sty} & for & local language definitions -% (see \ref{rLanguageDefinitions}), and\\ -% \texttt{lstlocal.cfg} & as & local configuration file -% \end{tabular} -% \end{center} -% and put it/them to the other \packagename{listings} files. These three files -% are not touched by a new installation except you remove them. -% If \texttt{lstlocal.cfg} exists, it is loaded after \texttt{listings.cfg}. -% You might want to change one of the following parameters. -% \begin{syntax} -% \item[,,data] \rcmdname\lstaspectfiles\quad contains~\rlap{\texttt{\lstaspectfiles}} -% \item[,,data] \rcmdname\lstlanguagefiles\quad contains~\rlap{\texttt{\lstlanguagefiles}} -% -% The package uses the specified files to find add-ons and language -% definitions. -% \end{syntax} -% Moreover you might want to adjust -% \icmdname\lstlistlistingname, -% \icmdname\lstlistingname, -% \ikeyname{defaultdialect}, -% \icmdname\lstalias, or -% \icmdname\lstalias -% as described in earlier section. -% -% -% \section{Experimental features}\label{rExperimentalFeatures} -% -% This section describes the more or less unestablished parts of this package. -% It's unlikely that they are all removed (except it is stated explicitly), but -% they are liable to (heavy) changes and improvements. Such features have been -% \dag-marked in the last sections. So, if you find anything \dag-marked here, -% you should be very, very careful. -% -% -% \subsection{Listings inside arguments}\label{rListingsInsideArguments} -% -% There are some things to consider if you want to use |\lstinline| or the -% listing environment inside arguments. Since \TeX\ reads the argument before -% the `\lst-macro' is executed, this package can't do anything to preserve the -% input: spaces shrink to one space, the tabulator and the end of line are -% converted to spaces, \TeX's comment character is not printable, and so on. -% Hence, \emph{you} must work a bit more. You have to put a backslash in front -% of each of the following four characters: |\{}%|. Moreover you must protect -% spaces in the same manner if: (i) there are two or more spaces following each -% other or (ii) the space is the first character in the line. -% That's not enough: Each line must be terminated with a `line feed' |^^J|. -% And you can't escape to \LaTeX\ inside such listings! -% -% The easiest examples are with |\lstinline| since we need no line feed. -% \begin{verbatim} -%\footnote{\lstinline{var i:integer;} and -% \lstinline!protected\ \ spaces! and -% \fbox{\lstinline!\\\{\}\%!}}\end{verbatim} -% yields\lstset{language=Pascal}\footnote{\lstinline{var i:integer;} and -% \lstinline!protected\ \ spaces! and -% \fbox{\lstinline!\\\{\}\%!}} -% if the current language is Pascal. Note that this example shows another -% experimental feature: use of argument braces as delimiters. This is -% described in section \ref{rTypesettingListings}. -% -% And now an environment example: -% \begin{lstsample}{\lstset{language={}}}{} -% \fbox{% -% \begin{lstlisting}^^J -% \ !"#$\%&'()*+,-./^^J -% 0123456789:;<=>?^^J -% @ABCDEFGHIJKLMNO^^J -% PQRSTUVWXYZ[\\]^_^^J -% `abcdefghijklmno^^J -% pqrstuvwxyz\{|\}~^^J -% \end{lstlisting}} -% \end{lstsample} -% \begin{advise} -% \item You might wonder that this feature is still experimental. The reason: -% You shouldn't use listings inside arguments; it's not always safe. -% \end{advise} -% -% -% \subsection{\dag\ Export of identifiers}\label{rExportOfIdentifiers} -% -% It would be nice to export function or procedure names. In general that's a -% dream so far. The problem is that programming languages use various syntaxes -% for function and procedure declaration or definition. A general interface is -% completely out of the scope of this package---that's the work of a compiler -% and not of a pretty-printing tool. However, it is possible for particular -% languages: in Pascal each function or procedure definition and variable -% declaration is preceded by a particular keyword. -% Note that you must request the following keys with \texttt{procnames} option: -% |\usepackage[procnames]{listings}|. -% \begin{syntax} -% \item[0.19,{{}},{\dag optional}] \rkeyname{procnamekeys}|=|\marg{keywords} -% \item[0.21,,\dag optional] \rkeyname{moreprocnamekeys}|=|\marg{keywords} -% \item[0.21,,\dag optional] \rkeyname{deleteprocnamekeys}|=|\marg{keywords} -% -% each specified keyword indicates a function or procedure definition. -% Any identifier following such a keyword appears in `procname' style. -% For Pascal you might use\vspace{-.5\baselineskip} -% \begin{verbatim} -% procnamekeys={program,procedure,function}\end{verbatim} -% -% \item[0.19,keywordstyle,\dag optional] \rkeyname{procnamestyle}|=|\meta{style} -% -% defines the style in which procedure and function names appear. -% -% \item[0.19,false,\dag optional] \rkeyname{indexprocnames}|=|\meta{\alternative{true,false}} -% -% If activated, procedure and function names are also indexed. -% \end{syntax} -% \begin{TODO} -% The \aspectname{procnames} aspect is unsatisfactory (since unchanged for more -% than four years). It marks and indexes the function definitions so far, but -% it would be possible to mark also the following function calls, for example. -% A key could control whether function names are added to a special keyword -% class, which then appears in `procname' style. But should these names be -% added globally? There are good reasons for both. Of course, we would also -% need a key to reset the name list. -% \end{TODO} -% -% -% \subsection{\dag\ Hyper references}\label{rHyperReferences} -% -% This very small aspect must be requested via \texttt{hyper} option since it -% is experimental. One perspective for the future is to combine this aspect -% with \aspectname{procnames}. Then it should be possible to click on a -% function name and jump to its definition, for example. -% \begin{syntax} -% \item[0.21,,{\dag optional}] \rkeyname{hyperref}|=|\marg{identifiers} -% \item[0.21,,{\dag optional}] \rkeyname{morehyperref}|=|\marg{identifiers} -% \item[0.21,,{\dag optional}] \rkeyname{deletehyperref}|=|\marg{identifiers} -% -% Hyper references the specified identifiers (via \packagename{hyperref} -% package). A `click' on such an identifier jumps to the previous -% occurrence. -% -% \item[0.21,\hyper@@anchor,{\dag optional}] \rkeyname{hyperanchor}|=|\meta{two-parameter macro} -% \item[0.21,\hyperlink,{\dag optional}] \rkeyname{hyperlink}|=|\meta{two-parameter macro} -% -% The macros are used to set an hyper anchor and link, respectively. -% The defaults are suited for the \packagename{hyperref} package. -% \end{syntax} -% -% -% \subsection{Literate programming} -% -% We begin with an example and hide the crucial key=value list. -% \begin{lstsample}{\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}}{} -% \begin{lstlisting} -% var i:integer; -% -% if (i<=0) i := 1; -% if (i>=0) i := 0; -% if (i<>0) i := 0; -% \end{lstlisting} -% \end{lstsample} -% Funny, isn't it? We could write |i := 0| respectively i| |$\gets$| |0 -% instead, but that's not literate!^^A :-) -% Now you might want to know how this has been done. Have a \emph{close} -% look at the following key. -% \begin{syntax} -% \item[0.20,,\dag] \rkeyname{literate}|=|\meta{replacement item}\ldots\meta{replacement item} -% -% First note that there are no commas between the items. Each item -% consists of three arguments: -% \marg{replace}\marg{replacement text}\marg{length}. -% \meta{replace} is the original character sequence. -% Instead of printing these characters, we use \meta{replacement text}, -% which takes the width of \meta{length} characters in the output. -% -% Each `printing unit' in \meta{replacement text} \emph{must} be braced -% except it's a single character. For example, you must put braces -% around |$\leq$|. -% If you want to replace |<-1->| by |$\leftarrow1\rightarrow$|, the -% replacement item would be |{<-1->}{{$\leftarrow$}1{$\rightarrow$}}3|. -% Note the braces around the arrows. -% -% If one \meta{replace} is a subsequence of another \meta{replace}, you -% must use the shorter sequence first. For example, |{-}| must be used -% before |{--}| and this before |{-->}|. -% \end{syntax} -% In the example above I've used -% \begin{verbatim} -% literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1\end{verbatim} -% \begin{TODO} -% Of course, it's good to have keys for adding and removing single -% \meta{replacement item}s. Maybe the key(s) should work in the same fashion -% as the string and comment definitions, i.e.~one item per key=value. -% This way it would be easier to provide better auto-detection in case of a -% subsequence. -% \end{TODO} -% -% -% \subsection{\textsf{LGrind} definitions}\label{rLGrindDefinitions} -% -% Yes, it's a nasty idea to steal language definitions from other programs. -% Nevertheless, it's possible for the \packagename{LGrind} definition -% file---at least partially. Please note that this file must be found by -% \TeX. -% \begin{syntax} -% \item[0.21,,{optional}] \rkeyname{lgrindef}|=|\meta{language} -% -% scans the \texttt{lgrindef} language definition file for -% \meta{language} and activates it if present. Note that not all -% \packagename{LGrind} capabilities have a \packagename{listings} -% analogue. -% -% Note that `Linda' language doesn't work properly since it defines -% compiler directives with preceding `|#|' as keywords. -% -% \item[0.21,lgrindef.,{data,optional}] \rcmdname\lstlgrindeffile -% -% contains the (path and) name of the definition file. -% \end{syntax} -% -% -% \subsection{\dag\ Automatic formatting} -% -% \lstloadaspects{formats}^^A -% The automatic source code formatting is far away from being good. First of -% all, there are no general rules on how source code should be formatted. So -% `format definitions' must be flexible. This flexibility requires a complex -% interface, a powerful `format definition' parser, and lots of code lines -% behind the scenes. Currently, format definitions aren't flexible enough -% (possibly not the definitions but the results). A single `format item' has -% the form -% \begin{itemize}\item[] -% \meta{input chars}|=|\oarg{exceptional chars}\meta{pre}\oarg{\texttt{\string\string}}\meta{post} -% \end{itemize} -% Whenever \meta{input chars} aren't followed by one of the \meta{exceptional -% chars}, formatting is done according to the rest of the value. If |\string| -% isn't specified, the input characters aren't printed (except it's an -% identifier or keyword). Otherwise \meta{pre} is `executed' before printing -% the original character string and \meta{post} afterwards. These two are -% `subsets' of -% \begin{itemize} -% \item |\newline| ---ensuring a new line; -% \item |\space| ---ensuring a whitespace; -% \item |\indent| ---increasing indention; -% \item |\noindent| ---descreasing indention. -% \end{itemize} -% Now we can give an example.\lstaspectindex{\lstdefineformat}{}\lstaspectindex{format}{} -% \begin{lstxsample} -% \lstdefineformat{C}{% -% \{=\newline\string\newline\indent,% -% \}=\newline\noindent\string\newline,% -% ;=[\ ]\string\space} -% \end{lstxsample} -% \begin{lstsample}{\lstset{language={}}}{} -% \begin{lstlisting}[format=C] -% for (int i=0;i<10; i++){/* wait */}; -% \end{lstlisting} -% \end{lstsample} -% Not good. But there is a (too?) simple work-around: -% \begin{lstxsample} -% \lstdefineformat{C}{% -% \{=\newline\string\newline\indent,% -% \}=[;]\newline\noindent\string\newline,% -% \};=\newline\noindent\string\newline,% -% ;=[\ ]\string\space} -% \end{lstxsample} -% \begin{lstsample}{\lstset{language={}}}{} -% \begin{lstlisting}[format=C] -% for (int i=0;i<10; i++){/* wait */}; -% \end{lstlisting} -% \end{lstsample} -% Sometimes the problem is just to find a suitable format definition. -% Further formatting is complicated. -% Here are only three examples with increasing level of difficulty. -% \begin{enumerate} -% \item Insert horizontal space to separate function/procedure name and -% following parenthesis or to separate arguments of a function, -% e.g.~add the space after a comma (if inside function call). -% \item Smart breaking of long lines. Consider long `and/or' expressions. -% Formatting should follow the logical structure! -% \item Context sensitive formatting rules. It can be annoying if empty -% or small blocks take three or more lines in the output---think of -% scrolling down all the time. So it would be nice if the block -% formatting was context sensitive. -% \end{enumerate} -% Note that this is a very first and clumsy attempt to provide automatic -% formatting---clumsy since the problem isn't trivial. Any ideas are welcome. -% Implementations also. Eventually you should know that you must request format -% definitions at package loading, e.g.~via |\usepackage[formats]{listings}|. -% -% \subsection{Arbitrary linerange markers}\label{rArbitraryLinerangeMarkers} -% -% Instead of using \keyname{linerange} with line numbers, one can use text -% markers. Each such marker consists of a \meta{prefix}, a \meta{text}, and a -% \meta{suffix}. You once (or more) define prefixes and suffixes and then use -% the marker text instead of the line numbers. -% \begin{lstxsample} -% \lstset{rangeprefix=\{\ ,% curly left brace plus space -% rangesuffix=\ \}}% space plus curly right brace -% \end{lstxsample} -% \begin{lstsample}{}{} -% \begin{lstlisting}% -% [linerange=loop\ 2-end] -% { loop 1 } -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% { end } -% { loop 2 } -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% { end } -% \end{lstlisting} -% \end{lstsample} -% Note that \TeX's special characters like the curly braces, the space, the -% percent sign, and such must be escaped with a backslash. -% \begin{syntax} -% \item[1.2] \rkeyname{rangebeginprefix}|=|\meta{prefix} -% \item[1.2] \rkeyname{rangebeginsuffix}|=|\meta{suffix} -% \item[1.2] \rkeyname{rangeendprefix}|=|\meta{prefix} -% \item[1.2] \rkeyname{rangeendsuffix}|=|\meta{suffix} -% -% define individual prefixes and suffixes for the begin- and end-marker. -% -% \item[1.2] \rkeyname{rangeprefix}|=|\meta{prefix} -% \item[1.2] \rkeyname{rangesuffix}|=|\meta{suffix} -% -% define identical prefixes and suffixes for the begin- and end-marker. -% -% \item[1.2,true] \rkeyname{includerangemarker}|=|\meta{\alternative{true,false}} -% -% shows or hides the markers in the output. -% \end{syntax} -% \begin{lstsample}{\lstset{rangeprefix=\{\ ,rangesuffix=\ \}}}{} -% \begin{lstlisting}% -% [linerange=loop\ 1-end, -% includerangemarker=false, -% frame=single] -% { loop 1 } -% for i:=maxint to 0 do -% begin -% { do nothing } -% end; -% { end } -% \end{lstlisting} -% \end{lstsample} -% -% -%\iffalse -% \section{Forthcoming ?} -% -% This section is rather rudimentary. It just lists some things I don't want -% to forget. -% -% First of all, I'd like to support even more languages, for example Maple, -% PostScript, and so on. Fortunately my lifetime is limited, so other -% people may do that work. Please (e-)mail me your language definitions. -% -% Then, there are several ideas for the future. Some have already been stated -% as `to do's; some came from other people and are stated below; some more are -% far from being implemented, -% e.g.~\keyname{linerange}|=|\oarg{inter}\marg{line range list} -% which prints all lines in the range and executes \meta{inter} when omitting -% some code lines. The main problem here are frames and background colours; -% what should happen to them? In fact, the problem is how this can be coded. -% Another idea is to change the background colour (or the basic style) for -% particular code blocks. This, too, is not easy. -% -%^^A Auto-detect whether surplus space (from spaces and tabs) isn't needed to fix -%^^A alignment of wide character combinations like |==| or |<>|. -%^^A -%^^A Make package compatible to calc package. -%^^A -%^^A Rewrite \lst@LAS, \lst@DefDriver, \lst@Require to distinguish loading -%^^A of languages (which don't need base languages at once) and aspects -%^^A (which need required aspects to be loaded). -% -% \lsthelper{Vincent~Poirriez}{1999/11/18}{code examples inside caml comments}: -% Inside caml comments, |[| and |]| should print the code in -% between in basicstyle (or another newly introduced style). Nesting of these -% `code example delimiters' is allowed, e.g.~|(* [[x;y]] *)|. -% -% \lsthelper{Claus~Atzenbeck}{1999/12/03}{`extendedchars=false' doesn't issue -% warning when extended characters are used}: issue warning in final mode if -% \ikeyname{extendedchars}|=false| but extended chars are used. -% -% \lsthelper{Andreas~Matthias}{2000/01/04}{define header/footer to print -% the listing name}: Make the header/footer print the listing name. Some -% people asked for continued captions. -%\fi -% -% -% \part{Tips and tricks} -% -% Note: This part of the documentation is under construction. -% Section \ref{uHowTos} must be sorted by topic and ordered in some way. -% Moreover a new section `Examples' is planned, but not written. -% Lack of time is the main problem \ldots -% -% -% \section{Troubleshooting}\label{uTroubleshooting} -% -% If you're faced with a \packagename{listings}' package problem, there are -% some steps you should undergo before you make a bug report. First you should -% consult the reference guide whether the problem is already known. If not, -% create a \emph{minimal} file which reproduces the problem. Follow these -% instructions: -% \begin{enumerate} -% \item Start from the minimal file in section \ref{uAMinimalFile}. -% \item Add the \LaTeX\ code which causes the problem, but keep it short. -% In particular, keep the number of additional packages small. -% \item Remove some code from the file (and the according packages) until the -% problem disappears. Then you've found a crucial piece. -% \item Add this piece of code again and start over with step 3 until all code -% and all packages are substantial. -% \item You now have a minimal file. Send a bug report to the address on the -% first page of this documentation and include the minimal file together -% with the created \texttt{.log}-file. If you use a very special package -% (i.e.~not on CTAN), also include the package if its software license -% allows it. -% \end{enumerate} -% -% -% \section{How tos}\label{uHowTos} -% -% -% \subsubsection*{How to reference line numbers} -% You want to put |\label{|\meta{whatever}|}| into a \LaTeX\ escape which is -% inside a comment whose delimiters aren't printed? The compiler won't see the -% \LaTeX\ code since inside a comment, and the \packagename{listings} package -% won't print anything since the delimiters are dropped and |\label| doesn't -% produce any printable output. Well, your wish is granted. -% -% In Pascal, for example, you could make the package recognize the `special' -% comment delimiters |(*@| and |@*)| as begin-escape and end-escape sequences. -% Then you can use this special comment for |\label|s and other things. -% \begin{lstsample}{\lstset{numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} -% \lstset{escapeinside={(*@}{@*)}} -% -% \begin{lstlisting} -% for i:=maxint to 0 do -% begin -% { comment }(*@\label{comment}@*) -% end; -% \end{lstlisting} -% Line \ref{comment} shows a comment. -% \end{lstsample} -% \begin{advise} -% \item Can I use `|(*@|' and `|*)|' instead? -% \advisespace -% Yes. -% \item Can I use `|(*|' and `|*)|' instead? -% \advisespace -% Sure. If you want this. -% \item Can I use `|{@|' and `|@}|' instead? -% \advisespace -% No, never! The second delimiter is not allowed. The character `|@|' is -% defined to check whether the escape is over. But reading the lonely -% `end-argument' brace, \TeX\ encounters the error `\texttt{Argument of @ -% has an extra \char125}'. Sorry. -% \item Can I use `|{|' and `|}|' instead? -% \advisespace -% No. Again the second delimiter is not allowed. Here now \TeX\ would -% give you a `\texttt{Runaway argument}' error. Since `|}|' is defined to -% check whether the escape is over, it won't work as `end-argument' brace. -% \item And how can I use a comment line? -% \advisespace -% For example, write `|escapeinside={//*}{\^^M}|'. Here |\^^M| represents -% the end of line character. -% \end{advise} -% -% -% \subsubsection*{How to gobble characters} -% To make your \LaTeX\ code more readable, you might want to indent your -% \texttt{lstlisting} listings. This indention must be removed for -% pretty-printing. If you indent each code line by three characters, you can -% remove them via |gobble=3|: -% \begin{lstsample}{}{\lstset{showspaces}} -% \begin{lstlisting}[gobble=3] -% 1 for i:=maxint to 0 do -% 2 begin -% 3 { do nothing } -% 123end; -% -% Write('Case insensitive '); -% WritE('Pascal keywords.'); -% \end{lstlisting} -% \end{lstsample} -% Note that empty lines as well as the beginning and the end of the environment -% need not to respect the indention. But never indent the end by more than -% `\ikeyname{gobble}' characters. Moreover note that tabulators expand to -% |tabsize| spaces before we gobble. -% \begin{advise} -% \item Could I use `\ikeyname{gobble}' together with `|\lstinputlisting|'? -% \advisespace -% Yes, but it has no effect. -% -% \item Note that `\ikeyname{gobble}' can also be set via `|\lstset|'. -% \end{advise} -% -% -% \subsubsection*{How to include graphics} -% \lsthelper{Herbert~Weinhandl}{1999/09/06}{listings + eps} found a very easy -% way to include graphics in listings. Thanks for contributing this idea---an -% idea I never have had. -% -% Some programming languages allow the dollar sign to be part of an identifier. -% But except for intermediate function names or library functions, this -% character is most often unused. The \packagename{listings} package defines -% the \ikeyname{mathescape} key, which lets `|$|' escape to \TeX's math mode. -% This makes the dollar character an excellent candidate for our purpose here: -% use a package which can include a graphic, set \ikeyname{mathescape} true, -% and include the graphic between two dollar signs, which are inside a comment. -% -% The following example is originally from a header file I got from Herbert. -% For the presentation here I use the \texttt{lstlisting} environment and an -% excerpt from the header file. The |\includegraphics| command is from -% David Carlisle's \packagename{graphics} bundle. -% \begin{verbatim} -% \begin{lstlisting}[mathescape=true] -% /* -% $ \includegraphics[height=1cm]{defs-p1.eps} $ -% */ -% typedef struct { -% Atom_T *V_ptr; /* pointer to Vacancy in grid */ -% Atom_T *x_ptr; /* pointer to (A|B) Atom in grid */ -% } ABV_Pair_T; -% \end{lstlisting}\end{verbatim} -% The result looks pretty good. Unfortunately you can't see it. -% -% -% \subsubsection*{How to get closed frames on each page} -% The package supports closed frames only for listings which don't cross pages. -% If a listing is split on two pages, there is neither a bottom rule at the -% bottom of a page, nor a top rule on the following page. If you insist on -% these rules, you might want to use \texttt{framed.sty} by Donald Arseneau. -% Then you could write -% \begin{verbatim} -% \begin{framed} -% \begin{lstlisting} -% or \lstinputlisting{...} -% \end{lstlisting} -% \end{framed}\end{verbatim} -% The package also provides a \texttt{shaded} environment. If you use it, you -% shouldn't forget to define \texttt{shadecolor} with the \packagename{color} -% package. -% -% -% \subsubsection*{How to print national characters with $\Lambda$ and \packagename{listings}}\label{uNationalCharacters} -% -% Apart from typing in national characters directly, you can use the `escape' -% feature described in section \ref{rEscapingToLaTeX}. -% The keys \ikeyname{escapechar}, \ikeyname{escapeinside}, and \ikeyname{texcl} -% allow partial usage of \LaTeX\ code. -% -% Now, if you use $\Lambda$ (Lambda, the \LaTeX\ pendant to Omega) and want, -% for example, Arabic comment lines, you need not to write |\begin{arab}| -% \ldots\ |\end{arab}| each escaped comment line. This can be automated: -% \begin{verbatim} -% \lstset{escapebegin=\begin{arab},escapeend=\end{arab}} -% -% \begin{lstlisting}[texcl] -% // Replace text by Arabic comment. -% for (int i=0; i<1; i++) { }; -% \end{lstlisting}\end{verbatim} -% If your programming language doesn't have comment lines, you'll have to use -% \ikeyname{escapechar} or \ikeyname{escapeinside}: -% \begin{verbatim} -% \lstset{escapebegin=\begin{greek},escapeend=\end{greek}} -% -% \begin{lstlisting}[escapeinside=`'] -% /* `Replace text by Greek comment.' */ -% for (int i=0; i<1; i++) { }; -% \end{lstlisting}\end{verbatim} -% Note that the delimiters |`| and |'| are essential here. The example doesn't -% work without them. There is a more clever way if the comment delimiters of -% the programming language are single characters like the braces in Pascal: -% \begin{verbatim} -% \lstset{escapebegin=\textbraceleft\begin{arab}, -% escapeend=\end{arab}\textbraceright} -% -% \begin{lstlisting}[escapeinside=\{\}] -% for i:=maxint to 0 do -% begin -% { Replace text by Arabic comment. } -% end; -% \end{lstlisting}\end{verbatim} -% Please note that the `interface' to $\Lambda$ is completely untested. -% Reports are welcome! -% -% -% \subsubsection*{How to get bold typewriter type keywords} -% Use the \href{http://www.ctan.org/tex-archive/fonts/luximono}{\packagename{LuxiMono}} package. -% -% \iffalse -% Many people asked for bold typewriter fonts since they aren't included in -% the \LaTeX\ standard distribution. Here now one answer on how to use them -% in spite of that. -% \begin{advise} -% \item Please note that I personally don't regard the following as a good -% solution. Such a bold typewriter type is too heavy. It would be better -% to use a light version of \texttt{cmtt} as basic font and \texttt{cmtt} -% or a \emph{slightly} heavier type for keywords. -% -% \item Why don't you tell us how to use the better solution? -% \advisespace -% A light version of \texttt{cmtt} doesn't exist. If it's once available, -% you can do a similar job as described below. -% \end{advise} -% First of all, you'll need Metafont source files for bold typewriter, e.g.~ -% \texttt{cmbtt8.mf}, \texttt{cmbtt9.mf} and \texttt{cmbtt10.mf} from -% \href{ftp://ftp.dante.de/tex-archive/fonts/cm/mf-extra/bold} -% {CTAN/fonts/cm/mf-extra/bold}. -% Secondly you have to create \texttt{.tfm}-files, i.e.~run the Metafont -% program on these sources. This is possibly done automatically when you use -% the fonts in a document. Finally you must tell \LaTeX\ that you've installed -% bold typewriter fonts. Just use -% \begin{verbatim} -% \DeclareFontShape{OT1}{cmtt}{bx}{n} -% {<5><6><7><8>cmbtt8% -% <9>cmbtt9% -% <10><10.95>cmbtt10% -% <12><14.4><17.28><20.74><24.88>cmbtt10% -% }{}\end{verbatim} -% in the preamble of your document. If you use these fonts often, you might -% want to make a local copy of \texttt{ot1cmtt.fd} and replace the declaration -% there. But note that you're not allowed to distributed the modified file -% under its original name! -% \fi -% -% -% \subsubsection*{How to get the developer's guide} -% In the \emph{source directory} of the listings package, i.e.~where -% the \texttt{.dtx} files are, create the file \texttt{ltxdoc.cfg} with the -% following contents. -% \begin{verbatim} -% \AtBeginDocument{\AlsoImplementation}\end{verbatim} -% Then run \texttt{\jobname.dtx} through \LaTeX\ twice, run Makeindex, -% and one last time \LaTeX\ on \texttt{\jobname.dtx}. This creates the whole -% documentation including User's guide, Reference guide, Developer's guide, -% and Implementation. -% -% -% \makeatletter -% \def\index@prologue{\section*{Index}\markboth{Index}{Index}} -% \makeatother -%^^A \StopEventually{\lstcheckreference\setcounter{IndexColumns}{2}\PrintIndex} -% \StopEventually{\setcounter{IndexColumns}{2}\PrintIndex} -% -% -% \part{Developer's guide} -% -% First I must apologize for this developer's guide since some parts are not -% explained as good as possible. But note that you are in a pretty good shape: -% this developer's guide exists! ^^A :-) -% You might want to peak into section \ref{dPackageExtensions} before reading -% section \ref{dBasicConcepts}. -% -% -% \section{Basic concepts}\label{dBasicConcepts} -% -% The functionality of the \packagename{listings} package appears to be -% divided into two parts: on the one hand commands which actually typeset -% listings and on the other via |\lstset| adjustable parameters. Both could -% be implemented in terms of \lst-aspects, which are simply collections of -% public keys and commands and internal hooks and definitions. The package -% defines a couple of aspects, in particular the kernel, the main engine. -% Other aspects drive this engine, and language and style definitions tell -% the aspects how to drive. The relations between car, driver and assistant -% driver are exactly reproduced---and I'll be your driving instructor. -% -% -% \subsection{Package loading}\label{dPackageLoading} -% -% Each option in |\usepackage[|\meta{options}|]{listings}| loads an aspect or -% \emph{prevents} the package from loading it if the aspect name is -% \emph{preceded by an exclamation mark}. This mechanism was designed to clear -% up the dependencies of different package parts and to debug the package. For -% this reason there is another option: -% \begin{syntax} -% \item[0.21,,option] \texttt{noaspects}\leavevmode -% -% deletes the list of aspects to load. Note that, for example, the -% option lists |0.21,!labels,noaspects| and |noaspects| are essentially -% the same: the kernel is loaded and no other aspect. -% \end{syntax} -% This is especially useful for aspect-testing since we can load exactly the -% required parts. Note, however, that an aspect is loaded later if a predefined -% programming language requests it. One can load aspects also by hand: -% \begin{syntax} -% \item[0.20] |\lstloadaspects|\marg{comma separated list of aspect names} -% -% loads the specified aspects if they are not already loaded. -% \end{syntax} -% Here now is a list of all aspects and related keys and commands---in the hope -% that this list is complete. -% \begin{description} -% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth\relax -% \item[\aspectname{strings}]\leavevmode -% -% \lstprintaspectkeysandcmds{strings} -% -% \item[\aspectname{comments}]\leavevmode -% -% \lstprintaspectkeysandcmds{comments} -% -% \item[\aspectname{pod}]\leavevmode -% -% \lstprintaspectkeysandcmds{pod} -% -% \item[\aspectname{escape}]\leavevmode -% -% \lstprintaspectkeysandcmds{escape} -% -% \item[\aspectname{writefile}] requires 1 |\toks|, 1 |\write| -% -% |\lst@BeginWriteFile|, |\lst@BeginAlsoWriteFile|, |\lst@EndWriteFile| -% -% \item[\aspectname{style}]\leavevmode -% -% empty style, \lstprintaspectkeysandcmds{style} -% -% \item[\aspectname{language}]\leavevmode -% -% empty language, \lstprintaspectkeysandcmds{language} -% -% \item[\aspectname{keywords}]\leavevmode -% -% \lstprintaspectkeysandcmds{keywords} -% -% \item[\aspectname{emph}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{emph} -% -% \item[\aspectname{html}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{html} -% -% \item[\aspectname{tex}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{tex} -% -% \item[\aspectname{directives}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{directives} -% -% \item[\aspectname{index}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{index} -% -% \item[\aspectname{procnames}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{procnames} -% -% \item[\aspectname{keywordcomments}] -% requires \aspectname{keywords}, \aspectname{comments} -% -% \lstprintaspectkeysandcmds{keywordcomments} -% -% \item[\aspectname{labels}] requires 2 |\count| -% -% \lstprintaspectkeysandcmds{labels} -% -% \item[\aspectname{lineshape}] requires 2 |\dimen| -% -% \lstprintaspectkeysandcmds{lineshape} -% -% \item[\aspectname{frames}] requires \aspectname{lineshape} -% -% \lstprintaspectkeysandcmds{frames} -% -% \item[\aspectname{make}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{make} -% -% \item[\aspectname{doc}] requires \aspectname{writefile} and 1 |\box| -% -% \lstprintaspectkeysandcmds{doc} -% -% \item[\aspectname{0.21}] defines old keys in terms of the new ones. -% \item[\aspectname{fancyvrb}] requires 1 |\box| -% -% \lstprintaspectkeysandcmds{fancyvrb} -% -% \item[\aspectname{lgrind}]\leavevmode -% -% \lstprintaspectkeysandcmds{lgrind} -% -% \item[\aspectname{hyper}] requires \aspectname{keywords} -% -% \lstprintaspectkeysandcmds{hyper} -% \end{description} -% The kernel allocates 6 |\count|, 4 |\dimen| and 1 |\toks|. -% Moreover it defines the following keys, commands, and environments: -% \begin{itemize}\item[] -% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth\relax -% \lstprintaspectkeysandcmds{kernel}, \keyname{fancyvrb} -% \end{itemize} -% -% -% \subsection{How to define \lst-aspects}\label{dHowToDefineLstAspects} -% -% There are at least three ways to add new functionality: (a) you write an -% aspect of general interest, send it to me, and I'll just paste it into the -% implementation; (b) you write a `local' aspect not of general interest; or -% (c) you have an idea for an aspect and make me writing it. (a) and (b) are -% good choices.^^A :-) -% -% An aspect definition starts with |\lst@BeginAspect| plus arguments and ends -% with the next |\lst@EndAspect|. In particular, aspect definitions can't be -% nested. -% \begin{syntax} -% \item[0.20] |\lst@BeginAspect|[\oarg{list of required aspects}]\marg{aspect name} -% \item[0.20] |\lst@EndAspect| -% \end{syntax} -% The optional list is a comma separated list of required aspect names. -% The complete aspect is not defined in each of the following cases: -% \begin{enumerate} -% \item \meta{aspect name} is empty. -% \item The aspect is already defined. -% \item A required aspect is neither defined nor loadable via -% |\lstloadaspects|. -% \end{enumerate} -% Consequently you can't define a part of an aspect and later on another part. -% But it is possible to define aspect $A_1$ and later aspect $A_2$ which -% requires $A_1$. -% \begin{advise} -% \item Put local add-ons into `\texttt{lstmisc0.sty}'---this file is searched -% first by default. If you want to make add-ons for one particular -% document just replace the surrounding `|\lst@BeginAspect|' and -% `|\lst@EndAspect|' by `|\makeatletter|' and `|\makeatother|' and use -% the definitions in the preamble of your document. However, you have to -% load required aspects on your own. -% \end{advise} -% You can put any \TeX\ material in between the two commands, but note that -% definitions must be |\global| if you need them later---\LaTeX's |\newcommand| -% makes local definitions and can't be preceded by |\global|. So use the -% following commands, |\gdef|, and commands described in later sections. -% \begin{syntax} -% \item[0.20] |\lst@UserCommand|\meta{macro}\meta{parameter text}\marg{replacement text} -% -% The macro is (mainly) equivalent to |\gdef|. The purpose is to -% distinguish user commands and internal global definitions. -% -% \item[0.19] |\lst@Key|\marg{key name}\marg{init value}[\oarg{default value}]\marg{definition} -% \item[0.19] |\lst@Key|\marg{key name}|\relax|[\oarg{default value}]\marg{definition} -% -% defines a key using the \packagename{keyval} package from David -% Carlisle. \meta{definition} is the replacement text of a macro with -% one parameter. The argument is either the value from `key=value' or -% \meta{default value} if no `=value' is given. The helper macros -% |\lstKV@...| below might simplify \meta{definition}. -% -% The key is not initialized if the second argument is |\relax|. -% Otherwise \meta{init value} is the initial value given to the key. -% Note that we locally switch to |\globalsdefs=1| to ensure that -% initialization is not effected by grouping. -% -% \item[0.19] |\lst@AddToHook|\marg{name of hook}\marg{\TeX\ material} -% -% adds \TeX\ material at predefined points. Section \ref{dHooks} lists -% all hooks and where they are defined respectively executed. -% |\lst@AddToHook{A}{\csa}| before |\lst@AddToHook{A}{\csb}| -% \emph{does not} guarantee that |\csa| is executed before |\csb|. -% -% \item[0.20] |\lst@AddToHookExe|\marg{name of hook}\marg{\TeX\ material} -% -% also executes \meta{\TeX\ material} for initialization. You might use -% local variables---local in the sense of \TeX\ and/or usual programming -% languages---but when the code is executed for initialization all -% assignments are global: we set |\globaldefs| locally to one. -% -% \item[0.20] |\lst@UseHook|\marg{name of hook} -% -% executes the hook. -% \end{syntax} -% \begin{advise} -% \item Let's look at two examples. The first extends the package by adding -% some hook-material. If you want status messages, you might write -% \begin{verbatim} -% \lst@AddToHook{Init}{\message{\MessageBreak Processing listing ...}} -% \lst@AddToHook{DeInit}{\message{complete.\MessageBreak}}\end{verbatim} -% The second example introduces two keys to let the user control the -% messages. The macro |\lst@AddTo| is described in section -% \ref{dGeneralPurposeMacros}. -% \begin{verbatim} -% \lst@BeginAspect{message} -% \lst@Key{message}{Annoying message.}{\gdef\lst@message{#1}} -% \lst@Key{moremessage}\relax{\lst@AddTo\lst@message{\MessageBreak#1}} -% \lst@AddToHook{Init}{\typeout{\MessageBreak\lst@message}} -% \lst@EndAspect\end{verbatim} -% However, there are certainly aspects which are more useful. -% \end{advise} -% The following macros can be used in the \meta{definition} argument of the -% |\lst@Key| command to evaluate the argument. The additional prefix |KV| -% refers to the \packagename{keyval} package. -% \begin{syntax} -% \item[0.19] |\lstKV@SetIf|\marg{value}\meta{if macro} -% -% \meta{if macro} becomes |\iftrue| if the first character of -% \meta{value} equals |t| or |T|. Otherwise it becomes |\iffalse|. -% Usually you will use |#1| as \meta{value}. -% -% \item[1.0] \cs{lstKV@SwitchCases}\marg{value}\\ -% |{|\meta{string 1}|&|\meta{execute 1}|\\|\\ -% | |\meta{string 2}|&|\meta{execute 2}|\\|\\ -% \hbox to 3em{\hfill\vdots}\\ -% | |\meta{string $n$}|&|\meta{execute $n$}|}|\marg{else} -% -% Either execute \meta{else} or the \meta{value} matching part. -% -% \item[0.20] |\lstKV@TwoArg|\marg{value}\marg{subdefinition} -% \item[0.20] |\lstKV@ThreeArg|\marg{value}\marg{subdefinition} -% \item[0.20] |\lstKV@FourArg|\marg{value}\marg{subdefinition} -% -% \meta{subdefinition} is the replacement text of a macro with two, -% three, and four parameters. We call this macro with the arguments given -% by \meta{value}. Empty arguments are added if necessary. -% -% \item[0.19] |\lstKV@OptArg|\oarg{default arg.}\marg{value}\marg{subdefinition} -% -% |[|\meta{default arg.}|]| is \emph{not} optional. \meta{subdefinition} -% is the replacement text of a macro with parameter text |[##1]##2|. -% Note that the macro parameter character |#| is doubled since used -% within another macro. \meta{subdefinition} accesses these arguments -% via |##1| and |##2|. -% -% \meta{value} is usually the argument |#1| passed by the -% \packagename{keyval} package. If \meta{value} has no optional argument, -% \meta{default arg.} is inserted to provide the arguments to -% \meta{subdefinition}. -% -% \item[0.21] |\lstKV@XOptArg|\oarg{default arg.}\marg{value}\meta{submacro} -% -% Same as |\lstKV@OptArg| but the third argument \meta{submacro} is -% already a definition and not replacement text. -% -% \item[0.20] |\lstKV@CSTwoArg|\marg{value}\marg{subdefinition} -% -% \meta{value} is a \texttt comma \texttt separated list of one or two -% arguments. These are given to the subdefinition which is the -% replacement text of a macro with two parameters. An empty second -% argument is added if necessary. -% \end{syntax} -% \begin{advise} -% \item One more example. The key `\keyname{sensitive}' belongs to the aspect -% \aspectname{keywords}. Therefore it is defined in between -% `|\lst@BeginAspect{keywords}|' and `|\lst@EndAspect|', which is not shown -% here. -% \begin{verbatim} -% \lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive} -% \lst@AddToHookExe{SetLanguage}{\let\lst@ifsensitive\iftrue}\end{verbatim} -% The last line is equivalent to -% \begin{verbatim} -% \lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue} -% \global\let\lst@ifsensitive\iftrue\end{verbatim} -% We initialize the variable globally since the user might request an -% aspect in a group. Afterwards the variable is used locally---there is -% no |\global| in \meta{\TeX\ material}. Note that we could define and -% init the key as follows: -% \begin{verbatim} -% \lst@Key{sensitive}t[t]{\lstKV@SetIf{#1}\lst@ifsensitive} -% \lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue}\end{verbatim} -%\end{advise} -% -% -% \subsection{Internal modes}\label{dInternalModes} -% -% You probably know \TeX's conditional commands |\ifhmode|, |\ifvmode|, -% |\ifmmode|, and |\ifinner|. They tell you whether \TeX\ is in (restricted) -% horizontal or (internal) vertical or in (nondisplay) mathematical mode. For -% example, true |\ifhmode| and true |\ifinner| indicate restricted horizontal -% mode, which means that you are in a |\hbox|. The typical user doesn't care -% about such modes; \TeX/\LaTeX\ manages all this. But since you're reading the -% developer's guide, we discuss the analogue for the \packagename{listings} -% package now. It uses modes to distinguish comments from strings, `comment -% lines' from `single comments', and so on. -% -% The package is in `no mode' before reading the source code. In the phase of -% initialization it goes to `processing mode'. Afterwards the mode depends on -% the actual source code. For example, consider the line -% \begin{verbatim} -% "string" // comment\end{verbatim} -% and assume \texttt{language=C++}. Reading the string delimiter, the package -% enters `string mode' and processes the string. The matching closing delimiter -% leaves the mode, i.e.\ switches back to the general `processing mode'. Coming -% to the two slashes, the package detects a comment line; it therefore enters -% `comment line mode' and outputs the slashes. Usually this mode lasts to the -% end of line. -% -% But with \texttt{textcl=true} the \aspectname{escape} aspect immediately -% leaves `comment line mode', interrupts the current mode sequence, and enters -% `\TeX\ comment line mode'. At the end of line we reenter the previous mode -% sequence `no mode' $\to$ 'processing mode'. This escape to \LaTeX\ works -% since `no mode' implies that \TeX's characters and catcodes are present, -% whereas `processing mode' means that \packagename{listings}' characters and -% catcodes are active. -% -% \begin{table}[htbp] -% \caption{Internal modes}\label{dDefinedInternalModes} -% \def\lsttabspace{\hspace*{1em}\hfill} -% \begin{tabular}{@{}lp{0.56\linewidth}@{}} -% aspect\lsttabspace\meta{mode name} & Usage/We are processing \ldots\\ -% \noalign{\smallskip} -% kernel\lsttabspace |\lst@nomode| & -% If this mode is active, \TeX's `character table' is present; the other -% implication is not true. Any other mode \emph{may} imply that catcodes -% and\nobreak/\allowbreak or definitions of characters are changed. -% \\ -% \lsttabspace |\lst@Pmode| & -% is a general processing mode. If active we are processing a listing, -% but haven't entered a more special mode. -% \\ -% \lsttabspace |\lst@GPmode| & -% general purpose mode for language definitions. -% \\ -% \aspectname{pod}\lsttabspace |\lst@PODmode| & -% \ldots~a POD---Perl specific. -% \\ -% \aspectname{escape}\lsttabspace |\lst@TeXLmode| & -% \ldots~a comment line, but \TeX's character table is present---except -% the EOL character, which is needed to terminate this mode. -% \\ -% \lsttabspace |\lst@TeXmode| & -% indicates that \TeX's character table is present (except one user -% specified character, which is needed to terminate this mode). -% \\ -% \aspectname{directives}\lsttabspace |\lst@CDmode| & -% indicates that the current line began with a compiler directive. -% \\ -% \aspectname{keywordcomments}\lsttabspace |\lst@KCmode| & -% \ldots~a keyword comment. -% \\ -% \lsttabspace |\lst@KCSmode| & -% \ldots~a keyword comment which can be terminated by a semicolon only. -% \\ -% \aspectname{html}\lsttabspace |\lst@insidemode| & -% Active if we are between \texttt{<} and \texttt{>}. -% \\ -% \aspectname{make}\lsttabspace |\lst@makemode| & -% Used to indicate a keyword. -% \end{tabular} -% \end{table} -% Table \ref{dDefinedInternalModes} lists all static modes and which aspects -% they belong to. Most features use dynamically created mode numbers, for -% example all strings and comments. Each aspect may define its own mode(s) -% simply by allocating it/\allowbreak them inside the aspect definition. -% \begin{syntax} -% \item[0.19] |\lst@NewMode|\meta{mode \textup(control sequence\textup)} -% -% defines a new static mode, which is a nonnegative integer assigned to -% \meta{mode}. \meta{mode} should have the prefix \texttt{lst@} and -% suffix \texttt{mode}. -% -% \item[0.21] |\lst@UseDynamicMode|\marg{token\textup(s\textup)} -% -% inserts a dynamic mode number as argument to the token(s). -% -% This macro cannot be used to get a mode number when an aspect is -% loaded or defined. It can only be used every listing in the process -% of initialization, e.g.~to define comments when the character table -% is selected. -% -% \item[0.19,,changed] |\lst@EnterMode|\meta{mode}\marg{start tokens} -% -% opens a group level, enters the mode, and executes \meta{start tokens}. -% -% Use |\lst@modetrue| in \meta{start tokens} to prohibit future mode -% changes---except leaving the mode, of course. You must test yourself -% whether you're allowed to enter, see below. -% -% \item[0.19] |\lst@LeaveMode| -% -% returns to the previous mode by closing a group level if and only if -% the current mode isn't |\lst@nomode| already. You must test yourself -% whether you're allowed to leave a mode, see below. -% -%\iffalse -% \item[0.19] |\lst@LeaveAllModes| -% -% returns to |\lst@nomode|. -% This is some kind of emergency macro, so don't use it! -%\fi -% -% \item[0.19] |\lst@InterruptModes| -% \item[0.19] |\lst@ReenterModes| -% -% The first command returns to |\lst@nomode|, but saves the current mode -% sequence on a special stack. Afterwards the second macro returns to the -% previous mode. In between these commands you may enter any mode you -% want. In particular you can interrupt modes, enter some modes, and say -% `interrupt modes' again. Then two re-enters will take you back in front -% of the first `interrupt modes'. -% -% Remember that |\lst@nomode| implies that \TeX's character table is -% active. -% \end{syntax} -% Some variables show the internal state of processing. You are allowed to read -% them, but \emph{direct write access is prohibited}. Note: |\lst@ifmode| is -% \emph{not} obsolete since there is no relation between the boolean and the -% current mode. It will happen that we enter a mode without setting -% |\lst@ifmode| true, and we'll set it true without assigning any mode! -% \begin{syntax} -% \item[0.18,,counter] |\lst@mode| -% -% keeps the current mode number. Use |\ifnum\lst@mode=|\meta{mode name} -% to test against a mode. Don't modify the counter directly! -% -% \item[0.18,,boolean] |\lst@ifmode| -% -% No mode change is allowed if this boolean is true---except leaving the -% current mode. Use |\lst@modetrue| to modify this variable, but do it -% only in \meta{start tokens}. -% -% \item[1.0,,boolean] |\lst@ifLmode| -% -% Indicates whether the current mode ends at end of line. -% \end{syntax} -% -% -% \subsection{Hooks}\label{dHooks} -% -% Several problems arise if you want to define an aspect. -% You should and/or must -% (a) find additional functionality (of general interest) and implement it, -% (b) create the user interface, and -% (c) interface with the \packagename{listings} package, i.e.~find correct -% hooks and insert appropriate \TeX\ material. -% (a) is out of the scope of this developer's guide. The commands |\lstKV@...| -% in section \ref{dHowToDefineLstAspects} might help you with (b). Here now we -% describe all hooks of the \packagename{listings} package. -% -% All hooks are executed inside an overall group. This group starts somewhere -% near the beginning and ends somewhere at the end of each listing. Don't make -% any other assumptions on grouping. So define variables globally if it's -% necessary---and be alert of side effects if you don't use your own groups. -% \begin{syntax} -% \item \hookname{AfterBeginComment} -% -% is executed after the package has entered comment mode. -% The starting delimiter is usually typeset when the hook is called. -% -% \item \hookname{BoxUnsafe} -% -% Contains all material to deactivate all commands and registers which -% are possibly unsafe inside |\hbox|. It is used whenever the package -% makes a box around a listing and for \packagename{fancyvrb} support. -% -% \item \hookname{DeInit} -% -% Called at the very end of a listing but before closing the box from -% \hookname{BoxUnsafe} or ending a float. -% -% \item \hookname{DetectKeywords} -% -% This \hookname{Output} subhook is executed if and only if mode changes -% are allowed, i.e.~if and only if the package doesn't process a comment, -% string, and so on---see section \ref{dInternalModes}. -% -% \item \hookname{DisplayStyle} -% -% deactivates/activates features for displaystyle listings. -% -% \item \hookname{EmptyStyle} -% -% Executed to select the `empty' style---except the user has redefined -% the style. -% -% \item \hookname{EndGroup} -% -% Executed whenever the package closes a group, e.g.~at end of comment or -% string. -% -% \item \hookname{EOL} -% -% Called at each end of \emph{input} line, right before -% \hookname{InitVarsEOL}. -% -% \item \hookname{EveryLine} -% -% Executed at the beginning of each \emph{output} line, i.e.~more than -% once for broken lines. This hook must not change the horizontal or -% vertical position. -% -% \item \hookname{EveryPar} -% -% Executed once for each input line when the output starts. This hook -% must not change the horizontal or vertical position. -% -%^^A \item \hookname{ExcludeDelims} -%^^A -%^^A Executed by the \keyname{excludedelims} key before the excluded -%^^A delimiters are determined. -%^^A -% \item \hookname{ExitVars} -% -% Executed right before \hookname{DeInit}. -% -% \item \hookname{FontAdjust} -% -% adjusts font specific internal values (currently |\lst@width| only). -% -% \item \hookname{Init} -% -% Executed once each listing to initialize things before the character -% table is changed. It is called after \hookname{PreInit} and before -% \hookname{InitVars}. -% -% \item \hookname{InitVars} -% -% Called to init variables each listing. -% -% \item \hookname{InitVarsBOL} -% -% initializes variables at the beginning of each input line. -% -% \item \hookname{InitVarsEOL} -% -% updates variables at the end of each input line. -% -% \item \hookname{ModeTrue} -% -% executed by the package when mode changes become illegal. -% Here keyword detection is switched off for comments and strings. -% -% \item \hookname{OnEmptyLine} -% -% executed \emph{before} the package outputs an empty line. -% -% \item \hookname{OnNewLine} -% -% executed \emph{before} the package starts one or more new lines, -% i.e.~before saying |\par\noindent\hbox{}| (roughly speaking). -% -% \item \hookname{Output} -% -% Called before an identifier is printed. -% If you want a special printing style, modify |\lst@thestyle|. -% -% \item \hookname{OutputBox} -% -% used inside each output box. Currently it is only used to make the -% package work together with Lambda---hopefully. -% -% \item \hookname{OutputOther} -% -% Called before other character strings are printed. -% If you want a special printing style, modify |\lst@thestyle|. -% -% \item \hookname{PostOutput} -% -% Called after printing an identifier or any other output unit. -% -% \item \hookname{PostTrackKeywords} -% -% is a very special \hookname{Init} subhook to insert keyword tests and -% define keywords on demand. -% This hook is called after \hookname{TrackKeywords}. -% -% \item \hookname{PreInit} -% -% Called right before \hookname{Init} hook. -% -% \item \hookname{PreSet} -% -% Each typesetting command/environment calls this hook to initialize -% internals before any user supplied key is set. -% -% \item \hookname{SelectCharTable} -% -% is executed after the package has selected the standard character -% table. Aspects adjust the character table here and define string and -% comment delimiters, and such. -% -% \item \hookname{SetFormat} -% -% Called before internal assignments for setting a format are made. -% This hook determines which parameters are reset every format selection. -% -% \item \hookname{SetStyle} -% -% Called before internal assignments for setting a style are made. -% This hook determines which parameters are reset every style selection. -% -% \item \hookname{SetLanguage} -% -% Called before internal assignments for setting a language are made. -% This hook determines which parameters are reset every language -% selection. -% -% \item \hookname{TextStyle} -% -% deactivates/activates features for textstyle listings. -% -% \item \hookname{TrackKeywords} -% -% is a very special \hookname{Init} subhook to insert keyword tests and -% define keywords on demand. -% This hook is called before \hookname{PostTrackKeywords}. -% \end{syntax} -% -% -% \subsection{Character tables}\label{dCharacterTables} -% -% Now you know how a car looks like, and you can get a driving license if you -% take some practice. But you will have difficulties if you want to make heavy -% alterations to the car. So let's take a closer look and come to the most -% difficult part: the engine. We'll have a look at the big picture and fill in -% the details step by step. For our purpose it's good to override \TeX's -% character table. First we define a standard character table which contains -% \begin{itemize} -% \item letters: characters identifiers are out of, -% \item digits: characters for identifiers or numerical constants, -% \item spaces: characters treated as blank spaces, -% \item tabulators: characters treated as tabulators, -% \item form feeds: characters treated as form feed characters, and -% \item others: all other characters. -% \end{itemize} -% This character table is altered depending on the current programming language. -% We may define string and comment delimiters or other special characters. -% Table \ref{rStdCharTable} on page \pageref{rStdCharTable} shows the standard -% character table. It can be modified with the keys \keyname{alsoletter}, -% \keyname{alsodigit}, and \keyname{alsoother}. -% -% How do these `classes' work together? Let's say that the current character -% string is `|tr|'. Then letter `|y|' simply appends the letter and we get -% `|try|'. The next nonletter (and nondigit) causes the output of the -% characters. Then we collect all coming nonletters until reaching a letter -% again. This causes the output of the nonletters, and so on. Internally each -% character becomes active in the sense of \TeX\ and is defined to do the right -% thing, e.g.~we say -% \begin{verbatim} -% \def A{\lst@ProcessLetter A}\end{verbatim} -% where the first `|A|' is active and the second has letter catcode 11. -% The macro |\lst@ProcessLetter| gets one token and treats it as a letter. -% The following macros exist, where the last three get no explicit argument. -% \begin{syntax} -% \item[0.18] |\lst@ProcessLetter| \meta{spec.\ token} -% \item[0.18] |\lst@ProcessDigit| \meta{spec.\ token} -% \item[0.18] |\lst@ProcessOther| \meta{spec.\ token} -% \item[0.18] |\lst@ProcessTabulator| -% \item[0.18] |\lst@ProcessSpace| -% \item[0.20] |\lst@ProcessFormFeed| -% \end{syntax} -% \meta{spec.\ token} is supposed to do two things. Usually it expands to -% a printable version of the character. But if |\lst@UM| is equivalent to -% |\@empty|, \meta{spec.\ token} must expand to a \emph{character token}. -% For example, the sharp usually expands to |\#|, which is defined via -% |\chardef| and is not a character token. But if |\lst@UM| is equivalent to -% |\@empty|, the sharp expands to the character `|#|' (catcode 12). Note: -% \emph{Changes to} |\lst@UM| \emph{must be locally.} However, there should -% be no need to do such basic things yourself. The \packagename{listings} -% package provides advanced macros which use that feature, -% e.g.~|\lst@InstallKeywords| in section \ref{dKeywordsAndWorkingIdentifiers}. -% -% \begin{syntax} -% \item[0.18] |\lst@Def|\marg{character code}\meta{parameter text}\marg{definition} -% \item[0.18] |\lst@Let|\marg{character code}\meta{token} -% -% defines the specified character respectively assigns \meta{token}. -% The catcode table if not affected. Be careful if your definition has -% parameters: it is not safe to read more than one character ahead. -% Moreover, the argument can be \emph{arbitrary}; somtimes it's the next -% source code character, sometimes it's some code of the -% \packagename{listings} package, e.g.~|\relax|, |\@empty|, |\else|, -% |\fi|, and so on. Therefore don't use \TeX's ord-operator |`| on such -% an argument, e.g.~don't write |\ifnum`#1=65| to test against `|A|'. -% -% |\lst@Def| and |\lst@Let| are relatively slow. The real definition of -% the standard character table differs from the following example, but it -% could begin with -% \begin{verbatim} -% \lst@Def{9}{\lst@ProcessTabulator} -% \lst@Def{32}{\lst@ProcessSpace} -% \lst@Def{48}{\lst@ProcessDigit 0} -% \lst@Def{65}{\lst@ProcessLetter A}\end{verbatim} -% -%\iffalse -% \item[0.20] |\lst@activecharstrue| -% \item[0.20] |\lst@activecharsfalse| -% -% control whether selecting the character table also makes all characters -% active (standard/extended). This is usually true and therefore default. -% Only the \packagename{fancyvrb} interface sets it locally false. -%\fi -% \end{syntax} -% That's enough for the moment. Section \ref{dUsefulInternalDefinitions} -% presents advanced definitions to manipulate the character table, in -% particular how to add new comment or string types. -% -% -% \subsection{On the output} -% -% The \packagename{listings} package uses some variables to keep the output -% data. Write access is not recommended. Let's start with the easy ones. -% \begin{syntax} -% \item[0.17,,data] |\lst@lastother| -% -% equals \meta{spec.\ token} version of the last processed -% nonidentifier-character. Since programming languages redefine the -% standard character table, we use the original \meta{spec.\ token}. -% For example, if a double quote was processed last, |\lst@lastother| -% is not equivalent to the macro which enters and leaves string mode. -% It's equivalent to |\lstum@"|, where |"| belongs to the control -% sequence. Remember that \meta{spec.\ token} expands either to a -% printable or to a token character. -% -% |\lst@lastother| is equivalent to |\@empty| if such a character is not -% available, e.g.~at the beginning of a line. Sometimes an indentifier -% has already been printed after processing the last `other' character, -% i.e.~the character is far, far away. In this case |\lst@lastother| -% equals |\relax|. -% -% \item[0.17] |\lst@outputspace| -% -% Use this predefined \meta{spec.\ token} (obviously for character code -% 32) to test against |\lst@lastother|. -% -% \item[0.20] |\lstum@backslash| -% -% Use this predefined \meta{spec.\ token} (for character code 92) to test -% against |\lst@lastother|. In the replacement text for |\lst@Def| one -% could write |\ifx| |\lst@lastother| |\lstum@backslash| \ldots\ to test -% whether the last character has been a backslash. -% -% \item[0.20] |\lst@SaveOutputDef|\marg{character code}\meta{macro} -% -% Stores the \meta{spec.\ token} corresponding to \meta{character code} -% in \meta{macro}. This is the only safe way to get a correct meaning to -% test against |\lst@lastother|, for example -% |\lst@SaveOutputDef{"5C}\lstum@backslash|. -% -% You'll get a ``runaway argument'' error if \meta{character code} is not -% between 33 and 126 (inclusive). -% \end{syntax} -% Now let's turn to the macros dealing a bit more with the output data and -% state. -% \begin{syntax} -% \item[1.0] |\lst@XPrintToken| -% -% outputs the current character string and resets it. This macro keeps -% track of all variables described here. -% -% \item[0.18,,token] |\lst@token| -% -% contains the current character string. Each `character' usually -% expands to its printable version, but it must expand to a character -% token if |\lst@UM| is equivalent to |\@empty|. -% -% \item[0.12,,counter] |\lst@length| -% -% is the length of the current character string. -% -% \item[0.12,,dimension] |\lst@width| -% -% is the width of a single character box. -% -% \item[0.20,,global dimension] |\lst@currlwidth| -% -% is the width of so far printed line. -% -% \item[0.18,,global counter] |\lst@column| -% \item[0.12,,global counter] |\lst@pos| (nonpositive) -% -% |\lst@column|$-$|\lst@pos| is the length of the so far printed line. -% We use two counters since this simplifies tabulator handling: -% |\lst@pos| is a nonpositive representative of `length of so far -% printed line' modulo \keyname{tabsize}. -% It's usually not the biggest nonpositive representative. -% -% \item[0.20] |\lst@CalcColumn| -% -% |\@tempcnta| gets |\lst@column| $-$ |\lst@pos| $+$ |\lst@length|. -% This is the current column number minus one, or the current column -% number zero based. -% -% \item[0.18,,global dimension] |\lst@lostspace| -% -% equals `lost' space: desired current line width minus real line width. -% Whenever this dimension is positive the flexible column format can use -% this space to fix the column alignment. -% \end{syntax} -% -% -% \section{Package extensions}\label{dPackageExtensions} -% -% -% \subsection{Keywords and working identifiers}\label{dKeywordsAndWorkingIdentifiers} -% -% The \aspectname{keywords} aspect defines two main macros. Their respective -% syntax is shown on the left. On the right you'll find examples how the -% package actually defines some keys. -% \begin{syntax} -% \item[0.21] -% \cs{lst@InstallFamily} -% -% \marg{prefix}\syntaxfill \texttt k\\ -% \marg{name}\syntaxfill |{keywords}|\\ -% \marg{style name}\syntaxfill |{keywordstyle}|\\ -% \marg{style init}\syntaxfill |\bfseries|\\ -% \marg{default style name}\syntaxfill |{keywordstyle}|\\ -% \marg{working procedure}\syntaxfill |{}|\\ -% \meta{\alternative{l,o}}\syntaxfill |l|\\ -% \meta{\alternative{d,o}}\syntaxfill |d| -% -% installs either a keyword or `working' class of identifiers according -% to whether \meta{working procedure} is empty. -% -% The three keys \meta{name}, \keyname{more}\meta{name} and -% \keyname{delete}\meta{name}, and if not empty \meta{style name} are -% defined. The first order member of the latter one is initialized with -% \meta{style init} if not equivalent to |\relax|. If the user leaves a -% class style undefined, \meta{default style name} is used instead. -% Thus, make sure that this style is always defined. In the example, -% the first order keywordstyle is set to |\bfseries| and is the default -% for all other classes. -% -% If \meta{working procedure} is not empty, this code is executed when -% reaching such an (user defined) identifier. \meta{working procedure} -% takes exactly one argument, namely the class number to which the -% actual identifier belongs to. If the code uses variables and requires -% values from previous calls, you must define these variables -% |\global|ly. It's not sure whether working procedures are executed -% inside a (separate) group or not. -% -% \texttt l indicates a language key, i.e.~the lists are reset every -% language selection. \texttt o stands for `other' key. -% The keyword respectively working test is either installed at the -% \hookname{DetectKeyword} or \hookname{Output} hook according to -% \meta{\alternative{d,o}}. -% -% \item[0.20] -% \cs{lst@InstallKeywords} -% -% \marg{prefix}\syntaxfill \texttt{cs}\\ -% \marg{name}\syntaxfill |{texcs}|\\ -% \marg{style name}\syntaxfill |{texcsstyle}|\\ -% \marg{style init}\syntaxfill |\relax|\\ -% \marg{default style name}\syntaxfill |{keywordstyle}|\\ -% \marg{working procedure}\syntaxfill see below\\ -% \meta{\alternative{l,o}}\syntaxfill |l|\\ -% \meta{\alternative{d,o}}\syntaxfill |d| -% -% Same parameters, same functionality with one execption. The macro -% installs exactly one keyword class and not a whole family. Therefore -% the argument to \meta{working procedure} is constant (currently empty). -% -% The working procedure of the example reads as follows.\vspace*{-.5\baselineskip} -% \begin{verbatim} -% {\ifx\lst@lastother\lstum@backslash -% \let\lst@thestyle\lst@texcsstyle -% \fi}\end{verbatim} -%\vspace*{-.5\baselineskip} -% What does this procedure do? First of all it is called only if a -% keyword from the user supplied list (or language definition) is found. -% The procedure now checks for a preceding backslash and sets the output -% style accordingly. -% -%\iffalse -% \item[0.20] |\lst@InstallTest|\marg{prefix}\syntaxbreak -% |\lst@|\meta{name}|@list||\lst@|\meta{name}~|\lst@g|\meta{name}|@list||\lst@g|\meta{name}\syntaxbreak -% |\lst@g|\meta{name}|@sty|~\meta{\alternative{w,s}}\meta{\alternative{d,o}} -% -% installs a `working identifier' test or keyword style depending on -% \meta{\alternative{w,s}}. |\lst@g|\meta{name}|@sty| contains the -% working procedure or style macro. Note that the behaviour of the tests -% depends on the \texttt{savemem} option. -% The keyword respectively working test is either installed at the -% \hookname{DetectKeyword} or \hookname{Output} hook according to -% \meta{\alternative{d,o}}. -% -%^^A Either each call of this macro or each different \meta{prefix} inserts -%^^A another test (depending on the \texttt{savemem} option). -% -% |\lst@|\meta{name} contains the current identifier list and -% |\lst@|\meta{name}|@list| a `|\lst@|\meta{$n_i$}|\lst@g|\meta{$n_i$}' -% sequence of currently used classes. If no other classes are used, -% this equals |\lst@|\meta{name}|\lst@g|\meta{name}. The global versions -% |\lst@g|\ldots\ are used to keep track of the keywords. -% (This description needs improvement.) -%\fi -% \end{syntax} -% -% -% \subsection{Delimiters} -% -% We describe two stages: adding a new delimiter type to an existing class of -% delimiters and writing a new class. Each class has its name; currently exist -% \texttt{Comment}, \texttt{String}, and \texttt{Delim}. As you know, the -% latter and the first both provide the type \texttt l, but there is no string -% which starts with the given delimiter and ends at end of line. So we'll add -% it now! -% -% First of all we extend the list of string types by -% \begin{verbatim} -% \lst@AddTo\lst@stringtypes{,l}\end{verbatim} -% Then we must provide the macro which takes the user supplied delimiter and -% makes appropriate definitions. The command name consists of the prefix -% |\lst@|, the delimiter name, |DM| for using dynamic modes, and |@| followed -% by the type. -% \begin{verbatim} -% \gdef\lst@StringDM@l#1#2\@empty#3#4#5{% -% \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}\end{verbatim} -% You can put these three lines into a \texttt{.sty}-file or surround them by -% |\makeatletter| and |\makeatother| in the preamble of a document. -% And that's all! -%{\makeatletter -%\lst@AddTo\lst@stringtypes{,l} -%\gdef\lst@StringDM@l#1#2\@empty#3#4#5{^^A -% \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} -%} -% \begin{lstsample}{}{} -% \lstset{string=[l]//} -% \begin{lstlisting} -% // This is a string. -% This isn't a string. -% \end{lstlisting} -% \end{lstsample} -% You want more details, of course. Let's begin with the arguments. -% \begin{itemize} -% \item The first argument \emph{after} |\@empty| is used to start the -% delimiter. It's provided by the delimiter class. -% \item The second argument \emph{after} |\@empty| is used to end the -% delimiter. It's also provided by the delimiter class. We didn't -% need it in the example, see the explanation below. -% \item The third argument \emph{after} |\@empty| is -% \marg{style}\meta{start tokens}. -% This with a preceding |\def\lst@currstyle| is used as argument to -% |\lst@EnterMode|. The delimiter class also provides it. In the -% example we `extended' |#5| by |\lst@Lmodetrue| (line mode true). -% The mode automatically ends at end of line, so we didn't need the -% end-delimiter argument. -% \end{itemize} -% And now for the other arguments. In case of dynamic modes, the first argument -% is the mode number. Then follow the user supplied delimiter(s) whose number -% must match the remaining arguments up to |\@empty|. For non-dynamic modes, -% you must either allocate a static mode yourself or use a predefined mode -% number. The delimiters then start with the first argument. -% -% Eventually let's look at the replacement text of the macro. The sequence -% |\lst@CArg #2\relax| puts two required arguments after |\lst@DefDelimB|. -% The syntax of the latter macro is -% \begin{syntax} -% \item[1.0] \cs{lst@DefDelimB} -% -% |{|\meta{1st}\meta{2nd}\marg{rest}|}|\syntaxfill |{//{}}|\\ -% \meta{save 1st}\syntaxfill |\lst@c/0|\\ -% \marg{execute}\syntaxfill|{}|\\ -% \marg{delim~exe~modetrue}\syntaxfill|{}|\\ -% \marg{delim~exe~modefalse}\syntaxfill|{}|\\ -% \meta{start-delimiter macro}\syntaxfill|#3|\\ -% \meta{mode number}\syntaxfill |{#1}|\\ -% |{|\marg{style}\meta{start tokens}|}|\syntaxfill |{#5\lst@Lmodetrue}| -% -% defines \meta{1st}\meta{2nd}\meta{rest} as starting-delimiter. -% \meta{execute} is executed when the package comes to \meta{1st}. -% \meta{delim~exe~modetrue} and \meta{delim~exe~modefalse} are -% executed only if the whole delimiter \meta{1st}\meta{2nd}\meta{rest} -% is found. Exactly one of them is called depending on |\lst@ifmode|. -% -% By default the package enters the mode if the delimiter is found -% \emph{and} |\lst@ifmode| is false. Internally we make an appropriate -% definition of |\lst@bnext|, which can be gobbled by placing -% |\@gobblethree| at the very end of \meta{delim exe modefalse}. -% One can provide an own definition (and gobble the default). -% -% \meta{save 1st} must be an undefined macro and is used internally to -% store the previous meaning of \meta{1st}. The arguments \meta{2nd} -% and/or \meta{rest} are empty if the delimiter has strictly less than -% three characters. All characters of \meta{1st}\meta{2nd}\meta{rest} -% must already be active (if not empty). -% That's not a problem since the macro |\lst@CArgX| does this job. -% -% \item[1.0] \cs{lst@DefDelimE} -% -% |{|\meta{1st}\meta{2nd}\marg{rest}|}|\\ -% \meta{save 1st}\\ -% \marg{execute}\\ -% \marg{delim~exe~modetrue}\\ -% \marg{delim~exe~modefalse}\\ -% \meta{end-delimiter macro}\\ -% \meta{mode number} -% -% Ditto for ending-delimiter with slight differences: -% \meta{delim~exe~modetrue} and \meta{delim~exe~modefalse} are executed -% depending on whether |\lst@mode| equals \meta{mode}. -% -% The package ends the mode if the delimiter is found and |\lst@mode| -% equals \meta{mode}. Internally we make an appropriate definition of -% |\lst@enext| (not |\lst@bnext|), which can be gobbled by placing -% |\@gobblethree| at the very end of \meta{delim exe modetrue}. -% -% \item[1.0] \cs{lst@DefDelimBE} -% -% followed by the same eight arguments as for |\lst@DefDelimB| and \ldots\\ -% \meta{end-delimiter macro} -% -% This is a combination of |\lst@DefDelimB| and |\lst@DefDelimE| for the -% case of starting and ending delimiter being the same. -% \end{syntax} -% We finish the first stage by examining two easy examples. -% \texttt d-type strings are defined by -% \begin{verbatim} -% \gdef\lst@StringDM@d#1#2\@empty#3#4#5{% -% \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4}\end{verbatim} -% (and an entry in the list of string types). -% Not a big deal. Ditto \texttt d-type comments: -% \begin{verbatim} -% \gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{% -% \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% -% \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}\end{verbatim} -% Here we just need to use both |\lst@DefDelimB| and |\lst@DefDelimE|. -% \goodbreak -% -% So let's get to the second stage. For illustration, here's the definition of -% the \texttt{Delim} class. The respective first argument to the service macro -% makes it delete all delimiters of the class, add the delimiter, or delete -% the particular delimiter only. -% \begin{verbatim} -% \lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}} -% \lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}} -% \lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}}\end{verbatim} -% The service macro itself calls another macro with appropriate arguments. -% \begin{verbatim} -% \gdef\lst@DelimKey#1#2{% -% \lst@Delim{}#2\relax{Delim}\lst@delimtypes #1% -% {\lst@BeginDelim\lst@EndDelim} -% i\@empty{\lst@BeginIDelim\lst@EndIDelim}}\end{verbatim} -% We have to look at those arguments. Above you can see the actual arguments -% for the \texttt{Delim} class, below are the \texttt{Comment} class ones. -% Note that the user supplied value covers the second and third line of -% arguments. -% \begin{syntax} -% \item[0.21,,changed] -% \cs{lst@Delim} -% -% \meta{default style macro}\syntaxfill \cs{lst@commentstyle}\\ \relax -% [\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt][\texttt[\meta{type option}\texttt]]]\\ -% \meta{delimiter\textup(s\textup)}\cs{relax}\syntaxfill|#2|\cs{relax}\\ -% \marg{delimiter name}\syntaxfill|{Comment}|\\ -% \meta{delimiter types macro}\syntaxfill\texttt{\cs{lst@commenttypes}}\\ -% \alternative{\cs{@empty},\cs{@nil},\cs{relax}}\syntaxfill|#1|\\ -% \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginComment}\cs{lst@EndComment}|}|\\ -% \meta{extra prefix}\syntaxfill |i|\\ -% \meta{extra conversion}\syntaxfill |\@empty|\\ -% \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginIComment}\cs{lst@EndIComment}|}| -% -% Most arguments should be clear. We'll discuss the last four. Both -% \marg{begin- and end-delim macro} must contain exactly two control -% sequences, which are given to |\lst@|\meta{name}[|DM|]|@|\meta{type} -% to begin and end a delimiter. These are the arguments |#3| and |#4| in our -% first example of |\lst@StringDM@l|. Depending on whether the user chosen -% type starts with \meta{extra prefix}, the first two or the last control -% sequences are used. -% -% By default the package takes the delimiter(s), makes the characters active, -% and places them after |\lst@|\meta{name}[|DM|]|@|\meta{type}. If the user -% type starts with \meta{extra prefix}, \meta{extra conversion} might change -% the definition of |\lst@next| to choose a different conversion. The default -% is equivalent to |\lst@XConvert| with |\lst@false|. -% -% Note that \meta{type} never starts with \meta{extra prefix} since it is -% discarded. The functionality must be fully implemented by choosing a -% different \marg{begin- and end-delim macro} pair. -% \end{syntax} -% You might need to know the syntaxes of the \meta{begin- and end-delim macro}s. -% They are called as follows. -% \begin{syntax} -% \item[0.21] |\lst@Begin|\meta{whatever} -% -% \marg{mode} -% |{|\marg{style}\meta{start tokens}|}| -% \meta{delimiter}|\@empty| -% -% \item[0.21] |\lst@End|\meta{whatever} -% -% \marg{mode} -% \meta{delimiter}|\@empty| -% \end{syntax} -% The existing macros are internally defined in terms of |\lst@DelimOpen| and -% |\lst@DelimClose|, see the implementation. -% -% -% \subsection{Getting the kernel run} -% -% If you want new pretty-printing environments, you should be happy with -% section \ref{rEnvironments}. New commands like |\lstinline| or -% |\lstinputlisting| are more difficult. Roughly speaking you must follow -% these steps. -% \begin{enumerate} -% \item Open a group to make all changes local. -% \item \meta{Do whatever you want.} -% \item Call |\lsthk@PreSet| in any case. -% \item Now you \emph{might } want to (but need not) use |\lstset| to set some -% new values. -% \item \meta{Do whatever you want.} -% \item Execute |\lst@Init\relax| to finish initialization. -% \item \meta{Do whatever you want.} -% \item Eventually comes the source code, which is processed by the kernel. -% You must ensure that the characters are either not already read or all -% active. Moreover \emph{you} must install a way to detect the end of the -% source code. If you've reached the end, you must \ldots -% \item \ldots\ call |\lst@DeInit| to shutdown the kernel safely. -% \item \meta{Do whatever you want.} -% \item Close the group from the beginning. -% \end{enumerate} -% For example, consider the |\lstinline| command in case of being not inside an -% argument. Then the steps are as follows. -% \begin{enumerate} -% \item |\leavevmode\bgroup| opens a group. -% \item |\def\lst@boxpos{b}| `baseline' aligns the listing. -% \item |\lsthk@PreSet| -% \item |\lstset{flexiblecolumns,#1}| (|#1| is the user provided -% key=value list) -% \item |\lsthk@TextStyle| deactivates all features not safe here. -% \item |\lst@Init\relax| -% \item |\lst@Def{`#1}{\lst@DeInit\egroup}| installs the `end inline' -% detection, where |#1| is the next character after |\lstinline|. -% Moreover chr(13) is redefined to end the fragment in the same way but -% also issues an error message. -% \item Now comes the source code and \ldots -% \item \ldots\ |\lst@DeInit| (from |\lst@Def| above) ends the code snippet -% correctly. -% \item Nothing. -% \item |\egroup| (also from |\lst@Def|) closes the group. -% \end{enumerate} -% The real definition is different since we allow source code inside arguments. -% Read also section \ref{iTheInputCommand} if you really want to write -% pretty-printing commands. -% -% -% \section{Useful internal definitions}\label{dUsefulInternalDefinitions} -% -% This section requires an update. -% -% -% \subsection{General purpose macros}\label{dGeneralPurposeMacros} -% -% \begin{syntax} -% \item[0.19] |\lst@AddTo|\meta{macro}\marg{\TeX~material} -% -% adds \meta{\TeX~material} globally to the contents of \meta{macro}. -% -% \item[0.20] |\lst@Extend|\meta{macro}\marg{\TeX~material} -% -% calls |\lst@AddTo| after the first token of \meta{\TeX~material} is -% |\expand|ed|after|. For example, |\lst@Extend \a \b| merges the -% contents of the two macros and stores it globally in |\a|. -% -% \item[0.19] |\lst@lAddTo|\meta{macro}\marg{\TeX~material} -% \item[0.20] |\lst@lExtend|\meta{macro}\marg{\TeX~material} -% -% are local versions of |\lst@AddTo| and |\lst@Extend|. -% -% \item[0.18] |\lst@DeleteKeysIn|\meta{macro}\meta{macro \textup(keys to remove\textup)} -% -% Both macros contain a comma separated list of keys (or keywords). All -% keys appearing in the second macro are removed (locally) from the first. -% -% \item[0.19] |\lst@ReplaceIn|\meta{macro}\meta{macro \textup(containing replacement list\textup)} -% \item[0.20] |\lst@ReplaceInArg|\meta{macro}\marg{replacement list} -% -% The replacement list has the form $a_1b_1$\ldots$a_nb_n$, where each -% $a_i$ and $b_i$ is a character sequence (enclosed in braces if -% necessary) and may contain macros, but the first token of $b_i$ must -% not be equivalent to |\@empty|. Each sequence $a_i$ inside the first -% macro is (locally) replaced by $b_i$. -% The suffix |Arg| refers to the \emph{braced} second argument instead of -% a (nonbraced) macro. It's a hint that we get the `real' argument and -% not a `pointer' to the argument. -% -% \item[0.20] |\lst@IfSubstring|\marg{character sequence}\meta{macro}\marg{then}\marg{else} -% -% \meta{then} is executed if \meta{character sequence} is a substring of -% the contents of \meta{macro}. Otherwise \meta{else} is called. -% -% \item[0.12] |\lst@IfOneOf|\meta{character sequence}|\relax|\meta{macro}\marg{then}\marg{else} -% -% |\relax| terminates the first parameter here since it is faster than -% enclosing it in braces. \meta{macro} contains a comma separated list -% of identifiers. If the character sequence is one of these indentifiers, -% \meta{then} is executed, and otherwise \meta{else}. -% -% \item[0.21] |\lst@Swap|\marg{tok1}\marg{tok2} -% -% changes places of the following two tokens or arguments \emph{without} -% inserting braces. For example, |\lst@Swap{abc}{def}| expands to -% |defabc|. -% -% \item[0.18] |\lst@IfNextChars|\meta{macro}\marg{then}\marg{else} -% \item[0.19] |\lst@IfNextCharsArg|\marg{character sequence}\marg{then}\marg{else} -% -% Both macros execute either \meta{then} or \meta{else} according to -% whether the given character sequence respectively the contents of the -% given macro is found (after the three arguments). Note an important -% difference between these macros and \LaTeX's |\@ifnextchar|: -% We remove the characters behind the arguments until it is possible to -% decide which part must be executed. However, we save these characters -% in the macro |\lst@eaten|, so they can be inserted using \meta{then} or -% \meta{else}. -% -% \item[0.19] |\lst@IfNextCharActive|\marg{then}\marg{else} -% -% executes \meta{then} if next character is active, and \meta{else} -% otherwise. -% -% \item[0.20] |\lst@DefActive|\meta{macro}\marg{character sequence} -% -% stores the character sequence in \meta{macro}, but all characters -% become active. The string \emph{must not} contain a begin group, end -% group or escape character (|{}\|); it may contain a left brace, right -% brace or backslash with other meaning (= catcode). This command -% would be quite surplus if \meta{character sequence} is not already read -% by \TeX\ since such catcodes can be changed easily. It is explicitly -% allowed that the charcaters have been read, e.g.~in -% |\def\test{\lst@DefActive\temp{ABC}}|! -% -% Note that this macro changes |\lccode|s 0--9 without restoring them. -% -% \item[0.20] |\lst@DefOther|\meta{macro}\marg{character sequence} -% -% stores \meta{character sequence} in \meta{macro}, but all characters -% have catcode 12. Moreover all spaces are removed and control sequences -% are converted to their name without preceding backslash. For example, -% |\{ Chip \}| leads to |{Chip}| where all catcodes are 12---internally -% the primitive |\meaning| is used. -% -% \iffalse -% \item[0.19] |\lst@MakeActive|\marg{character sequence} -% -% stores the character sequence in |\lst@arg| and has the same -% restrictions as |\lst@DefActive|. If fact, the latter definition uses -% this macro here. -% \fi -% \end{syntax} -% -% -% \subsection{Character tables manipulated}\label{dCharacterTablesManipulated} -% -% \begin{syntax} -% \item[0.20] |\lst@SaveDef|\marg{character code}\meta{macro} -% -% Saves the current definition of the specified character in -% \meta{macro}. You should always save a character definition before you -% redefine it! And use the saved version instead of writing directly -% |\lst@Process|\ldots---the character could already be redefined and -% thus not equivalent to its standard definition. -% -% \item[0.20] |\lst@DefSaveDef|\marg{character code}\meta{macro}\meta{parameter text}\marg{definition} -% \item[0.20] |\lst@LetSaveDef|\marg{character code}\meta{macro}\meta{token} -% -% combine |\lst@SaveDef| and |\lst@Def| respectively |\lst@Let|. -% \end{syntax} -% Of course I shouldn't forget to mention \emph{where} to alter the character -% table. Hook material at \hookname{SelectCharTable} makes permanent changes, -% i.e.~it effects all languages. The following two keys can be used in any -% language definition and effects the particular language only. -% \begin{syntax} -% \item[0.20] |SelectCharTable=|\meta{\TeX\ code} -% \item[0.20] |MoreSelectCharTable=|\meta{\TeX\ code} -% -% uses \meta{\TeX\ code} (additionally) to select the character table. -% The code is executed after the standard character table is selected, -% but possibly before other aspects make more changes. Since previous -% meanings are always saved and executed inside the new definition, this -% should be harmless. -% \end{syntax} -% Here come two rather useless examples. Each point (full stop) will cause a -% message `|.|' on the terminal and in the |.log| file if language |useless| is -% active: -% \begin{verbatim} -% \lstdefinelanguage{useless} -% {SelectCharTable=\lst@DefSaveDef{46}% save chr(46) ... -% \lsts@point % ... in \lsts@point and ... -% {\message{.}\lsts@point}% ... use new definition -% }\end{verbatim} -% If you want to count points, you could write -% \begin{verbatim} -% \newcount\lst@points % \global -% \lst@AddToHook{Init}{\global\lst@points\z@} -% \lst@AddToHook{DeInit}{\message{Number of points: \the\lst@points}} -% \lstdefinelanguage[2]{useless} -% {SelectCharTable=\lst@DefSaveDef{46}\lsts@point -% {\global\advance\lst@points\@ne \lsts@point} -% }\end{verbatim} -% |% \global| indicates that the allocated counter is used globally. We zero -% the counter at the beginning of each listing, display a message about the -% current value at the end of a listing, and each processed point advances the -% counter by one. -% -% \begin{syntax} -% \item[0.21] |\lst@CArg|\meta{active characters}|\relax|\meta{macro} -% -% The string of active characters is split into \meta{1st}, \meta{2nd}, -% and \marg{rest}. If one doesn't exist, an empty argument is used. Then -% \meta{macro} is called with |{|\meta{1st}\meta{2nd}\marg{rest}|}| plus -% a yet undefined control sequence \meta{save 1st}. This macro is -% intended to hold the current definition of \meta{1st}, so \meta{1st} -% can be redefined without loosing information. -% -% \item[0.19] |\lst@CArgX|\meta{characters}|\relax|\meta{macro} -% -% makes \meta{characters} active before calling |\lst@CArg|. -% -% \item[0.21] |\lst@CDef{|\meta{1st}\meta{2nd}\marg{rest}|}|\meta{save 1st}\marg{execute}\marg{pre}\marg{post} -% -% should be used in connection with |\lst@CArg| or |\lst@CArgX|, i.e.~as -% \meta{macro} there. \meta{1st}, \meta{2nd}, and \meta{rest} must be -% active characters and \meta{save 1st} must be an undefined control -% sequence. -% -% Whenever the package reaches the character \meta{1st} (in a listing), -% \meta{execute} is executed. If the package detects the whole string -% \meta{1st}\meta{2nd}\meta{rest}, we additionally execute \meta{pre}, -% then the string, and finally \meta{post}. -% -% \item[0.21] |\lst@CDefX|\meta{1st}\meta{2nd}\marg{rest}\meta{save 1st}\marg{execute}\marg{pre}\marg{post} -% -% Ditto except that we execute \meta{pre} and \meta{post} without the -% original string if we reach \meta{1st}\meta{2nd}\meta{rest}. -% This means that the string is replaced by \meta{pre}\meta{post} (with -% preceding \meta{execute}). -% \end{syntax} -% As the final example, here's the definition of |\lst@DefDelimB|. -% \begin{verbatim} -% \gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{% -% \lst@CDef{#1}#2% -% {#3}% -% {\let\lst@bnext\lst@CArgEmpty -% \lst@ifmode #4\else -% #5% -% \def\lst@bnext{#6{#7}{#8}}% -% \fi -% \lst@bnext}% -% \@empty}\end{verbatim} -% You got it? -% -% -% \part{Implementation} -% -% -% \CheckSum{11807} -%^^A -%^^A Don't index TeX-primitives. -%^^A -% \DoNotIndex{\advance,\afterassignment,\aftergroup,\batchmode,\begingroup} -% \DoNotIndex{\box,\catcode,\char,\chardef,\closeout,\copy,\count,\csname,\def} -% \DoNotIndex{\dimen,\discretionary,\divide,\dp,\edef,\else,\end,\endcsname} -% \DoNotIndex{\endgroup,\endinput,\endlinechar,\escapechar,\everypar} -% \DoNotIndex{\expandafter,\fi,\gdef,\global,\globaldefs,\hbadness,\hbox} -% \DoNotIndex{\hrulefill,\hss,\ht} -% \DoNotIndex{\if,\ifdim,\iffalse,\ifhmode,\ifinner,\ifnum,\ifodd,\iftrue} -% \DoNotIndex{\ifvoid,\ifx,\ignorespaces,\immediate,\input,\jobname,\kern} -% \DoNotIndex{\lccode,\leftskip,\let,\long,\lower,\lowercase,\meaning,\message} -% \DoNotIndex{\multiply,\muskip,\noexpand,\noindent,\openout,\par,\parfillskip} -% \DoNotIndex{\parshape,\parskip,\raise,\read,\relax,\rightskip,\setbox,\skip} -% \DoNotIndex{\string,\the,\toks,\uppercase,\vbox,\vcenter,\vrule,\vtop,\wd} -% \DoNotIndex{\write,\xdef} -% -%^^A -%^^A Don't index LaTeX's private definitions. -%^^A -% \DoNotIndex{\@@end,\@@par,\@M,\@arabic,\@circlefnt,\@currentlabel} -% \DoNotIndex{\@currenvir,\@depth,\@doendpe,\@dottedtocline,\@eha,\@ehc} -% \DoNotIndex{\@empty,\@firstofone,\@firstoftwo,\@float,\@for,\@getcirc} -% \DoNotIndex{\@gobble,\@gobbletwo,\@halfwidth,\@height,\@ifnextchar} -% \DoNotIndex{\@ifundefined,\@ignoretrue,\@makecaption,\@makeother,\@namedef} -% \DoNotIndex{\@ne,\@noligs,\@notprerr,\@onlypreamble,\@secondoftwo,\@spaces} -% \DoNotIndex{\@starttoc,\@totalleftmargin,\@undefined,\@whilenum} -% \DoNotIndex{\@wholewidth,\@width} -% \DoNotIndex{\c@chapter,\c@figure,\c@page,\end@float,\f@family,\filename@area} -% \DoNotIndex{\filename@base,\filename@ext,\filename@parse,\if@twoside} -% \DoNotIndex{\l@ngrel@x,\m@ne,\new@command,\nfss@catcodes,\tw@,\thr@@} -% \DoNotIndex{\z@,\zap@space} -% -%^^A -%^^A Don't index LaTeX's package definitions. -%^^A -% \DoNotIndex{\AtEndOfPackage} -% \DoNotIndex{\CurrentOption,\DeclareOption,\IfFileExists,\InputIfFileExists} -% \DoNotIndex{\MessageBreak,\NeedsTeXFormat,\PackageError,\PackageWarning} -% \DoNotIndex{\ProcessOptions,\ProvidesFile,\ProvidesPackage,\RequirePackage} -% -%^^A -%^^A Don't index LaTeX's public definitions. -%^^A -% \DoNotIndex{\abovecaptionskip,\active,\addcontentsline,\addtocounter,\begin} -% \DoNotIndex{\belowcaptionskip,\bfseries,\bgroup,\bigbreak,\chapter} -% \DoNotIndex{\contentsname,\do,\egroup,\footnotesize,\index,\itshape} -% \DoNotIndex{\linewidth,\llap,\makeatletter,\newbox,\newcommand,\newcount} -% \DoNotIndex{\newcounter,\newdimen,\newtoks,\newwrite,\nointerlineskip} -% \DoNotIndex{\normalbaselines,\normalfont,\numberline,\pretolerance,\protect} -% \DoNotIndex{\qquad,\refstepcounter,\removelastskip,\renewcommand,\rlap} -% \DoNotIndex{\small,\smallbreak,\smallskipamount,\smash,\space,\strut} -% \DoNotIndex{\strutbox,\tableofcontents,\textasciicircum,\textasciitilde} -% \DoNotIndex{\textasteriskcentered,\textbackslash,\textbar,\textbraceleft} -% \DoNotIndex{\textbraceright,\textdollar,\textendash,\textgreater,\textless} -% \DoNotIndex{\textunderscore,\textvisiblespace,\thechapter,\ttdefault} -% \DoNotIndex{\ttfamily,\typeout,\value,\vphantom} -% -%^^A -%^^A Don't index definitions from other packages. -%^^A -% \DoNotIndex{\MakePercentComment,\MakePercentIgnore} -% -%^^A -%^^A Don't index 0.19 definitions. -%^^A -% \DoNotIndex{\listlistingsname,\listoflistings,\lstbox,\lstbox@} -% \DoNotIndex{\lstlanguage@} -% -%^^A -%^^A Don't index 0.20 subdefinitions. -%^^A -% \DoNotIndex{\lst@ATH@,\lst@BOLGobble@,\lst@BOLGobble@@,\lst@CArg@,\lst@CArg@@} -% \DoNotIndex{\lst@CBC@,\lst@CBC@@,\lst@CCECUse@,\lst@CCPutMacro@,\lst@DefLang@} -% \DoNotIndex{\lst@DefLang@@,\lst@DefOther@,\lst@DeleteKeysIn@,\lst@Escape@} -% \DoNotIndex{\lstframe@,\lst@frameH@,\lst@frameL@,\lst@frameR@} -% \DoNotIndex{\lst@FillFixed@,\lst@FindAlias@,\lst@FVConvert@} -% \DoNotIndex{\lst@IfNextChars@,\lst@IfNextChars@@,\lst@InsideConvert@} -% \DoNotIndex{\lst@InstallKeywords@,\lst@Key@,\lst@KeywordTestI@} -% \DoNotIndex{\lst@MakeActive@,\lst@MakeMoreKeywords@} -% \DoNotIndex{\lst@RC@,\lst@RC@@,\lst@ReplaceIn@,\lst@ReplaceInput@} -% \DoNotIndex{\lst@ReportAllocs@,\lst@SKS@,\lst@SKS@@,\lst@UBC@} -% \DoNotIndex{\lst@WorkingTestI@,\lstalias@,\lstalias@@,\lstalso@} -% \DoNotIndex{\lstdefinestyle@,\lstenv@BOLGobble@@} -% \DoNotIndex{\lstenv@ProcessJ@,\lstinline@,\lstKV@OptArg@,\lstKV@SetIf@} -% \DoNotIndex{\lstlang@,\lstnewenvironment@,\lst@outputpos,\lstset@} -% -% -% \section{Overture} -% -% \paragraph{Registers} -% For each aspect, the required numbers of registers are listed in section -% \lstref{dPackageLoading}. Furthermore, the \packagename{keyval} package -% allocates one token register. The macros, boxes and counters -% |\@temp|\ldots|a|/|b|, the dimensions |\@tempdim|\ldots, and the macro -% |\@gtempa| are also used, see the index. -% -% \paragraph{Naming conventions} -% Let's begin with definitions for the user. All these public macros have -% lower case letters and contain |lst|. Private macros and variables use the -% following prefixes (not up-to-date?): -% \begin{itemize} -% \item |\lst@| for a general macro or variable, -% \item |\lstenv@| if it is defined for the listing environment, -% \item |\lsts@| for |s|aved character meanings, -% \item |\lsthk@|\meta{name of hook} holds hook material, -% \item |\lst|\meta{prefix}|@| for various kinds of keywords and working -% identifiers. -% \item |\lstlang@|\meta{language}|@|\meta{dialect} contains a language and -% \item |\lststy@|\meta{the style} contains style definition, -% \item |\lstpatch@|\meta{aspect} to patch an aspect, -% -% \item |\lsta@|\meta{language}|$|\meta{dialect} contains alias, -% \item |\lsta@|\meta{language} contains alias for all dialects of a language, -% \item |\lstdd@|\meta{language} contains default dialect of a language -% (if present). -% \end{itemize} -% To distinguish procedure-like macros from data-macros, the name of procedure -% macros use upper case letters with each beginning word, e.g.~|\lst@AddTo|. -% A macro with suffix |@| is the main working-procedure for another definition, -% for example |\lstinputlisting@| does the main work for |\lstinputlisting|. -% -% \paragraph{Preamble} -% All files generated from this \texttt{listings.dtx} will get a header. -% \begin{macrocode} -%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf. -%% -%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed -%% elsewhere in this file. -%% (c) 2006 Brooks Moses -%% -%% Send comments and ideas on the package, error reports and additional -%% programming languages to . -%% -% \end{macrocode} -% -% \paragraph{Identification} -% All files will have same date and version. -% \begin{macrocode} -\def\filedate{2004/09/07} -\def\fileversion{1.3} -% \end{macrocode} -% What we need and who we are. -% \begin{macrocode} -%<*kernel> -\NeedsTeXFormat{LaTeX2e} -\AtEndOfPackage{\ProvidesPackage{listings} - [\filedate\space\fileversion\space(Carsten Heinz)]} -% \end{macrocode} -% \begin{macro}{\lst@CheckVersion} -% can be used by the various driver files to guarantee the correct version. -% \begin{macrocode} -\def\lst@CheckVersion#1{\edef\reserved@a{#1}% - \ifx\lst@version\reserved@a \expandafter\@gobble - \else \expandafter\@firstofone \fi} -% \end{macrocode} -% \begin{macrocode} -\let\lst@version\fileversion -% -% \end{macrocode} -% \end{macro} -% For example by the miscellaneous file -% \begin{macrocode} -%<*misc> -\ProvidesFile{lstmisc.sty} - [\filedate\space\fileversion\space(Carsten Heinz)] -\lst@CheckVersion\fileversion - {\typeout{^^J% - ***^^J% - *** This file requires `listings.sty' version \fileversion.^^J% - *** You have a serious problem, so I'm exiting ...^^J% - ***^^J}% - \batchmode \@@end} -% -% \end{macrocode} -% or by the dummy patch. -% \begin{macrocode} -%<*patch> -\ProvidesFile{lstpatch.sty} - [\filedate\space\fileversion\space(Carsten Heinz)] -\lst@CheckVersion\lst@version{} -% -% \end{macrocode} -% \begin{macrocode} -%<*doc> -\ProvidesPackage{lstdoc} - [\filedate\space\fileversion\space(Carsten Heinz)] -% -% \end{macrocode} -% -% \paragraph{Category codes} -% We define two macros to ensure correct catcodes when we input other files of -% the \packagename{listings} package. -% -% \begin{macro}{\lst@InputCatcodes} -% |@| and |"| become letters. Tabulators and EOLs are ignored; this avoids -% unwanted spaces---in the case I've forgotten a comment character. -% \begin{macrocode} -%<*kernel> -\def\lst@InputCatcodes{% - \makeatletter \catcode`\"12% - \catcode`\^^@\active - \catcode`\^^I9% - \catcode`\^^L9% - \catcode`\^^M9% - \catcode`\%14% - \catcode`\~\active} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@RestoreCatcodes} -% To load the kernel, we will change some catcodes and lccodes. We restore them -% at the end of package loading. \lsthelper{Dr.~Jobst~Hoffmann}{2000/11/17} -% {incompatibility with typehtml package} reported an incompatibility with the -% \packagename{typehtml} package, which is resolved by |\lccode`\/`\/| below. -% \begin{macrocode} -\def\lst@RestoreCatcodes#1{% - \ifx\relax#1\else - \noexpand\catcode`\noexpand#1\the\catcode`#1\relax - \expandafter\lst@RestoreCatcodes - \fi} -\edef\lst@RestoreCatcodes{% - \noexpand\lccode`\noexpand\/`\noexpand\/% - \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax} -% \end{macrocode} -% Now we are ready for -% \begin{macrocode} -\lst@InputCatcodes -\AtEndOfPackage{\lst@RestoreCatcodes} -% -% \end{macrocode} -% \end{macro} -% -% \paragraph{Statistics} -% \begin{macro}{\lst@GetAllocs} -% \begin{macro}{\lst@ReportAllocs} -% are used to show the allocated registers. -% \begin{macrocode} -%<*info> -\def\lst@GetAllocs{% - \edef\lst@allocs{% - 0\noexpand\count\the\count10,1\noexpand\dimen\the\count11,% - 2\noexpand\skip\the\count12,3\noexpand\muskip\the\count13,% - 4\noexpand\box\the\count14,5\noexpand\toks\the\count15,% - 6\noexpand\read\the\count16,7\noexpand\write\the\count17}} -\def\lst@ReportAllocs{% - \message{^^JAllocs:}\def\lst@temp{none}% - \expandafter\lst@ReportAllocs@\lst@allocs,\z@\relax\z@,} -\def\lst@ReportAllocs@#1#2#3,{% - \ifx#2\relax \message{\lst@temp^^J}\else - \@tempcnta\count1#1\relax \advance\@tempcnta -#3\relax - \ifnum\@tempcnta=\z@\else - \let\lst@temp\@empty - \message{\the\@tempcnta \string#2,}% - \fi - \expandafter\lst@ReportAllocs@ - \fi} -\lst@GetAllocs -% \end{macrocode} -% \end{macro}\end{macro} -% \begingroup -% \begin{macrocode} -% -% \end{macrocode} -% \endgroup -% -% \paragraph{Miscellaneous} -% \begin{macro}{\@lst} -% Just a definition to save memory space. -% \begin{macrocode} -%<*kernel> -\def\@lst{lst} -% -% \end{macrocode} -% \end{macro} -% -% -% \section{General problems} -% -% All definitions in this section belong to the kernel. -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% -% -%^^A \subsection{Quick `if parameter empty'} -%^^A -%^^A There are many situations where you have to look whether a macro parameter is empty. -%^^A We have at least two possibilities to test |#1|, for example: -%^^A \begin{center} -%^^A \begin{minipage}{0.35\linewidth} -%^^A \begin{verbatim} -%^^A\def\test{#1}% -%^^A\ifx \test\empty -%^^A % #1 is empty -%^^A\else -%^^A % #1 is not empty -%^^A\fi\end{verbatim} -%^^A \end{minipage} -%^^A \hskip2em\vrule\hskip2em -%^^A \begin{minipage}{0.35\linewidth} -%^^A \begin{verbatim} -%^^A\ifx \empty#1\empty -%^^A % #1 is empty -%^^A\else -%^^A % #1 is not empty -%^^A\fi\end{verbatim} -%^^A \end{minipage} -%^^A \end{center} -%^^A where |\empty| is defined by |\def\empty{}|, of course. -%^^A The left variant should be clear and works in any case. -%^^A The right-hand side works correct if and only if the first token of |#1| is -%^^A not equivalent to |\empty|. -%^^A This granted, the |\ifx| is true if and only if |#1| is empty (since |\empty| -%^^A left from |#1| is (not) compared with |\empty| on the right). -%^^A The two |\empty|s might be replaced by any other macro, which is not -%^^A equivalent to the first token of the argument. -%^^A But the definition of that macro shouldn't be too complex since this would -%^^A slow down the |\ifx|. -%^^A The right example needs about $45\%$ of the left's time. -%^^A Note that this \TeX{}nique lost its importance from version 0.18 on and that -%^^A other packages use |!| or |\relax| instead of |\empty|, for example. -%^^A -%^^A This \TeX nique is described in ``The \TeX book'' on page 376. -% -% -% \subsection{Substring tests}\label{iSubstringTests} -% -% \lstset{language=TeX,gobble=4,xleftmargin=20pt,columns=[l]fullflexible,mathescape,keywordstyle=\ttfamily,texcsstyle=\bfseries} -% \let\texverb\lstinline -% \lstnewenvironment{texcode}[1][]{\lstset{#1}}{} -% \lstset{keywords={def,key}} -% -% It's easy to decide whether a given character sequence is a substring of -% another string. For example, for the substring \texverb|def| we could say -% \begin{texcode} -% \def \lst@temp#1def#2\relax{% -% \ifx \@empty#2\@empty -% % "def" is not a substring -% \else -% % "def" is a substring -% \fi} -% -% \lst@temp $\meta{another\ string}$def\relax -% \end{texcode} -% When \TeX\ passes the arguments |#1| and |#2|, the second is empty if -% and only if \texverb|def| is not a substring. Without the additional -% \texverb|def\relax|, one would get a ``runaway argument'' error if -% \meta{another string} doesn't contain \texverb|def|. -% -% We use substring tests mainly in the special case of an identifier and a -% comma separated list of keys or keywords: -% \begin{texcode}[keywords=key] -% \def \lst@temp#1,key,#2\relax{% -% \ifx \@empty#2\@empty -% % `key' is not a keyword -% \else -% % `key' is a keyword -% \fi} -% -% \lst@temp,$\meta{list\ of\ keywords}$,key,\relax -% \end{texcode} -% This works very well and is quite fast. But we can reduce run time in the -% case that \texttt{key} is a keyword. Then |#2| takes the rest of the string, -% namely all keywords after \texttt{key}. -% Since \TeX\ inserts |#2| between the \texverb|\@empty|s, it must drop all of -% |#2| except the first character---which is compared with \texverb|\@empty|. -% We can redirect this rest to a third parameter: -% \begin{texcode}[keywords=key] -% \def \lst@temp#1,key,#2#3\relax{% -% \ifx \@empty#2% -% % "key" is not a keyword -% \else -% % "key" is a keyword -% \fi} -% -% \lst@temp,$\meta{list\ of\ keywords}$,key,\@empty\relax -% \end{texcode} -% That's a bit faster and an improvement for version 0.20. -% -% \begin{macro}{\lst@IfSubstring} -% The implementation should be clear from the discussion above. -% \begin{macrocode} -\def\lst@IfSubstring#1#2{% - \def\lst@temp##1#1##2##3\relax{% - \ifx \@empty##2\expandafter\@secondoftwo - \else \expandafter\@firstoftwo \fi}% - \expandafter\lst@temp#2#1\@empty\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@IfOneOf} -% Ditto. -% \begin{macrocode} -\def\lst@IfOneOf#1\relax#2{% - \def\lst@temp##1,#1,##2##3\relax{% - \ifx \@empty##2\expandafter\@secondoftwo - \else \expandafter\@firstoftwo \fi}% - \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax} -% \end{macrocode} -% \end{macro} -% \begin{REMOVED} -% One day, if there is need for a case insensitive key(word) test again, we -% can use two |\uppercase|s to normalize the first parameter: -% \begin{verbatim} -%\def\lst@IfOneOfInsensitive#1\relax#2{% -% \uppercase{\def\lst@temp##1,#1},##2##3\relax{% -% \ifx \@empty##2\expandafter\@secondoftwo -% \else \expandafter\@firstoftwo \fi}% -% \uppercase{% -% \expandafter\lst@temp\expandafter,#2,#1},\@empty\relax}\end{verbatim} -% Here we assume that macro |#2| already contains capital characters only, see -% the definition of |\lst@MakeMacroUppercase| at the very end of section -% \ref{iMakingTests}. If we \emph{must not} assume that, we could simply -% insert an |\expandafter| between the second |\uppercase| and the following -% brace. But this slows down the tests! -% \end{REMOVED} -% -% \begin{macro}{\lst@DeleteKeysIn} -% The submacro does the main work; we only need to expand the second -% macro---the list of keys to remove---and append the terminator |\relax|. -% \begin{macrocode} -\def\lst@DeleteKeysIn#1#2{% - \expandafter\lst@DeleteKeysIn@\expandafter#1#2,\relax,} -% \end{macrocode} -% `Replacing' the very last |\lst@DeleteKeysIn@| by |\lst@RemoveCommas| -% terminates the loop here. Note: The |\@empty| after |#2| ensures that this -% macro also works if |#2| is empty. -% \begin{macrocode} -\def\lst@DeleteKeysIn@#1#2,{% - \ifx\relax#2\@empty - \expandafter\@firstoftwo\expandafter\lst@RemoveCommas - \else - \ifx\@empty#2\@empty\else -% \end{macrocode} -% If we haven't reached the end of the list and if the key is not empty, we -% define a temporary macro which removes all appearances. -% \begin{macrocode} - \def\lst@temp##1,#2,##2{% - ##1% - \ifx\@empty##2\@empty\else - \expandafter\lst@temp\expandafter,% - \fi ##2}% - \edef#1{\expandafter\lst@temp\expandafter,#1,#2,\@empty}% - \fi - \fi - \lst@DeleteKeysIn@#1} -% \end{macrocode} -% \end{macro} -% \begin{OLDDEF} -% The following modification needs about $50\%$ more run time. -% It doesn't use |\edef| and thus also works with |\{| inside |#1|. -% However, we don't need that at the moment. -% \begin{verbatim} -% \def\lst@temp##1,#2,##2{% -% \ifx\@empty##2% -% \lst@lAddTo#1{##1}% -% \else -% \lst@lAddTo#1{,##1}% -% \expandafter\lst@temp\expandafter,% -% \fi ##2}% -% \let\@tempa#1\let#1\@empty -% \expandafter\lst@temp\expandafter,\@tempa,#2,\@empty\end{verbatim} -% \end{OLDDEF} -% -% \begin{macro}{\lst@RemoveCommas} -% The macro drops commas at the beginning and assigns the new value to |#1|. -% \begin{macrocode} -\def\lst@RemoveCommas#1{\edef#1{\expandafter\lst@RC@#1\@empty}} -\def\lst@RC@#1{\ifx,#1\expandafter\lst@RC@ \else #1\fi} -% \end{macrocode} -% \end{macro} -% \begin{OLDDEF} -% The following version works with |\{| inside the macro |#1|. -% \begin{verbatim} -%\def\lst@RemoveCommas#1{\expandafter\lst@RC@#1\@empty #1} -%\def\lst@RC@#1{% -% \ifx,#1\expandafter\lst@RC@ -% \else\expandafter\lst@RC@@\expandafter#1\fi} -%\def\lst@RC@@#1\@empty#2{\def#2{#1}}\end{verbatim} -% \end{OLDDEF} -% -% \begin{macro}{\lst@ReplaceIn} -% \begin{macro}{\lst@ReplaceInArg} -% These macros are similar to |\lst@DeleteKeysIn|, except that \ldots -% \begin{macrocode} -\def\lst@ReplaceIn#1#2{% - \expandafter\lst@ReplaceIn@\expandafter#1#2\@empty\@empty} -\def\lst@ReplaceInArg#1#2{\lst@ReplaceIn@#1#2\@empty\@empty} -% \end{macrocode} -% \ldots\space we replace |#2| by |#3| instead of |,#2,| by a single comma -% (which removed the key |#2| above). -% \begin{macrocode} -\def\lst@ReplaceIn@#1#2#3{% - \ifx\@empty#3\relax\else - \def\lst@temp##1#2##2{% - \ifx\@empty##2% - \lst@lAddTo#1{##1}% - \else - \lst@lAddTo#1{##1#3}\expandafter\lst@temp - \fi ##2}% - \let\@tempa#1\let#1\@empty - \expandafter\lst@temp\@tempa#2\@empty - \expandafter\lst@ReplaceIn@\expandafter#1% - \fi} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \subsection{Flow of control} -% -% \begin{macro}{\@gobblethree} -% is defined if and only if undefined. -% \begin{macrocode} -\providecommand*\@gobblethree[3]{} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@GobbleNil} -% \begin{macrocode} -\def\lst@GobbleNil#1\@nil{} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Swap} -% is just this: -% \begin{macrocode} -\def\lst@Swap#1#2{#2#1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@if} -% \begin{macro}{\lst@true} -% \begin{macro}{\lst@false} -% A general |\if| for temporary use. -% \begin{macrocode} -\def\lst@true{\let\lst@if\iftrue} -\def\lst@false{\let\lst@if\iffalse} -\lst@false -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@IfNextCharsArg} -% is quite easy: We define a macro and call |\lst@IfNextChars|. -% \begin{macrocode} -\def\lst@IfNextCharsArg#1{% - \def\lst@tofind{#1}\lst@IfNextChars\lst@tofind} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@IfNextChars} -% We save the arguments and start a loop. -% \begin{macrocode} -\def\lst@IfNextChars#1#2#3{% - \let\lst@tofind#1\def\@tempa{#2}\def\@tempb{#3}% - \let\lst@eaten\@empty \lst@IfNextChars@} -% \end{macrocode} -% Expand the characters we are looking for. -% \begin{macrocode} -\def\lst@IfNextChars@{\expandafter\lst@IfNextChars@@\lst@tofind\relax} -% \end{macrocode} -% Now we can refine |\lst@tofind| and append the input character |#3| to -% |\lst@eaten|. -% \begin{macrocode} -\def\lst@IfNextChars@@#1#2\relax#3{% - \def\lst@tofind{#2}\lst@lAddTo\lst@eaten{#3}% - \ifx#1#3% -% \end{macrocode} -% If characters are the same, we either call |\@tempa| or continue the test. -% \begin{macrocode} - \ifx\lst@tofind\@empty - \let\lst@next\@tempa - \else - \let\lst@next\lst@IfNextChars@ - \fi - \expandafter\lst@next - \else -% \end{macrocode} -% If the characters are different, we call |\@tempb|. -% \begin{macrocode} - \expandafter\@tempb - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@IfNextCharActive} -% We compare the character |#3| with its active version |\lowercase{~}|. -% Note that the right brace between |\ifx~| and |#3| ends the |\lowercase|. -% The |\endgroup| restores the |\lccode|. -% \begin{macrocode} -\def\lst@IfNextCharActive#1#2#3{% - \begingroup \lccode`\~=`#3\lowercase{\endgroup - \ifx~}#3% - \def\lst@next{#1}% - \else - \def\lst@next{#2}% - \fi \lst@next #3} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@for} -% A for-loop with expansion of the loop-variable. -% \begin{macrocode} -\def\lst@for#1\do#2{% - \def\lst@forbody##1{#2}% - \@for\lst@forvar:=#1\do - {\expandafter\lst@forbody\expandafter{\lst@forvar}}} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Catcode changes}\label{iCatcodeChanges} -% -% A character gets its catcode right after reading it and \TeX\ has no -% primitive command to change attached catcodes. However, we can replace these -% characters by characters with same ASCII codes and different catcodes. -% It's not the same but suffices since the result is the same. -% Here we treat the very special case that all characters become active. -% If we want \texverb|\lst@arg| to contain an active version of the character -% |#1|, a prototype macro could be -% \begin{texcode} -% \def\lst@MakeActive#1{\lccode`\~=`#1\lowercase{\def\lst@arg{~}}} -% \end{texcode} -% The |\lowercase| changes the ASCII code of |~| to the one of |#1| since we -% have said that |~| is the lower case version of |#1|. -% Fortunately the |\lowercase| doesn't change the catcode, so we have an active -% version of |#1|. -% Note that |~| is usually active. -% -% \begin{macro}{\lst@MakeActive} -% We won't do this character by character. -% To increase speed we change nine characters at the same time (if nine -% characters are left). -% \begin{TODO} -% This was introduced when the delimiters were converted each listings. Now -% this conversion is done only each language selection. So we might want to -% implement a character by character conversion again to decrease the memory -% usage. -% \end{TODO} -% We get the argument, empty |\lst@arg| and begin a loop. -% \begin{macrocode} -\def\lst@MakeActive#1{% - \let\lst@temp\@empty \lst@MakeActive@#1% - \relax\relax\relax\relax\relax\relax\relax\relax\relax} -% \end{macrocode} -% There are nine |\relax|es since |\lst@MakeActive@| has nine parameters and we -% don't want any problems in the case that |#1| is empty. -% We need nine active characters now instead of a single |~|. -% We make these catcode changes local and define the coming macro |\global|. -% \begin{macrocode} -\begingroup -\catcode`\^^@=\active \catcode`\^^A=\active \catcode`\^^B=\active -\catcode`\^^C=\active \catcode`\^^D=\active \catcode`\^^E=\active -\catcode`\^^F=\active \catcode`\^^G=\active \catcode`\^^H=\active -% \end{macrocode} -% First we |\let| the next operation be |\relax|. -% This aborts our loop for processing all characters (default and possibly -% changed later). -% Then we look if we have at least one character. -% If this is not the case, the loop terminates and all is done. -% \begin{macrocode} -\gdef\lst@MakeActive@#1#2#3#4#5#6#7#8#9{\let\lst@next\relax - \ifx#1\relax - \else \lccode`\^^@=`#1% -% \end{macrocode} -% Otherwise we say that |^^@|=chr(0) is the lower case version of the first -% character. -% Then we test the second character. -% If there is none, we append the lower case |^^@| to |\lst@temp|. -% Otherwise we say that |^^A|=chr(1) is the lower case version of the second -% character and we test the next argument, and so on. -% \begin{macrocode} - \ifx#2\relax - \lowercase{\lst@lAddTo\lst@temp{^^@}}% - \else \lccode`\^^A=`#2% - \ifx#3\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A}}% - \else \lccode`\^^B=`#3% - \ifx#4\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B}}% - \else \lccode`\^^C=`#4% - \ifx#5\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C}}% - \else \lccode`\^^D=`#5% - \ifx#6\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D}}% - \else \lccode`\^^E=`#6% - \ifx#7\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E}}% - \else \lccode`\^^F=`#7% - \ifx#8\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F}}% - \else \lccode`\^^G=`#8% - \ifx#9\relax - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G}}% -% \end{macrocode} -% If nine characters are present, we append (lower case versions of) nine -% active characters and call this macro again via redefining |\lst@next|. -% \begin{macrocode} - \else \lccode`\^^H=`#9% - \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G^^H}}% - \let\lst@next\lst@MakeActive@ - \fi \fi \fi \fi \fi \fi \fi \fi \fi - \lst@next} -\endgroup -% \end{macrocode} -% This |\endgroup| restores the catcodes of chr(0)--chr(8), but not the -% catcodes of the characters inside |\lst@MakeActive@| since they are already -% read. -% -% Note: A conversion from an arbitrary `catcode--character code' table back to -% \TeX's catcodes is possible if we test against the character codes (either -% via |\ifnum| or |\ifcase|). -% But control sequences and begin and end group characters definitely need -% some special treatment. -% However I haven't checked the details. -% So just ignore this and don't bother me for this note. :\,--\,) -% \end{macro} -% -% \begin{macro}{\lst@DefActive} -% An easy application of |\lst@MakeActive|. -% \begin{macrocode} -\def\lst@DefActive#1#2{\lst@MakeActive{#2}\let#1\lst@temp} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DefOther} -% We use the fact that |\meaning| produces catcode 12 characters except spaces -% stay spaces. |\escapechar| is modified locally to suppress the output of an -% escape character. Finally we remove spaces via \LaTeX's |\zap@space|, which -% was proposed by \lsthelper{Rolf~Niepraschk}{1997/04/24}{use \zap@space}---not -% in this context, but that doesn't matter. -% \begin{macrocode} -\def\lst@DefOther#1#2{% - \begingroup \def#1{#2}\escapechar\m@ne \expandafter\endgroup - \expandafter\lst@DefOther@\meaning#1\relax#1} -\def\lst@DefOther@#1>#2\relax#3{\edef#3{\zap@space#2 \@empty}} -% \end{macrocode} -% \end{macro} -% -% -%\ifhyper -% \subsection{Applications to \ref*{iCatcodeChanges}}\label{iApplicationsTo} -%\else -% \subsection{Applications to \ref{iCatcodeChanges}}\label{iApplicationsTo} -%\fi -% -% If an environment is used inside an argument, the listing is already read and -% we can do nothing to preserve the catcodes. -% However, under certain circumstances the environment can be used inside an -% argument---that's at least what I've said in the User's guide. -% And now I have to work for it coming true. -% Moreover we define an analogous conversion macro for the -% \packagename{fancyvrb} mode. -% \begin{syntax} -% \item[0.19] |\lst@InsideConvert{|\meta{\TeX\ material \textup(already read\textup)}|}| -% -% \emph{appends} a verbatim version of the argument to |\lst@arg|, but all -% appended characters are active. Since it's not a character to character -% conversion, `verbatim' needs to be explained. All characters can be -% typed in as they are except |\|, |{|, |}| and |%|. If you want one of -% these, you must write |\\|, |\{|, |\}| and |\%| instead. -% If two spaces should follow each other, the second (third, fourth, -% \ldots) space must be entered with a preceding backslash. -% -% \item[0.19] |\lst@XConvert{|\meta{\TeX\ material \textup(already read\textup)}|}| -% -% \emph{appends} a `verbatim' version of the argument to |\lst@arg|. -% Here \TeX\ material is allowed to be put inside argument braces like -% |{(*}{*)}|. The contents of these arguments are converted, the braces -% stay as curly braces. -% -% If |\lst@if| is true, each second argument is treated differently. -% Only the first character (of the delimiter) becomes active. -% \end{syntax} -% -% \begin{macro}{\lst@InsideConvert} -% If \texttt{mathescape} is not on, we call (near the end of this definition) a -% submacro similar to |\zap@space| to replaced single spaces by active spaces. -% Otherwise we check whether the code contains a pair |$...$| and call the -% appropriate macro. -% \begin{macrocode} -\def\lst@InsideConvert#1{% - \lst@ifmathescape - \lst@InsideConvert@e#1$\@nil - \lst@if - \lst@InsideConvert@ey#1\@nil - \else - \lst@InsideConvert@#1 \@empty - \expandafter\@gobbletwo - \fi - \expandafter\lst@next - \else - \lst@InsideConvert@#1 \@empty - \fi} -\begingroup \lccode`\~=`\ \relax \lowercase{% -% \end{macrocode} -% We make |#1| active and append these characters (plus an active space) to -% |\lst@arg|. -% If we haven't found the end |\@empty| of the input, we continue the process. -% \begin{macrocode} -\gdef\lst@InsideConvert@#1 #2{% - \lst@MakeActive{#1}% - \ifx\@empty#2% - \lst@lExtend\lst@arg{\lst@temp}% - \else - \lst@lExtend\lst@arg{\lst@temp~}% - \expandafter\lst@InsideConvert@ - \fi #2} -% \end{macrocode} -% Finally we end the |\lowercase| and close a group. -% \begin{macrocode} -}\endgroup -% \end{macrocode} -% The next definition has been used above to check for |$...$| and the following -% one keeps the math contents from being converted. This feature was requested by -% \lsthelper{Dr.~Jobst~Hoffmann}{}{}. -% \begin{macrocode} -\def\lst@InsideConvert@e#1$#2\@nil{% - \ifx\@empty#2\@empty \lst@false \else \lst@true \fi} -\def\lst@InsideConvert@ey#1$#2$#3\@nil{% - \lst@InsideConvert@#1 \@empty - \lst@lAddTo\lst@arg{% - \lst@ifdropinput\else - \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken - \setbox\@tempboxa=\hbox\bgroup$\lst@escapebegin - #2% - \lst@escapeend$\egroup \lst@CalcLostSpaceAndOutput - \lst@whitespacefalse - \fi}% - \def\lst@next{\lst@InsideConvert{#3}}% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@XConvert} -% Check for an argument \ldots -% \begin{macrocode} -\def\lst@XConvert{\@ifnextchar\bgroup \lst@XConvertArg\lst@XConvert@} -% \end{macrocode} -% \ldots, convert the argument, add it together with group delimiters to -% |\lst@arg|, and we continue the conversion. -% \begin{macrocode} -\def\lst@XConvertArg#1{% - {\lst@false \let\lst@arg\@empty - \lst@XConvert#1\@nil - \global\let\@gtempa\lst@arg}% - \lst@lExtend\lst@arg{\expandafter{\@gtempa}}% - \lst@XConvertNext} -% \end{macrocode} -% Having no |\bgroup|, we look whether we've found the end of the input, and -% convert one token ((non)active character or control sequence) and continue. -% \begin{macrocode} -\def\lst@XConvert@#1{% - \ifx\@nil#1\else - \begingroup\lccode`\~=`#1\lowercase{\endgroup - \lst@lAddTo\lst@arg~}% - \expandafter\lst@XConvertNext - \fi} -\def\lst@XConvertNext{% - \lst@if \expandafter\lst@XConvertX - \else \expandafter\lst@XConvert \fi} -% \end{macrocode} -% Now we make only the first character active. -% \begin{macrocode} -\def\lst@XConvertX#1{% - \ifx\@nil#1\else - \lst@XConvertX@#1\relax - \expandafter\lst@XConvert - \fi} -\def\lst@XConvertX@#1#2\relax{% - \begingroup\lccode`\~=`#1\lowercase{\endgroup - \lst@XCConvertX@@~}{#2}} -\def\lst@XCConvertX@@#1#2{\lst@lAddTo\lst@arg{{#1#2}}} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Driver file handling*} -% -% The \packagename{listings} package is split into several driver files, -% miscellaneous (= aspect) files, and one kernel file. -% All these files can be loaded partially and on demand---except the kernel -% which provides this functionality. -% \begin{syntax} -% \item[0.21] |\lst@Require|\marg{name}\marg{prefix}\marg{feature list}\meta{alias}\meta{file list macro} -% -% tries to load all items of \meta{feature list} from the files -% listed in \meta{file list macro}. -% Each item has the form [\oarg{sub}]\meta{feature}. -% |\lst@if| equals |\iftrue| if and only if all items were loadable. -% -% The macro \meta{alias} gets an item as argument and must define -% appropriate versions of |\lst@oalias| and |\lst@malias|. In fact -% the feature associated with these definitions is loaded. You can -% use \meta{alias}=|\lst@NoAlias| for no substitution. -% -% \meta{prefix} identifies the type internally and \meta{name} is used -% for messages. -% -% For example, |\lstloadaspects| uses the following arguments where |#1| -% is the list of aspects: |{aspects}|\allowbreak|a|\allowbreak -% |{#1}|\allowbreak|\lst@NoAlias|\allowbreak|\lstaspectfiles|. -% -% \item[0.20] |\lst@DefDriver|\marg{name}\marg{prefix}\meta{interface macro}|\if|\alternative{true,false} -% -% -% -% \item[0.21] |\lst@IfRequired|\oarg{sub}\marg{feature}\marg{then}\marg{else} -% -% is used inside a driver file by the aspect, language, or whatever -% else defining commands. \meta{then} is executed if and only if -% \oarg{sub}\marg{feature} has been requested via |\lst@Require|. -% Otherwise \meta{else} is executed---which is also the case for -% subsequent calls with the same \oarg{sub}\marg{feature}. -% -% \meta{then} and \meta{else} may use |\lst@prefix| (read access only). -% -% |\lst@BeginAspect| in section \ref{iAspectCommands} and |\lst@DefDriver| -% serve as examples. -% \end{syntax} -% -% \begin{macro}{\lst@Require} -% Initialize variables (if required items aren't empty), \ldots -% \begin{macrocode} -\def\lst@Require#1#2#3#4#5{% - \begingroup - \aftergroup\lst@true - \ifx\@empty#3\@empty\else - \def\lst@prefix{#2}\let\lst@require\@empty -% \end{macrocode} -% \ldots\space and for each nonempty item: determine alias and add it to -% |\lst@require| if it isn't loaded. -% \begin{macrocode} - \edef\lst@temp{\expandafter\zap@space#3 \@empty}% - \lst@for\lst@temp\do{% - \ifx\@empty##1\@empty\else \lstKV@OptArg[]{##1}{% - #4[####1]{####2}% - \@ifundefined{\@lst\lst@prefix @\lst@malias $\lst@oalias}% - {\edef\lst@require{\lst@require,\lst@malias $\lst@oalias}}% - {}}% - \fi}% -% \end{macrocode} -% Init things and input files if and as long as it is necessary. -% \begin{macrocode} - \global\let\lst@loadaspects\@empty - \lst@InputCatcodes - \ifx\lst@require\@empty\else - \lst@for{#5}\do{% - \ifx\lst@require\@empty\else - \InputIfFileExists{##1}{}{}% - \fi}% - \fi -% \end{macrocode} -% Issue error and call |\lst@false| (after closing the local group) if some -% items weren't loadable. -% \begin{macrocode} - \ifx\lst@require\@empty\else - \PackageError{Listings}{Couldn't load requested #1}% - {The following #1s weren't loadable:^^J\@spaces - \lst@require^^JThis may cause errors in the sequel.}% - \aftergroup\lst@false - \fi -% \end{macrocode} -% Request aspects. -% \begin{macrocode} - \ifx\lst@loadaspects\@empty\else - \lst@RequireAspects\lst@loadaspects - \fi - \fi - \endgroup} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@IfRequired} -% uses |\lst@IfOneOf| and adds some code to \meta{then} part: -% delete the now loaded item from the list and define -% |\lst|\meta{prefix}|@|\meta{feature}|$|\meta{sub}. -% \begin{macrocode} -\def\lst@IfRequired[#1]#2{% - \lst@NormedDef\lst@temp{[#1]#2}% - \expandafter\lst@IfRequired@\lst@temp\relax} -\def\lst@IfRequired@[#1]#2\relax#3{% - \lst@IfOneOf #2$#1\relax\lst@require - {\lst@DeleteKeysIn@\lst@require#2$#1,\relax,% - \global\expandafter\let - \csname\@lst\lst@prefix @#2$#1\endcsname\@empty - #3}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@require} -% \begin{macrocode} -\let\lst@require\@empty -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@NoAlias} -% just defines |\lst@oalias| and |\lst@malias|. -% \begin{macrocode} -\def\lst@NoAlias[#1]#2{% - \lst@NormedDef\lst@oalias{#1}\lst@NormedDef\lst@malias{#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LAS} -% \begin{macrocode} -\gdef\lst@LAS#1#2#3#4#5#6#7{% - \lst@Require{#1}{#2}{#3}#4#5% - #4#3% - \@ifundefined{lst#2@\lst@malias$\lst@oalias}% - {\PackageError{Listings}% - {#1 \ifx\@empty\lst@oalias\else \lst@oalias\space of \fi - \lst@malias\space undefined}% - {The #1 is not loadable. \@ehc}}% - {#6\csname\@lst#2@\lst@malias $\lst@oalias\endcsname #7}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@RequireAspects} -% \begin{macro}{\lstloadaspects} -% make use of the just developped definitions. -% \begin{macrocode} -\def\lst@RequireAspects#1{% - \lst@Require{aspect}{asp}{#1}\lst@NoAlias\lstaspectfiles} -\let\lstloadaspects\lst@RequireAspects -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lstaspectfiles} -% This macro is defined if and only if it's undefined yet. -% \begin{macrocode} -\@ifundefined{lstaspectfiles} - {\newcommand\lstaspectfiles{lstmisc0.sty,lstmisc.sty}}{} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DefDriver} -% Test the next character and reinsert the arguments. -% \begin{macrocode} -\gdef\lst@DefDriver#1#2#3#4{% - \@ifnextchar[{\lst@DefDriver@{#1}{#2}#3#4}% - {\lst@DefDriver@{#1}{#2}#3#4[]}} -% \end{macrocode} -% We set |\lst@if| locally true if the item has been requested. -% \begin{macrocode} -\gdef\lst@DefDriver@#1#2#3#4[#5]#6{% - \def\lst@name{#1}\let\lst@if#4% - \lst@NormedDef\lst@driver{\@lst#2@#6$#5}% - \lst@IfRequired[#5]{#6}{\begingroup \lst@true}% - {\begingroup}% - \lst@setcatcodes - \@ifnextchar[{\lst@XDefDriver{#1}#3}{\lst@DefDriver@@#3}} -% \end{macrocode} -% Note that |\lst@XDefDriver| takes optional `base' arguments, but eventually -% calls |\lst@DefDriver@@|. We define the item (in case of need), and -% |\endgroup| resets some catcodes and |\lst@if|, i.e.~|\lst@XXDefDriver| knows -% whether called by a public or internal command. -% \begin{macrocode} -\gdef\lst@DefDriver@@#1#2{% - \lst@if - \global\@namedef{\lst@driver}{#1{#2}}% - \fi - \endgroup - \@ifnextchar[\lst@XXDefDriver\@empty} -% \end{macrocode} -% We get the aspect argument, and (if not empty) load the aspects immediately -% if called by a public command or extend the list of required aspects or -% simply ignore the argument if the item leaves undefined. -% \begin{macrocode} -\gdef\lst@XXDefDriver[#1]{% - \ifx\@empty#1\@empty\else - \lst@if - \lstloadaspects{#1}% - \else - \@ifundefined{\lst@driver}{}% - {\xdef\lst@loadaspects{\lst@loadaspects,#1}}% - \fi - \fi} -% \end{macrocode} -% We insert an additional `also'key=value pair. -% \begin{macrocode} -\gdef\lst@XDefDriver#1#2[#3]#4#5{\lst@DefDriver@@#2{also#1=[#3]#4,#5}} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Aspect commands}\label{iAspectCommands} -% -% This section contains commands used in defining `\lst-aspects'. -% \begin{macro}{\lst@UserCommand} -% is mainly equivalent to |\gdef|. -% \begin{macrocode} -%\let\lst@UserCommand\gdef -%\def\lst@UserCommand#1{\message{\string#1,}\gdef#1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@BeginAspect} -% A straight-forward implementation: -% \begin{macrocode} -\newcommand*\lst@BeginAspect[2][]{% - \def\lst@curraspect{#2}% - \ifx \lst@curraspect\@empty - \expandafter\lst@GobbleAspect - \else -% \end{macrocode} -% If \meta{aspect name} is not empty, there are certain other conditions not to -% define the aspect (as described in section \ref{dHowToDefineLstAspects}). -% \begin{macrocode} -% \let\lst@next\@empty -% \def\lst@next{% -% \message{^^JDefine lst-aspect `#2':}\lst@GetAllocs}% - \lst@IfRequired[]{#2}% - {\lst@RequireAspects{#1}% - \lst@if\else \let\lst@next\lst@GobbleAspect \fi}% - {\let\lst@next\lst@GobbleAspect}% - \expandafter\lst@next - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EndAspect} -% finishes an aspect definition. -% \begin{macrocode} -\def\lst@EndAspect{% - \csname\@lst patch@\lst@curraspect\endcsname -% \lst@ReportAllocs - \let\lst@curraspect\@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@GobbleAspect} -% drops all code up to the next |\lst@EndAspect|. -% \begin{macrocode} -\long\def\lst@GobbleAspect#1\lst@EndAspect{\let\lst@curraspect\@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Key} -% The command simply defines the key. But we must take care of an optional -% parameter and the initialization argument |#2|. -% \begin{macrocode} -\def\lst@Key#1#2{% -% \message{#1,}% - \@ifnextchar[{\lstKV@def{#1}{#2}}% - {\def\lst@temp{\lst@Key@{#1}{#2}} - \afterassignment\lst@temp - \global\@namedef{KV@\@lst @#1}####1}} -% \end{macrocode} -% Now comes a renamed and modified copy from a \packagename{keyval} macro: -% We need global key definitions. -% \begin{macrocode} -\def\lstKV@def#1#2[#3]{% - \global\@namedef{KV@\@lst @#1@default\expandafter}\expandafter - {\csname KV@\@lst @#1\endcsname{#3}}% - \def\lst@temp{\lst@Key@{#1}{#2}}\afterassignment\lst@temp - \global\@namedef{KV@\@lst @#1}##1} -% \end{macrocode} -% We initialize the key if the first token of |#2| is not |\relax|. -% \begin{macrocode} -\def\lst@Key@#1#2{% - \ifx\relax#2\@empty\else - \begingroup \globaldefs\@ne - \csname KV@\@lst @#1\endcsname{#2}% - \endgroup - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@UseHook} -% is very, very, \ldots, very (hundreds of times) easy. -% \begin{macrocode} -\def\lst@UseHook#1{\csname\@lst hk@#1\endcsname} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@AddToHook} -% \begin{macro}{\lst@AddToHookExe} -% \begin{macro}{\lst@AddToHookAtTop} -% All use the same submacro. -% \begin{macrocode} -\def\lst@AddToHook{\lst@ATH@\iffalse\lst@AddTo} -\def\lst@AddToHookExe{\lst@ATH@\iftrue\lst@AddTo} -\def\lst@AddToHookAtTop{\lst@ATH@\iffalse\lst@AddToAtTop} -% \end{macrocode} -% If and only if the boolean value is true, the hook material is executed -% globally. -% \begin{macrocode} -\long\def\lst@ATH@#1#2#3#4{% - \@ifundefined{\@lst hk@#3}{% -% \message{^^Jnew hook `#3',^^J}% - \expandafter\gdef\csname\@lst hk@#3\endcsname{}}{}% - \expandafter#2\csname\@lst hk@#3\endcsname{#4}% - \def\lst@temp{#4}% - #1% \iftrue|false - \begingroup \globaldefs\@ne \lst@temp \endgroup - \fi} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@AddTo} -% Note that the definition is global! -% \begin{macrocode} -\long\def\lst@AddTo#1#2{% - \expandafter\gdef\expandafter#1\expandafter{#1#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@AddToAtTop} -% We need a couple of |\expandafter|s now. Simply note that we have\\ -% {\small\hspace*{2em}|\expandafter\gdef\expandafter#1\expandafter{\lst@temp| -% $\langle$\textit{contents of }|#1|$\rangle$|}|}\\ -% after the `first phase' of expansion. -% \begin{macrocode} -\def\lst@AddToAtTop#1#2{\def\lst@temp{#2}% - \expandafter\expandafter\expandafter\gdef - \expandafter\expandafter\expandafter#1% - \expandafter\expandafter\expandafter{\expandafter\lst@temp#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@lAddTo} -% A local version of |\lst@AddTo| \ldots -% \begin{macrocode} -\def\lst@lAddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Extend} -% \begin{macro}{\lst@lExtend} -% \ldots\space and here we expand the first token of the second argument first. -% \begin{macrocode} -\def\lst@Extend#1#2{% - \expandafter\lst@AddTo\expandafter#1\expandafter{#2}} -\def\lst@lExtend#1#2{% - \expandafter\lst@lAddTo\expandafter#1\expandafter{#2}} -% \end{macrocode} -% \begin{TODO} -% This should never be changed to -% \begin{verbatim} -% \def\lst@Extend#1{% -% \expandafter\lst@AddTo\expandafter#1\expandafter} -% \def\lst@lExtend#1{% -% \expandafter\lst@lAddTo\expandafter#1}\end{verbatim} -% The first is not equivalent in case that the second argument is a single -% (= non-braced) control sequence, and the second isn't in case of a braced -% second argument. -% \end{TODO} -% \end{macro} -% \end{macro} -% -% -% \subsection{Interfacing with \textsf{keyval}} -% -% The \packagename{keyval} package passes the value via the one and only -% paramater |#1| to the definition part of the key macro. The following -% commands may be used to analyse the value. Note that we need at least version -% 1.10 of the \packagename{keyval} package. Note also that the package removes -% a naming conflict with AMS classes---reported by \lsthelper{Ralf~Quast} -% {1998/01/08}{\keywords conflicts with AMS classes}. -% \begingroup -% \begin{macrocode} -\RequirePackage{keyval}[1997/11/10] -% \end{macrocode} -% \endgroup -% -% \begin{macro}{\lstKV@TwoArg} -% \begin{macro}{\lstKV@ThreeArg} -% \begin{macro}{\lstKV@FourArg} -% Define temporary macros and call with given arguments |#1|. We add empty -% arguments for the case that the user doesn't provide enough. -% \begin{macrocode} -\def\lstKV@TwoArg#1#2{\gdef\@gtempa##1##2{#2}\@gtempa#1{}{}} -\def\lstKV@ThreeArg#1#2{\gdef\@gtempa##1##2##3{#2}\@gtempa#1{}{}{}} -\def\lstKV@FourArg#1#2{\gdef\@gtempa##1##2##3##4{#2}\@gtempa#1{}{}{}{}} -% \end{macrocode} -% There's one question: What are the global definitions good for? |\lst@Key| -% might set |\globaldefs| to one and possibly calls this macro. That's the -% reason why we use global definitions here and below. -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lstKV@OptArg} -% We define the temporary macro |\@gtempa| and insert default argument if -% necessary. -% \begin{macrocode} -\def\lstKV@OptArg[#1]#2#3{% - \gdef\@gtempa[##1]##2{#3}\lstKV@OptArg@{#1}#2\@} -\def\lstKV@OptArg@#1{\@ifnextchar[\lstKV@OptArg@@{\lstKV@OptArg@@[#1]}} -\def\lstKV@OptArg@@[#1]#2\@{\@gtempa[#1]{#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstKV@XOptArg} -% Here |#3| is already a definition with at least two parameters whose first -% is enclosed in brackets. -% \begin{macrocode} -\def\lstKV@XOptArg[#1]#2#3{% - \global\let\@gtempa#3\lstKV@OptArg@{#1}#2\@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstKV@CSTwoArg} -% Just define temporary macro and call it. -% \begin{macrocode} -\def\lstKV@CSTwoArg#1#2{% - \gdef\@gtempa##1,##2,##3\relax{#2}% - \@gtempa#1,,\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstKV@SetIf} -% We simply test the lower case first character of |#1|. -% \begin{macrocode} -\def\lstKV@SetIf#1{\lstKV@SetIf@#1\relax} -\def\lstKV@SetIf@#1#2\relax#3{\lowercase{% - \expandafter\let\expandafter#3% - \csname if\ifx #1t}true\else false\fi\endcsname} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstKV@SwitchCases} -% is implemented as a substring test. -% \begin{macrocode} -\def\lstKV@SwitchCases#1#2#3{% - \def\lst@temp##1\\#1&##2\\##3##4\@nil{% - \ifx\@empty##3% - #3% - \else - ##2% - \fi - }% - \lst@temp\\#2\\#1&\\\@empty\@nil} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstset} -% Finally this main user interface macro. -% We change catcodes for reading the argument. -% \begin{macrocode} -\lst@UserCommand\lstset{\begingroup \lst@setcatcodes \lstset@} -\def\lstset@#1{\endgroup \ifx\@empty#1\@empty\else\setkeys{lst}{#1}\fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@setcatcodes} -% contains all catcode changes for |\lstset|. The equal-sign has been added -% after a bug report by \lsthelper{Bekir~Karaoglu}{2003/09/16}{keyval problems -% with [turkish]{babel}}---babel's active equal sign clashes with keyval's -% usage. |\catcode`\"=12\relax| has been removed after a bug report by -% \lsthelper{Heiko~Bauke}{2004/06/27}{listings und ngerman}\,---\,hopefully -% this introduces no other bugs. -% \begin{macrocode} -\def\lst@setcatcodes{\makeatletter \catcode`\==12\relax} -% \end{macrocode} -% \begin{TODO} -% Change more catcodes? -% \end{TODO} -% \end{macro} -% -% -% \subsection{Internal modes} -% -% \begin{macro}{\lst@NewMode} -% We simply use |\chardef| for a mode definition. The counter |\lst@mode| -% mainly keeps the current mode number. But it is also used to advance the -% number in the macro |\lst@newmode|---we don't waste another counter. -% \begin{macrocode} -\def\lst@NewMode#1{% - \ifx\@undefined#1% - \lst@mode\lst@newmode\relax \advance\lst@mode\@ne - \xdef\lst@newmode{\the\lst@mode}% - \global\chardef#1=\lst@mode - \lst@mode\lst@nomode - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@mode} -% \begin{macro}{\lst@nomode} -% We allocate the counter and the first mode. -% \begin{macrocode} -\newcount\lst@mode -\def\lst@newmode{\m@ne}% init -\lst@NewMode\lst@nomode % init (of \lst@mode :-) -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@UseDynamicMode} -% For dynamic modes we must not use the counter |\lst@mode| (since possibly -% already valued). |\lst@dynamicmode| substitutes |\lst@newmode| and is a local -% definition here, \ldots -% \begin{macrocode} -\def\lst@UseDynamicMode{% - \@tempcnta\lst@dynamicmode\relax \advance\@tempcnta\@ne - \edef\lst@dynamicmode{\the\@tempcnta}% - \expandafter\lst@Swap\expandafter{\expandafter{\lst@dynamicmode}}} -% \end{macrocode} -% \ldots\ initialized each listing with the current `value' of |\lst@newmode|. -% \begin{macrocode} -\lst@AddToHook{InitVars}{\let\lst@dynamicmode\lst@newmode} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EnterMode} -% Each mode opens a group level, stores the mode number and execute mode -% specific tokens. Moreover we keep all these changes in mind (locally) and -% adjust internal variables if the user wants it. -% \begin{macrocode} -\def\lst@EnterMode#1#2{% - \bgroup \lst@mode=#1\relax #2% - \lst@FontAdjust - \lst@lAddTo\lst@entermodes{\lst@EnterMode{#1}{#2}}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{InitVars}{\let\lst@entermodes\@empty} -\let\lst@entermodes\@empty % init -% \end{macrocode} -% The initialization has been added after a bug report from -% \lsthelper{Herfried~Karl~Wagner}{2002/05/11}{undefined control sequence -% \lst@entermodes}. -% \end{macro} -% -% \begin{macro}{\lst@LeaveMode} -% We simply close the group and call |\lsthk@EndGroup| if and only if the -% current mode is not |\lst@nomode|. -% \begin{macrocode} -\def\lst@LeaveMode{% - \ifnum\lst@mode=\lst@nomode\else - \egroup \expandafter\lsthk@EndGroup - \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{EndGroup}{}% init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@InterruptModes} -% We put the current mode sequence on a stack and leave all modes. -% \begin{macrocode} -\def\lst@InterruptModes{% - \lst@Extend\lst@modestack{\expandafter{\lst@entermodes}}% - \lst@LeaveAllModes} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{InitVars}{\global\let\lst@modestack\@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ReenterModes} -% If the stack is not empty, we leave all modes and pop the topmost element -% (which is the last element of |\lst@modestack|). -% \begin{macrocode} -\def\lst@ReenterModes{% - \ifx\lst@modestack\@empty\else - \lst@LeaveAllModes - \global\let\@gtempa\lst@modestack - \global\let\lst@modestack\@empty - \expandafter\lst@ReenterModes@\@gtempa\relax - \fi} -\def\lst@ReenterModes@#1#2{% - \ifx\relax#2\@empty -% \end{macrocode} -% If we've reached |\relax|, we've also found the last element: we execute |#1| -% and gobble |{#2}|=|{\relax}| after |\fi|. -% \begin{macrocode} - \gdef\@gtempa##1{#1}% - \expandafter\@gtempa - \else -% \end{macrocode} -% Otherwise we just add the element to |\lst@modestack| and continue the loop. -% \begin{macrocode} - \lst@AddTo\lst@modestack{{#1}}% - \expandafter\lst@ReenterModes@ - \fi - {#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LeaveAllModes} -% Leaving all modes means closing groups until the mode equals |\lst@nomode|. -% \begin{macrocode} -\def\lst@LeaveAllModes{% - \ifnum\lst@mode=\lst@nomode - \expandafter\lsthk@EndGroup - \else - \expandafter\egroup\expandafter\lst@LeaveAllModes - \fi} -% \end{macrocode} -% We need that macro to end a listing correctly. -% \begin{macrocode} -\lst@AddToHook{ExitVars}{\lst@LeaveAllModes} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Pmode} -% \begin{macro}{\lst@GPmode} -% The `processing' and the general purpose mode. -% \begin{macrocode} -\lst@NewMode\lst@Pmode -\lst@NewMode\lst@GPmode -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@modetrue} -% The usual macro to value a boolean except that we also execute a hook. -% \begin{macrocode} -\def\lst@modetrue{\let\lst@ifmode\iftrue \lsthk@ModeTrue} -\let\lst@ifmode\iffalse % init -\lst@AddToHook{ModeTrue}{}% init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ifLmode} -% Comment lines use a static mode. It terminates at end of line. -% \begin{macrocode} -\def\lst@Lmodetrue{\let\lst@ifLmode\iftrue} -\let\lst@ifLmode\iffalse % init -\lst@AddToHook{EOL}{\@whilesw \lst@ifLmode\fi \lst@LeaveMode} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Divers helpers} -% -% \begin{macro}{\lst@NormedDef} -% works like |\def| (without any parameters!) but normalizes the replacement -% text by making all characters lower case and stripping off spaces. -% \begin{macrocode} -\def\lst@NormedDef#1#2{\lowercase{\edef#1{\zap@space#2 \@empty}}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@NormedNameDef} -% works like |\global\@namedef| (again without any parameters!) but normalizes -% both the macro name and the replacement text. -% \begin{macrocode} -\def\lst@NormedNameDef#1#2{% - \lowercase{\edef\lst@temp{\zap@space#1 \@empty}% - \expandafter\xdef\csname\lst@temp\endcsname{\zap@space#2 \@empty}}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@GetFreeMacro} -% Initialize |\@tempcnta| and |\lst@freemacro|, \ldots -% \begin{macrocode} -\def\lst@GetFreeMacro#1{% - \@tempcnta\z@ \def\lst@freemacro{#1\the\@tempcnta}% - \lst@GFM@} -% \end{macrocode} -% \ldots\space and either build the control sequence or advance the counter and -% continue. -% \begin{macrocode} -\def\lst@GFM@{% - \expandafter\ifx \csname\lst@freemacro\endcsname \relax - \edef\lst@freemacro{\csname\lst@freemacro\endcsname}% - \else - \advance\@tempcnta\@ne - \expandafter\lst@GFM@ - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@gtempboxa} -% \begin{macrocode} -\newbox\lst@gtempboxa -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \end{macro} -% -% -% \section{Doing output} -% -% -% \subsection{Basic registers and keys} -% -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% -% \paragraph{The current character string} -% is kept in a token register and a counter holds its length. -% Here we define the macros to put characters into the output queue. -% -% \begin{macro}{\lst@token} -% \begin{macro}{\lst@length} -% are allocated here. Quite a useful comment, isn't it? -% \begin{macrocode} -\newtoks\lst@token \newcount\lst@length -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@ResetToken} -% \begin{macro}{\lst@lastother} -% The two registers get empty respectively zero at the beginning of each line. -% After receiving a report from \lsthelper{Claus~Atzenbeck}{1999/11/24}{HTML: -% output unit repeated after >}---I removed such a bug many times---I decided -% to reset these registers in the \hookname{EndGroup} hook, too. -% \begin{macrocode} -\def\lst@ResetToken{\lst@token{}\lst@length\z@} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{InitVarsBOL}{\lst@ResetToken \let\lst@lastother\@empty} -\lst@AddToHook{EndGroup}{\lst@ResetToken \let\lst@lastother\@empty} -% \end{macrocode} -% The macro |\lst@lastother| will be equivalent to the last `other' character, -% which leads us to |\lst@ifletter|. -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@ifletter} -% indicates whether the token contains an identifier or other characters. -% \begin{macrocode} -\def\lst@lettertrue{\let\lst@ifletter\iftrue} -\def\lst@letterfalse{\let\lst@ifletter\iffalse} -\lst@AddToHook{InitVars}{\lst@letterfalse} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Append} -% puts the argument into the output queue. -% \begin{macrocode} -\def\lst@Append#1{\advance\lst@length\@ne - \lst@token=\expandafter{\the\lst@token#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@AppendOther} -% Depending on the current state, we first output the character string as an -% identifier. Then we save the `argument' via |\futurelet| and call the macro -% |\lst@Append| to do the rest. -% \begin{macrocode} -\def\lst@AppendOther{% - \lst@ifletter \lst@Output\lst@letterfalse \fi - \futurelet\lst@lastother\lst@Append} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@AppendLetter} -% We output a non-identifier string if necessary and call |\lst@Append|. -% \begin{macrocode} -\def\lst@AppendLetter{% - \lst@ifletter\else \lst@OutputOther\lst@lettertrue \fi - \lst@Append} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@SaveToken} -% \begin{macro}{\lst@RestoreToken} -% If a group end appears and ruins the character string, we can use these -% macros to save and restore the contents. |\lst@thestyle| is the current -% printing style and must be saved and restored, too. -% \begin{macrocode} -\def\lst@SaveToken{% - \global\let\lst@gthestyle\lst@thestyle - \global\let\lst@glastother\lst@lastother - \xdef\lst@RestoreToken{\noexpand\lst@token{\the\lst@token}% - \noexpand\lst@length\the\lst@length\relax - \noexpand\let\noexpand\lst@thestyle - \noexpand\lst@gthestyle - \noexpand\let\noexpand\lst@lastother - \noexpand\lst@glastother}} -% \end{macrocode} -% Now -- that means after a bug report by \lsthelper{Rolf~Niepraschk} -% {2002/04/12}{\RequirePackage is missing keywordstyle when near the top of -% a page} -- |\lst@lastother| is also saved and restored. -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@IfLastOtherOneOf} -% Finally, this obvious implementation. -% \begin{macrocode} -\def\lst@IfLastOtherOneOf#1{\lst@IfLastOtherOneOf@ #1\relax} -\def\lst@IfLastOtherOneOf@#1{% - \ifx #1\relax - \expandafter\@secondoftwo - \else - \ifx\lst@lastother#1% - \lst@IfLastOtherOneOf@t - \else - \expandafter\expandafter\expandafter\lst@IfLastOtherOneOf@ - \fi - \fi} -\def\lst@IfLastOtherOneOf@t#1\fi\fi#2\relax{\fi\fi\@firstoftwo} -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{The current position} -% is either the dimension |\lst@currlwidth|, which is the horizontal position -% without taking the current character string into account, or it's the current -% column starting with number 0. This is |\lst@column| $-$ |\lst@pos| $+$ -% |\lst@length|. Moreover we have |\lst@lostspace| which is the difference -% between the current and the desired line width. We define macros to insert -% this lost space. -% -% \begin{macro}{\lst@currlwidth} -% \begin{macro}{\lst@column} -% \begin{macro}{\lst@pos} -% the current line width and two counters. -% \begin{macrocode} -\newdimen\lst@currlwidth % \global -\newcount\lst@column \newcount\lst@pos % \global -\lst@AddToHook{InitVarsBOL} - {\global\lst@currlwidth\z@ \global\lst@pos\z@ \global\lst@column\z@} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@CalcColumn} -% sets |\@tempcnta| to the current column. -% Note that |\lst@pos| will be nonpositive. -% \begin{macrocode} -\def\lst@CalcColumn{% - \@tempcnta\lst@column - \advance\@tempcnta\lst@length - \advance\@tempcnta-\lst@pos} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@lostspace} -% Whenever this dimension is positive we can insert space. A negative `lost -% space' means that the printed line is wider than expected. -% \begin{macrocode} -\newdimen\lst@lostspace % \global -\lst@AddToHook{InitVarsBOL}{\global\lst@lostspace\z@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@UseLostSpace} -% We insert space and reset it if and only if |\lst@lostspace| is positive. -% \begin{macrocode} -\def\lst@UseLostSpace{\ifdim\lst@lostspace>\z@ \lst@InsertLostSpace \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@InsertLostSpace} -% \begin{macro}{\lst@InsertHalfLostSpace} -% Ditto, but insert even if negative. |\lst@Kern| will be defined very soon. -% \begin{macrocode} -\def\lst@InsertLostSpace{% - \lst@Kern\lst@lostspace \global\lst@lostspace\z@} -\def\lst@InsertHalfLostSpace{% - \global\lst@lostspace.5\lst@lostspace \lst@Kern\lst@lostspace} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \paragraph{Column widths} -% Here we deal with the width of a single column, which equals the width of a -% single character box. Keep in mind that there are fixed and flexible column -% formats. -% -% \begin{macro}{\lst@width} -% \begin{lstkey}{basewidth} -% \keyname{basewidth} assigns the values to macros and tests whether they are -% negative. -% \begin{macrocode} -\newdimen\lst@width -\lst@Key{basewidth}{0.6em,0.45em}{\lstKV@CSTwoArg{#1}% - {\def\lst@widthfixed{##1}\def\lst@widthflexible{##2}% - \ifx\lst@widthflexible\@empty - \let\lst@widthflexible\lst@widthfixed - \fi - \def\lst@temp{\PackageError{Listings}% - {Negative value(s) treated as zero}% - \@ehc}% - \let\lst@error\@empty - \ifdim \lst@widthfixed<\z@ - \let\lst@error\lst@temp \let\lst@widthfixed\z@ - \fi - \ifdim \lst@widthflexible<\z@ - \let\lst@error\lst@temp \let\lst@widthflexible\z@ - \fi - \lst@error}} -% \end{macrocode} -% We set the dimension in a special hook. -% \begin{macrocode} -\lst@AddToHook{FontAdjust} - {\lst@width=\lst@ifflexible\lst@widthflexible - \else\lst@widthfixed\fi \relax} -% \end{macrocode} -% \end{lstkey} -% \end{macro} -% -% \begin{lstkey}{fontadjust} -% \begin{macro}{\lst@FontAdjust} -% This hook is controlled by a switch and is always executed at -% \hookname{InitVars}. -% \begin{macrocode} -\lst@Key{fontadjust}{false}[t]{\lstKV@SetIf{#1}\lst@iffontadjust} -\def\lst@FontAdjust{\lst@iffontadjust \lsthk@FontAdjust \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{InitVars}{\lsthk@FontAdjust} -% \end{macrocode} -% \end{macro} -% \end{lstkey} -% -% -% \subsection{Low- and mid-level output} -% -% \paragraph{Doing the output} -% means putting the character string into a box register, updating all internal -% data, and eventually giving the box to \TeX. -% -% \begin{macro}{\lst@OutputBox} -% \begin{macro}{\lst@alloverstyle} -% The lowest level is the output of a box register. -% Here we use |\box#1| as argument to |\lst@alloverstyle|. -% \begin{macrocode} -\def\lst@OutputBox#1{\lst@alloverstyle{\box#1}} -% \end{macrocode} -% \begin{ALTERNATIVE} -% Instead of |\global\advance\lst@currlwidth| |\wd|\meta{box number} in -% both definitions |\lst@Kern| and |\lst@CalcLostSpaceAndOutput|, we could -% also advance the dimension here. But I decided not to do so since it -% simplifies possible redefinitions of |\lst@OutputBox|: we need not to care -% about |\lst@currlwidth|. -% \end{ALTERNATIVE} -% \begin{macrocode} -\def\lst@alloverstyle#1{#1}% init -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@Kern} -% has been used to insert `lost space'. -% It must not use |\@tempboxa| since that \ldots -% \begin{macrocode} -\def\lst@Kern#1{% - \setbox\z@\hbox{{\lst@currstyle{\kern#1}}}% - \global\advance\lst@currlwidth \wd\z@ - \lst@OutputBox\z@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CalcLostSpaceAndOutput} -% \ldots\space is used here. -% We keep track of |\lst@lostspace|, |\lst@currlwidth| and |\lst@pos|. -% \begin{macrocode} -\def\lst@CalcLostSpaceAndOutput{% - \global\advance\lst@lostspace \lst@length\lst@width - \global\advance\lst@lostspace-\wd\@tempboxa - \global\advance\lst@currlwidth \wd\@tempboxa - \global\advance\lst@pos -\lst@length -% \end{macrocode} -% Before |\@tempboxa| is output, we insert space if there is enough lost space. -% This possibly invokes |\lst@Kern| via `insert half lost space', which is the -% reason for why we mustn't use |\@tempboxa| above. By redefinition we prevent -% |\lst@OutputBox| from using any special style in |\lst@Kern|. -% \begin{macrocode} - \setbox\@tempboxa\hbox{\let\lst@OutputBox\box - \ifdim\lst@lostspace>\z@ \lst@leftinsert \fi - \box\@tempboxa - \ifdim\lst@lostspace>\z@ \lst@rightinsert \fi}% -% \end{macrocode} -% Finally we can output the new box. -% \begin{macrocode} - \lst@OutputBox\@tempboxa \lsthk@PostOutput} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{PostOutput}{}% init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@OutputToken} -% Now comes a mid-level definition. -% Here we use |\lst@token| to set |\@tempboxa| and eventually output the box. -% We take care of font adjustment and special output styles. -% Yet unknown macros are defined in the following subsections. -% \begin{macrocode} -\def\lst@OutputToken{% - \lst@TrackNewLines \lst@OutputLostSpace - \lst@ifgobbledws - \lst@gobbledwhitespacefalse - \lst@@discretionary - \fi - \lst@CheckMerge - {\lst@thestyle{\lst@FontAdjust - \setbox\@tempboxa\lst@hbox - {\lsthk@OutputBox - \lst@lefthss - \expandafter\lst@FillOutputBox\the\lst@token\@empty - \lst@righthss}% - \lst@CalcLostSpaceAndOutput}}% - \lst@ResetToken} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{OutputBox}{}% init -% \end{macrocode} -% \begin{macrocode} -\def\lst@gobbledwhitespacetrue{\global\let\lst@ifgobbledws\iftrue} -\def\lst@gobbledwhitespacefalse{\global\let\lst@ifgobbledws\iffalse} -\lst@AddToHookExe{InitBOL}{\lst@gobbledwhitespacefalse}% init -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{Delaying the output} -% means saving the character string somewhere and pushing it back when -% neccessary. We may also attach the string to the next output box without -% affecting style detection: both will be printed in the style of the upcoming -% output. We will call this `merging'. -% -% \begin{macro}{\lst@Delay} -% \begin{macro}{\lst@Merge} -% To delay or merge |#1|, we process it as usual and simply save the state -% in macros. For delayed characters we also need the currently `active' -% output routine. Both definitions first check whether there are already -% delayed or `merged' characters. -% \begin{macrocode} -\def\lst@Delay#1{% - \lst@CheckDelay - #1% - \lst@GetOutputMacro\lst@delayedoutput - \edef\lst@delayed{\the\lst@token}% - \edef\lst@delayedlength{\the\lst@length}% - \lst@ResetToken} -% \end{macrocode} -% \begin{macrocode} -\def\lst@Merge#1{% - \lst@CheckMerge - #1% - \edef\lst@merged{\the\lst@token}% - \edef\lst@mergedlength{\the\lst@length}% - \lst@ResetToken} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@MergeToken} -% Here we put the things together again. -% \begin{macrocode} -\def\lst@MergeToken#1#2{% - \advance\lst@length#2% - \lst@lExtend#1{\the\lst@token}% - \expandafter\lst@token\expandafter{#1}% - \let#1\@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CheckDelay} -% We need to print delayed characters. The mode depends on the current output -% macro. If it equals the saved definition, we put the delayed characters in -% front of the character string (we merge them) since there has been no -% letter-to-other or other-to-letter leap. Otherwise we locally reset the -% current character string, merge this empty string with the delayed one, -% and output it. -% \begin{macrocode} -\def\lst@CheckDelay{% - \ifx\lst@delayed\@empty\else - \lst@GetOutputMacro\@gtempa - \ifx\lst@delayedoutput\@gtempa - \lst@MergeToken\lst@delayed\lst@delayedlength - \else - {\lst@ResetToken - \lst@MergeToken\lst@delayed\lst@delayedlength - \lst@delayedoutput}% - \let\lst@delayed\@empty - \fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CheckMerge} -% All this is easier for |\lst@merged|. -% \begin{macrocode} -\def\lst@CheckMerge{% - \ifx\lst@merged\@empty\else - \lst@MergeToken\lst@merged\lst@mergedlength - \fi} -% \end{macrocode} -% \begin{macrocode} -\let\lst@delayed\@empty % init -\let\lst@merged\@empty % init -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Column formats} -% -% It's time to deal with fixed and flexible column modes. -% A couple of open definitions are now filled in. -% -% \begin{macro}{\lst@column@fixed} -% switches to the fixed column format. The definitions here control how the -% output of the above definitions looks like. -% \begin{macrocode} -\def\lst@column@fixed{% - \lst@flexiblefalse - \lst@width\lst@widthfixed\relax - \let\lst@OutputLostSpace\lst@UseLostSpace - \let\lst@FillOutputBox\lst@FillFixed - \let\lst@hss\hss - \def\lst@hbox{\hbox to\lst@length\lst@width}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@FillFixed} -% Filling up a fixed mode box is easy. -% \begin{macrocode} -\def\lst@FillFixed#1{#1\lst@FillFixed@} -% \end{macrocode} -% While not reaching the end (|\@empty| from above), we insert dynamic space, -% output the argument and call the submacro again. -% \begin{macrocode} -\def\lst@FillFixed@#1{% - \ifx\@empty#1\else \lst@hss#1\expandafter\lst@FillFixed@ \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@column@flexible} -% The first flexible format. -% \begin{macrocode} -\def\lst@column@flexible{% - \lst@flexibletrue - \lst@width\lst@widthflexible\relax - \let\lst@OutputLostSpace\lst@UseLostSpace - \let\lst@FillOutputBox\@empty - \let\lst@hss\@empty - \let\lst@hbox\hbox} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@column@fullflexible} -% This column format inserts no lost space except at the beginning of a line. -% \begin{macrocode} -\def\lst@column@fullflexible{% - \lst@column@flexible - \def\lst@OutputLostSpace{\lst@ifnewline \lst@UseLostSpace\fi}% - \let\lst@leftinsert\@empty - \let\lst@rightinsert\@empty} -% \end{macrocode} -% \end{macro} -% -% So far the column formats. Now we define macros to use them. -% -% \begin{macro}{\lst@outputpos} -% This macro sets the `output-box-positioning' parameter (the old key -% \keyname{outputpos}). We test for |l|, |c| and |r|. -% The fixed formats use |\lst@lefthss| and |\lst@righthss|, whereas the -% flexibles need |\lst@leftinsert| and |\lst@rightinsert|. -% \begin{macrocode} -\def\lst@outputpos#1#2\relax{% - \def\lst@lefthss{\lst@hss}\let\lst@righthss\lst@lefthss - \let\lst@rightinsert\lst@InsertLostSpace - \ifx #1c% - \let\lst@leftinsert\lst@InsertHalfLostSpace - \else\ifx #1r% - \let\lst@righthss\@empty - \let\lst@leftinsert\lst@InsertLostSpace - \let\lst@rightinsert\@empty - \else - \let\lst@lefthss\@empty - \let\lst@leftinsert\@empty - \ifx #1l\else \PackageWarning{Listings}% - {Unknown positioning for output boxes}% - \fi - \fi\fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ifflexible} -% indicates the column mode but does not distinguish between different fixed -% or flexible modes. -% \begin{macrocode} -\def\lst@flexibletrue{\let\lst@ifflexible\iftrue} -\def\lst@flexiblefalse{\let\lst@ifflexible\iffalse} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{columns} -% This is done here: check optional parameter and then build the control -% sequence of the column format. -% \begin{macrocode} -\lst@Key{columns}{[c]fixed}{\lstKV@OptArg[]{#1}{% - \ifx\@empty##1\@empty\else \lst@outputpos##1\relax\relax \fi - \expandafter\let\expandafter\lst@arg - \csname\@lst @column@##2\endcsname -% \end{macrocode} -% We issue a warning or save the definition for later. -% \begin{macrocode} - \lst@arg - \ifx\lst@arg\relax - \PackageWarning{Listings}{Unknown column format `##2'}% - \else - \lst@ifflexible - \let\lst@columnsflexible\lst@arg - \else - \let\lst@columnsfixed\lst@arg - \fi - \fi}} -% \end{macrocode} -% \begin{macrocode} -\let\lst@columnsfixed\lst@column@fixed % init -\let\lst@columnsflexible\lst@column@flexible % init -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{flexiblecolumns} -% Nothing else but a key to switch between the last flexible and fixed mode. -% \begin{macrocode} -\lst@Key{flexiblecolumns}\relax[t]{% - \lstKV@SetIf{#1}\lst@ifflexible - \lst@ifflexible \lst@columnsflexible - \else \lst@columnsfixed \fi} -% \end{macrocode} -% \end{lstkey} -% -% -% \subsection{New lines} -% -% \begin{macro}{\lst@newlines} -% This counter holds the number of `new lines' (cr+lf) we have to perform. -% \begin{macrocode} -\newcount\lst@newlines -\lst@AddToHook{InitVars}{\global\lst@newlines\z@} -\lst@AddToHook{InitVarsBOL}{\global\advance\lst@newlines\@ne} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@NewLine} -% This is how we start a new line: begin new paragraph and output an empty -% box. If low-level definition |\lst@OutputBox| just gobbles the box , we -% don't start a new line. This is used to drop the whole output. -% \begin{macrocode} -\def\lst@NewLine{% - \ifx\lst@OutputBox\@gobble\else - \par\noindent \hbox{}% - \fi - \global\advance\lst@newlines\m@ne - \lst@newlinetrue} -% \end{macrocode} -% Define |\lst@newlinetrue| and reset if after output. -% \begin{macrocode} -\def\lst@newlinetrue{\global\let\lst@ifnewline\iftrue} -\lst@AddToHookExe{PostOutput}{\global\let\lst@ifnewline\iffalse}% init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@TrackNewLines} -% If |\lst@newlines| is positive, we execute the hook and insert the -% new lines. -% \begin{macrocode} -\def\lst@TrackNewLines{% - \ifnum\lst@newlines>\z@ - \lsthk@OnNewLine - \lst@DoNewLines - \fi} -\lst@AddToHook{OnNewLine}{}% init -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{emptylines} -% \lsthelper{Adam~Prugel-Bennett}{2001/02/19}{spacing of empty lines} asked for -% such a key---if I didn't misunderstood him. We check for the optional star -% and set |\lst@maxempty| and switch. -% \begin{macrocode} -\lst@Key{emptylines}\maxdimen{% - \@ifstar{\lst@true\@tempcnta\@gobble#1\relax\lst@GobbleNil}% - {\lst@false\@tempcnta#1\relax\lst@GobbleNil}#1\@nil - \advance\@tempcnta\@ne - \edef\lst@maxempty{\the\@tempcnta\relax}% - \let\lst@ifpreservenumber\lst@if} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@DoNewLines} -% First we take care of |\lst@maxempty| and then of the remaining empty lines. -% \begin{macrocode} -\def\lst@DoNewLines{ - \@whilenum\lst@newlines>\lst@maxempty \do - {\lst@ifpreservenumber - \lsthk@OnEmptyLine - \global\advance\c@lstnumber\lst@advancelstnum - \fi - \global\advance\lst@newlines\m@ne}% - \@whilenum \lst@newlines>\@ne \do - {\lsthk@OnEmptyLine \lst@NewLine}% - \ifnum\lst@newlines>\z@ \lst@NewLine \fi} -\lst@AddToHook{OnEmptyLine}{}% init -% \end{macrocode} -% \end{macro} -% -% -% \subsection{High-level output} -% -% \begin{lstkey}{identifierstyle} -% A simple key. -% \begin{macrocode} -\lst@Key{identifierstyle}{}{\def\lst@identifierstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@GotoTabStop} -% Here we look whether the line already contains printed characters. -% If true, we output a box with the width of a blank space. -% \begin{macrocode} -\def\lst@GotoTabStop{% - \ifnum\lst@newlines=\z@ - \setbox\@tempboxa\hbox{\lst@outputspace}% - \setbox\@tempboxa\hbox to\wd\@tempboxa{{\lst@currstyle{\hss}}}% - \lst@CalcLostSpaceAndOutput -% \end{macrocode} -% It's probably not clear why it is sufficient to output a single space to go -% to the next tabulator stop. Just note that the space lost by this process is -% `lost space' in the sense above and therefore will be inserted before the -% next characters are output. -% \begin{macrocode} - \else -% \end{macrocode} -% Otherwise (no printed characters) we only need to advance |\lst@lostspace|, -% which is inserted by |\lst@OutputToken| above, and update the column. -% \begin{macrocode} - \global\advance\lst@lostspace \lst@length\lst@width - \global\advance\lst@column\lst@length \lst@length\z@ - \fi} -% \end{macrocode} -% Note that this version works also in flexible column mode. -% In fact, it's mainly the flexible version of \packagename{listings} 0.20. -% \begin{TODO} -% Use |\lst@ifnewline| instead of |\ifnum\lst@newlines=\z@|? -% \end{TODO} -% \end{macro} -% -% \begin{macro}{\lst@OutputOther} -% becomes easy with the previous definitions. -% \begin{macrocode} -\def\lst@OutputOther{% - \lst@CheckDelay - \ifnum\lst@length=\z@\else - \let\lst@thestyle\lst@currstyle - \lsthk@OutputOther - \lst@OutputToken - \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{OutputOther}{}% init -\let\lst@currstyle\relax % init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Output} -% We might use identifier style as default. -% \begin{macrocode} -\def\lst@Output{% - \lst@CheckDelay - \ifnum\lst@length=\z@\else - \ifx\lst@currstyle\relax - \let\lst@thestyle\lst@identifierstyle - \else - \let\lst@thestyle\lst@currstyle - \fi - \lsthk@Output - \lst@OutputToken - \fi - \let\lst@lastother\relax} -% \end{macrocode} -% Note that |\lst@lastother| becomes equivalent to |\relax| and not equivalent -% to |\@empty| as everywhere else. I don't know whether this will be important -% in the future or not. -% \begin{macrocode} -\lst@AddToHook{Output}{}% init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@GetOutputMacro} -% Just saves the output macro to be used. -% \begin{macrocode} -\def\lst@GetOutputMacro#1{% - \lst@ifletter \global\let#1\lst@Output - \else \global\let#1\lst@OutputOther\fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@PrintToken} -% outputs the current character string in letter or nonletter mode. -% \begin{macrocode} -\def\lst@PrintToken{% - \lst@ifletter \lst@Output \lst@letterfalse - \else \lst@OutputOther \let\lst@lastother\@empty \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@XPrintToken} -% is a special definition to print also merged characters. -% \begin{macrocode} -\def\lst@XPrintToken{% - \lst@PrintToken \lst@CheckMerge - \ifnum\lst@length=\z@\else \lst@PrintToken \fi} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Dropping the whole output} -% -% \begin{macro}{\lst@BeginDropOutput} -% It's sometimes useful to process a part of a listing as usual, but to drop -% the output. This macro does the main work and gets one argument, namely the -% internal mode it enters. We save |\lst@newlines|, restore it |\aftergroup| -% and redefine one macro, namely |\lst@OutputBox|. After a bug report from -% \lsthelper{Gunther~Schmidl}{2002/02/27}{collapsing empty lines don't work -% with printpod=false} -% \begin{macrocode} -\def\lst@BeginDropOutput#1{% - \xdef\lst@BDOnewlines{\the\lst@newlines}% - \global\let\lst@BDOifnewline\lst@ifnewline - \lst@EnterMode{#1}% - {\lst@modetrue - \let\lst@OutputBox\@gobble - \aftergroup\lst@BDORestore}} -% \end{macrocode} -% Restoring the date is quite easy: -% \begin{macrocode} -\def\lst@BDORestore{% - \global\lst@newlines\lst@BDOnewlines - \global\let\lst@ifnewline\lst@BDOifnewline} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EndDropOutput} -% is equivalent to |\lst@LeaveMode|. -% \begin{macrocode} -\let\lst@EndDropOutput\lst@LeaveMode -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Writing to an external file} -% -% \begin{aspect}{writefile} -% Now it would be good to know something about character classes since we need -% to access the true input characters, for example a tabulator and not the -% spaces it `expands' to. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{writefile} -% \end{macrocode} -% -% \begin{macro}{\lst@WF} -% \begin{macro}{\lst@WFtoken} -% The contents of the token will be written to file. -% \begin{macrocode} -\newtoks\lst@WFtoken % global -\lst@AddToHook{InitVarsBOL}{\global\lst@WFtoken{}} -% \end{macrocode} -% \begin{macrocode} -\newwrite\lst@WF -\global\let\lst@WFifopen\iffalse % init -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@WFWriteToFile} -% To do this, we have to expand the contents and then expand this via |\edef|. -% Empty |\lst@UM| ensures that special characters (underscore, dollar, etc.) -% are written correctly. -% \begin{macrocode} -\gdef\lst@WFWriteToFile{% - \begingroup - \let\lst@UM\@empty - \expandafter\edef\expandafter\lst@temp\expandafter{\the\lst@WFtoken}% - \immediate\write\lst@WF{\lst@temp}% - \endgroup - \global\lst@WFtoken{}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@WFAppend} -% Similar to |\lst@Append| but uses |\lst@WFtoken|. -% \begin{macrocode} -\gdef\lst@WFAppend#1{% - \global\lst@WFtoken=\expandafter{\the\lst@WFtoken#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@BeginWriteFile} -% \begin{macro}{\lst@BeginAlsoWriteFile} -% use different macros for |\lst@OutputBox| (not) to drop the output. -% \begin{macrocode} -\gdef\lst@BeginWriteFile{\lst@WFBegin\@gobble} -\gdef\lst@BeginAlsoWriteFile{\lst@WFBegin\lst@OutputBox} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@WFBegin} -% Here \ldots -% \begin{macrocode} -\begingroup \catcode`\^^I=11 -\gdef\lst@WFBegin#1#2{% - \begingroup - \let\lst@OutputBox#1% -% \end{macrocode} -% \ldots\space we have to update |\lst@WFtoken| and \ldots -% \begin{macrocode} - \def\lst@Append##1{% - \advance\lst@length\@ne - \expandafter\lst@token\expandafter{\the\lst@token##1}% - \ifx ##1\lst@outputspace \else - \lst@WFAppend##1% - \fi}% - \lst@lAddTo\lst@PreGotoTabStop{\lst@WFAppend{^^I}}% - \lst@lAddTo\lst@ProcessSpace{\lst@WFAppend{ }}% -% \end{macrocode} -% \ldots\space need different `EOL' and `DeInit' definitions to write the -% token register to file. -% \begin{macrocode} - \let\lst@DeInit\lst@WFDeInit - \let\lst@MProcessListing\lst@WFMProcessListing -% \end{macrocode} -% Finally we open the file if necessary. -% \begin{macrocode} - \lst@WFifopen\else - \immediate\openout\lst@WF=#2\relax - \global\let\lst@WFifopen\iftrue - \@gobbletwo\fi\fi - \fi} -\endgroup -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EndWriteFile} -% closes the file and restores original definitions. -% \begin{macrocode} -\gdef\lst@EndWriteFile{% - \immediate\closeout\lst@WF \endgroup - \global\let\lst@WFifopen\iffalse} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@WFMProcessListing} -% \begin{macro}{\lst@WFDeInit} -% write additionally |\lst@WFtoken| to external file. -% \begin{macrocode} -\global\let\lst@WFMProcessListing\lst@MProcessListing -\global\let\lst@WFDeInit\lst@DeInit -\lst@AddToAtTop\lst@WFMProcessListing{\lst@WFWriteToFile} -\lst@AddToAtTop\lst@WFDeInit{% - \ifnum\lst@length=\z@\else \lst@WFWriteToFile \fi} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \section{Character classes}\label{iCharacterClasses} -% -% In this section, we define how the basic character classes do behave, before -% turning over to the selection of character tables and how to specialize -% characters. -% -% -% \subsection{Letters, digits and others} -% -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% -% \begin{macro}{\lst@ProcessLetter} -% We put the letter, which is not a whitespace, into the output queue. -% \begin{macrocode} -\def\lst@ProcessLetter{\lst@whitespacefalse \lst@AppendLetter} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ProcessOther} -% Ditto. -% \begin{macrocode} -\def\lst@ProcessOther{\lst@whitespacefalse \lst@AppendOther} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ProcessDigit} -% A digit appends the character to the current character string. But we must -% use the right macro. This allows digits to be part of an identifier or -% a numerical constant. -% \begin{macrocode} -\def\lst@ProcessDigit{% - \lst@whitespacefalse - \lst@ifletter \expandafter\lst@AppendLetter - \else \expandafter\lst@AppendOther\fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ifwhitespace} -% indicates whether the last processed character has been white space. -% \begin{macrocode} -\def\lst@whitespacetrue{\global\let\lst@ifwhitespace\iftrue} -\def\lst@whitespacefalse{\global\let\lst@ifwhitespace\iffalse} -\lst@AddToHook{InitVarsBOL}{\lst@whitespacetrue} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Whitespaces} -% -% Here we have to take care of two things: dropping empty lines at the end of -% a listing and the different column formats. Both use |\lst@lostspace|. Lines -% containing only tabulators and spaces should be viewed as empty. In order to -% achieve this, tabulators and spaces at the beginning of a line don't output -% any characters but advance |\lst@lostspace|. Whenever this dimension is -% positive we insert that space before the character string is output. Thus, -% if there are only tabulators and spaces, the line is `empty' since we -% haven't done any output. -% -% We have to do more for flexible columns. Whitespaces can fix the column -% alignment: if the real line is wider than expected, a tabulator is at least -% one space wide; all remaining space fixes the alignment. If there are two or -% more space characters, at least one is printed; the others fix the column -% alignment. -% -% -% \paragraph{Tabulators} -% are processed in three stages. You have already seen the last stage -% |\lst@GotoTabStop|. The other two calculate the necessary width and take care -% of visible tabulators and spaces. -% -% \begin{lstkey}{tabsize} -% We check for a legal argument before saving it. Default tabsize is 8 as -% proposed by \lsthelper{Rolf~Niepraschk}{1997/04/24}{tabsize=8}. -% \begin{macrocode} -\lst@Key{tabsize}{8} - {\ifnum#1>\z@ \def\lst@tabsize{#1}\else - \PackageError{Listings}{Strict positive integer expected}% - {You can't use `#1' as tabsize. \@ehc}% - \fi} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{showtabs} -% \begin{lstkey}{tab} -% Two more user keys for tab control. -% \begin{macrocode} -\lst@Key{showtabs}f[t]{\lstKV@SetIf{#1}\lst@ifshowtabs} -\lst@Key{tab}{\kern.06em\hbox{\vrule\@height.3ex}% - \hrulefill\hbox{\vrule\@height.3ex}} - {\def\lst@tab{#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@ProcessTabulator} -% A tabulator outputs the preceding characters, which decrements |\lst@pos| by -% the number of printed characters. -% \begin{macrocode} -\def\lst@ProcessTabulator{% - \lst@XPrintToken \lst@whitespacetrue -% \end{macrocode} -% Then we calculate how many columns we need to reach the next tabulator stop: -% we add |\lst@tabsize| until |\lst@pos| is strict positive. In other words, -% |\lst@pos| is the column modulo |tabsize| and we're looking for a positive -% representative. We assign it to |\lst@length| and reset |\lst@pos| in the -% submacro. -% \begin{macrocode} - \global\advance\lst@column -\lst@pos - \@whilenum \lst@pos<\@ne \do - {\global\advance\lst@pos\lst@tabsize}% - \lst@length\lst@pos - \lst@PreGotoTabStop} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@PreGotoTabStop} -% Visible tabs print |\lst@tab|. -% \begin{macrocode} -\def\lst@PreGotoTabStop{% - \lst@ifshowtabs - \lst@TrackNewLines - \setbox\@tempboxa\hbox to\lst@length\lst@width - {{\lst@currstyle{\hss\lst@tab}}}% - \lst@CalcLostSpaceAndOutput - \else -% \end{macrocode} -% If we are advised to keep spaces, we insert the correct number of them. -% \begin{macrocode} - \lst@ifkeepspaces - \@tempcnta\lst@length \lst@length\z@ - \@whilenum \@tempcnta>\z@ \do - {\lst@AppendOther\lst@outputspace - \advance\@tempcnta\m@ne}% - \lst@OutputOther - \else - \lst@GotoTabStop - \fi - \fi - \lst@length\z@ \global\lst@pos\z@} -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{Spaces} -% are implemented as described at the beginning of this subsection. But first -% we define some user keys. -% -% \begin{macro}{\lst@outputspace} -% \begin{macro}{\lst@visiblespace} -% The first macro is a default definition, \ldots -% \begin{macrocode} -\def\lst@outputspace{\ } -\def\lst@visiblespace{\lst@ttfamily{\char32}\textvisiblespace} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{lstkey}{showspaces} -% \begin{lstkey}{keepspaces} -% \ldots\space which is modified on user's request. -% \begin{macrocode} -\lst@Key{showspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifshowspaces} -\lst@Key{keepspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifkeepspaces} -\lst@AddToHook{Init} - {\lst@ifshowspaces - \let\lst@outputspace\lst@visiblespace - \lst@keepspacestrue - \fi} -\def\lst@keepspacestrue{\let\lst@ifkeepspaces\iftrue} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@ProcessSpace} -% We look whether spaces fix the column alignment or not. In the latter case -% we append a space; otherwise \ldots -% \begin{macrocode} -\def\lst@ProcessSpace{% - \lst@ifkeepspaces - \lst@whitespacetrue - \lst@PrintToken - \lst@AppendOther\lst@outputspace - \lst@PrintToken - \else \ifnum\lst@newlines=\z@ -% \end{macrocode} -% \ldots\space we append a `special space' if the line isn't empty. -% \begin{macrocode} - \lst@AppendSpecialSpace - \else \ifnum\lst@length=\z@ -% \end{macrocode} -% If the line is empty, we check whether there are characters in the output -% queue. If there are no characters we just advance |\lst@lostspace|. -% Otherwise we append the space. -% \begin{macrocode} - \global\advance\lst@lostspace\lst@width - \global\advance\lst@pos\m@ne - \lst@whitespacetrue - \else - \lst@AppendSpecialSpace - \fi - \fi \fi} -% \end{macrocode} -% Note that this version works for fixed and flexible column output. -% \end{macro} -% -% \begin{macro}{\lst@AppendSpecialSpace} -% If there are at least two white spaces, we output preceding characters and -% advance |\lst@lostspace| to avoid alignment problems. Otherwise we append -% a space to the current character string. -% \begin{macrocode} -\def\lst@AppendSpecialSpace{% - \lst@ifwhitespace - \lst@PrintToken - \global\advance\lst@lostspace\lst@width - \global\advance\lst@pos\m@ne - \lst@gobbledwhitespacetrue - \else - \lst@whitespacetrue - \lst@PrintToken - \lst@AppendOther\lst@outputspace - \lst@PrintToken - \fi} -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{Form feeds} -% has been introduced after communication with -% \lsthelper{Jan~Braun}{1998/04/27}{formfeed}. -% -% \begin{lstkey}{formfeed} -% let the user make adjustments. -% \begin{macrocode} -\lst@Key{formfeed}{\bigbreak}{\def\lst@formfeed{#1}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@ProcessFormFeed} -% Here we execute some macros according to whether a new line has already -% begun or not. No |\lst@EOLUpdate| is used in the else branch -% anymore---\lsthelper{Kalle~Tuulos}{2001/01/14}{form feed gobbles following -% output unit} sent the bug report. -% \begin{macrocode} -\def\lst@ProcessFormFeed{% - \lst@XPrintToken - \ifnum\lst@newlines=\z@ - \lst@EOLUpdate \lsthk@InitVarsBOL - \fi - \lst@formfeed - \lst@whitespacetrue} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Character tables}\label{iCharacterTables} -% -% -% \subsubsection{The standard table} -% -% The standard character table is selected by |\lst@SelectStdCharTable|, which -% expands to a token sequence -% \ldots|\def| |A{\lst@ProcessLetter| |A}|\ldots\space -% where the first A is active and the second has catcode 12. We use the -% following macros to build the character table. -% \begin{syntax} -% \item[0.19] |\lst@CCPut|\meta{class macro}\meta{$c_1$}\ldots\meta{$c_k$}|\z@| -% -% extends the standard character table by the characters with codes -% \meta{$c_1$}\ldots\meta{$c_k$} making each character use -% \meta{class macro}. All these characters must be printable via -% |\char|\meta{$c_i$}. -% -% \item[0.20] |\lst@CCPutMacro|\meta{class$_1$}\meta{$c_1$}\meta{definition$_1$}\ldots|\@empty\z@\@empty| -% -% also extends the standard character table: the character \meta{$c_i$} -% will use \meta{class$_i$} and is printed via \meta{definition$_i$}. -% These definitions must be \meta{spec. token}s in the sense of section -% \ref{dCharacterTables}. -% \end{syntax} -% -% \begin{macro}{\lst@Def} -% \begin{macro}{\lst@Let} -% For speed we won't use these helpers too often. -% \begin{macrocode} -\def\lst@Def#1{\lccode`\~=#1\lowercase{\def~}} -\def\lst@Let#1{\lccode`\~=#1\lowercase{\let~}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begingroup -% The definition of the space below doesn't hurt anything. But other aspects, -% for example \aspectname{lineshape} and \aspectname{formats}, redefine also -% the macro |\space|. Now, if \LaTeX\ calls |\try@load@fontshape|, the |.log| -% messages would show some strange things since \LaTeX\ uses |\space| in these -% messages. The following addition ensures that |\space| expands to a space -% and not to something different. This was one more bug reported by -% \lsthelper{Denis~Girou}{1999/09/16}{bad font info message with breaklines}. -% \begin{macrocode} -\lst@AddToAtTop{\try@load@fontshape}{\def\space{ }} -% \end{macrocode} -% \endgroup -% -% \begin{macro}{\lst@SelectStdCharTable} -% The first three standard characters. |\lst@Let| has been replaced by -% |\lst@Def| after a bug report from \lsthelper{Chris~Edwards}{2002/02/15} -% {tabulators show up with firstline>1}. -% \begin{macrocode} -\def\lst@SelectStdCharTable{% - \lst@Def{9}{\lst@ProcessTabulator}% - \lst@Def{12}{\lst@ProcessFormFeed}% - \lst@Def{32}{\lst@ProcessSpace}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CCPut} -% The first argument gives the character class, then follow the codes. -% \begin{macrocode} -\def\lst@CCPut#1#2{% - \ifnum#2=\z@ - \expandafter\@gobbletwo - \else - \lccode`\~=#2\lccode`\/=#2\lowercase{\lst@CCPut@~{#1/}}% - \fi - \lst@CCPut#1} -\def\lst@CCPut@#1#2{\lst@lAddTo\lst@SelectStdCharTable{\def#1{#2}}} -% \end{macrocode} -% Now we insert more standard characters. -% \begin{macrocode} -\lst@CCPut \lst@ProcessOther - {"21}{"22}{"28}{"29}{"2B}{"2C}{"2E}{"2F} - {"3A}{"3B}{"3D}{"3F}{"5B}{"5D} - \z@ -\lst@CCPut \lst@ProcessDigit - {"30}{"31}{"32}{"33}{"34}{"35}{"36}{"37}{"38}{"39} - \z@ -\lst@CCPut \lst@ProcessLetter - {"40}{"41}{"42}{"43}{"44}{"45}{"46}{"47} - {"48}{"49}{"4A}{"4B}{"4C}{"4D}{"4E}{"4F} - {"50}{"51}{"52}{"53}{"54}{"55}{"56}{"57} - {"58}{"59}{"5A} - {"61}{"62}{"63}{"64}{"65}{"66}{"67} - {"68}{"69}{"6A}{"6B}{"6C}{"6D}{"6E}{"6F} - {"70}{"71}{"72}{"73}{"74}{"75}{"76}{"77} - {"78}{"79}{"7A} - \z@ -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CCPutMacro} -% Now we come to a delicate point. The characters not inserted yet aren't -% printable (|_|, |$|, \ldots) or aren't printed well (|*|, |-|, \ldots) if we -% enter these characters. Thus we use proper macros to print the characters. -% Works perfectly. The problem is that the current character string is -% printable for speed, for example |_| is already replaced by a macro version, -% but the new keyword tests need the original characters. -% -% The solution: We define |\def _{\lst@ProcessLetter\lst@um_}| where the first -% underscore is active and the second belongs to the control sequence. -% Moreover we have |\def\lst@um_{\lst@UM _}| where the second underscore has -% the usual meaning. Now the keyword tests can access the original character -% simply by making |\lst@UM| empty. The default definition gets the following -% token and builds the control sequence |\lst@um_@|, which we'll define to -% print the character. Easy, isn't it?^^A ;-) -% -% The following definition does all this for us. The first parameter gives the -% character class, the second the character code, and the last the definition -% which actually prints the character. We build the names |\lst@um_| and -% |\lst@um_@| and give them to a submacro. -% \begin{macrocode} -\def\lst@CCPutMacro#1#2#3{% - \ifnum#2=\z@ \else - \begingroup\lccode`\~=#2\relax \lccode`\/=#2\relax - \lowercase{\endgroup\expandafter\lst@CCPutMacro@ - \csname\@lst @um/\expandafter\endcsname - \csname\@lst @um/@\endcsname /~}#1{#3}% - \expandafter\lst@CCPutMacro - \fi} -% \end{macrocode} -% The arguments are now |\lst@um_|, |\lst@um_@|, nonactive character, active -% character, character class and printing definition. We add |\def _{| -% |\lst@ProcessLetter| |\lst@um_}| to |\lst@SelectStdCharTable| (and similarly -% other special characters), define |\def\lst@um_{\lst@UM _}| and |\lst@um_@|. -% \begin{macrocode} -\def\lst@CCPutMacro@#1#2#3#4#5#6{% - \lst@lAddTo\lst@SelectStdCharTable{\def#4{#5#1}}% - \def#1{\lst@UM#3}% - \def#2{#6}} -% \end{macrocode} -% The default definition of |\lst@UM|: -% \begin{macrocode} -\def\lst@UM#1{\csname\@lst @um#1@\endcsname} -% \end{macrocode} -% And all remaining standard characters. -% \begin{macrocode} -\lst@CCPutMacro - \lst@ProcessOther {"23}\# - \lst@ProcessLetter{"24}\textdollar - \lst@ProcessOther {"25}\% - \lst@ProcessOther {"26}\& - \lst@ProcessOther {"27}{\lst@ifupquote \textquotesingle - \else \char39\relax \fi} - \lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered} - \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{$-$}} - \lst@ProcessOther {"3C}{\lst@ttfamily<\textless} - \lst@ProcessOther {"3E}{\lst@ttfamily>\textgreater} - \lst@ProcessOther {"5C}{\lst@ttfamily{\char92}\textbackslash} - \lst@ProcessOther {"5E}\textasciicircum - \lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}\textunderscore} - \lst@ProcessOther {"60}{\lst@ifupquote \textasciigrave - \else \char96\relax \fi} - \lst@ProcessOther {"7B}{\lst@ttfamily{\char123}\textbraceleft} - \lst@ProcessOther {"7C}{\lst@ttfamily|\textbar} - \lst@ProcessOther {"7D}{\lst@ttfamily{\char125}\textbraceright} - \lst@ProcessOther {"7E}\textasciitilde - \lst@ProcessOther {"7F}- - \@empty\z@\@empty -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ttfamily} -% What is this ominous macro? It prints either the first or the second -% argument. In |\ttfamily| it ensures that |----| is typeset |----| and not -% $-$$-$$-$$-$ as in version 0.17. Bug encountered by -% \lsthelper{Dr.~Jobst~Hoffmann}{1998/03/30}{|\lst@minus| and |\ttfamily|}. -% Furthermore I added |\relax| after receiving an error report from -% \lsthelper{Magnus~Lewis-Smith}{1999/08/06}{! Bad character code (920).} -% \begin{macrocode} -\def\lst@ttfamily#1#2{\ifx\f@family\ttdefault#1\relax\else#2\fi} -% \end{macrocode} -% |\ttdefault| is defined |\long|, so the |\ifx| doesn't work since |\f@family| -% isn't |\long|! We go around this problem by redefining |\ttdefault| locally: -% \begin{macrocode} -\lst@AddToHook{Init}{\edef\ttdefault{\ttdefault}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{upquote} -% is used above to decide which quote to print. We print an error message if -% the necessary \packagename{textcomp} commands are not available. This key -% has been added after an email from \lsthelper{Frank~Mittelbach}{2003/06/18} -% {listings and upquote}. -% \begin{macrocode} -\lst@Key{upquote}{false}[t]{\lstKV@SetIf{#1}\lst@ifupquote - \lst@ifupquote - \@ifundefined{textasciigrave}% - {\let\KV@lst@upquote\@gobble - \lstKV@SetIf f\lst@ifupquote \@gobble\fi - \PackageError{Listings}{Option `upquote' requires `textcomp' - package.\MessageBreak The option has been disabled}% - {Add \string\usepackage{textcomp} to your preamble.}}% - {}% - \fi} -% \end{macrocode} -% If an \packagename{upquote} package is loaded, the \keyname{upquote} option -% is enabled by default. -% \begin{macrocode} -\AtBeginDocument{% - \@ifpackageloaded{upquote}{\RequirePackage{textcomp}% - \lstset{upquote}}{}% - \@ifpackageloaded{upquote2}{\lstset{upquote}}{}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@ifactivechars} -% A simple switch. -% \begin{macrocode} -\def\lst@activecharstrue{\let\lst@ifactivechars\iftrue} -\def\lst@activecharsfalse{\let\lst@ifactivechars\iffalse} -\lst@activecharstrue -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@SelectCharTable} -% We select the standard character table and switch to active catcodes. -% \begin{macrocode} -\def\lst@SelectCharTable{% - \lst@SelectStdCharTable - \lst@ifactivechars - \catcode9\active \catcode12\active \catcode13\active - \@tempcnta=32\relax - \@whilenum\@tempcnta<128\do - {\catcode\@tempcnta\active\advance\@tempcnta\@ne}% - \fi - \lst@ifec \lst@DefEC \fi -% \end{macrocode} -% The following line and the according macros below have been added after a -% bug report from \lsthelper{Fr\'ed\'eric~Boulanger}{2001/02/27}{ligatures}. -% The assignment to |\do@noligs| was changed to |\do| after a bug report from -% \lsthelper{Peter~Ruckdeschel}{2002/04/12}{problems with simultanous use of -% seminar.sty and listings.sty}. This bugfix was kindly provided by -% \lsthelper{Timothy~Van~Zandt}{2002/04/13}{Re: ...}. -% \begin{macrocode} - \let\do\lst@do@noligs \verbatim@nolig@list -% \end{macrocode} -% There are two ways to adjust the standard table: inside the hook or with -% |\lst@DeveloperSCT|. We use these macros and initialize the backslash if -% necessary. |\lst@DefRange| has been moved outside the hook after a bug report -% by \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung -% m\"oglich...}. -% \begin{macrocode} - \lsthk@SelectCharTable - \lst@DeveloperSCT - \lst@DefRange - \ifx\lst@Backslash\relax\else - \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{SelectCharTable} -% \begin{lstkey}{MoreSelectCharTable} -% The keys to adjust |\lst@DeveloperSCT|. -% \begin{macrocode} -\lst@Key{SelectCharTable}{}{\def\lst@DeveloperSCT{#1}} -\lst@Key{MoreSelectCharTable}\relax{\lst@lAddTo\lst@DeveloperSCT{#1}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{SetLanguage}{\let\lst@DeveloperSCT\@empty} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@do@noligs} -% To prevent ligatures, this macro inserts the token |\lst@NoLig| in front of -% |\lst@Process|\meta{whatever}\meta{spec.~token}. This is done by -% |\verbatim@nolig@list| for certain characters. Note that the submacro is -% a special kind of a local |\lst@AddToAtTop|. The submacro definition was -% fixed thanks to \lsthelper{Peter~Bartke}{2002/04/10}{bad `noligs' handling}. -% \begin{macrocode} -\def\lst@do@noligs#1{% - \begingroup \lccode`\~=`#1\lowercase{\endgroup - \lst@do@noligs@~}} -\def\lst@do@noligs@#1{% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter#1% - \expandafter\expandafter\expandafter{\expandafter\lst@NoLig#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@NoLig} -% When this extra macro is processed, it adds |\lst@nolig| to the output queue -% without increasing its length. For keyword detection this must expand to -% nothing if |\lst@UM| is empty. -% \begin{macrocode} -\def\lst@NoLig{\advance\lst@length\m@ne \lst@Append\lst@nolig} -\def\lst@nolig{\lst@UM\@empty}% -% \end{macrocode} -% But the usual meaning of |\lst@UM| builds the following control sequence, -% which prevents ligatures in the manner of \LaTeX's |\do@noligs|. -% \begin{macrocode} -\@namedef{\@lst @um@}{\leavevmode\kern\z@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@SaveOutputDef} -% To get the \meta{spec.~token} meaning of character |#1|, we look for |\def| -% `active character |#1|' in |\lst@SelectStdCharTable|, get the replacement -% text, strip off the character class via |\@gobble|, and assign the meaning. -% Note that you get a ``runaway argument'' error if an illegal \meta{character -% code}=|#1| is used. -% \begin{macrocode} -\def\lst@SaveOutputDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup - \def\lst@temp##1\def~##2##3\relax}{% - \global\expandafter\let\expandafter#2\@gobble##2\relax}% - \expandafter\lst@temp\lst@SelectStdCharTable\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstum@backslash} -% A commonly used character. -% \begin{macrocode} -\lst@SaveOutputDef{"5C}\lstum@backslash -% \end{macrocode} -% \end{macro} -% -% -% \subsubsection{National characters} -% -% \begin{lstkey}{extendedchars} -% The user key to activate extended characters 128--255. -% \begin{macrocode} -\lst@Key{extendedchars}{true}[t]{\lstKV@SetIf{#1}\lst@ifec} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@DefEC} -% Currently each character in the range 128--255 is treated as a letter. -% \begin{macrocode} -\def\lst@DefEC{% - \lst@CCECUse \lst@ProcessLetter - ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f% - ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f% - ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af% - ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf% - ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf% - ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df% - ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef% - ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff% - ^^00} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CCECUse} -% Reaching end of list (|^^00|) we terminate the loop. -% Otherwise we do the same as in |\lst@CCPut| if the character is not active. -% But if the character is active, we save the meaning before redefinition. -% \begin{macrocode} -\def\lst@CCECUse#1#2{% - \ifnum`#2=\z@ - \expandafter\@gobbletwo - \else - \ifnum\catcode`#2=\active - \lccode`\~=`#2\lccode`\/=`#2\lowercase{\lst@CCECUse@#1~/}% - \else - \lst@ifactivechars \catcode`#2=\active \fi - \lccode`\~=`#2\lccode`\/=`#2\lowercase{\def~{#1/}}% - \fi - \fi - \lst@CCECUse#1} -% \end{macrocode} -% We save the meaning as mentioned. Here we must also use the `|\lst@UM| -% construction' since extended characters could often appear in words = -% identifiers. Bug reported by \lsthelper{Denis~Girou}{1999/07/26} -% {incompatibility with inputenc}. -% \begin{macrocode} -\def\lst@CCECUse@#1#2#3{% - \expandafter\def\csname\@lst @EC#3\endcsname{\lst@UM#3}% - \expandafter\let\csname\@lst @um#3@\endcsname #2% - \edef#2{\noexpand#1% - \expandafter\noexpand\csname\@lst @EC#3\endcsname}} -% \end{macrocode} -% \lsthelper{Daniel~Gerigk}{2001/10/25}{extendedchars do not work} and -% \lsthelper{Heiko~Oberdiek}{2001/10/26}{extendedchars do not work: um@\#3@ -% must be @um\#3@} reported an error and a solution, respectively. -% \end{macro} -% -% -% \subsubsection{Catcode problems} -% -% \begin{macro}{\lst@nfss@catcodes} -% \lsthelper{Anders~Edenbrandt}{1997/04/22}{preload of .fd files} found a bug -% with \texttt{.fd}-files. Since we change catcodes and these files are read -% on demand, we must reset the catcodes before the files are input. We use a -% local redefinition of |\nfss@catcodes|. -% \begin{macrocode} -\lst@AddToHook{Init} - {\let\lsts@nfss@catcodes\nfss@catcodes - \let\nfss@catcodes\lst@nfss@catcodes} -% \end{macrocode} -% The |&|-character had turned into |\&| after a bug report by \lsthelper -% {David~Aspinall}{2003/07/17}{loading of .fd file inside tabular produces -% error}. -% \begin{macrocode} -\def\lst@nfss@catcodes{% - \lst@makeletter - ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\relax - \@makeother (\@makeother )\@makeother ,\@makeother :\@makeother\&% - \@makeother 0\@makeother 1\@makeother 2\@makeother 3\@makeother 4% - \@makeother 5\@makeother 6\@makeother 7\@makeother 8\@makeother 9% - \@makeother =\lsts@nfss@catcodes} -% \end{macrocode} -% The investigation of a bug reported by \lsthelper{Christian~Gudrian} -% {2000/11/16}{problems with mathpple} showed that the equal sign needs -% to have `other' catcode, as assigned above. -% \lsthelper{Svend~Tollak~Munkejord}{2002/04/17}{package incompatible with -% Lucida .fd files} reported problems with Lucida .fd-files, while -% \lsthelper{Heiko~Oberdiek}{2002/04/17}{Re: listings fails with Lucida -% font} analysed the bug, which above led to the line starting with -% |\@makeaother (|. -% -% The name of |\lst@makeletter| is an imitation of \LaTeX's |\@makeother|. -% \begin{macrocode} -\def\lst@makeletter#1{% - \ifx\relax#1\else\catcode`#111\relax \expandafter\lst@makeletter\fi} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{useoutput} -% \begin{macro}{\output} -% Another problem was first reported by \lsthelper{Marcin~Kasperski} -% {1999/04/28}{listings spoil toc}. It is also catcode related and -% \lsthelper{Donald~Arseneau}{1999/05/13}{comp.text.tex Re: delayed write and -% catcode changes} let me understand it. The point is that \TeX\ seems to use -% the \emph{currently} active catcode table when it writes non-|\immediate| -% |\write|s to file and not the catcodes involved when \emph{reading} the -% characters. -% So a section heading |\L a| was written |\La| if a listing was split on two -% pages since a non-standard catcode table was in use when writing |\La| to -% file, the previously attached catcodes do not matter. One more bug was that -% accents in page headings or footers were lost when a listing was split on -% two pages. \lsthelper{Denis~Girou}{1999/08/03}{Accents lost in heading if -% listing split on two pages} found this latter bug. A similar problem with -% the tilde was reported by \lsthelper{Thorsten~Vitt}{2001/06/25}{fancyhdr + -% listings crossing pages ==> ~ in header, not space}. -% -% We can choose between three possibilities. -% \begin{macrocode} -\lst@Key{useoutput}{2}{\edef\lst@useoutput{\ifcase#10 0\or 1\else 2\fi}} -% \end{macrocode} -% The first does not modify the existing output routine. -% \begin{macrocode} -\lst@AddToHook{Init} -{\edef\lst@OrgOutput{\the\output}% -\ifcase\lst@useoutput\relax -\or -% \end{macrocode} -% The second possibility is as follows: We interrupt the current modes---in -% particular |\lst@Pmode| with modified catcode table---, call the original -% output routine and reenter the mode. This must be done with a little care. -% First we have to close the group which \TeX\ opens at the beginning of the -% output routine. A single |\egroup| gives an `unbalanced output routine' -% error. But |\expandafter\egroup| works. Again it was -% \lsthelper{Donald~Arseneau}{2001/01/10}{comp.text.tex Re: \output puzzle} -% who gave the explaination: The |\expandafter| set the token type of |\bgroup| -% to |backed_up|, which prevents \TeX's from recovering from an unbalanced -% output routine. \lsthelper{Heiko~Oberdiek}{2001/01/05}{comp.text.tex Re: -% \output puzzle} reported that |\csname| |egroup||\endcsname| does the trick, -% too. -% -% However, since \TeX\ checks the contents of |\box| 255 when we close the -% group (`output routine didn't use all of |\box| 255'), we have to save it -% temporaryly. -% \begin{macrocode} - \output{\global\setbox\lst@gtempboxa\box\@cclv - \expandafter\egroup -% \end{macrocode} -% Now we can interrupt the mode, but we have to save the current character -% string and the current style. -% \begin{macrocode} - \lst@SaveToken - \lst@InterruptModes -% \end{macrocode} -% We restore the contents, use the original output routine, and \ldots -% \begin{macrocode} - \setbox\@cclv\box\lst@gtempboxa - \bgroup\lst@OrgOutput\egroup -% \end{macrocode} -% \ldots\space open a group matching the |}| which \TeX\ inserts at the end of -% the output routine. We reenter modes and restore the character string and -% style |\aftergroup|. Moreover we need to reset |\pagegoal|---added after a -% bug report by \lsthelper{Jochen~Schneider}{2002/03/09}{de.comp.text.tex: -% Problem mit Listings-Paket 1.0-Beta; unmotivated pagebreak with preceding -% float}. -% \begin{macrocode} - \bgroup - \aftergroup\pagegoal\aftergroup\vsize - \aftergroup\lst@ReenterModes\aftergroup\lst@RestoreToken}% -\else -% \end{macrocode} -% The third option is to restore all catcodes and meanings inside a modified -% output routine and to call the original routine afterwards. -% \begin{macrocode} - \output{\lst@RestoreOrigCatcodes - \lst@ifec \lst@RestoreOrigExtendedCatcodes \fi - \lst@OrgOutput}% -\fi} -% \end{macrocode} -% Note that this output routine isn't used too often. It is executed only if -% it's possible that a listing is split on two pages: if a listing ends at -% the bottom or begins at the top of a page, or if a listing is really split. -% \end{macro} -% \end{lstkey} -% -% \begin{macro}{\lst@GetChars} -% \begin{macro}{\lst@ScanChars} -% \begin{lstkey}{rescanchars} -% To make the third |\output|-option work, we have to scan the catcodes and -% also the meanings of active characters: -% \begin{macrocode} -\def\lst@GetChars#1#2#3{% - \let#1\@empty - \@tempcnta#2\relax \@tempcntb#3\relax - \loop \ifnum\@tempcnta<\@tempcntb\relax - \lst@lExtend#1{\expandafter\catcode\the\@tempcnta=}% - \lst@lExtend#1{\the\catcode\@tempcnta\relax}% - \ifnum\the\catcode\@tempcnta=\active - \begingroup\lccode`\~=\@tempcnta - \lowercase{\endgroup - \lst@lExtend#1{\expandafter\let\expandafter~\csname - lstecs@\the\@tempcnta\endcsname}% - \expandafter\let\csname lstecs@\the\@tempcnta\endcsname~}% - \fi - \advance\@tempcnta\@ne - \repeat} -\def\lst@ScanChars{% - \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}% - \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}} -% \end{macrocode} -% The scan can be issued by hand and at the beginning of a document. -% \begin{macrocode} -\lst@Key{rescanchars}\relax{\lst@ScanChars} -\AtBeginDocument{\lst@ScanChars} -% \end{macrocode} -% \end{lstkey} -% \end{macro} -% \end{macro} -% -% -% \subsubsection{Adjusting the table} -% -% We begin with modifiers for the basic character classes. -% -% \begin{lstkey}{alsoletter} -% \begin{lstkey}{alsodigit} -% \begin{lstkey}{alsoother} -% The macros |\lst@also|\ldots\space will hold |\def|\meta{char}|{|\ldots|}| -% sequences, which adjusts the standard character table. -% \begin{macrocode} -\lst@Key{alsoletter}\relax{% - \lst@DoAlso{#1}\lst@alsoletter\lst@ProcessLetter} -\lst@Key{alsodigit}\relax{% - \lst@DoAlso{#1}\lst@alsodigit\lst@ProcessDigit} -\lst@Key{alsoother}\relax{% - \lst@DoAlso{#1}\lst@alsoother\lst@ProcessOther} -% \end{macrocode} -% This is done at \hookname{SelectCharTable} and every language selection -% the macros get empty. -% \begin{macrocode} -\lst@AddToHook{SelectCharTable} - {\lst@alsoother \lst@alsodigit \lst@alsoletter} -\lst@AddToHookExe{SetLanguage}% init - {\let\lst@alsoletter\@empty - \let\lst@alsodigit\@empty - \let\lst@alsoother\@empty} -% \end{macrocode} -% The service macro starts a loop and \ldots -% \begin{macrocode} -\def\lst@DoAlso#1#2#3{% - \lst@DefOther\lst@arg{#1}\let#2\@empty - \expandafter\lst@DoAlso@\expandafter#2\expandafter#3\lst@arg\relax} -\def\lst@DoAlso@#1#2#3{% - \ifx\relax#3\expandafter\@gobblethree \else -% \end{macrocode} -% \ldots\space while not reaching |\relax| we use the \TeX nique from -% |\lst@SaveOutputDef| to replace the class by |#2|. Eventually we append -% the new definition to |#1|. -% \begin{macrocode} - \begingroup \lccode`\~=`#3\relax \lowercase{\endgroup - \def\lst@temp##1\def~##2##3\relax{% - \edef\lst@arg{\def\noexpand~{\noexpand#2\expandafter - \noexpand\@gobble##2}}}}% - \expandafter\lst@temp\lst@SelectStdCharTable\relax - \lst@lExtend#1{\lst@arg}% - \fi - \lst@DoAlso@#1#2} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@SaveDef} -% \begin{macro}{\lst@DefSaveDef} -% \begin{macro}{\lst@LetSaveDef} -% These macros can be used in language definitions to make special changes. -% They save the definition and define or assign a new one. -% \begin{macrocode} -\def\lst@SaveDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~}} -\def\lst@DefSaveDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\def~}} -\def\lst@LetSaveDef#1#2{% - \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\let~}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% Now we get to the more powerful definitions. -% -% \begin{macro}{\lst@CDef} -% Here we unfold the first parameter \meta{1st}\marg{2nd}\marg{rest} and say -% that this input string is `replaced' by \meta{save 1st}\marg{2nd}^^A -% \marg{rest}---plus \meta{execute}, \meta{pre}, and \meta{post}. This main -% work is done by |\lst@CDefIt|. -% \begin{macrocode} -\def\lst@CDef#1{\lst@CDef@#1} -\def\lst@CDef@#1#2#3#4{\lst@CDefIt#1{#2}{#3}{#4#2#3}#4} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CDefX} -% drops the input string. -% \begin{macrocode} -\def\lst@CDefX#1{\lst@CDefX@#1} -\def\lst@CDefX@#1#2#3{\lst@CDefIt#1{#2}{#3}{}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CDefIt} -% is the main working procedure for the previous macros. It redefines the -% sequence |#1#2#3| of characters. At least |#1| must be active; the other two -% arguments might be empty, not equivalent to empty! -% \begin{macrocode} -\def\lst@CDefIt#1#2#3#4#5#6#7#8{% - \ifx\@empty#2\@empty -% \end{macrocode} -% For a single character we just execute the arguments in the correct order. -% You might want to go back to section \ref{dCharacterTablesManipulated} to -% look them up. -% \begin{macrocode} - \def#1{#6\def\lst@next{#7#4#8}\lst@next}% - \else \ifx\@empty#3\@empty -% \end{macrocode} -% For a two character sequence we test whether \meta{pre} and \meta{post} -% must be executed. -% \begin{macrocode} - \def#1##1{% - #6% - \ifx##1#2\def\lst@next{#7#4#8}\else - \def\lst@next{#5##1}\fi - \lst@next}% - \else -% \end{macrocode} -% We do the same for an arbitrary character sequence---except that we have to -% use |\lst@IfNextCharsArg| instead of |\ifx|\ldots|\fi|. -% \begin{macrocode} - \def#1{% - #6% - \lst@IfNextCharsArg{#2#3}{#7#4#8}% - {\expandafter#5\lst@eaten}}% - \fi \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CArgX} -% We make |#1#2| active and call |\lst@CArg|. -% \begin{macrocode} -\def\lst@CArgX#1#2\relax{% - \lst@DefActive\lst@arg{#1#2}% - \expandafter\lst@CArg\lst@arg\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CArg} -% arranges the first two arguments for |\lst@CDef|[|X|]. We get an undefined -% macro and use |\@empty\@empty\relax| as delimiter for the submacro. -% \begin{macrocode} -\def\lst@CArg#1#2\relax{% - \lccode`\/=`#1\lowercase{\def\lst@temp{/}}% - \lst@GetFreeMacro{lst@c\lst@temp}% - \expandafter\lst@CArg@\lst@freemacro#1#2\@empty\@empty\relax} -% \end{macrocode} -% Save meaning of \meta{1st}=|#2| in \meta{save 1st}=|#1| and call the macro -% |#6| with correct arguments. From version 1.0 on, |#2|, |#3| and |#4| -% (respectively empty arguments) are tied together with group braces. -% This allows us to save two arguments in other definitions, for example in -% |\lst@DefDelimB|. -% \begin{macrocode} -\def\lst@CArg@#1#2#3#4\@empty#5\relax#6{% - \let#1#2% - \ifx\@empty#3\@empty - \def\lst@next{#6{#2{}{}}}% - \else - \def\lst@next{#6{#2#3{#4}}}% - \fi - \lst@next #1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CArgEmpty} -% `executes' an |\@empty|-delimited argument. We will use it for the delimiters. -% \begin{macrocode} -\def\lst@CArgEmpty#1\@empty{#1} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Delimiters} -% -% Here we start with general definitions common to all delimiters. -% -% \begin{lstkey}{excludedelims} -% controls which delimiters are not printed in \meta{whatever}style. We just -% define |\lst@ifex|\meta{whatever} to be true. Such switches are set false -% in the \hookname{ExcludeDelims} hook and are handled by the individual -% delimiters. -% \begin{macrocode} -\lst@Key{excludedelims}\relax - {\lsthk@ExcludeDelims \lst@NormedDef\lst@temp{#1}% - \expandafter\lst@for\lst@temp\do - {\expandafter\let\csname\@lst @ifex##1\endcsname\iftrue}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@DelimPrint} -% And this macro might help in doing so. |#1| is |\lst@ifex|\meta{whatever} -% (plus |\else|) or just |\iffalse|, and |#2| will be the delimiter. The -% temporary mode change ensures that the characters can't end the current -% delimiter or start a new one. -% \begin{macrocode} -\def\lst@DelimPrint#1#2{% - #1% - \begingroup - \lst@mode\lst@nomode \lst@modetrue - #2\lst@XPrintToken - \endgroup - \lst@ResetToken - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DelimOpen} -% We print preceding characters and the delimiter, enter the appropriate mode, -% print the delimiter again, and execute |#3|. In fact, the arguments |#1| and -% |#2| will ensure that the delimiter is printed only once. -% \begin{macrocode} -\def\lst@DelimOpen#1#2#3#4#5#6\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \lst@DelimPrint#1{#6}% - \lst@EnterMode{#4}{\def\lst@currstyle#5}% - \lst@DelimPrint{#1#2}{#6}% - #3} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DelimClose} -% is the same in reverse order. -% \begin{macrocode} -\def\lst@DelimClose#1#2#3\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \lst@DelimPrint{#1#2}{#3}% - \lst@LeaveMode - \lst@DelimPrint{#1}{#3}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@BeginDelim} -% \begin{macro}{\lst@EndDelim} -% These definitions are applications of |\lst@DelimOpen| and |\lst@DelimClose|: -% the delimiters have the same style as the delimited text. -% \begin{macrocode} -\def\lst@BeginDelim{\lst@DelimOpen\iffalse\else{}} -\def\lst@EndDelim{\lst@DelimClose\iffalse\else} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@BeginIDelim} -% \begin{macro}{\lst@EndIDelim} -% Another application: no delimiter is printed. -% \begin{macrocode} -\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{}{}} -\def\lst@EndIDelim{\lst@DelimClose\iffalse{}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@DefDelims} -% This macro defines all delimiters and is therefore reset every language -% selection. -% \begin{macrocode} -\lst@AddToHook{SelectCharTable}{\lst@DefDelims} -\lst@AddToHookExe{SetLanguage}{\let\lst@DefDelims\@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Delim} -% First we set default values: no |\lst@modetrue|, cumulative style, and no -% argument to |\lst@Delim|[|DM|]|@|\meta{type}. -% \begin{macrocode} -\def\lst@Delim#1{% - \lst@false \let\lst@cumulative\@empty \let\lst@arg\@empty -% \end{macrocode} -% These are the correct settings for the double-star-form, so we immediately -% call the submacro in this case. Otherwise we either just suppress cumulative -% style, or even indicate the usage of |\lst@modetrue| with |\lst@true|. -% \begin{macrocode} - \@ifstar{\@ifstar{\lst@Delim@{#1}}% - {\let\lst@cumulative\relax - \lst@Delim@{#1}}}% - {\lst@true\lst@Delim@{#1}}} -% \end{macrocode} -% The type argument is saved for later use. We check against the optional -% \meta{style} argument using |#1| as default, define |\lst@delimstyle| and -% look for the optional \meta{type option}, which is just saved in |\lst@arg|. -% \begin{macrocode} -\def\lst@Delim@#1[#2]{% - \gdef\lst@delimtype{#2}% - \@ifnextchar[\lst@Delim@sty - {\lst@Delim@sty[#1]}} -\def\lst@Delim@sty[#1]{% - \def\lst@delimstyle{#1}% - \ifx\@empty#1\@empty\else - \lst@Delim@sty@ #1\@nil - \fi - \@ifnextchar[\lst@Delim@option - \lst@Delim@delim} -\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim} -% \end{macrocode} -% |[| and |]| in the replacement text above have been added after a bug report -% by \lsthelper{Stephen~Reindl}{2002/05/28}{\inaccessible using Cobol}. -% -% The definition of |\lst@delimstyle| depends on whether the first token is a -% control sequence. Here we possibly build |\lst@|\meta{style}. -% \begin{macrocode} -\def\lst@Delim@sty@#1#2\@nil{% - \if\relax\noexpand#1\else - \edef\lst@delimstyle{\expandafter\noexpand - \csname\@lst @\lst@delimstyle\endcsname}% - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Delim@delim} -% Eventually this macro is called. First we might need to delete a bunch of -% delimiters. If there is no delimiter, we might delete a subclass. -% \begin{macrocode} -\def\lst@Delim@delim#1\relax#2#3#4#5#6#7#8{% - \ifx #4\@empty \lst@Delim@delall{#2}\fi - \ifx\@empty#1\@empty - \ifx #4\@nil - \@ifundefined{\@lst @#2DM@\lst@delimtype}% - {\lst@Delim@delall{#2@\lst@delimtype}}% - {\lst@Delim@delall{#2DM@\lst@delimtype}}% - \fi - \else -% \end{macrocode} -% If the delimiter is not empty, we convert the delimiter and append it to -% |\lst@arg|. Ditto |\lst@Begin|\ldots, |\lst@End|\ldots, and the style and -% mode selection. -% \begin{macrocode} - \expandafter\lst@Delim@args\expandafter - {\lst@delimtype}{#1}{#5}#6{#7}{#8}#4% -% \end{macrocode} -% If the type is known, we either choose dynamic or static mode and use the -% contents of |\lst@arg| as arguments. All this is put into |\lst@delim|. -% \begin{macrocode} - \let\lst@delim\@empty - \expandafter\lst@IfOneOf\lst@delimtype\relax#3% - {\@ifundefined{\@lst @#2DM@\lst@delimtype}% - {\lst@lExtend\lst@delim{\csname\@lst @#2@\lst@delimtype - \expandafter\endcsname\lst@arg}}% - {\lst@lExtend\lst@delim{\expandafter\lst@UseDynamicMode - \csname\@lst @#2DM@\lst@delimtype - \expandafter\endcsname\lst@arg}}% -% \end{macrocode} -% Now, depending on the mode |#4| we either remove this particular delimiter or -% append it to all current ones. -% \begin{macrocode} - \ifx #4\@nil - \let\lst@temp\lst@DefDelims \let\lst@DefDelims\@empty - \expandafter\lst@Delim@del\lst@temp\@empty\@nil\@nil\@nil - \else - \lst@lExtend\lst@DefDelims\lst@delim - \fi}% -% \end{macrocode} -% An unknown type issues an error. -% \begin{macrocode} - {\PackageError{Listings}{Illegal type `\lst@delimtype'}% - {#2 types are #3.}}% - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Delim@args} -% Now let's look how we add the arguments to |\lst@arg|. First we initialize -% the conversion just to make all characters active. But if the first character -% of the type equals |#4|, \ldots -% \begin{macrocode} -\def\lst@Delim@args#1#2#3#4#5#6#7{% - \begingroup - \lst@false \let\lst@next\lst@XConvert -% \end{macrocode} -% \ldots\ we remove that character from |\lst@delimtype|, and |#5| might select -% a different conversion setting or macro. -% \begin{macrocode} - \@ifnextchar #4{\xdef\lst@delimtype{\expandafter\@gobble - \lst@delimtype}% - #5\lst@next#2\@nil - \lst@lAddTo\lst@arg{\@empty#6}% - \lst@GobbleNil}% -% \end{macrocode} -% Since we are in the `special' case above, we've also added the special -% |\lst@Begin|\ldots\space and |\lst@End|\ldots\space macros to |\lst@arg| -% (and |\@empty| as a brake for the delimiter). No special task must be done -% if the characters are not equal. -% \begin{macrocode} - {\lst@next#2\@nil - \lst@lAddTo\lst@arg{\@empty#3}% - \lst@GobbleNil}% - #1\@nil -% \end{macrocode} -% We always transfer the arguments to the outside of the group and append the -% style and mode selection if and only if we're not deleting a delimiter. -% Therefor we expand the delimiter style. -% \begin{macrocode} - \global\let\@gtempa\lst@arg - \endgroup - \let\lst@arg\@gtempa - \ifx #7\@nil\else - \expandafter\lst@Delim@args@\expandafter{\lst@delimstyle}% - \fi} -% \end{macrocode} -% Recall that the style is `selected' by |\def\lst@currstyle#5|, and this -% `argument' |#5| is to be added now. Depending on the settings at the very -% beginning, we use either |{\meta{style}}\lst@modetrue|---which selects the -% style and deactivates keyword detection---, or |{}\meta{style}|---which -% defines an empty style macro and executes the style for cumulative styles---, -% or |{\meta{style}|---which just defines the style macro. Note that we have to -% use two extra group levels below: one is discarded directly by |\lst@lAddTo| -% and the other by |\lst@Delim|[|DM|]|@|\meta{type}. -% \begin{macrocode} -\def\lst@Delim@args@#1{% - \lst@if - \lst@lAddTo\lst@arg{{{#1}\lst@modetrue}}% - \else - \ifx\lst@cumulative\@empty - \lst@lAddTo\lst@arg{{{}#1}}% - \else - \lst@lAddTo\lst@arg{{{#1}}}% - \fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Delim@del} -% To delete a particular delimiter, we iterate down the list of delimiters and -% compare the current item with the user supplied. -% \begin{macrocode} -\def\lst@Delim@del#1\@empty#2#3#4{% - \ifx #2\@nil\else - \def\lst@temp{#1\@empty#2#3}% - \ifx\lst@temp\lst@delim\else - \lst@lAddTo\lst@DefDelims{#1\@empty#2#3{#4}}% - \fi - \expandafter\lst@Delim@del - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Delim@delall} -% To delete a whole class of delimiters, we first expand the control sequence -% name, init some other data, and call a submacro to do the work. -% \begin{macrocode} -\def\lst@Delim@delall#1{% - \begingroup - \edef\lst@delim{\expandafter\string\csname\@lst @#1\endcsname}% - \lst@false \global\let\@gtempa\@empty - \expandafter\lst@Delim@delall@\lst@DefDelims\@empty - \endgroup - \let\lst@DefDelims\@gtempa} -% \end{macrocode} -% We first discard a preceding |\lst@UseDynamicMode|. -% \begin{macrocode} -\def\lst@Delim@delall@#1{% - \ifx #1\@empty\else - \ifx #1\lst@UseDynamicMode - \lst@true - \let\lst@next\lst@Delim@delall@do - \else - \def\lst@next{\lst@Delim@delall@do#1}% - \fi - \expandafter\lst@next - \fi} -% \end{macrocode} -% Then we can check whether (the following) |\lst@|\meta{delimiter name}\ldots\ -% matches the delimiter class given by |\lst@delim|. -% \begin{macrocode} -\def\lst@Delim@delall@do#1#2\@empty#3#4#5{% - \expandafter\lst@IfSubstring\expandafter{\lst@delim}{\string#1}% - {}% - {\lst@if \lst@AddTo\@gtempa\lst@UseDynamicMode \fi - \lst@AddTo\@gtempa{#1#2\@empty#3#4{#5}}}% - \lst@false \lst@Delim@delall@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DefDelimB} -% Here we put the arguments together to fit |\lst@CDef|. Note that the very -% last argument |\@empty| to |\lst@CDef| is a brake for |\lst@CArgEmpty| -% and |\lst@DelimOpen|. -% \begin{macrocode} -\gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{% - \lst@CDef{#1}#2% - {#3}% - {\let\lst@bnext\lst@CArgEmpty - \lst@ifmode #4\else - #5% - \def\lst@bnext{#6{#7}{#8}}% - \fi - \lst@bnext}% - \@empty} -% \end{macrocode} -% After a bug report from \lsthelper{Vespe~Savikko}{2000/11/06}{bad output of -% doc-strings if HTML and Python are loaded} I added braces around |#7|. -% \end{macro} -% -% \begin{macro}{\lst@DefDelimE} -% The |\ifnum #7=\lst@mode| in the 5th line ensures that the delimiters -% match each other. -% \begin{macrocode} -\gdef\lst@DefDelimE#1#2#3#4#5#6#7{% - \lst@CDef{#1}#2% - {#3}% - {\let\lst@enext\lst@CArgEmpty - \ifnum #7=\lst@mode% - #4% - \let\lst@enext#6% - \else - #5% - \fi - \lst@enext}% - \@empty} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{Init}{\let\lst@bnext\relax \let\lst@enext\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DefDelimBE} -% This service macro will actually define all string delimiters. -% \begin{macrocode} -\gdef\lst@DefDelimBE#1#2#3#4#5#6#7#8#9{% - \lst@CDef{#1}#2% - {#3}% - {\let\lst@bnext\lst@CArgEmpty - \ifnum #7=\lst@mode - #4% - \let\lst@bnext#9% - \else - \lst@ifmode\else - #5% - \def\lst@bnext{#6{#7}{#8}}% - \fi - \fi - \lst@bnext}% - \@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@delimtypes} -% is the list of general delimiter types. -% \begin{macrocode} -\gdef\lst@delimtypes{s,l} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DelimKey} -% We just put together the arguments for |\lst@Delim|. -% \begin{macrocode} -\gdef\lst@DelimKey#1#2{% - \lst@Delim{}#2\relax - {Delim}\lst@delimtypes #1% - {\lst@BeginDelim\lst@EndDelim} - i\@empty{\lst@BeginIDelim\lst@EndIDelim}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{delim} -% \begin{lstkey}{moredelim} -% \begin{lstkey}{deletedelim} -% all use |\lst@DelimKey|. -% \begin{macrocode} -\lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}} -\lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}} -\lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@DelimDM@l} -% \begin{macro}{\lst@DelimDM@s} -% Nohting special here. -% \begin{macrocode} -\gdef\lst@DelimDM@l#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@DelimDM@s#1#2#3\@empty#4#5#6{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% - \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \subsubsection{Strings} -% -% \begin{aspect}{strings} -% Just starting a new aspect. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{strings} -% \end{macrocode} -% -% \begin{macro}{\lst@stringtypes} -% is the list of \ldots\space string types? -% \begin{macrocode} -\gdef\lst@stringtypes{d,b,m,bd,db} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@StringKey} -% We just put together the arguments for |\lst@Delim|. -% \begin{macrocode} -\gdef\lst@StringKey#1#2{% - \lst@Delim\lst@stringstyle #2\relax - {String}\lst@stringtypes #1% - {\lst@BeginString\lst@EndString}% - \@@end\@empty{}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{string} -% \begin{lstkey}{morestring} -% \begin{lstkey}{deletestring} -% all use |\lst@StringKey|. -% \begin{macrocode} -\lst@Key{string}\relax{\lst@StringKey\@empty{#1}} -\lst@Key{morestring}\relax{\lst@StringKey\relax{#1}} -\lst@Key{deletestring}\relax{\lst@StringKey\@nil{#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{lstkey}{stringstyle} -% You shouldn't need comments on the following two lines, do you? -% \begin{macrocode} -\lst@Key{stringstyle}{}{\def\lst@stringstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{showstringspaces} -% Thanks to \lsthelper{Knut~M\"uller}{1997/04/28}{\blankstringtrue} for -% reporting problems with |\blankstringtrue| (now |showstringspaces=false|). -% The problem has gone. -% \begin{macrocode} -\lst@Key{showstringspaces}t[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@BeginString} -% Note that the tokens after |\lst@DelimOpen| are arguments! The only special -% here is that we switch to `keepspaces' after starting a string, if necessary. -% A bug reported by \lsthelper{Vespe~Savikko}{2000/09/27}{stringstyle used also -% on previous other characters} has gone due to the use of |\lst@DelimOpen|. -% \begin{macrocode} -\gdef\lst@BeginString{% - \lst@DelimOpen - \lst@ifexstrings\else - {\lst@ifshowstringspaces - \lst@keepspacestrue - \let\lst@outputspace\lst@visiblespace - \fi}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexstrings\iffalse} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EndString} -% Again the two tokens following |\lst@DelimClose| are arguments. -% \begin{macrocode} -\gdef\lst@EndString{\lst@DelimClose\lst@ifexstrings\else} -% \end{macrocode} -% \end{macro} -% -% And now all the |\lst@StringDM@|\meta{type} definitions. -% -% \begin{macro}{\lst@StringDM@d} -% `d' means no extra work.; the first three arguments after |\lst@DefDelimBE| -% are left empty. The others are used to start and end the string. -% \begin{macrocode} -\gdef\lst@StringDM@d#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@StringDM@b} -% The |\lst@ifletter|\ldots|\fi| has been inserted after bug reports by -% \lsthelper{Daniel~Gerigk}{2001/10/25}{improper strings in C++} and -% \lsthelper{Peter~Bartke}{2001/11/01}{improper strings in C++}. If the last -% other character is a backslash (4th line), we gobble the `end string' token -% sequence. -% \begin{macrocode} -\gdef\lst@StringDM@b#1#2\@empty#3#4#5{% - \let\lst@ifbstring\iftrue - \lst@CArg #2\relax\lst@DefDelimBE - {\lst@ifletter \lst@Output \lst@letterfalse \fi}% - {\ifx\lst@lastother\lstum@backslash - \expandafter\@gobblethree - \fi}{}#3{#1}{#5}#4} -% \end{macrocode} -% \begin{macrocode} -\global\let\lst@ifbstring\iffalse % init -% \end{macrocode} -% \lsthelper{Heiko~Heil}{2002/02/08}{string '\\' does not finish after the -% delimiter} reported problems with double backslashes. So: -% \begin{macrocode} -\lst@AddToHook{SelectCharTable}{% - \lst@ifbstring - \lst@CArgX \\\\\relax \lst@CDefX{}% - {\lst@ProcessOther\lstum@backslash - \lst@ProcessOther\lstum@backslash - \let\lst@lastother\relax}% - {}% - \fi} -% \end{macrocode} -% The reset of |\lst@lastother| has been added after a bug reports by -% \lsthelper{Hermann~H\"uttler}{2002/10/05}{C++-string "... \\" does not -% end with second double quote} and \lsthelper{Dan~Luecking}{2003/01/15} -% {string "\\" doesn't end after the second quote}. -% \end{macro} -% -% \begin{macro}{\lst@StringDM@bd} -% \begin{macro}{\lst@StringDM@db} -% are just the same and the same as |\lst@StringDM@b|. -% \begin{macrocode} -\global\let\lst@StringDM@bd\lst@StringDM@b -\global\let\lst@StringDM@db\lst@StringDM@bd -% \end{macrocode} -% \end{macro}\end{macro} -% -% \begin{macro}{\lst@StringDM@a} -% This delimiter type is designed for Ada. Here we enter string mode only -% if the last character has not been a letter and has not been a right -% parenthesis or right bracket. The test for the latter one has been added -% after bug report from \lsthelper{Christian~Kindinger}{2002/03/??} -% {]' starts a string in Matlab}. -% \begin{macrocode} -\gdef\lst@StringDM@a#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimBE{}{}% - {\let\lst@next\@gobblethree - \lst@ifletter\else - \ifx\lst@lastother)\else \ifx\lst@lastother]\else - \let\lst@next\@empty - \fi \fi \fi - \lst@next}#3{#1}{#5}#4} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@StringDM@m} -% is for Matlab. We enter string mode only if the last character is not in -% the following list of exceptional characters: letters, digits, period, -% quote, right parenthesis, right bracket, and right brace. The first list -% has been extended after bug reports from \lsthelper{Christian~Kindinger} -% {2002/03/??}{]' starts a string in Matlab}, \lsthelper{Benjamin~Schubert} -% {2003/02/05}{.' starts a string in Matlab}, and \lsthelper{Stefan~Stoll} -% {2003/02/18}{any of 0123456789\}' plus quote start a string in Matlab}. -% \begin{macrocode} -\gdef\lst@StringDM@m#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimBE{}{}% - {\let\lst@next\@gobblethree - \lst@ifletter\else - \lst@IfLastOtherOneOf{)].0123456789\lstum@rbrace'}% - {}% - {\let\lst@next\@empty}% - \fi - \lst@next}#3{#1}{#5}#4} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstum@rbrace} -% This has been used above. -% \begin{macrocode} -\lst@SaveOutputDef{"7D}\lstum@rbrace -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \begin{aspect}{mf} -% For MetaFont and MetaPost we now define macros to print the input-filenames -% in stringstyle. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{mf} -% \end{macrocode} -% -% \begin{macro}{\lst@mfinputmode} -% \begin{macro}{\lst@String@mf} -% \begin{macrocode} -\lst@AddTo\lst@stringtypes{,mf} -\lst@NewMode\lst@mfinputmode -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@String@mf#1\@empty#2#3#4{% - \lst@CArg #1\relax\lst@DefDelimB - {}{}{\lst@ifletter \expandafter\@gobblethree \fi}% - \lst@BeginStringMFinput\lst@mfinputmode{#4\lst@Lmodetrue}% - \@ifundefined{lsts@semicolon}% - {\lst@DefSaveDef{`\;}\lsts@semicolon{% ; and space end the filename - \ifnum\lst@mode=\lst@mfinputmode - \lst@XPrintToken - \expandafter\lst@LeaveMode - \fi - \lsts@semicolon}% - \lst@DefSaveDef{`\ }\lsts@space{% - \ifnum\lst@mode=\lst@mfinputmode - \lst@XPrintToken - \expandafter\lst@LeaveMode - \fi - \lsts@space}% - }{}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@BeginStringMFinput} -% It remains to define this macro. In contrast to |\lst@PrintDelim|, we don't -% use |\lst@modetrue| to allow keyword detection here. -% \begin{macrocode} -\gdef\lst@BeginStringMFinput#1#2#3\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \begingroup - \lst@mode\lst@nomode - #3\lst@XPrintToken - \endgroup - \lst@ResetToken - \lst@EnterMode{#1}{\def\lst@currstyle#2}% - \lst@ifshowstringspaces - \lst@keepspacestrue - \let\lst@outputspace\lst@visiblespace - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsubsection{Comments} -% -% \begin{aspect}{comments} -% That's what we are working on. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{comments} -% \end{macrocode} -% -% \begin{macro}{\lst@commentmode} -% is a general purpose mode for comments. -% \begin{macrocode} -\lst@NewMode\lst@commentmode -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@commenttypes} -% Via \keyname{comment} available comment types: \textbf line, \textbf fixed -% column, \textbf single, and \textbf nested and all with -% preceding \textbf i for invisible comments. -% \begin{macrocode} -\gdef\lst@commenttypes{l,f,s,n} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CommentKey} -% We just put together the arguments for |\lst@Delim|. -% \begin{macrocode} -\gdef\lst@CommentKey#1#2{% - \lst@Delim\lst@commentstyle #2\relax - {Comment}\lst@commenttypes #1% - {\lst@BeginComment\lst@EndComment}% - i\@empty{\lst@BeginInvisible\lst@EndInvisible}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{comment} -% \begin{lstkey}{morecomment} -% \begin{lstkey}{deletecomment} -% The keys are easy since defined in terms of |\lst@CommentKey|. -% \begin{macrocode} -\lst@Key{comment}\relax{\lst@CommentKey\@empty{#1}} -\lst@Key{morecomment}\relax{\lst@CommentKey\relax{#1}} -\lst@Key{deletecomment}\relax{\lst@CommentKey\@nil{#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{lstkey}{commentstyle} -% Any hints necessary? -% \begin{macrocode} -\lst@Key{commentstyle}{}{\def\lst@commentstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\itshape} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@BeginComment} -% \begin{macro}{\lst@EndComment} -% Once more the three tokens following |\lst@DelimOpen| are arguments. -% \begin{macrocode} -\gdef\lst@BeginComment{% - \lst@DelimOpen - \lst@ifexcomments\else - \lsthk@AfterBeginComment} -% \end{macrocode} -% Ditto. -% \begin{macrocode} -\gdef\lst@EndComment{\lst@DelimClose\lst@ifexcomments\else} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{AfterBeginComment}{} -\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexcomments\iffalse} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@BeginInvisible} -% \begin{macro}{\lst@EndInvisible} -% Print preceding characters and begin dropping the output. -% \begin{macrocode} -\gdef\lst@BeginInvisible#1#2#3\@empty{% - \lst@TrackNewLines \lst@XPrintToken - \lst@BeginDropOutput{#1}} -% \end{macrocode} -% Don't print the delimiter and end dropping the output. -% \begin{macrocode} -\gdef\lst@EndInvisible#1\@empty{\lst@EndDropOutput} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% Now we provide all |\lst@Comment|[|DM|]|@|\meta{type} macros. -% -% \begin{macro}{\lst@CommentDM@l} -% is easy---thanks to |\lst@CArg| and |\lst@DefDelimB|. Note that the -% `end comment' argument |#4| is not used here. -% \begin{macrocode} -\gdef\lst@CommentDM@l#1#2\@empty#3#4#5{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CommentDM@f} -% is slightly more work. First we provide the number of preceding columns. -% \begin{macrocode} -\gdef\lst@CommentDM@f#1{% - \@ifnextchar[{\lst@Comment@@f{#1}}% - {\lst@Comment@@f{#1}[0]}} -% \end{macrocode} -% We define the comment in the same way as above, but we enter comment mode -% if and only if the character is in column |#2| (counting from zero). -% \begin{macrocode} -\gdef\lst@Comment@@f#1[#2]#3\@empty#4#5#6{% - \lst@CArg #3\relax\lst@DefDelimB{}{}% - {\lst@CalcColumn - \ifnum #2=\@tempcnta\else - \expandafter\@gobblethree - \fi}% - #4{#1}{#6\lst@Lmodetrue}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CommentDM@s} -% Nothing special here. -% \begin{macrocode} -\gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{% - \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% - \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@CommentDM@n} -% We either give an error message or define the nested comment. -% \begin{macrocode} -\gdef\lst@CommentDM@n#1#2#3\@empty#4#5#6{% - \ifx\@empty#3\@empty\else - \def\@tempa{#2}\def\@tempb{#3}% - \ifx\@tempa\@tempb - \PackageError{Listings}{Identical delimiters}% - {These delimiters make no sense with nested comments.}% - \else - \lst@CArg #2\relax\lst@DefDelimB - {}% -% \end{macrocode} -% Note that the following |\@gobble| eats an |\else| from |\lst@DefDelimB|. -% \begin{macrocode} - {\ifnum\lst@mode=#1\relax \expandafter\@gobble \fi}% - {}#4{#1}{#6}% - \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}% - \fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsubsection{PODs} -% -% \begin{aspect}{pod} -% PODs are defined as a separate aspect. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{pod} -% \end{macrocode} -% -% \begin{lstkey}{printpod} -% \begin{lstkey}{podcomment} -% We begin with the user keys, which I introduced after communication with -% \lsthelper{Michael~Piotrowski}{1997/11/11}{printpod}. -% \begin{macrocode} -\lst@Key{printpod}{false}[t]{\lstKV@SetIf{#1}\lst@ifprintpod} -\lst@Key{podcomment}{false}[t]{\lstKV@SetIf{#1}\lst@ifpodcomment} -\lst@AddToHookExe{SetLanguage}{\let\lst@ifpodcomment\iffalse} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@PODmode} -% is the static mode for PODs. -% \begin{macrocode} -\lst@NewMode\lst@PODmode -% \end{macrocode} -% \end{macro} -% -% We adjust some characters if the user has selected |podcomment=true|. -% \begin{macrocode} -\lst@AddToHook{SelectCharTable} - {\lst@ifpodcomment - \lst@CArgX =\relax\lst@DefDelimB{}{}% -% \end{macrocode} -% The following code is executed if we've found an equality sign and haven't -% entered a mode (in fact if mode changes are allowed): We `begin drop output' -% and gobble the usual begin of comment sequence (via |\@gobblethree|) if PODs -% aren't be printed. Moreover we gobble it if the current column number is not -% zero---|\@tempcnta| is valued below. -% \begin{macrocode} - {\ifnum\@tempcnta=\z@ - \lst@ifprintpod\else - \def\lst@bnext{\lst@BeginDropOutput\lst@PODmode}% - \expandafter\expandafter\expandafter\@gobblethree - \fi - \else - \expandafter\@gobblethree - \fi}% - \lst@BeginComment\lst@PODmode{{\lst@commentstyle}}% -% \end{macrocode} -% If we come to |=|, we calculate the current column number (zero based). -% \begin{macrocode} - \lst@CArgX =cut\^^M\relax\lst@DefDelimE - {\lst@CalcColumn}% -% \end{macrocode} -% If there is additionally |cut|+EOL and if we are in |\lst@PODmode| but not in -% column one, we must gobble the `end comment sequence'. -% \begin{macrocode} - {\ifnum\@tempcnta=\z@\else - \expandafter\@gobblethree - \fi}% - {}% - \lst@EndComment\lst@PODmode - \fi} -% \end{macrocode} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsubsection{Tags} -% -% \begin{aspect}{html} -% Support for HTML and other `markup languages'. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{html} -% \end{macrocode} -% -% \begin{macro}{\lst@tagtypes} -% Again we begin with the list of tag types. It's rather short. -% \begin{macrocode} -\gdef\lst@tagtypes{s} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@TagKey} -% Again we just put together the arguments for |\lst@Delim| and \ldots -% \begin{macrocode} -\gdef\lst@TagKey#1#2{% - \lst@Delim\lst@tagstyle #2\relax - {Tag}\lst@tagtypes #1% - {\lst@BeginTag\lst@EndTag}% - \@@end\@empty{}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{tag} -% \ldots\ we use the definition here. -% \begin{macrocode} -\lst@Key{tag}\relax{\lst@TagKey\@empty{#1}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{tagstyle} -% You shouldn't need comments on the following two lines, do you? -% \begin{macrocode} -\lst@Key{tagstyle}{}{\def\lst@tagstyle{#1}} -\lst@AddToHook{EmptyStyle}{\let\lst@tagstyle\@empty} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@BeginTag} -% The special things here are: (1) We activate keyword detection inside tags -% and (2) we initialize the switch |\lst@iffirstintag| if necessary. -% \begin{macrocode} -\gdef\lst@BeginTag{% - \lst@DelimOpen - \lst@ifextags\else - {\let\lst@ifkeywords\iftrue - \lst@ifmarkfirstintag \lst@firstintagtrue \fi}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifextags\iffalse} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EndTag} -% is just like the other |\lst@End|\meta{whatever} definitions. -% \begin{macrocode} -\gdef\lst@EndTag{\lst@DelimClose\lst@ifextags\else} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{usekeywordsintag} -% \begin{lstkey}{markfirstintag} -% The second key has already been `used'. -% \begin{macrocode} -\lst@Key{usekeywordsintag}t[t]{\lstKV@SetIf{#1}\lst@ifusekeysintag} -\lst@Key{markfirstintag}f[t]{\lstKV@SetIf{#1}\lst@ifmarkfirstintag} -% \end{macrocode} -% For this, we install a (global) switch, \ldots -% \begin{macrocode} -\gdef\lst@firstintagtrue{\global\let\lst@iffirstintag\iftrue} -\global\let\lst@iffirstintag\iffalse -% \end{macrocode} -% \ldots\ which is reset by the output of an identifier but not by other -% output. -% \begin{macrocode} -\lst@AddToHook{PostOutput}{\lst@tagresetfirst} -\lst@AddToHook{Output} - {\gdef\lst@tagresetfirst{\global\let\lst@iffirstintag\iffalse}} -\lst@AddToHook{OutputOther}{\gdef\lst@tagresetfirst{}} -% \end{macrocode} -% Now we only need to test against this switch in the \hookname{Output} hook. -% \begin{macrocode} -\lst@AddToHook{Output} - {\ifnum\lst@mode=\lst@tagmode - \lst@iffirstintag \let\lst@thestyle\lst@gkeywords@sty \fi -% \end{macrocode} -% Moreover we check here, whether the keyword style is always to be used. -% \begin{macrocode} - \lst@ifusekeysintag\else \let\lst@thestyle\lst@gkeywords@sty\fi - \fi} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@tagmode} -% We allocate the mode and \ldots -% \begin{macrocode} -\lst@NewMode\lst@tagmode -% \end{macrocode} -% deactivate keyword detection if any tag delimiter is defined (see below). -% \begin{macrocode} -\lst@AddToHook{Init}{\global\let\lst@ifnotag\iftrue} -\lst@AddToHook{SelectCharTable}{\let\lst@ifkeywords\lst@ifnotag} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Tag@s} -% The definition of the one and only delimiter type is not that interesting. -% Compared with the others we set |\lst@ifnotag| and enter tag mode only if -% we aren't in tag mode. -% \begin{macrocode} -\gdef\lst@Tag@s#1#2\@empty#3#4#5{% - \global\let\lst@ifnotag\iffalse - \lst@CArg #1\relax\lst@DefDelimB {}{}% - {\ifnum\lst@mode=\lst@tagmode \expandafter\@gobblethree \fi}% - #3\lst@tagmode{#5}% - \lst@CArg #2\relax\lst@DefDelimE {}{}{}#4\lst@tagmode}% -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@BeginCDATA} -% This macro is used by the XML language definition. -% \begin{macrocode} -\gdef\lst@BeginCDATA#1\@empty{% - \lst@TrackNewLines \lst@PrintToken - \lst@EnterMode\lst@GPmode{}\let\lst@ifmode\iffalse - \lst@mode\lst@tagmode #1\lst@mode\lst@GPmode\relax\lst@modetrue} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Replacing input} -% -% \begingroup -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% \endgroup -% -% \begin{macro}{\lst@ReplaceInput} -% is defined in terms of |\lst@CArgX| and |\lst@CDefX|. -% \begin{macrocode} -\def\lst@ReplaceInput#1{\lst@CArgX #1\relax\lst@CDefX{}{}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{literate} -% \lsthelper{Jason~Alexander}{1999/03/10}{literate programming} asked for -% something like that. The key looks for a star and saves the argument. -% \begin{macrocode} -\def\lst@Literatekey#1\@nil@{\let\lst@ifxliterate\lst@if - \def\lst@literate{#1}} -\lst@Key{literate}{}{\@ifstar{\lst@true \lst@Literatekey} - {\lst@false\lst@Literatekey}#1\@nil@} -\lst@AddToHook{SelectCharTable} - {\ifx\lst@literate\@empty\else - \expandafter\lst@Literate\lst@literate{}\relax\z@ - \fi} -% \end{macrocode} -% Internally we don't make use of the `replace input' feature any more. -%^^A We print the preceding text, assign token and length, and output it. -% \begin{macrocode} -\def\lst@Literate#1#2#3{% - \ifx\relax#2\@empty\else - \lst@CArgX #1\relax\lst@CDef - {} - {\let\lst@next\@empty - \lst@ifxliterate - \lst@ifmode \let\lst@next\lst@CArgEmpty \fi - \fi - \ifx\lst@next\@empty - \ifx\lst@OutputBox\@gobble\else - \lst@XPrintToken \let\lst@scanmode\lst@scan@m - \lst@token{#2}\lst@length#3\relax - \lst@XPrintToken - \fi - \let\lst@next\lst@CArgEmptyGobble - \fi - \lst@next}% - \@empty - \expandafter\lst@Literate - \fi} -\def\lst@CArgEmptyGobble#1\@empty{} -% \end{macrocode} -% Note that we check |\lst@OutputBox| for being |\@gobble|. This is due to -% a bug report by \lsthelper{Jared~Warren}{2003/07/10}{literate replacement -% produces "ghosts"}. -% \end{lstkey} -% -% \begin{macro}{\lst@BeginDropInput} -% We deactivate all `process' macros. |\lst@modetrue| does this for all -% up-coming string delimiters, comments, and so on. -% \begin{macrocode} -\def\lst@BeginDropInput#1{% - \lst@EnterMode{#1}% - {\lst@modetrue - \let\lst@OutputBox\@gobble - \let\lst@ifdropinput\iftrue - \let\lst@ProcessLetter\@gobble - \let\lst@ProcessDigit\@gobble - \let\lst@ProcessOther\@gobble - \let\lst@ProcessSpace\@empty - \let\lst@ProcessTabulator\@empty - \let\lst@ProcessFormFeed\@empty}} -\let\lst@ifdropinput\iffalse % init -% \end{macrocode} -% \end{macro} -% -% \begingroup -% \begin{macrocode} -% -% \end{macrocode} -% \endgroup -% -% -% \subsection{Escaping to \LaTeX} -% -% \begin{aspect}{escape} -% We now define the \ldots\ damned \ldots\ the aspect has escaped! -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{escape} -% \end{macrocode} -% -% \begin{lstkey}{texcl} -% Communication with \lsthelper{J\"orn~Wilms}{1997/07/07}{\TeX\ comments} is -% responsible for this key. The definition and the first hooks are easy. -% \begin{macrocode} -\lst@Key{texcl}{false}[t]{\lstKV@SetIf{#1}\lst@iftexcl} -\lst@AddToHook{TextStyle}{\let\lst@iftexcl\iffalse} -\lst@AddToHook{EOL} - {\ifnum\lst@mode=\lst@TeXLmode - \expandafter\lst@escapeend - \expandafter\lst@LeaveAllModes - \expandafter\lst@ReenterModes - \fi} -% \end{macrocode} -% If the user wants \TeX\ comment lines, we print the comment separator and -% interrupt the normal processing. -% \begin{macrocode} -\lst@AddToHook{AfterBeginComment} - {\lst@iftexcl \lst@ifLmode \lst@ifdropinput\else - \lst@PrintToken - \lst@LeaveMode \lst@InterruptModes - \lst@EnterMode{\lst@TeXLmode}{\lst@modetrue\lst@commentstyle}% - \expandafter\expandafter\expandafter\lst@escapebegin - \fi \fi \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@NewMode\lst@TeXLmode -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@ActiveCDefX} -% Same as |\lst@CDefX| but we both make |#1| active and assign a new catcode. -% \begin{macrocode} -\gdef\lst@ActiveCDefX#1{\lst@ActiveCDefX@#1} -\gdef\lst@ActiveCDefX@#1#2#3{ - \catcode`#1\active\lccode`\~=`#1% - \lowercase{\lst@CDefIt~}{#2}{#3}{}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@Escape} -% gets four arguments all in all. The first and second are the `begin' and -% `end' escape sequences, the third is executed when the escape starts, and the -% fourth right before ending it. We use the same mechanism as for \TeX\ comment -% lines. The |\lst@ifdropinput| test has been added after a bug report by -% \lsthelper{Michael~Weber}{2002/03/26}{escape on lines < firstline corrupts -% output}. -% \begin{macrocode} -\gdef\lst@Escape#1#2#3#4{% - \lst@CArgX #1\relax\lst@CDefX - {}% - {\lst@ifdropinput\else - \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken - \lst@InterruptModes - \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}% -% \end{macrocode} -% Now we must define the character sequence to end the escape. -% \begin{macrocode} - \ifx\^^M#2% - \lst@CArg #2\relax\lst@ActiveCDefX - {}% - {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}% - {\lst@MProcessListing}% - \else - \lst@CArg #2\relax\lst@ActiveCDefX - {}% - {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes - \lst@whitespacefalse}% - {}% - \fi - #3\lst@escapebegin - \fi}% - {}} -% \end{macrocode} -% The |\lst@whitespacefalse| above was added after a bug report from -% \lsthelper{Martin~Steffen}{2001/04/07}{mathescape drops subsequent space}. -% \begin{macrocode} -\lst@NewMode\lst@TeXmode -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{escapebegin} -% \begin{lstkey}{escapeend} -% The keys simply store the arguments. -% \begin{macrocode} -\lst@Key{escapebegin}{}{\def\lst@escapebegin{#1}} -\lst@Key{escapeend}{}{\def\lst@escapeend{#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{lstkey}{escapechar} -% The introduction of this key is due to a communication with \lsthelper -% {Rui~Oliveira}{1998/06/05}{escape characters}. We define |\lst@DefEsc| and -% execute it after selecting the standard character table. -% \begin{macrocode} -\lst@Key{escapechar}{} - {\ifx\@empty#1\@empty - \let\lst@DefEsc\relax - \else - \def\lst@DefEsc{\lst@Escape{#1}{#1}{}{}}% - \fi} -\lst@AddToHook{TextStyle}{\let\lst@DefEsc\@empty} -\lst@AddToHook{SelectCharTable}{\lst@DefEsc} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{escapeinside} -% Nearly the same. -% \begin{macrocode} -\lst@Key{escapeinside}{}{\lstKV@TwoArg{#1}% - {\let\lst@DefEsc\@empty - \ifx\@empty##1@empty\else \ifx\@empty##2\@empty\else - \def\lst@DefEsc{\lst@Escape{##1}{##2}{}{}}% - \fi\fi}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{mathescape} -% This is a switch and checked after character table selection. We use -% |\lst@Escape| with math shifts as arguments, but all inside |\hbox| -% to determine the correct width. -% \begin{macrocode} -\lst@Key{mathescape}{false}[t]{\lstKV@SetIf{#1}\lst@ifmathescape} -\lst@AddToHook{SelectCharTable} - {\lst@ifmathescape \lst@Escape{\$}{\$}% - {\setbox\@tempboxa=\hbox\bgroup$}% - {$\egroup \lst@CalcLostSpaceAndOutput}\fi} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \section{Keywords} -% -% -% \subsection{Making tests}\label{iMakingTests} -% -% \begin{aspect}{keywords} -% We begin a new and very important aspect. -% First of all we need to initialize some variables in order to work around a -% bug reported by \lsthelper{Beat~Birkhofer}{2001/06/15}{savemem doesn't work}. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{keywords} -% \end{macrocode} -% \begin{macrocode} -\global\let\lst@ifsensitive\iftrue % init -\global\let\lst@ifsensitivedefed\iffalse % init % \global -% \end{macrocode} -% All keyword tests take the following three arguments. -% \begin{macroargs} -% \item \meta{prefix} -% \item |\lst@|\meta{name}|@list| (a list of macros which contain the keywords) -% \item |\lst@g|\meta{name}|@sty| (global style macro) -% \end{macroargs} -% We begin with non memory-saving tests. -% \begingroup -% \begin{macrocode} -\lst@ifsavemem\else -% \end{macrocode} -% \endgroup -% -% \begin{macro}{\lst@KeywordTest} -% Fast keyword tests take advance of the |\lst@UM| construction in section -% \ref{iCharacterTables}. If |\lst@UM| is empty, all `use macro' characters -% expand to their original characters. Since |\lst|\meta{prefix}|@|\meta{keyword} -% will be equivalent to the appropriate style, we only need to build the control -% sequence |\lst|\meta{prefix}|@|\meta{current token} and assign it to -% |\lst@thestyle|. -% \begin{macrocode} -\gdef\lst@KeywordTest#1#2#3{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#1@\the\lst@token\endcsname - \endgroup - \ifx\@gtempa\relax\else - \let\lst@thestyle\@gtempa - \fi} -% \end{macrocode} -% Note that we need neither |#2| nor |#3| here. -% \end{macro} -% -% \begin{macro}{\lst@KEYWORDTEST} -% Case insensitive tests make the current character string upper case and give -% it to a submacro similar to |\lst@KeywordTest|. -% \begin{macrocode} -\gdef\lst@KEYWORDTEST{% - \uppercase\expandafter{\expandafter - \lst@KEYWORDTEST@\the\lst@token}\relax} -\gdef\lst@KEYWORDTEST@#1\relax#2#3#4{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#2@#1\endcsname - \endgroup - \ifx\@gtempa\relax\else - \let\lst@thestyle\@gtempa - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@WorkingTest} -% \begin{macro}{\lst@WORKINGTEST} -% The same except that |\lst|\meta{prefix}|@|\meta{current token} might be -% a working procedure; it is executed. -% \begin{macrocode} -\gdef\lst@WorkingTest#1#2#3{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#1@\the\lst@token\endcsname - \endgroup - \@gtempa} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@WORKINGTEST{% - \uppercase\expandafter{\expandafter - \lst@WORKINGTEST@\the\lst@token}\relax} -\gdef\lst@WORKINGTEST@#1\relax#2#3#4{% - \begingroup \let\lst@UM\@empty - \global\expandafter\let\expandafter\@gtempa - \csname\@lst#2@#1\endcsname - \endgroup - \@gtempa} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@DefineKeywords} -% Eventually we need macros which define and undefine -% |\lst|\meta{prefix}|@|\meta{keyword}. Here the arguments are -% \begin{macroargs} -% \item \meta{prefix} -% \item |\lst@|\meta{name} (a keyword list) -% \item |\lst@g|\meta{name}|@sty| -% \end{macroargs} -% We make the keywords upper case if necessary, \ldots -% \begin{macrocode} -\gdef\lst@DefineKeywords#1#2#3{% - \lst@ifsensitive - \def\lst@next{\lst@for#2}% - \else - \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}% - \fi - \lst@next\do -% \end{macrocode} -% \ldots\space iterate through the list, and make -% |\lst|\meta{prefix}|@|\meta{keyword} (if undefined) equivalent to -% |\lst@g|\meta{name}|@sty| which is possibly a working macro. -% \begin{macrocode} - {\expandafter\ifx\csname\@lst#1@##1\endcsname\relax - \global\expandafter\let\csname\@lst#1@##1\endcsname#3% - \fi}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@UndefineKeywords} -% We make the keywords upper case if necessary, \ldots -% \begin{macrocode} -\gdef\lst@UndefineKeywords#1#2#3{% - \lst@ifsensitivedefed - \def\lst@next{\lst@for#2}% - \else - \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}% - \fi - \lst@next\do -% \end{macrocode} -% \ldots\space iterate through the list, and `undefine' -% |\lst|\meta{prefix}|@|\meta{keyword} if it's equivalent to -% |\lst@g|\meta{name}|@sty|. -% \begin{macrocode} - {\expandafter\ifx\csname\@lst#1@##1\endcsname#3% - \global\expandafter\let\csname\@lst#1@##1\endcsname\relax - \fi}} -% \end{macrocode} -% Thanks to \lsthelper{Magnus~Lewis-Smith}{1999/09/08}{keywords do not -% undefine} a wrong |#2| in the replacement text could be changed to |#3|. -% \end{macro} -% -% \begingroup -% And now memory-saving tests. -% \begin{macrocode} -\fi -\lst@ifsavemem -% \end{macrocode} -% \endgroup -% -% \begin{macro}{\lst@IfOneOutOf} -% The definition here is similar to |\lst@IfOneOf|, but its second argument -% is a |\lst@|\meta{name}|@list|. Therefore we test a list of macros here. -% \begin{macrocode} -\gdef\lst@IfOneOutOf#1\relax#2{% - \def\lst@temp##1,#1,##2##3\relax{% - \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}% - \def\lst@next{\lst@IfOneOutOf@#1\relax}% - \expandafter\lst@next#2\relax\relax} -% \end{macrocode} -% We either execute the \meta{else} part or make the next test. -% \begin{macrocode} -\gdef\lst@IfOneOutOf@#1\relax#2#3{% - \ifx#2\relax - \expandafter\@secondoftwo - \else - \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax - \expandafter\lst@next - \fi} -\ifx\iffalse\else\fi -\gdef\lst@IOOOfirst#1\relax#2#3{\fi#2} -% \end{macrocode} -% The line |\ifx\iffalse\else\fi| balances the |\fi| inside |\lst@IOOOfirst|. -% \end{macro} -% -% \begin{macro}{\lst@IFONEOUTOF} -% As in |\lst@IFONEOF| we need two |\uppercase|s here. -% \begin{macrocode} -\gdef\lst@IFONEOUTOF#1\relax#2{% - \uppercase{\def\lst@temp##1,#1},##2##3\relax{% - \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}% - \def\lst@next{\lst@IFONEOUTOF@#1\relax}% - \expandafter\lst@next#2\relax} -\gdef\lst@IFONEOUTOF@#1\relax#2#3{% - \ifx#2\relax - \expandafter\@secondoftwo - \else - \uppercase - {\expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}% - \expandafter\lst@next - \fi} -% \end{macrocode} -% Note: The third last line uses the fact that keyword lists (not the list -% of keyword lists) are already made upper case if keywords are insensitive. -% \end{macro} -% -% \begin{macro}{\lst@KWTest} -% is a helper for the keyword and working identifier tests. We expand the -% token and call |\lst@IfOneOf|. The tests below will append appropriate -% \meta{then} and \meta{else} arguments. -% \begin{macrocode} -\gdef\lst@KWTest{% - \begingroup \let\lst@UM\@empty - \expandafter\xdef\expandafter\@gtempa\expandafter{\the\lst@token}% - \endgroup - \expandafter\lst@IfOneOutOf\@gtempa\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@KeywordTest} -% \begin{macro}{\lst@KEYWORDTEST} -% are fairly easy now. Note that we don't need |#1|=\meta{prefix} here. -% \begin{macrocode} -\gdef\lst@KeywordTest#1#2#3{\lst@KWTest #2{\let\lst@thestyle#3}{}} -\global\let\lst@KEYWORDTEST\lst@KeywordTest -% \end{macrocode} -% For case insensitive tests we assign the insensitive version to -% |\lst@IfOneOutOf|. Thus we need no extra definition here. -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@WorkingTest} -% \begin{macro}{\lst@WORKINGTEST} -% Ditto. -% \begin{macrocode} -\gdef\lst@WorkingTest#1#2#3{\lst@KWTest #2#3{}} -\global\let\lst@WORKINGTEST\lst@WorkingTest -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begingroup -% \begin{macrocode} -\fi -% \end{macrocode} -% \endgroup -% -% \begin{lstkey}{sensitive} -% is a switch, preset \texttt{true} every language selection. -% \begin{macrocode} -\lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive} -\lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue} -% \end{macrocode} -% We select case insensitive definitions if necessary. -% \begin{macrocode} -\lst@AddToHook{Init} - {\lst@ifsensitive\else - \let\lst@KeywordTest\lst@KEYWORDTEST - \let\lst@WorkingTest\lst@WORKINGTEST - \let\lst@IfOneOutOf\lst@IFONEOUTOF - \fi} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@MakeMacroUppercase} -% makes the contents of |#1| (if defined) upper case. -% \begin{macrocode} -\gdef\lst@MakeMacroUppercase#1{% - \ifx\@undefined#1\else \uppercase\expandafter - {\expandafter\def\expandafter#1\expandafter{#1}}% - \fi} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Installing tests} -% -% \begin{macro}{\lst@InstallTest} -% The arguments are -% \begin{macroargs} -% \item \meta{prefix} -% \item |\lst@|\meta{name}|@list| -% \item |\lst@|\meta{name} -% \item |\lst@g|\meta{name}|@list| -% \item |\lst@g|\meta{name} -% \item |\lst@g|\meta{name}|@sty| -% \item \alternative{w,s} (working procedure or style) -% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) -% \end{macroargs} -% We just insert hook material. The tests will be inserted on demand. -% \begin{macrocode} -\gdef\lst@InstallTest#1#2#3#4#5#6#7#8{% - \lst@AddToHook{TrackKeywords}{\lst@TrackKeywords{#1}#2#4#6#7#8}% - \lst@AddToHook{PostTrackKeywords}{\lst@PostTrackKeywords#2#3#4#5}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{Init}{\lsthk@TrackKeywords\lsthk@PostTrackKeywords} -\lst@AddToHook{TrackKeywords} - {\global\let\lst@DoDefineKeywords\@empty}% init -\lst@AddToHook{PostTrackKeywords} - {\lst@DoDefineKeywords - \global\let\lst@DoDefineKeywords\@empty}% init -% \end{macrocode} -% We have to detect the keywords somewhere. -% \begin{macrocode} -\lst@AddToHook{Output}{\lst@ifkeywords \lsthk@DetectKeywords \fi} -\lst@AddToHook{DetectKeywords}{}% init -\lst@AddToHook{ModeTrue}{\let\lst@ifkeywords\iffalse} -\lst@AddToHookExe{Init}{\let\lst@ifkeywords\iftrue} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@InstallTestNow} -% actually inserts a test. -% \begin{macroargs} -% \item \meta{prefix} -% \item |\lst@|\meta{name}|@list| -% \item |\lst@g|\meta{name}|@sty| -% \item \alternative{w,s} (working procedure or style) -% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) -% \end{macroargs} -% For example, |#4#5|=|sd| will add -% |\lst@KeywordTest{|\meta{prefix}|}| -% |\lst@|\meta{name}|@list| |\lst@g|\meta{name}|@sty| -% to the \hookname{DetectKeywords} hook. -% \begin{macrocode} -\gdef\lst@InstallTestNow#1#2#3#4#5{% - \@ifundefined{\string#2#1}% - {\global\@namedef{\string#2#1}{}% - \edef\@tempa{% - \noexpand\lst@AddToHook{\ifx#5dDetectKeywords\else Output\fi}% - {\ifx #4w\noexpand\lst@WorkingTest - \else\noexpand\lst@KeywordTest \fi - {#1}\noexpand#2\noexpand#3}}% -% \end{macrocode} -% If we are advised to save memory, we insert a test for each \meta{name}. -% Otherwise we install the tests according to \meta{prefix}. -% \begin{macrocode} - \lst@ifsavemem - \@tempa - \else - \@ifundefined{\@lst#1@if@ins}% - {\@tempa \global\@namedef{\@lst#1@if@ins}{}}% - {}% - \fi} - {}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@TrackKeywords} -% Now it gets a bit tricky. We expand the class list |\lst@|\meta{name}|@list| -% behind |\lst@TK@{|\meta{prefix}|}||\lst@g|\meta{name}|@sty| and use two -% |\relax|es as terminators. This will define the keywords of all the classes -% as keywords of type \meta{prefix}. More details come soon. -% \begin{macrocode} -\gdef\lst@TrackKeywords#1#2#3#4#5#6{% - \lst@false - \def\lst@arg{{#1}#4}% - \expandafter\expandafter\expandafter\lst@TK@ - \expandafter\lst@arg#2\relax\relax -% \end{macrocode} -% And nearly the same to undefine all out-dated keywords, which is necessary -% only if we don't save memory. -% \begin{macrocode} - \lst@ifsavemem\else - \def\lst@arg{{#1}#4#2}% - \expandafter\expandafter\expandafter\lst@TK@@ - \expandafter\lst@arg#3\relax\relax - \fi -% \end{macrocode} -% Finally we install the keyword test if keywords changed, in particular if -% they are defined the first time. Note that |\lst@InstallTestNow| inserts a -% test only once. -% \begin{macrocode} - \lst@if \lst@InstallTestNow{#1}#2#4#5#6\fi} -% \end{macrocode} -% Back to the current keywords. Global macros |\lst@g|\meta{id} contain -% globally defined keywords, whereas |\lst@|\meta{id} conatin the true -% keywords. This way we can keep track of the keywords: If keywords or -% \keyname{sensitive} changed, we undefine the old (= globally defined) -% keywords and define the true ones. The arguments of |\lst@TK@| are -% \begin{macroargs} -% \item \meta{prefix} -% \item |\lst@g|\meta{name}|@sty| -% \item |\lst@|\meta{id} -% \item |\lst@g|\meta{id} -% \end{macroargs} -% Thanks to \lsthelper{Holger~Arndt}{2004/05/27}{bad \lst@UndefineKeywords -% \lst@DefineKeywords sequence if keyword crosses orders in two languages} -% the definition of keywords is now delayed via |\lst@DoDefineKeywords|. -% \begin{macrocode} -\gdef\lst@TK@#1#2#3#4{% - \ifx\lst@ifsensitive\lst@ifsensitivedefed - \ifx#3#4\else - \lst@true - \lst@ifsavemem\else - \lst@UndefineKeywords{#1}#4#2% - \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}% - \fi - \fi - \else - \ifx#3\relax\else - \lst@true - \lst@ifsavemem\else - \lst@UndefineKeywords{#1}#4#2% - \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}% - \fi - \fi - \fi -% \end{macrocode} -% We don't define and undefine keywords if we try to save memory. But we -% possibly need to make them upper case, which again wastes some memory. -% \begin{macrocode} - \lst@ifsavemem \ifx#3\relax\else - \lst@ifsensitive\else \lst@MakeMacroUppercase#3\fi - \fi \fi -% \end{macrocode} -% Reaching the end of the class list, we end the loop. -% \begin{macrocode} - \ifx#3\relax - \expandafter\@gobblethree - \fi - \lst@TK@{#1}#2} -% \end{macrocode} -% Here now we undefine the out-dated keywords. While not reaching the end of -% the global list, we look whether the keyword class |#4#5| is still in use or -% needs to be undefined. Our arguments are -% \begin{macroargs} -% \item \meta{prefix} -% \item |\lst@g|\meta{name}|@sty| -% \item |\lst@|\meta{name}|@list| -% \item |\lst@|\meta{id} -% \item |\lst@g|\meta{id} -% \end{macroargs} -% \begin{macrocode} -\gdef\lst@TK@@#1#2#3#4#5{% - \ifx#4\relax - \expandafter\@gobblefour - \else - \lst@IfSubstring{#4#5}#3{}{\lst@UndefineKeywords{#1}#5#2}% - \fi - \lst@TK@@{#1}#2#3} -% \end{macrocode} -% Keywords are up-to-date after \hookname{InitVars}. -% \begin{macrocode} -\lst@AddToHook{InitVars} - {\global\let\lst@ifsensitivedefed\lst@ifsensitive} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@PostTrackKeywords} -% After updating all the keywords, the global keywords and the global list -% become equivalent to the local ones. -% \begin{macrocode} -\gdef\lst@PostTrackKeywords#1#2#3#4{% - \lst@ifsavemem\else - \global\let#3#1% - \global\let#4#2% - \fi} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Classes and families} -% -% \begin{lstkey}{classoffset} -% just stores the argument in a macro. -% \begin{macrocode} -\lst@Key{classoffset}\z@{\def\lst@classoffset{#1}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@InstallFamily} -% Recall the parameters -% \begin{macroargs} -% \item \meta{prefix} -% \item \meta{name} -% \item \meta{style name} -% \item \meta{style init} -% \item \meta{default style name} -% \item \meta{working procedure} -% \item \alternative{l,o} (language or other key) -% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) -% \end{macroargs} -% First we define the keys and the style key \meta{style name} if and only if -% the name is not empty. -% \begin{macrocode} -\gdef\lst@InstallFamily#1#2#3#4#5{% - \lst@Key{#2}\relax{\lst@UseFamily{#2}##1\relax\lst@MakeKeywords}% - \lst@Key{more#2}\relax - {\lst@UseFamily{#2}##1\relax\lst@MakeMoreKeywords}% - \lst@Key{delete#2}\relax - {\lst@UseFamily{#2}##1\relax\lst@DeleteKeywords}% - \ifx\@empty#3\@empty\else - \lst@Key{#3}{#4}{\lstKV@OptArg[\@ne]{##1}% - {\@tempcnta\lst@classoffset \advance\@tempcnta####1\relax - \@namedef{lst@#3\ifnum\@tempcnta=\@ne\else \the\@tempcnta - \fi}{####2}}}% - \fi - \expandafter\lst@InstallFamily@ - \csname\@lst @#2@data\expandafter\endcsname - \csname\@lst @#5\endcsname {#1}{#2}{#3}} -% \end{macrocode} -% Now we check whether \meta{working procedure} is empty. Accordingly we use -% \texttt working procedure or \texttt style in the `data' definition. -% The working procedure is defined right here if necessary. -% \begin{macrocode} -\gdef\lst@InstallFamily@#1#2#3#4#5#6#7#8{% - \gdef#1{{#3}{#4}{#5}#2#7}% - \long\def\lst@temp##1{#6}% - \ifx\lst@temp\@gobble - \lst@AddTo#1{s#8}% - \else - \lst@AddTo#1{w#8}% - \global\@namedef{lst@g#4@wp}##1{#6}% - \fi} -% \end{macrocode} -% Nothing else is defined here, all the rest is done on demand. -% \end{macro} -% -% \begin{macro}{\lst@UseFamily} -% We look for the optional class number, provide this member, \ldots -% \begin{macrocode} -\gdef\lst@UseFamily#1{% - \def\lst@family{#1}% - \@ifnextchar[\lst@UseFamily@{\lst@UseFamily@[\@ne]}} -\gdef\lst@UseFamily@[#1]{% - \@tempcnta\lst@classoffset \advance\@tempcnta#1\relax - \lst@ProvideFamily\lst@family -% \end{macrocode} -% \ldots\space and build the control sequences \ldots -% \begin{macrocode} - \lst@UseFamily@a - {\lst@family\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}} -\gdef\lst@UseFamily@a#1{% - \expandafter\lst@UseFamily@b - \csname\@lst @#1@list\expandafter\endcsname - \csname\@lst @#1\expandafter\endcsname - \csname\@lst @#1@also\expandafter\endcsname - \csname\@lst @g#1\endcsname} -% \end{macrocode} -% \ldots\space required for |\lst@MakeKeywords| and |#6|. -% \begin{macrocode} -\gdef\lst@UseFamily@b#1#2#3#4#5\relax#6{\lstKV@XOptArg[]{#5}#6#1#2#3#4} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ProvideFamily} -% provides the member `|\the\@tempcnta|' of the family |#1|. We do nothing if -% the member already exists. Otherwise we expand the data macro defined above. -% Note that we don't use the counter if it equals one. Since a bug report by -% \lsthelper{Kris~Luyten}{2002/08/03}{Undefined control sequence \lst@thestyle} -% keyword families use the prefix |lstfam| instead of |lst|. The marker -% |\lstfam@#1|\oarg{number} is defined globally since a bug report by -% \lsthelper{Edsko~de~Vries}{2003/07/20}{bad keywords with language selections -% only in optional arguments}. -% \begin{macrocode} -\gdef\lst@ProvideFamily#1{% - \@ifundefined{lstfam@#1\ifnum\@tempcnta=\@ne\else\the\@tempcnta\fi}% - {\global\@namedef{lstfam@#1\ifnum\@tempcnta=\@ne\else - \the\@tempcnta\fi}{}% - \expandafter\expandafter\expandafter\lst@ProvideFamily@ - \csname\@lst @#1@data\endcsname - {\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}% - {}}% -% \end{macrocode} -% Now we have the following arguments -% \begin{macroargs} -% \item \meta{prefix} -% \item \meta{name} -% \item \meta{style name} -% \item \meta{default style name} -% \item \alternative{l,o} (language or other key) -% \item \alternative{w,s} (working procedure or style) -% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) -% \item |\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi| -% \end{macroargs} -% We define |\lst@g|\meta{name}\meta{number}|@sty| to call either -% |\lst@g|\meta{name}|@wp| with the number as argument or -% |\lst@|\meta{style name}\meta{number} where the number belongs to the control -% sequence. -% \begin{macrocode} -\gdef\lst@ProvideFamily@#1#2#3#4#5#6#7#8{% - \expandafter\xdef\csname\@lst @g#2#8@sty\endcsname - {\if #6w% - \expandafter\noexpand\csname\@lst @g#2@wp\endcsname{#8}% - \else - \expandafter\noexpand\csname\@lst @#3#8\endcsname - \fi}% -% \end{macrocode} -% We ensure the existence of the style macro. This is done in the -% \hookname{Init} hook by assigning the default style if necessary. -% \begin{macrocode} - \ifx\@empty#3\@empty\else - \edef\lst@temp{\noexpand\lst@AddToHook{Init}{% - \noexpand\lst@ProvideStyle\expandafter\noexpand - \csname\@lst @#3#8\endcsname\noexpand#4}}% - \lst@temp - \fi -% \end{macrocode} -% We call a submacro to do the rest. It requires some control sequences. -% \begin{macrocode} - \expandafter\lst@ProvideFamily@@ - \csname\@lst @#2#8@list\expandafter\endcsname - \csname\@lst @#2#8\expandafter\endcsname - \csname\@lst @#2#8@also\expandafter\endcsname - \csname\@lst @g#2#8@list\expandafter\endcsname - \csname\@lst @g#2#8\expandafter\endcsname - \csname\@lst @g#2#8@sty\expandafter\endcsname - {#1}#5#6#7} -% \end{macrocode} -% Now we have (except that \meta{number} is possibly always missing) -% \begin{macroargs} -% \item |\lst@|\meta{name}\meta{number}|@list| -% \item |\lst@|\meta{name}\meta{number} -% \item |\lst@|\meta{name}\meta{number}|@also| -% \item |\lst@g|\meta{name}\meta{number}|@list| -% \item |\lst@g|\meta{name}\meta{number} -% \item |\lst@g|\meta{name}\meta{number}|@sty| -% \item \meta{prefix} -% \item \alternative{l,o} (language or other key) -% \item \alternative{w,s} (working procedure or style) -% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) -% \end{macroargs} -% Note that |#9| and `|#10|' are read by |\lst@InstallTest|. We initialize all -% required `variables' (at \hookname{SetLanguage}) and install the test (which -% definition is in fact also delayed). -% \begin{macrocode} -\gdef\lst@ProvideFamily@@#1#2#3#4#5#6#7#8{% - \gdef#1{#2#5}\global\let#2\@empty \global\let#3\@empty % init - \gdef#4{#2#5}\global\let#5\@empty % init - \if #8l\relax - \lst@AddToHook{SetLanguage}{\def#1{#2#5}\let#2\@empty}% - \fi - \lst@InstallTest{#7}#1#2#4#5#6} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@InstallKeywords} -% Now we take advance of the optional argument construction above. Thus, we -% just insert |[\@ne]| as \meta{number} in the definitions of the keys. -% \begin{macrocode} -\gdef\lst@InstallKeywords#1#2#3#4#5{% - \lst@Key{#2}\relax - {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeKeywords}% - \lst@Key{more#2}\relax - {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeMoreKeywords}% - \lst@Key{delete#2}\relax - {\lst@UseFamily{#2}[\@ne]##1\relax\lst@DeleteKeywords}% - \ifx\@empty#3\@empty\else - \lst@Key{#3}{#4}{\@namedef{lst@#3}{##1}}% - \fi - \expandafter\lst@InstallFamily@ - \csname\@lst @#2@data\expandafter\endcsname - \csname\@lst @#5\endcsname {#1}{#2}{#3}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ProvideStyle} -% If the style macro |#1| is not defined, it becomes equivalent to |#2|. -% \begin{macrocode} -\gdef\lst@ProvideStyle#1#2{% - \ifx#1\@undefined \let#1#2% - \else\ifx#1\relax \let#1#2\fi\fi} -% \end{macrocode} -% \end{macro} -% -% Finally we define |\lst@MakeKeywords|, \ldots, |\lst@DeleteKeywords|. -% We begin with two helper. -% -% \begin{macro}{\lst@BuildClassList} -% After |#1| follows a comma separated list of keyword classes terminated by -% |,\relax,|, e.g.~|keywords2,emph1,\relax,|. For each \meta{item} in this -% list we \emph{append} the two macros |\lst@|\meta{item}|\lst@g|\meta{item} -% to |#1|. -% \begin{macrocode} -\gdef\lst@BuildClassList#1#2,{% - \ifx\relax#2\@empty\else - \ifx\@empty#2\@empty\else - \lst@lExtend#1{\csname\@lst @#2\expandafter\endcsname - \csname\@lst @g#2\endcsname}% - \fi - \expandafter\lst@BuildClassList\expandafter#1 - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DeleteClassesIn} -% deletes pairs of tokens, namely the arguments |#2#3| to the submacro. -% \begin{macrocode} -\gdef\lst@DeleteClassesIn#1#2{% - \expandafter\lst@DCI@\expandafter#1#2\relax\relax} -\gdef\lst@DCI@#1#2#3{% - \ifx#2\relax - \expandafter\@gobbletwo - \else -% \end{macrocode} -% If we haven't reached the end of the class list, we define a temporary macro -% which removes all appearances. -% \begin{macrocode} - \def\lst@temp##1#2#3##2{% - \lst@lAddTo#1{##1}% - \ifx ##2\relax\else - \expandafter\lst@temp - \fi ##2}% - \let\@tempa#1\let#1\@empty - \expandafter\lst@temp\@tempa#2#3\relax - \fi - \lst@DCI@#1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@MakeKeywords} -% We empty some macros and make use of |\lst@MakeMoreKeywords|. -% Note that this and the next two definitions have the following arguments: -% \begin{macroargs} -% \item class list (in brackets) -% \item keyword list -% \item |\lst@|\meta{name}|@list| -% \item |\lst@|\meta{name} -% \item |\lst@|\meta{name}|@also| -% \item |\lst@g|\meta{name} -% \end{macroargs} -% \begin{macrocode} -\gdef\lst@MakeKeywords[#1]#2#3#4#5#6{% - \def#3{#4#6}\let#4\@empty \let#5\@empty - \lst@MakeMoreKeywords[#1]{#2}#3#4#5#6} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@MakeMoreKeywords} -% We append classes and keywords. -% \begin{macrocode} -\gdef\lst@MakeMoreKeywords[#1]#2#3#4#5#6{% - \lst@BuildClassList#3#1,\relax,% - \lst@DefOther\lst@temp{,#2}\lst@lExtend#4\lst@temp} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@DeleteKeywords} -% We convert the keyword arguments via |\lst@MakeKeywords| and remove the -% classes and keywords. -% \begin{macrocode} -\gdef\lst@DeleteKeywords[#1]#2#3#4#5#6{% - \lst@MakeKeywords[#1]{#2}\@tempa\@tempb#5#6% - \lst@DeleteClassesIn#3\@tempa - \lst@DeleteKeysIn#4\@tempb} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Main families and classes} -% -% -% \paragraph{Keywords} -% -% \begin{lstkey}{keywords} -% Defining the keyword family gets very, very easy. -% \begin{macrocode} -\lst@InstallFamily k{keywords}{keywordstyle}\bfseries{keywordstyle}{}ld -% \end{macrocode} -% The following macro sets a keywordstyle, which \ldots -% \begin{macrocode} -\gdef\lst@DefKeywordstyle#1#2\@nil@{% - \@namedef{lst@keywordstyle\ifnum\@tempcnta=\@ne\else\the\@tempcnta - \fi}{#1#2}}% -% \end{macrocode} -% \ldots\space is put together here. If we detect a star after the class -% number, we insert code to make the keyword uppercase. -% \begin{macrocode} -\lst@Key{keywordstyle}{\bfseries}{\lstKV@OptArg[\@ne]{#1}% - {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax - \@ifstar{\lst@DefKeywordstyle{\uppercase\expandafter{% - \expandafter\lst@token - \expandafter{\the\lst@token}}}}% - {\lst@DefKeywordstyle{}}##2\@nil@}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{ndkeywords} -% Second order keywords use the same trick as |\lst@InstallKeywords|. -% \begin{macrocode} -\lst@Key{ndkeywords}\relax - {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeKeywords}% -\lst@Key{morendkeywords}\relax - {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeMoreKeywords}% -\lst@Key{deletendkeywords}\relax - {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@DeleteKeywords}% -\lst@Key{ndkeywordstyle}\relax{\@namedef{lst@keywordstyle2}{#1}}% -% \end{macrocode} -% \lsthelper{Dr.~Peter~Leibner}{1999/11/05}{undefined \lst@UseKeywords, -% Illegal parameter number (##1)} reported two bugs: |\lst@UseKeywords| and -% |##1| became |\lst@UseFamily| and |#1|. -% \end{lstkey} -% -% \begin{lstkey}{keywordsprefix} -% is implemented experimentally. The one and only prefix indicates its -% presence by making |\lst@prefixkeyword| empty. We can catch this information -% in the \keyname{Output} hook. -% \begin{macrocode} -\lst@Key{keywordsprefix}\relax{\lst@DefActive\lst@keywordsprefix{#1}} -\global\let\lst@keywordsprefix\@empty -\lst@AddToHook{SelectCharTable} - {\ifx\lst@keywordsprefix\@empty\else - \expandafter\lst@CArg\lst@keywordsprefix\relax - \lst@CDef{}% - {\lst@ifletter\else - \global\let\lst@prefixkeyword\@empty - \fi}% - {}% - \fi} -\lst@AddToHook{Init}{\global\let\lst@prefixkeyword\relax} -\lst@AddToHook{Output} - {\ifx\lst@prefixkeyword\@empty - \let\lst@thestyle\lst@gkeywords@sty - \global\let\lst@prefixkeyword\relax - \fi}% -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{otherkeywords} -% Thanks to \lsthelper{Bradford~Chamberlain}{2001/07/07}{otherkeywords={@,@^} -% does not work} we now iterate down the list of `other keywords' and make each -% active---instead of making the whole argument active. We append the active -% token sequence to |\lst@otherkeywords| to define each `other' keyword. -% \begin{macrocode} -\lst@Key{otherkeywords}{}{% - \let\lst@otherkeywords\@empty - \lst@for{#1}\do{% - \lst@MakeActive{##1}% - \lst@lExtend\lst@otherkeywords{% - \expandafter\lst@CArg\lst@temp\relax\lst@CDef - {}\lst@PrintOtherKeyword\@empty}}} -\lst@AddToHook{SelectCharTable}{\lst@otherkeywords} -% \end{macrocode} -% |\lst@PrintOtherkeyword| has been changed to |\lst@PrintOtherKeyword| after a -% bug report by \lsthelper{Peter~Bartke}{2001/11/06}{undefined control sequence -% \lst@PrintOtherkeyword}. -% \end{lstkey} -% -% \begin{macro}{\lst@PrintOtherKeyword} -% print preceding characters, prepare the output and typeset the argument in -% keyword style. \lsthelper{James~Willans}{2004/07/23}{problem: otherkeywords} -% reported problems when the output routine is invoked within |\begingroup| and -% |\endgroup|. Now the definition is restructured. -% \begin{macrocode} -\gdef\lst@PrintOtherKeyword#1\@empty{% - \lst@XPrintToken - \begingroup - \lst@modetrue \lsthk@TextStyle - \let\lst@ProcessDigit\lst@ProcessLetter - \let\lst@ProcessOther\lst@ProcessLetter - \lst@lettertrue - #1% - \lst@SaveToken - \endgroup - \lst@RestoreToken - \global\let\lst@savedcurrstyle\lst@currstyle - \let\lst@currstyle\lst@gkeywords@sty - \lst@Output - \let\lst@currstyle\lst@savedcurrstyle} -% \end{macrocode} -% \begin{TODO} -% Which part of \hookname{TextStyle} hook is required? Is it required anymore, -% i.e.after the restruction? Need to move it elsewhere? -% \end{TODO} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \paragraph{The emphasize family} -% -% \begin{aspect}{emph} -% is just one macro call here. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{emph} -\lst@InstallFamily e{emph}{emphstyle}{}{emphstyle}{}od -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \paragraph{\TeX\ control sequences} -% -% \begin{aspect}{tex} -% Here we check the last `other' processed token. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{tex} -% \end{macrocode} -% \begin{macrocode} -\lst@InstallFamily {cs}{texcs}{texcsstyle}\relax{keywordstyle} - {\ifx\lst@lastother\lstum@backslash - \expandafter\let\expandafter\lst@thestyle - \csname lst@texcsstyle#1\endcsname - \fi} - ld -% \end{macrocode} -% The style-key checks for the optional star (which must be in front of -% the optional class argument). -% \begin{macrocode} -\lst@Key{texcsstyle}\relax - {\@ifstar{\lst@true\lst@DefTexcsstyle}% - {\lst@false\lst@DefTexcsstyle}#1\@nil@} -\gdef\lst@DefTexcsstyle#1\@nil@{% - \let\lst@iftexcsincludebs\lst@if - \lstKV@OptArg[\@ne]{#1}% - {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax - \@namedef{lst@texcsstyle\ifnum\@tempcnta=\@ne\else - \the\@tempcnta \fi}{##2}}}% -\global\let\lst@iftexcsincludebs\iffalse -% \end{macrocode} -% To make the backslash belong to the control sequence, it is merged with -% the following token. This option was suggested by \lsthelper{Morten~H\o gholm} -% {2004/07/16}{defining new (colored) texcs}. -% \begin{macrocode} -\let\lst@iftexcsincludebs\iffalse -\lst@AddToHook{SelectCharTable} -{\lst@iftexcsincludebs \ifx\@empty\lst@texcs\else - \lst@DefSaveDef{`\\}\lsts@texcsbs - {\ifx\lst@lastother\lstum@backslash - \lsts@texcsbs\lst@XPrintToken - \else - \lst@Merge\lsts@texcsbs - \fi}% - \fi \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \paragraph{Compiler directives} -% -% \begin{aspect}{directives} -% \begin{lstkey}{directives} -% First some usual stuff. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{directives} -% \end{macrocode} -% The initialization of |\lst@directives| has been added after a bug report -% from \lsthelper{Kris~Luyten}{2002/07/30}{Undefined control sequence -% \lst@thestyle caused by undefined \lst@directives after loading C}. -% \begin{macrocode} -\lst@NewMode\lst@CDmode -\lst@AddToHook{EOL}{\ifnum\lst@mode=\lst@CDmode \lst@LeaveMode \fi} -\lst@InstallKeywords{d}{directives}{directivestyle}\relax{keywordstyle} - {\ifnum\lst@mode=\lst@CDmode - \let\lst@thestyle\lst@directivestyle - \fi} - ld -\global\let\lst@directives\@empty % init -% \end{macrocode} -% Now we define a new delimiter for directives: We enter `directive mode' -% only in the first column. -% \begin{macrocode} -\lst@AddTo\lst@delimtypes{,directive} -\gdef\lst@Delim@directive#1\@empty#2#3#4{% - \lst@CArg #1\relax\lst@DefDelimB - {\lst@CalcColumn}% - {}% - {\ifnum\@tempcnta=\z@ - \def\lst@bnext{#2\lst@CDmode{#4\lst@Lmodetrue}% - \let\lst@currstyle\lst@directivestyle}% - \fi - \@gobblethree}% - #2\lst@CDmode{#4\lst@Lmodetrue}} -% \end{macrocode} -% We introduce a new string type (thanks to \lsthelper{R.~Isernhagen} -% {1999/11/12}{float isn't keyword in #include }), which \ldots -% \begin{macrocode} -\lst@AddTo\lst@stringtypes{,directive} -\gdef\lst@StringDM@directive#1#2#3\@empty{% - \lst@CArg #2\relax\lst@CDef - {}% -% \end{macrocode} -% \ldots\space is active only in |\lst@CDmode|: -% \begin{macrocode} - {\let\lst@bnext\lst@CArgEmpty - \ifnum\lst@mode=\lst@CDmode - \def\lst@bnext{\lst@BeginString{#1}}% - \fi - \lst@bnext}% - \@empty - \lst@CArg #3\relax\lst@CDef - {}% - {\let\lst@enext\lst@CArgEmpty - \ifnum #1=\lst@mode - \let\lst@bnext\lst@EndString - \fi - \lst@bnext}% - \@empty} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Keyword comments} -% -% \begin{aspect}{keywordcomments} -% includes both comment types and is possibly split into this and |dkcs|. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords,comments]{keywordcomments} -% \end{macrocode} -% -% \begin{macro}{\lst@BeginKC} -% \begin{macro}{\lst@BeginKCS} -% Starting a keyword comment is easy, but: (1) The submacros are called -% outside of two group levels, and \ldots -% \begin{macrocode} -\lst@NewMode\lst@KCmode \lst@NewMode\lst@KCSmode -\gdef\lst@BeginKC{\aftergroup\aftergroup\aftergroup\lst@BeginKC@}% -\gdef\lst@BeginKC@{% - \lst@ResetToken - \lst@BeginComment\lst@KCmode{{\lst@commentstyle}\lst@modetrue}% - \@empty}% -\gdef\lst@BeginKCS{\aftergroup\aftergroup\aftergroup\lst@BeginKCS@}% -\gdef\lst@BeginKCS@{% - \lst@ResetToken - \lst@BeginComment\lst@KCSmode{{\lst@commentstyle}\lst@modetrue}% - \@empty}% -% \end{macrocode} -% (2) we must ensure that the comment starts after printing the comment -% delimiter since it could be a keyword. We assign |\lst@BeginKC|[|S|] to -% |\lst@KCpost|, which is executed and reset in \hookname{PostOutput}. -% \begin{macrocode} -\lst@AddToHook{PostOutput}{\lst@KCpost \global\let\lst@KCpost\@empty} -\global\let\lst@KCpost\@empty % init -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@EndKC} -% leaves the comment mode before the (temporaryly saved) comment delimiter is -% printed. -% \begin{macrocode} -\gdef\lst@EndKC{\lst@SaveToken \lst@LeaveMode \lst@RestoreToken - \let\lst@thestyle\lst@identifierstyle \lsthk@Output} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{keywordcomment} -% The delimiters must be identical here, thus we use |\lst@KCmatch|. Note the -% last argument |o| to |\lst@InstallKeywords|: The working test is installed -% in the \hookname{Output} hook and not in \hookname{DetectKeywords}. -% Otherwise we couldn't detect the ending delimiter since keyword detection is -% done if and only if mode changes are allowed. -% \begin{macrocode} -\lst@InstallKeywords{kc}{keywordcomment}{}\relax{} - {\ifnum\lst@mode=\lst@KCmode - \edef\lst@temp{\the\lst@token}% - \ifx\lst@temp\lst@KCmatch - \lst@EndKC - \fi - \else - \lst@ifmode\else - \xdef\lst@KCmatch{\the\lst@token}% - \global\let\lst@KCpost\lst@BeginKC - \fi - \fi} - lo -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{keywordcommentsemicolon} -% The key simply stores the keywords. After a bug report by \lsthelper -% {Norbert~Eisinger}{2002/11/26}{keywordcommentsemicolon active after -% language change} the initialization in \hookname{SetLanguage} has been -% added. -% \begin{macrocode} -\lst@Key{keywordcommentsemicolon}{}{\lstKV@ThreeArg{#1}% - {\def\lst@KCAkeywordsB{##1}% - \def\lst@KCAkeywordsE{##2}% - \def\lst@KCBkeywordsB{##3}% - \def\lst@KCkeywords{##1##2##3}}} -\lst@AddToHook{SetLanguage}{% - \let\lst@KCAkeywordsB\@empty \let\lst@KCAkeywordsE\@empty - \let\lst@KCBkeywordsB\@empty \let\lst@KCkeywords\@empty} -% \end{macrocode} -% We define an appropriate semicolon if this keyword comment type is defined. -% Appropriate means that we leave any keyword comment mode if active. -% \lsthelper{Oldrich~Jedlicka}{2001/12/12}{keywordcomment(semicolon) fails} -% reported a bug and provided the fix, the two |\@empty|s. -% \begin{macrocode} -\lst@AddToHook{SelectCharTable} - {\ifx\lst@KCkeywords\@empty\else - \lst@DefSaveDef{`\;}\lsts@EKC - {\lst@XPrintToken - \ifnum\lst@mode=\lst@KCmode \lst@EndComment\@empty \else - \ifnum\lst@mode=\lst@KCSmode \lst@EndComment\@empty - \fi \fi - \lsts@EKC}% - \fi} -% \end{macrocode} -% The `working identifier' macros enter respectively leave comment mode. -% \begin{macrocode} -\gdef\lst@KCAWorkB{% - \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKC \fi} -\gdef\lst@KCBWorkB{% - \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKCS \fi} -\gdef\lst@KCAWorkE{\ifnum\lst@mode=\lst@KCmode \lst@EndKC \fi} -% \end{macrocode} -% Now we install the tests and initialize the given macros. -% \begin{macrocode} -\lst@ProvideFamily@@ - \lst@KCAkeywordsB@list\lst@KCAkeywordsB \lst@KC@also - \lst@gKCAkeywordsB@list\lst@gKCAkeywordsB \lst@KCAWorkB - {kcb}owo % prefix, other key, working procedure, Output hook -\lst@ProvideFamily@@ - \lst@KCAkeywordsE@list\lst@KCAkeywordsE \lst@KC@also - \lst@gKCAkeywordsE@list\lst@gKCAkeywordsE \lst@KCAWorkE - {kce}owo -\lst@ProvideFamily@@ - \lst@KCBkeywordsB@list\lst@KCBkeywordsB \lst@KC@also - \lst@gKCBkeywordsB@list\lst@gKCBkeywordsB \lst@KCBWorkB - {kcs}owo -% \end{macrocode} -% \end{lstkey} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Export of identifiers} -% -% \begin{aspect}{index} -% \begin{macro}{\lstindexmacro} -% One more `keyword' class. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{index} -\lst@InstallFamily w{index}{indexstyle}\lstindexmacro{indexstyle} - {\csname\@lst @indexstyle#1\expandafter\endcsname - \expandafter{\the\lst@token}} - od -\lst@UserCommand\lstindexmacro#1{\index{{\ttfamily#1}}} -\lst@EndAspect -% -% \end{macrocode} -% \end{macro} -% \end{aspect} -% -% \begin{aspect}{procnames} -% \begin{lstkey}{procnamestyle} -% \begin{lstkey}{procnamekeys} -% \begin{lstkey}{indexprocnames} -% The `idea' here is the usage of a global |\lst@ifprocname|, indicating a -% preceding `procedure keyword'. All the other is known stuff. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{procnames} -\gdef\lst@procnametrue{\global\let\lst@ifprocname\iftrue} -\gdef\lst@procnamefalse{\global\let\lst@ifprocname\iffalse} -\lst@AddToHook{Init}{\lst@procnamefalse} -\lst@AddToHook{DetectKeywords} - {\lst@ifprocname - \let\lst@thestyle\lst@procnamestyle - \lst@ifindexproc \csname\@lst @gindex@sty\endcsname \fi - \lst@procnamefalse - \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@Key{procnamestyle}{}{\def\lst@procnamestyle{#1}} -\lst@Key{indexprocnames}{false}[t]{\lstKV@SetIf{#1}\lst@ifindexproc} -\lst@AddToHook{Init}{\lst@ifindexproc \lst@indexproc \fi} -\gdef\lst@indexproc{% - \@ifundefined{lst@indexstyle1}% - {\@namedef{lst@indexstyle1}##1{}}% - {}} -% \end{macrocode} -% The default definition of |\lst@indexstyle| above has been moved outside the -% hook after a bug report from \lsthelper{Ulrich~G.~Wortmann}{2002/01/22} -% {procnames doesn't work}. -% \begin{macrocode} -\lst@InstallKeywords w{procnamekeys}{}\relax{} - {\global\let\lst@PNpost\lst@procnametrue} - od -\lst@AddToHook{PostOutput}{\lst@PNpost\global\let\lst@PNpost\@empty} -\global\let\lst@PNpost\@empty % init -\lst@EndAspect -% -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{aspect} -% -% -% \section{More aspects and keys} -% -% \begin{lstkey}{basicstyle} -% \begin{lstkey}{inputencoding} -% There is no better place to define these keys, I think. -% \begin{macrocode} -%<*kernel> -\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}} -\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}} -\lst@AddToHook{Init} - {\lst@basicstyle - \ifx\lst@inputenc\@empty\else - \@ifundefined{inputencoding}{}% - {\inputencoding\lst@inputenc}% - \fi} -\lst@AddToHookExe{EmptyStyle} - {\let\lst@basicstyle\@empty - \let\lst@inputenc\@empty} -% -% \end{macrocode} -% Michael Niedermair asked for a key like \keyname{inputencoding}. -% \end{lstkey} -% \end{lstkey} -% -% -% \subsection{Styles and languages} -% -% \begin{aspect}{style} -% We begin with style definition and selection. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{style} -% \end{macrocode} -% -% \begin{macro}{\lststylefiles} -% This macro is defined if and only if it's undefined yet. -% \begin{macrocode} -\@ifundefined{lststylefiles} - {\lst@UserCommand\lststylefiles{lststy0.sty}}{} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstdefinestyle} -% \begin{macro}{\lst@definestyle} -% \begin{macro}{\lst@DefStyle} -% are defined in terms of |\lst@DefStyle|, which is defined via -% |\lst@DefDriver|. -% \begin{macrocode} -\lst@UserCommand\lstdefinestyle{\lst@DefStyle\iftrue} -\lst@UserCommand\lst@definestyle{\lst@DefStyle\iffalse} -\gdef\lst@DefStyle{\lst@DefDriver{style}{sty}\lstset} -% \end{macrocode} -% The `empty' style calls the initial empty hook \hookname{EmptyStyle}. -% \begin{macrocode} -\global\@namedef{lststy@$}{\lsthk@EmptyStyle} -\lst@AddToHook{EmptyStyle}{}% init -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{lstkey}{style} -% is an application of |\lst@LAS|. We just specify the hook and an empty -% argument as `pre' and `post' code. -% \begin{macrocode} -\lst@Key{style}\relax{% - \lst@LAS{style}{sty}{[]{#1}}\lst@NoAlias\lststylefiles - \lsthk@SetStyle - {}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{SetStyle}{}% init -% \end{macrocode} -% \end{lstkey} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% \begin{aspect}{language} -% Now we deal with commands used in defining and selecting programming -% languages, in particular with aliases. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{language} -% \end{macrocode} -% -% \begin{macro}{\lstlanguagefiles} -% This macro is defined if and only if it's undefined yet. -% \begin{macrocode} -\@ifundefined{lstdriverfiles} - {\lst@UserCommand\lstlanguagefiles{lstlang0.sty}}{} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstdefinelanguage} -% \begin{macro}{\lst@definelanguage} -% \begin{macro}{\lst@DefLang} -% are defined in terms of |\lst@DefLang|, which is defined via -% |\lst@DefDriver|. -% \begin{macrocode} -\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue} -\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse} -\gdef\lst@DefLang{\lst@DefDriver{language}{lang}\lstset} -% \end{macrocode} -% Now we can provide the `empty' language. -% \begin{macrocode} -\lstdefinelanguage{}{} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{lstkey}{language} -% \begin{lstkey}{alsolanguage} -% is mainly an application of |\lst@LAS|. -% \begin{macrocode} -\lst@Key{language}\relax{\lstKV@OptArg[]{#1}% - {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles - \lsthk@SetLanguage - {\lst@FindAlias[##1]{##2}% - \let\lst@language\lst@malias - \let\lst@dialect\lst@oalias}}} -% \end{macrocode} -% Ditto, we simply don't execute |\lsthk@SetLanguage|. -% \begin{macrocode} -\lst@Key{alsolanguage}\relax{\lstKV@OptArg[]{#1}% - {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles - {}% - {\lst@FindAlias[##1]{##2}% - \let\lst@language\lst@malias - \let\lst@dialect\lst@oalias}}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{SetLanguage}{}% init -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lstalias} -% Now we concentrate on aliases and default dialects. -% |\lsta@|\meta{language}|$|\meta{dialect} and |\lsta@|\meta{language} contain -% the aliases of a particular dialect respectively a complete language. -% We'll use a |$|-character to separate a language name from its dialect. -% Thanks to \lsthelper{Walter~E.~Brown}{2004/02/25}{\lstalias -% (+\lstdefinelanguage) fails} for reporting a problem with the argument -% delimiter `[' in a previous definition of |\lstalias@|. -% \begin{macrocode} -\lst@UserCommand\lstalias{\@ifnextchar[\lstalias@\lstalias@@} -\gdef\lstalias@[#1]#2{\lstalias@b #2$#1} -\gdef\lstalias@b#1[#2]#3{\lst@NormedNameDef{lsta@#1}{#3$#2}} -\gdef\lstalias@@#1#2{\lst@NormedNameDef{lsta@#1}{#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{defaultdialect} -% We simply store the dialect. -% \begin{macrocode} -\lst@Key{defaultdialect}\relax - {\lstKV@OptArg[]{#1}{\lst@NormedNameDef{lstdd@##2}{##1}}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@FindAlias} -% Now we have to find a language. First we test for a complete language alias, -% then we set the default dialect if necessary. -% \begin{macrocode} -\gdef\lst@FindAlias[#1]#2{% - \lst@NormedDef\lst@oalias{#1}% - \lst@NormedDef\lst@malias{#2}% - \@ifundefined{lsta@\lst@malias}{}% - {\edef\lst@malias{\csname\@lst a@\lst@malias\endcsname}}% -% \end{macrocode} -% \begin{macrocode} - \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}% - {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}% - \fi -% \end{macrocode} -% Now we are ready for an alias of a single dialect. -% \begin{macrocode} - \edef\lst@temp{\lst@malias $\lst@oalias}% - \@ifundefined{lsta@\lst@temp}{}% - {\edef\lst@temp{\csname\@lst a@\lst@temp\endcsname}}% -% \end{macrocode} -% Finally we again set the default dialect---for the case of a dialect alias. -% \begin{macrocode} - \expandafter\lst@FindAlias@\lst@temp $} -\gdef\lst@FindAlias@#1$#2${% - \def\lst@malias{#1}\def\lst@oalias{#2}% - \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}% - {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}% - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@RequireLanguages} -% This definition will be equivalent to |\lstloadlanguages|. We requested the -% given list of languages and load additionally required aspects. -% \begin{macrocode} -\gdef\lst@RequireLanguages#1{% - \lst@Require{language}{lang}{#1}\lst@FindAlias\lstlanguagefiles - \ifx\lst@loadaspects\@empty\else - \lst@RequireAspects\lst@loadaspects - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstloadlanguages} -% is the same as |\lst@RequireLanguages|. -% \begin{macrocode} -\global\let\lstloadlanguages\lst@RequireLanguages -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Format definitions*} -% -% \begin{aspect}{formats} -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{formats} -% \end{macrocode} -% -% \begin{macro}{\lstformatfiles} -% This macro is defined if and only if it's undefined yet. -% \begin{macrocode} -\@ifundefined{lstformatfiles} - {\lst@UserCommand\lstformatfiles{lstfmt0.sty}}{} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstdefineformat} -% \begin{macro}{\lst@defineformat} -% \begin{macro}{\lst@DefFormat} -% are defined in terms of |\lst@DefFormat|, which is defined via -% |\lst@DefDriver|. -% \begin{macrocode} -\lst@UserCommand\lstdefineformat{\lst@DefFormat\iftrue} -\lst@UserCommand\lst@defineformat{\lst@DefFormat\iffalse} -\gdef\lst@DefFormat{\lst@DefDriver{format}{fmt}\lst@UseFormat} -% \end{macrocode} -% We provide the `empty' format. -% \begin{macrocode} -\lstdefineformat{}{} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{lstkey}{format} -% is an application of |\lst@LAS|. We just specify the hook as `pre' and an -% empty argument as `post' code. -% \begin{macrocode} -\lst@Key{format}\relax{% - \lst@LAS{format}{fmt}{[]{#1}}\lst@NoAlias\lstformatfiles - \lsthk@SetFormat - {}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{SetFormat}{\let\lst@fmtformat\@empty}% init -% \end{macrocode} -% \end{lstkey} -% -% -% \paragraph{Helpers} -% Our goal is to define the yet unkown |\lst@UseFormat|. This definition -% will parse the user supplied format. We start with some general macros. -% -% \begin{macro}{\lst@fmtSplit} -% splits the content of the macro |#1| at |#2| in the preceding characters -% |\lst@fmta| and the following ones |\lst@fmtb|. |\lst@if| is false if and -% only if |#1| doesn't contain |#2|. -% \begin{macrocode} -\gdef\lst@fmtSplit#1#2{% - \def\lst@temp##1#2##2\relax##3{% - \ifnum##3=\z@ - \ifx\@empty##2\@empty - \lst@false - \let\lst@fmta#1% - \let\lst@fmtb\@empty - \else - \expandafter\lst@temp#1\relax\@ne - \fi - \else - \def\lst@fmta{##1}\def\lst@fmtb{##2}% - \fi}% - \lst@true - \expandafter\lst@temp#1#2\relax\z@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@IfNextCharWhitespace} -% is defined in terms of |\lst@IfSubstring|. -% \begin{macrocode} -\gdef\lst@IfNextCharWhitespace#1#2#3{% - \lst@IfSubstring#3\lst@whitespaces{#1}{#2}#3} -% \end{macrocode} -% And here come all white space characters. -% \begin{macrocode} -\begingroup -\catcode`\^^I=12\catcode`\^^J=12\catcode`\^^M=12\catcode`\^^L=12\relax% -\lst@DefActive\lst@whitespaces{\ ^^I^^J^^M}% add ^^L -\global\let\lst@whitespaces\lst@whitespaces% -\endgroup -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtIfIdentifier} -% tests the first character of |#1| -% \begin{macrocode} -\gdef\lst@fmtIfIdentifier#1{% - \ifx\relax#1\@empty - \expandafter\@secondoftwo - \else - \expandafter\lst@fmtIfIdentifier@\expandafter#1% - \fi} -% \end{macrocode} -% against the `letters' |_|, |@|, |A|,\ldots,|Z| and |a|,\ldots,|z|. -% \begin{macrocode} -\gdef\lst@fmtIfIdentifier@#1#2\relax{% - \let\lst@next\@secondoftwo - \ifnum`#1=`_\else - \ifnum`#1<64\else - \ifnum`#1<91\let\lst@next\@firstoftwo\else - \ifnum`#1<97\else - \ifnum`#1<123\let\lst@next\@firstoftwo\else - \fi \fi \fi \fi \fi - \lst@next} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtIfNextCharIn} -% is required for the optional \meta{exceptional characters}. -% The implementation is easy---refer section \ref{iSubstringTests}. -% \begin{macrocode} -\gdef\lst@fmtIfNextCharIn#1{% - \ifx\@empty#1\@empty \expandafter\@secondoftwo \else - \def\lst@next{\lst@fmtIfNextCharIn@{#1}}% - \expandafter\lst@next\fi} -\gdef\lst@fmtIfNextCharIn@#1#2#3#4{% - \def\lst@temp##1#4##2##3\relax{% - \ifx \@empty##2\expandafter\@secondoftwo - \else \expandafter\@firstoftwo \fi}% - \lst@temp#1#4\@empty\relax{#2}{#3}#4} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtCDef} -% We need derivations of |\lst@CDef| and |\lst@CDefX|: we have to test the -% next character against the sequence |#5| of exceptional characters. -% These tests are inserted here. -% \begin{macrocode} -\gdef\lst@fmtCDef#1{\lst@fmtCDef@#1} -\gdef\lst@fmtCDef@#1#2#3#4#5#6#7{% - \lst@CDefIt#1{#2}{#3}% - {\lst@fmtIfNextCharIn{#5}{#4#2#3}{#6#4#2#3#7}}% - #4% - {}{}{}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtCDefX} -% The same but `drop input'. -% \begin{macrocode} -\gdef\lst@fmtCDefX#1{\lst@fmtCDefX@#1} -\gdef\lst@fmtCDefX@#1#2#3#4#5#6#7{% - \let#4#1% - \ifx\@empty#2\@empty - \def#1{\lst@fmtIfNextCharIn{#5}{#4}{#6#7}}% - \else \ifx\@empty#3\@empty - \def#1##1{% - \ifx##1#2% - \def\lst@next{\lst@fmtIfNextCharIn{#5}{#4##1}% - {#6#7}}% - \else - \def\lst@next{#4##1}% - \fi - \lst@next}% - \else - \def#1{% - \lst@IfNextCharsArg{#2#3}% - {\lst@fmtIfNextCharIn{#5}{\expandafter#4\lst@eaten}% - {#6#7}}% - {\expandafter#4\lst@eaten}}% - \fi \fi} -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{The parser} -% applies |\lst@fmtSplit| to cut a format definition into items, items into -% `input' and `output', and `output' into `pre' and 'post'. This should be -% clear if you are in touch with format definitions. -% -% \begin{macro}{\lst@UseFormat} -% Now we can start with the parser. -% \begin{macrocode} -\gdef\lst@UseFormat#1{% - \def\lst@fmtwhole{#1}% - \lst@UseFormat@} -\gdef\lst@UseFormat@{% - \lst@fmtSplit\lst@fmtwhole,% -% \end{macrocode} -% We assign the rest of the format definition, \ldots -% \begin{macrocode} - \let\lst@fmtwhole\lst@fmtb - \ifx\lst@fmta\@empty\else -% \end{macrocode} -% \ldots\space split the item at the equal sign, and work on the item. -% \begin{macrocode} - \lst@fmtSplit\lst@fmta=% - \ifx\@empty\lst@fmta\else -% \end{macrocode} -% \begin{TODO} -% Insert |\let\lst@arg\@empty| |\expandafter\lst@XConvert\lst@fmtb\@nil| -% |\let\lst@fmtb\lst@arg|. -% \end{TODO} -% \begin{macrocode} - \expandafter\lstKV@XOptArg\expandafter[\expandafter]% - \expandafter{\lst@fmtb}\lst@UseFormat@b - \fi - \fi -% \end{macrocode} -% Finally we process the next item if the rest is not empty. -% \begin{macrocode} - \ifx\lst@fmtwhole\@empty\else - \expandafter\lst@UseFormat@ - \fi} -% \end{macrocode} -% We make |\lst@fmtc| contain the preceding characters as a braced argument. -% To add more arguments, we first split the replacement tokens at the control -% sequence |\string|. -% \begin{macrocode} -\gdef\lst@UseFormat@b[#1]#2{% - \def\lst@fmtc{{#1}}\lst@lExtend\lst@fmtc{\expandafter{\lst@fmta}}% - \def\lst@fmtb{#2}% - \lst@fmtSplit\lst@fmtb\string -% \end{macrocode} -% We append an empty argument or |\lst@fmtPre| with `|\string|-preceding' -% tokens as argument. We do the same for the tokens after |\string|. -% \begin{macrocode} - \ifx\@empty\lst@fmta - \lst@lAddTo\lst@fmtc{{}}% - \else - \lst@lExtend\lst@fmtc{\expandafter - {\expandafter\lst@fmtPre\expandafter{\lst@fmta}}}% - \fi - \ifx\@empty\lst@fmtb - \lst@lAddTo\lst@fmtc{{}}% - \else - \lst@lExtend\lst@fmtc{\expandafter - {\expandafter\lst@fmtPost\expandafter{\lst@fmtb}}}% - \fi -% \end{macrocode} -% Eventually we extend |\lst@fmtformat| appropriately. Note that |\lst@if| -% still indicates whether the replacement tokens contain |\string|. -% \begin{macrocode} - \expandafter\lst@UseFormat@c\lst@fmtc} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@UseFormat@c#1#2#3#4{% - \lst@fmtIfIdentifier#2\relax - {\lst@fmtIdentifier{#2}% - \lst@if\else \PackageWarning{Listings}% - {Cannot drop identifier in format definition}% - \fi}% - {\lst@if - \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDef}% - \else - \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDefX}% - \fi - \lst@DefActive\lst@fmtc{#1}% - \lst@lExtend\lst@fmtformat{\expandafter{\lst@fmtc}{#3}{#4}}}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{SelectCharTable}{\lst@fmtformat} -\global\let\lst@fmtformat\@empty -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{The formatting} -% -% \begin{macro}{\lst@fmtPre} -% \begin{macrocode} -\gdef\lst@fmtPre#1{% - \lst@PrintToken - \begingroup - \let\newline\lst@fmtEnsureNewLine - \let\space\lst@fmtEnsureSpace - \let\indent\lst@fmtIndent - \let\noindent\lst@fmtNoindent - #1% - \endgroup} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtPost} -% \begin{macrocode} -\gdef\lst@fmtPost#1{% - \global\let\lst@fmtPostOutput\@empty - \begingroup - \def\newline{\lst@AddTo\lst@fmtPostOutput\lst@fmtEnsureNewLine}% - \def\space{\aftergroup\lst@fmtEnsurePostSpace}% - \def\indent{\lst@AddTo\lst@fmtPostOutput\lst@fmtIndent}% - \def\noindent{\lst@AddTo\lst@fmtPostOutput\lst@fmtNoindent}% - \aftergroup\lst@PrintToken - #1% - \endgroup} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{Init}{\global\let\lst@fmtPostOutput\@empty} -\lst@AddToHook{PostOutput} - {\lst@fmtPostOutput \global\let\lst@fmtPostOutput\@empty} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtEnsureSpace} -% \begin{macro}{\lst@fmtEnsurePostSpace} -% \begin{macrocode} -\gdef\lst@fmtEnsureSpace{% - \lst@ifwhitespace\else \expandafter\lst@ProcessSpace \fi} -\gdef\lst@fmtEnsurePostSpace{% - \lst@IfNextCharWhitespace{}{\lst@ProcessSpace}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{lstkey}{fmtindent} -% \begin{macro}{\lst@fmtIndent} -% \begin{macro}{\lst@fmtNoindent} -% \begin{macrocode} -\lst@Key{fmtindent}{20pt}{\def\lst@fmtindent{#1}} -\newdimen\lst@fmtcurrindent -\lst@AddToHook{InitVars}{\global\lst@fmtcurrindent\z@} -\gdef\lst@fmtIndent{\global\advance\lst@fmtcurrindent\lst@fmtindent} -\gdef\lst@fmtNoindent{\global\advance\lst@fmtcurrindent-\lst@fmtindent} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{lstkey} -% -% \begin{macro}{\lst@fmtEnsureNewLine} -% \begin{macrocode} -\gdef\lst@fmtEnsureNewLine{% - \global\advance\lst@newlines\@ne - \global\advance\lst@newlinesensured\@ne - \lst@fmtignoretrue} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToAtTop\lst@DoNewLines{% - \ifnum\lst@newlines>\lst@newlinesensured - \global\advance\lst@newlines-\lst@newlinesensured - \fi - \global\lst@newlinesensured\z@} -\newcount\lst@newlinesensured % global -\lst@AddToHook{Init}{\global\lst@newlinesensured\z@} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@fmtignoretrue{\let\lst@fmtifignore\iftrue} -\gdef\lst@fmtignorefalse{\let\lst@fmtifignore\iffalse} -\lst@AddToHook{InitVars}{\lst@fmtignorefalse} -\lst@AddToHook{Output}{\lst@fmtignorefalse} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@fmtUseLostSpace} -% \begin{macrocode} -\gdef\lst@fmtUseLostSpace{% - \lst@ifnewline \kern\lst@fmtcurrindent \global\lst@lostspace\z@ - \else - \lst@OldOLS - \fi} -\lst@AddToHook{Init} - {\lst@true - \ifx\lst@fmtformat\@empty \ifx\lst@fmt\@empty \lst@false \fi\fi - \lst@if - \let\lst@OldOLS\lst@OutputLostSpace - \let\lst@OutputLostSpace\lst@fmtUseLostSpace - \let\lst@ProcessSpace\lst@fmtProcessSpace - \fi} -% \end{macrocode} -% \begin{TODO} -% This `lost space' doesn't use |\lst@alloverstyle| yet! -% \end{TODO} -% \end{macro} -% -% \begin{macro}{\lst@fmtProcessSpace} -% \begin{macrocode} -\gdef\lst@fmtProcessSpace{% - \lst@ifletter - \lst@Output - \lst@fmtifignore\else - \lst@AppendOther\lst@outputspace - \fi - \else \lst@ifkeepspaces - \lst@AppendOther\lst@outputspace - \else \ifnum\lst@newlines=\z@ - \lst@AppendSpecialSpace - \else \ifnum\lst@length=\z@ - \global\advance\lst@lostspace\lst@width - \global\advance\lst@pos\m@ne - \else - \lst@AppendSpecialSpace - \fi - \fi \fi \fi - \lst@whitespacetrue} -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{Formatting identifiers} -% -% \begin{macro}{\lst@fmtIdentifier} -% We install a (keyword) test for the `format identifiers'. -% \begin{macrocode} -\lst@InstallTest{f} - \lst@fmt@list\lst@fmt \lst@gfmt@list\lst@gfmt - \lst@gfmt@wp - wd -\gdef\lst@fmt@list{\lst@fmt\lst@gfmt}\global\let\lst@fmt\@empty -\gdef\lst@gfmt@list{\lst@fmt\lst@gfmt}\global\let\lst@gfmt\@empty -% \end{macrocode} -% The working procedure expands |\lst@fmt$|\meta{string} (and defines -% |\lst@PrintToken| to do nothing). -% \begin{macrocode} -\gdef\lst@gfmt@wp{% - \begingroup \let\lst@UM\@empty - \let\lst@PrintToken\@empty - \csname\@lst @fmt$\the\lst@token\endcsname - \endgroup} -% \end{macrocode} -% This control sequence is probably defined as `working identifier'. -% \begin{macrocode} -\gdef\lst@fmtIdentifier#1#2#3#4{% - \lst@DefOther\lst@fmta{#2}\edef\lst@fmt{\lst@fmt,\lst@fmta}% - \@namedef{\@lst @fmt$\lst@fmta}{#3#4}} -% \end{macrocode} -% |\lst@fmt$|\meta{identifier} expands to a |\lst@fmtPre|/|\lst@fmtPost| -% sequence defined by |#2| and |#3|. -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% -% \subsection{Line numbers} -% -% \begin{aspect}{labels} -% \lsthelper{Rolf~Niepraschk}{1997/04/24}{line numbers} asked for line numbers. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{labels} -% \end{macrocode} -% -% \begin{lstkey}{numbers} -% Depending on the argument we define |\lst@PlaceNumber| to print the line -% number. -% \begin{macrocode} -\lst@Key{numbers}{none}{% - \let\lst@PlaceNumber\@empty - \lstKV@SwitchCases{#1}% - {none&\\% - left&\def\lst@PlaceNumber{\llap{\normalfont - \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\% - right&\def\lst@PlaceNumber{\rlap{\normalfont - \kern\linewidth \kern\lst@numbersep - \lst@numberstyle{\thelstnumber}}}% - }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{numberstyle} -% \begin{lstkey}{numbersep} -% \begin{lstkey}{stepnumber} -% \begin{lstkey}{numberblanklines} -% \begin{lstkey}{numberfirstline} -% Definition of the keys. -% \begin{macrocode} -\lst@Key{numberstyle}{}{\def\lst@numberstyle{#1}} -\lst@Key{numbersep}{10pt}{\def\lst@numbersep{#1}} -\lst@Key{stepnumber}{1}{\def\lst@stepnumber{#1\relax}} -\lst@AddToHook{EmptyStyle}{\let\lst@stepnumber\@ne} -% \end{macrocode} -% \begin{macrocode} -\lst@Key{numberblanklines}{true}[t] - {\lstKV@SetIf{#1}\lst@ifnumberblanklines} -\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{#1}\lst@ifnumberfirstline} -\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{lstkey}{firstnumber} -% We select the first number according to the argument. -% \begin{macrocode} -\lst@Key{firstnumber}{auto}{% - \lstKV@SwitchCases{#1}% - {auto&\let\lst@firstnumber\@undefined\\% - last&\let\lst@firstnumber\c@lstnumber - }{\def\lst@firstnumber{#1\relax}}} -\lst@AddToHook{PreSet}{\let\lst@advancenumber\z@} -\lst@AddToHook{PreInit} - {\ifx\lst@firstnumber\@undefined - \let\lst@firstnumber\lst@firstline - \fi} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@SetFirstNumber} -% \begin{macro}{\lst@SaveFirstNumber} -% \lsthelper{Boris~Veytsman}{1998/03/25}{continue line numbering: a.c b.c a.c} -% proposed to continue line numbers according to listing names. We define the -% label number of the first printing line here. A bug reported by -% \lsthelper{Jens~Schwarzer}{2001/05/29}{wrong line numbering of lstlisting -% with first>1} has been removed by replacing |\@ne| by |\lst@firstline|. -% \begin{macrocode} -\gdef\lst@SetFirstNumber{% - \ifx\lst@firstnumber\@undefined - \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax - \ifnum\@tempcnta=\z@ \@tempcnta\lst@firstline - \else \lst@nololtrue \fi - \advance\@tempcnta\lst@advancenumber - \edef\lst@firstnumber{\the\@tempcnta\relax}% - \fi} -% \end{macrocode} -% The current label is stored in|\lstno@|\meta{name}. If the name is empty, -% we use a space instead, which leaves |\lstno@| undefined. -% \begin{macrocode} -\gdef\lst@SaveFirstNumber{% - \expandafter\xdef - \csname\@lst no\ifx\lst@intname\@empty @ \else @\lst@intname\fi - \endcsname{\the\c@lstnumber}} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\c@lstnumber} -% This counter keeps the current label number. We use it as current label to -% make line numbers referenced by |\ref|. This was proposed by -% \lsthelper{Boris~Veytsman}{1998/03/25}{make line numbers referenced via -% \label and \ref}. We now use |\refstepcounter| to do the job---thanks to a -% bug report from \lsthelper{Christian~Gudrian}{2000/11/13}{\ref{lst:line} -% jumps to top of listing and not to the line}. -% \begin{macrocode} -\newcounter{lstnumber}% \global -\global\c@lstnumber\@ne % init -\renewcommand*\thelstnumber{\@arabic\c@lstnumber} -\lst@AddToHook{EveryPar} - {\global\advance\c@lstnumber\lst@advancelstnum - \global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}% - \lst@SkipOrPrintLabel}% -\global\let\lst@advancelstnum\@ne -% \end{macrocode} -% Note that the counter advances \emph{before} the label is printed and not -% afterwards. Otherwise we have wrong references---reported by -% \lsthelper{Gregory~Van~Vooren}{1999/06/04}{reference one unit too large}. -% \begin{macrocode} -\lst@AddToHook{Init}{\def\@currentlabel{\thelstnumber}} -% \end{macrocode} -% The label number is initialized and we ensure correct line numbers for -% continued listings. -% \begin{macrocode} -\lst@AddToHook{InitVars} - {\global\c@lstnumber\lst@firstnumber - \global\advance\c@lstnumber\lst@advancenumber - \global\advance\c@lstnumber-\lst@advancelstnum - \ifx \lst@firstnumber\c@lstnumber - \global\advance\c@lstnumber-\lst@advancelstnum - \fi} -\lst@AddToHook{ExitVars} - {\global\advance\c@lstnumber\lst@advancelstnum} -% \end{macrocode} -% \lsthelper{Walter~E.~Brown}{2001/05/22}{pdftex 3.14159-14f warning: -% destination with the same identifier} reported problems with pdftex and -% \packagename{hyperref}. A bad default of |\theHlstlabel| was the reason. -% \lsthelper{Heiko~Oberdiek}{2001/11/08}{pdftex warning: destination with -% the same identifier} found another bug which was due to the localization -% of |\lst@neglisting|. He also provided the following fix, replacing -% |\thelstlisting| with the |\ifx| \ldots\ |\fi| construction. -% \begin{macrocode} -\AtBeginDocument{% - \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting - \else \thelstlisting \fi - .\thelstnumber}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@skipnumbers} -% There are more things to do. We calculate how many lines must skip their -% label. The formula is -% $$|\lst@skipnumbers|= -% \textrm{\emph{first printing line}}\bmod|\lst@stepnumber|.$$ -% Note that we use a nonpositive representative for |\lst@skipnumbers|. -% \begin{macrocode} -\newcount\lst@skipnumbers % \global -\lst@AddToHook{Init} - {\ifnum \z@>\lst@stepnumber - \let\lst@advancelstnum\m@ne - \edef\lst@stepnumber{-\lst@stepnumber}% - \fi - \ifnum \z@<\lst@stepnumber - \global\lst@skipnumbers\lst@firstnumber - \global\divide\lst@skipnumbers\lst@stepnumber - \global\multiply\lst@skipnumbers-\lst@stepnumber - \global\advance\lst@skipnumbers\lst@firstnumber - \ifnum\lst@skipnumbers>\z@ - \global\advance\lst@skipnumbers -\lst@stepnumber - \fi -% \end{macrocode} -% If |\lst@stepnumber| is zero, no line numbers are printed: -% \begin{macrocode} - \else - \let\lst@SkipOrPrintLabel\relax - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@SkipOrPrintLabel} -% But default is this. We use the fact that |\lst@skipnumbers| is nonpositive. -% The counter advances every line and if that counter is zero, we print a line -% number and decrement the counter by |\lst@stepnumber|. -% \begin{macrocode} -\gdef\lst@SkipOrPrintLabel{% - \ifnum\lst@skipnumbers=\z@ - \global\advance\lst@skipnumbers-\lst@stepnumber\relax - \lst@PlaceNumber - \lst@numberfirstlinefalse - \else -% \end{macrocode} -% If the first line of a listing should get a number, it gets it here. -% \begin{macrocode} - \lst@ifnumberfirstline - \lst@PlaceNumber - \lst@numberfirstlinefalse - \fi - \fi - \global\advance\lst@skipnumbers\@ne}% -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{OnEmptyLine}{% - \lst@ifnumberblanklines\else \ifnum\lst@skipnumbers=\z@ - \global\advance\lst@skipnumbers-\lst@stepnumber\relax - \fi\fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Line shape and line breaking} -% -% \begin{macro}{\lst@parshape} -% We define a default version of |\lst@parshape| for the case that the -% \aspectname{lineshape} aspect is not loaded. We use this parshape every line -% (in fact every paragraph). Furthermore we must repeat the parshape if we -% close a group level---or the shape is forgotten. -% \begin{macrocode} -%<*kernel> -\def\lst@parshape{\parshape\@ne \z@ \linewidth} -\lst@AddToHookAtTop{EveryLine}{\lst@parshape} -\lst@AddToHookAtTop{EndGroup}{\lst@parshape} -% -% \end{macrocode} -% \end{macro} -% -% \begin{aspect}{lineshape} -% Our first aspect in this section. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{lineshape} -% \end{macrocode} -% -% \begin{lstkey}{xleftmargin} -% \begin{lstkey}{xrightmargin} -% \begin{lstkey}{resetmargins} -% \begin{lstkey}{linewidth} -% Usual stuff. -% \begin{macrocode} -\lst@Key{xleftmargin}{\z@}{\def\lst@xleftmargin{#1}} -\lst@Key{xrightmargin}{\z@}{\def\lst@xrightmargin{#1}} -\lst@Key{resetmargins}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins} -% \end{macrocode} -% The margins become zero if we make an exact box around the listing. -% \begin{macrocode} -\lst@AddToHook{BoxUnsafe}{\let\lst@xleftmargin\z@ - \let\lst@xrightmargin\z@} -\lst@AddToHook{TextStyle}{% - \let\lst@xleftmargin\z@ \let\lst@xrightmargin\z@ - \let\lst@ifresetmargins\iftrue} -% \end{macrocode} -% Added above hook after bug report from \lsthelper{Magnus~Lewis-Smith} -%{1999/08/06}{|\lstinline| indented} and \lsthelper{Jos\'e~Romildo~Malaquias} -%{2000/08/22}{|\lstinline| indented (resetmargins)} respectively. -% \begin{macrocode} -\lst@Key{linewidth}\linewidth{\def\lst@linewidth{#1}} -\lst@AddToHook{PreInit}{\linewidth\lst@linewidth\relax} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@parshape} -% The definition itself is easy. -% \begin{macrocode} -\gdef\lst@parshape{% - \parshape\@ne \@totalleftmargin \linewidth} -% \end{macrocode} -% We calculate the line width and (inner/outer) indent for a listing. -% \begin{macrocode} -\lst@AddToHook{Init} - {\lst@ifresetmargins - \advance\linewidth\@totalleftmargin - \advance\linewidth\rightmargin - \@totalleftmargin\z@ - \fi - \advance\linewidth-\lst@xleftmargin - \advance\linewidth-\lst@xrightmargin - \advance\@totalleftmargin\lst@xleftmargin\relax} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{lineskip} -% The introduction of this key is due to communication with -% \lsthelper{Andreas~Bartelt}{1997/09/11}{problem with redefed \parskip; -% \lstlineskip introduced}. Version 1.0 implements this feature by -% redefining |\baselinestretch|. -% \begin{macrocode} -\lst@Key{lineskip}{\z@}{\def\lst@lineskip{#1\relax}} -\lst@AddToHook{Init} - {\parskip\z@ - \ifdim\z@=\lst@lineskip\else - \@tempdima\baselineskip - \advance\@tempdima\lst@lineskip -% \end{macrocode} -% The following three lines simulate the `bad' |\divide| |\@tempdima| -% |\strip@pt| |\baselineskip| |\relax|. Thanks to \lsthelper{Peter~Bartke} -% {2002/04/10}{bad use of \strip@pt} for the bug report. -% \begin{macrocode} - \multiply\@tempdima\@cclvi - \divide\@tempdima\baselineskip\relax - \multiply\@tempdima\@cclvi -% \end{macrocode} -% \begin{macrocode} - \edef\baselinestretch{\strip@pt\@tempdima}% - \selectfont - \fi} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{breaklines} -% \begin{lstkey}{breakindent} -% \begin{lstkey}{breakautoindent} -% \begin{lstkey}{breakatwhitespace} -% \begin{lstkey}{prebreak} -% \begin{lstkey}{postbreak} -% As usual we have no problems in announcing more keys. -% \keyname{breakatwhitespace} is due to \lsthelper{Javier~Bezos}{2003/09/23} -% {breaklines breaks at odd places}. Unfortunately a previous definition of -% that key was wrong as \lsthelper{Franz~Rinnerthaler}{2004/03/12} -% {breakatwhitespace has no effect} and \lsthelper{Ulrike~Fischer}{2004/07/11} -% {breakatwhitespace has no effect} reported. -% \begin{macrocode} -\lst@Key{breaklines}{false}[t]{\lstKV@SetIf{#1}\lst@ifbreaklines} -\lst@Key{breakindent}{20pt}{\def\lst@breakindent{#1}} -\lst@Key{breakautoindent}{t}[t]{\lstKV@SetIf{#1}\lst@ifbreakautoindent} -\lst@Key{breakatwhitespace}{false}[t]% - {\lstKV@SetIf{#1}\lst@ifbreakatwhitespace} -\lst@Key{prebreak}{}{\def\lst@prebreak{#1}} -\lst@Key{postbreak}{}{\def\lst@postbreak{#1}} -% \end{macrocode} -% We assign some different macros and (if necessary) suppress ``underfull -% |\hbox|'' messages (and use different pretolerance): -% \begin{macrocode} -\lst@AddToHook{Init} - {\lst@ifbreaklines - \hbadness\@M \pretolerance\@M - \@rightskip\@flushglue \rightskip\@rightskip % \raggedright - \leftskip\z@skip \parindent\z@ -% \end{macrocode} -% A |\raggedright| above has been replaced by setting the values by hand after -% a bug report from \lsthelper{Morten~H\o gholm}{2004/09/06}{ltugboat.cls and -% listings}. -% -% We use the normal parshape and the calculated |\lst@breakshape| (see below). -% \begin{macrocode} - \def\lst@parshape{\parshape\tw@ \@totalleftmargin\linewidth - \lst@breakshape}% - \else - \let\lst@discretionary\@empty - \fi} -\lst@AddToHook{OnNewLine} - {\lst@ifbreaklines \lst@breakNewLine \fi} -% \end{macrocode} -% \end{lstkey}\end{lstkey}\end{lstkey}\end{lstkey} -% \end{lstkey}\end{lstkey} -% -% \begin{macro}{\lst@discretionary} -% \begin{macro}{\lst@spacekern} -% Here comes the whole magic: We set a discretionary break after each `output -% unit'. However we redefine |\space| to be used inside |\discretionary| and -% use \hookname{EveryLine} hook. After a bug report by \lsthelper{Carsten~Hamm} -% {2002/04/19}{wrong frame rules with breaklines and xleftmargin>0pt} I've -% added |\kern-\lst@xleftmargin|, which became |\kern-\@totalleftmargin| after -% a bug report by \lsthelper{Christian~Kaiser}{2002/12/13}{wrong frame inside -% itemize with breaklines=true}. -% \begin{macrocode} -\gdef\lst@discretionary{% - \lst@ifbreakatwhitespace - \lst@ifwhitespace \lst@@discretionary \fi - \else - \lst@@discretionary - \fi}% -\gdef\lst@@discretionary{% - \discretionary{\let\space\lst@spacekern\lst@prebreak}% - {\llap{\lsthk@EveryLine - \kern\lst@breakcurrindent \kern-\@totalleftmargin}% - \let\space\lst@spacekern\lst@postbreak}{}} -\lst@AddToHook{PostOutput}{\lst@discretionary} -\gdef\lst@spacekern{\kern\lst@width} -% \end{macrocode} -% \begin{ALTERNATIVE} -% |\penalty\@M \hskip\z@ plus 1fil \penalty0\hskip\z@ plus-1fil| \emph{before} -% each `output unit' (i.e.~before |\hbox{...}| in the output macros) also break -% the lines as desired. But we wouldn't have |prebreak| and |postbreak|. -% \end{ALTERNATIVE} -% \end{macro}\end{macro} -% -% \begin{macro}{\lst@breakNewLine} -% We use \keyname{breakindent}, and additionally the current line indention -% (coming from white spaces at the beginning of the line) if `auto indent' is -% on. -% \begin{macrocode} -\gdef\lst@breakNewLine{% - \@tempdima\lst@breakindent\relax - \lst@ifbreakautoindent \advance\@tempdima\lst@lostspace \fi -% \end{macrocode} -% Now we calculate the margin and line width of the wrapped part \ldots -% \begin{macrocode} - \@tempdimc-\@tempdima \advance\@tempdimc\linewidth - \advance\@tempdima\@totalleftmargin -% \end{macrocode} -% \ldots\space and store it in |\lst@breakshape|. -% \begin{macrocode} - \xdef\lst@breakshape{\noexpand\lst@breakcurrindent \the\@tempdimc}% - \xdef\lst@breakcurrindent{\the\@tempdima}} -\global\let\lst@breakcurrindent\z@ % init -% \end{macrocode} -% The initialization of |\lst@breakcurrindent| has been added after a bug -% report by \lsthelper{Alvaro~Herrera}{2002/12/09}{`undefined control -% sequence \lst@breakcurrindent' with fancyvrb and breaklines}. -% \begin{TODO} -% We could speed this up by allocating two global dimensions. -% \end{TODO} -% \end{macro} -% -% \begin{macro}{\lst@breakshape} -% \lsthelper{Andreas~Deininger}{2000/08/25}{`breaklines,first>1' leads to -% ``undefined control sequence'' error} reported a problem which is resolved -% by providing a default break shape. -% \begin{macrocode} -\gdef\lst@breakshape{\@totalleftmargin \linewidth} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@breakProcessOther} -% is the same as |\lst@ProcessOther| except that it also outputs the current -% token string. This inserts a potential linebreak point. -% Only the closing parenthesis uses this macro yet. -% \begin{macrocode} -\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1\lst@OutputOther} -\lst@AddToHook{SelectCharTable} - {\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi} -% \end{macrocode} -% A bug reported by \lsthelper{Gabriel~Tauro}{2001/04/18}{unexpected `)' if -% the character appears before first printed line} has been removed by using -% |\lst@ProcessOther| instead of |\lst@AppendOther|. -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Frames} -% -% \begin{aspect}{frames} -% Another aspect. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[lineshape]{frames} -% \end{macrocode} -% -% \begin{lstkey}{framexleftmargin} -% \begin{lstkey}{framexrightmargin} -% \begin{lstkey}{framextopmargin} -% \begin{lstkey}{framexbottommargin} -% These keys just save the argument. -% \begin{macrocode} -\lst@Key{framexleftmargin}{\z@}{\def\lst@framexleftmargin{#1}} -\lst@Key{framexrightmargin}{\z@}{\def\lst@framexrightmargin{#1}} -\lst@Key{framextopmargin}{\z@}{\def\lst@framextopmargin{#1}} -\lst@Key{framexbottommargin}{\z@}{\def\lst@framexbottommargin{#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{lstkey}{backgroundcolor} -% \lsthelper{Ralf~Imh\"auser}{2000/01/08}{coloured background} inspired the -% key \keyname{backgroundcolor}. All keys save the argument, and \ldots -% \begin{macrocode} -\lst@Key{backgroundcolor}{}{\def\lst@bkgcolor{#1}} -\lst@Key{fillcolor}{}{\def\lst@fillcolor{#1}} -\lst@Key{rulecolor}{}{\def\lst@rulecolor{#1}} -\lst@Key{rulesepcolor}{}{\def\lst@rulesepcolor{#1}} -% \end{macrocode} -% \ldots\space some have default settings if they are empty. -% \begin{macrocode} -\lst@AddToHook{Init}{% - \ifx\lst@fillcolor\@empty - \let\lst@fillcolor\lst@bkgcolor - \fi - \ifx\lst@rulesepcolor\@empty - \let\lst@rulesepcolor\lst@fillcolor - \fi} -% \end{macrocode} -% \end{lstkey} -% -% \begin{lstkey}{rulesep} -% \begin{lstkey}{framerule} -% \begin{lstkey}{framesep} -% \begin{lstkey}{frameshape} -% Another set of keys, which mainly save their respective argument. -% \keyname{frameshape} capitalizes all letters, and checks whether at least one -% round corner is specified. Eventually we define |\lst@frame| to be empty if -% and only if there is no frameshape. -% \begin{macrocode} -\lst@Key{rulesep}{2pt}{\def\lst@rulesep{#1}} -\lst@Key{framerule}{.4pt}{\def\lst@framerulewidth{#1}} -\lst@Key{framesep}{3pt}{\def\lst@frametextsep{#1}} -\lst@Key{frameshape}{}{% - \let\lst@xrulecolor\@empty - \lstKV@FourArg{#1}% - {\uppercase{\def\lst@frametshape{##1}}% - \uppercase{\def\lst@framelshape{##2}}% - \uppercase{\def\lst@framershape{##3}}% - \uppercase{\def\lst@framebshape{##4}}% - \let\lst@ifframeround\iffalse - \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}% - \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}% - \def\lst@frame{##1##2##3##4}}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{lstkey}{frameround} -% \begin{lstkey}{frame} -% We have to do some conversion here. -% \begin{macrocode} -\lst@Key{frameround}\relax - {\uppercase{\def\lst@frameround{#1}}% - \expandafter\lstframe@\lst@frameround ffff\relax} -\global\let\lst@frameround\@empty -% \end{macrocode} -% In case of an verbose argument, we use the |trbl|-subset replacement. -% \begin{macrocode} -\lst@Key{frame}\relax{% - \let\lst@xrulecolor\@empty - \lstKV@SwitchCases{#1}% - {none&\let\lst@frame\@empty\\% - leftline&\def\lst@frame{l}\\% - topline&\def\lst@frame{t}\\% - bottomline&\def\lst@frame{b}\\% - lines&\def\lst@frame{tb}\\% - single&\def\lst@frame{trbl}\\% - shadowbox&\def\lst@frame{tRBl}% - \def\lst@xrulecolor{\lst@rulesepcolor}% - \def\lst@rulesep{\lst@frametextsep}% - }{\def\lst@frame{#1}}% - \expandafter\lstframe@\lst@frameround ffff\relax} -% \end{macrocode} -% Adding |t|, |r|, |b|, and |l| in case of their upper case versions makes -% later tests easier. -% \begin{macrocode} -\gdef\lstframe@#1#2#3#4#5\relax{% - \lst@IfSubstring T\lst@frame{\edef\lst@frame{t\lst@frame}}{}% - \lst@IfSubstring R\lst@frame{\edef\lst@frame{r\lst@frame}}{}% - \lst@IfSubstring B\lst@frame{\edef\lst@frame{b\lst@frame}}{}% - \lst@IfSubstring L\lst@frame{\edef\lst@frame{l\lst@frame}}{}% -% \end{macrocode} -% We now check top and bottom frame rules, \ldots -% \begin{macrocode} - \let\lst@frametshape\@empty \let\lst@framebshape\@empty - \lst@frameCheck - ltr\lst@framelshape\lst@frametshape\lst@framershape #4#1% - \lst@frameCheck - LTR\lst@framelshape\lst@frametshape\lst@framershape #4#1% - \lst@frameCheck - lbr\lst@framelshape\lst@framebshape\lst@framershape #3#2% - \lst@frameCheck - LBR\lst@framelshape\lst@framebshape\lst@framershape #3#2% -% \end{macrocode} -% \ldots\space look for round corners \ldots -% \begin{macrocode} - \let\lst@ifframeround\iffalse - \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}% - \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}% -% \end{macrocode} -% and define left and right frame shape. -% \begin{macrocode} - \let\lst@framelshape\@empty \let\lst@framershape\@empty - \lst@IfSubstring L\lst@frame - {\def\lst@framelshape{YY}}% - {\lst@IfSubstring l\lst@frame{\def\lst@framelshape{Y}}{}}% - \lst@IfSubstring R\lst@frame - {\def\lst@framershape{YY}}% - {\lst@IfSubstring r\lst@frame{\def\lst@framershape{Y}}{}}} -% \end{macrocode} -% Now comes the macro used to define top and bottom frame shape. -% It extends the macro |#5|. -% The last two arguments show whether left and right corners are round. -% |#4| and |#6| are temporary macros. -% |#1#2#3| are the three characters we test for. -% \begin{macrocode} -\gdef\lst@frameCheck#1#2#3#4#5#6#7#8{% - \lst@IfSubstring #1\lst@frame - {\if #7T\def#4{R}\else \def#4{Y}\fi}% - {\def#4{N}}% - \lst@IfSubstring #3\lst@frame - {\if #8T\def#6{R}\else \def#6{Y}\fi}% - {\def#6{N}}% - \lst@IfSubstring #2\lst@frame{\edef#5{#5#4Y#6}}{}} -% \end{macrocode} -% For text style listings all frames are deactivated -- added after a bug -% report by \lsthelper{Stephen~Reindl}{2002/06/04}{frames not deactivated -% for text style listings}. -% \begin{macrocode} -\lst@AddToHook{TextStyle} - {\let\lst@frame\@empty - \let\lst@frametshape\@empty - \let\lst@framershape\@empty - \let\lst@framebshape\@empty - \let\lst@framelshape\@empty} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@frameMakeVBox} -% \begin{macrocode} -\gdef\lst@frameMakeBoxV#1#2#3{% - \setbox#1\hbox{% - \color@begingroup \lst@rulecolor - \llap{\setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3% - \lst@frameL}% - \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}% - {\ht\z@}{\dp\z@}}% - \box\z@ - \ifx\lst@framelshape\@empty - \kern\lst@frametextsep\relax - \else - \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}% - \fi - \kern\lst@framexleftmargin}% - \rlap{\kern-\lst@framexleftmargin - \@tempdima\linewidth - \advance\@tempdima\lst@framexleftmargin - \advance\@tempdima\lst@framexrightmargin - \lst@frameBlock\lst@bkgcolor\@tempdima{#2}{#3}% - \ifx\lst@framershape\@empty - \kern\lst@frametextsep\relax - \else - \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}% - \fi - \setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3% - \lst@frameR}% - \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}% - {\ht\z@}{\dp\z@}}% - \box\z@}% - \color@endgroup}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameBlock} -% \begin{macrocode} -\gdef\lst@frameBlock#1#2#3#4{% - \color@begingroup - #1% - \setbox\z@\hbox{\vrule\@height#3\@depth#4% - \ifx#1\@empty \@width\z@ \kern#2\relax - \else \@width#2\relax \fi}% - \box\z@ - \color@endgroup} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameR} -% typesets right rules. -% We only need to iterate through |\lst@framershape|. -% \begin{macrocode} -\gdef\lst@frameR{% - \expandafter\lst@frameR@\lst@framershape\relax - \kern-\lst@rulesep} -\gdef\lst@frameR@#1{% - \ifx\relax#1\@empty\else - \if #1Y\lst@framevrule \else \kern\lst@framerulewidth \fi - \kern\lst@rulesep - \expandafter\lst@frameR@b - \fi} -\gdef\lst@frameR@b#1{% - \ifx\relax#1\@empty - \else - \if #1Y\color@begingroup - \lst@xrulecolor - \lst@framevrule - \color@endgroup - \else - \kern\lst@framerulewidth - \fi - \kern\lst@rulesep - \expandafter\lst@frameR@ - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameL} -% Ditto left rules. -% \begin{macrocode} -\gdef\lst@frameL{% - \kern-\lst@rulesep - \expandafter\lst@frameL@\lst@framelshape\relax} -\gdef\lst@frameL@#1{% - \ifx\relax#1\@empty\else - \kern\lst@rulesep - \if#1Y\lst@framevrule \else \kern\lst@framerulewidth \fi - \expandafter\lst@frameL@ - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameH} -% This is the central macro used to draw top and bottom frame rules. -% The first argument is either |T| or |B| and the second contains the shape. -% We use |\@tempcntb| as size counter. -% \begin{macrocode} -\gdef\lst@frameH#1#2{% - \global\let\lst@framediml\z@ \global\let\lst@framedimr\z@ - \setbox\z@\hbox{}\@tempcntb\z@ - \expandafter\lst@frameH@\expandafter#1#2\relax\relax\relax - \@tempdimb\lst@frametextsep\relax - \advance\@tempdimb\lst@framerulewidth\relax - \@tempdimc-\@tempdimb - \advance\@tempdimc\ht\z@ - \advance\@tempdimc\dp\z@ - \setbox\z@=\hbox{% - \lst@frameHBkg\lst@fillcolor\@tempdimb\@firstoftwo - \if#1T\rlap{\raise\dp\@tempboxa\box\@tempboxa}% - \else\rlap{\lower\ht\@tempboxa\box\@tempboxa}\fi - \lst@frameHBkg\lst@rulesepcolor\@tempdimc\@secondoftwo - \advance\@tempdimb\ht\@tempboxa - \if#1T\rlap{\raise\lst@frametextsep\box\@tempboxa}% - \else\rlap{\lower\@tempdimb\box\@tempboxa}\fi - \rlap{\box\z@}% - }} -\gdef\lst@frameH@#1#2#3#4{% - \ifx\relax#4\@empty\else - \lst@frameh \@tempcntb#1#2#3#4% - \advance\@tempcntb\@ne - \expandafter\lst@frameH@\expandafter#1% - \fi} -\gdef\lst@frameHBkg#1#2#3{% - \setbox\@tempboxa\hbox{% - \kern-\lst@framexleftmargin - #3{\kern-\lst@framediml\relax}{\@tempdima\z@}% - \ifdim\lst@framediml>\@tempdimb - #3{\@tempdima\lst@framediml \advance\@tempdima-\@tempdimb - \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@}% - {\kern-\lst@framediml - \advance\@tempdima\lst@framediml\relax}% - \fi - #3{\@tempdima\z@ - \ifx\lst@framelshape\@empty\else - \advance\@tempdima\@tempdimb - \fi - \ifx\lst@framershape\@empty\else - \advance\@tempdima\@tempdimb - \fi}% - {\ifdim\lst@framedimr>\@tempdimb - \advance\@tempdima\lst@framedimr\relax - \fi}% - \advance\@tempdima\linewidth - \advance\@tempdima\lst@framexleftmargin - \advance\@tempdima\lst@framexrightmargin - \lst@frameBlock#1\@tempdima#2\z@ - #3{\ifdim\lst@framedimr>\@tempdimb - \@tempdima-\@tempdimb - \advance\@tempdima\lst@framedimr\relax - \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@ - \fi}{}% - }} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameh} -% This is the low-level macro used to draw top and bottom frame rules. -% It \emph{adds} one rule plus corners to box 0. -% The first parameter gives the size of the corners and the second is either -% |T| or |B|. -% |#3#4#5| is a left-to-right description of the frame and is in -% $\{$\texttt{Y,N,R}$\}\times\{$\texttt{Y,N}$\}\times\{$\texttt{Y,N,R}$\}$. -% We move to the correct horizontal position, set the left corner, the -% horizontal line, and the right corner. -% \begin{macrocode} -\gdef\lst@frameh#1#2#3#4#5{% - \lst@frameCalcDimA#1% - \lst@ifframeround \@getcirc\@tempdima \fi -% \end{macrocode} -% \begin{macrocode} - \setbox\z@\hbox{% - \begingroup - \setbox\z@\hbox{% - \kern-\lst@framexleftmargin - \color@begingroup - \ifnum#1=\z@ \lst@rulecolor \else \lst@xrulecolor \fi -% \end{macrocode} -% |\lst@frameCorner| gets four arguments: -% |\llap|, |TL| or |BL|, the corner type $\in\{$\texttt{Y,N,R}$\}$, and the -% size |#1|. -% \begin{macrocode} - \lst@frameCornerX\llap{#2L}#3#1% - \ifdim\lst@framediml<\@tempdimb - \xdef\lst@framediml{\the\@tempdimb}% - \fi - \begingroup - \if#4Y\else \let\lst@framerulewidth\z@ \fi - \@tempdima\lst@framexleftmargin - \advance\@tempdima\lst@framexrightmargin - \advance\@tempdima\linewidth - \vrule\@width\@tempdima\@height\lst@framerulewidth \@depth\z@ - \endgroup - \lst@frameCornerX\rlap{#2R}#5#1% - \ifdim\lst@framedimr<\@tempdimb - \xdef\lst@framedimr{\the\@tempdimb}% - \fi - \color@endgroup}% -% \end{macrocode} -% \begin{macrocode} - \if#2T\rlap{\raise\dp\z@\box\z@}% - \else\rlap{\lower\ht\z@\box\z@}\fi - \endgroup - \box\z@}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameCornerX} -% typesets a single corner and returns |\@tempdimb|, the width of the corner. -% \begin{macrocode} -\gdef\lst@frameCornerX#1#2#3#4{% - \setbox\@tempboxa\hbox{\csname\@lst @frame\if#3RR\fi #2\endcsname}% - \@tempdimb\wd\@tempboxa - \if #3R% - #1{\box\@tempboxa}% - \else - \if #3Y\expandafter#1\else - \@tempdimb\z@ \expandafter\vphantom \fi - {\box\@tempboxa}% - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameCalcDimA} -% calculates an all over width; used by |\lst@frameh| and |\lst@frameInit|. -% \begin{macrocode} -\gdef\lst@frameCalcDimA#1{% - \@tempdima\lst@rulesep - \advance\@tempdima\lst@framerulewidth - \multiply\@tempdima#1\relax - \advance\@tempdima\lst@frametextsep - \advance\@tempdima\lst@framerulewidth - \multiply\@tempdima\tw@} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameInit} -% First we look which frame types we have on the left and on the right. -% We speed up things if there are no vertical rules. -% \begin{macrocode} -\lst@AddToHook{Init}{\lst@frameInit} -\newbox\lst@framebox -\gdef\lst@frameInit{% - \ifx\lst@framelshape\@empty \let\lst@frameL\@empty \fi - \ifx\lst@framershape\@empty \let\lst@frameR\@empty \fi - \def\lst@framevrule{\vrule\@width\lst@framerulewidth\relax}% -% \end{macrocode} -% We adjust values to round corners if necessary. -% \begin{macrocode} - \lst@ifframeround - \lst@frameCalcDimA\z@ \@getcirc\@tempdima - \@tempdimb\@tempdima \divide\@tempdimb\tw@ - \advance\@tempdimb -\@wholewidth - \edef\lst@frametextsep{\the\@tempdimb}% - \edef\lst@framerulewidth{\the\@wholewidth}% -% \end{macrocode} -% \begin{macrocode} - \lst@frameCalcDimA\@ne \@getcirc\@tempdima - \@tempdimb\@tempdima \divide\@tempdimb\tw@ - \advance\@tempdimb -\tw@\@wholewidth - \advance\@tempdimb -\lst@frametextsep - \edef\lst@rulesep{\the\@tempdimb}% - \fi -% \end{macrocode} -% \begin{macrocode} - \lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}% - \def\lst@framelr{\copy\lst@framebox}% -% \end{macrocode} -% Finally we typeset the rules (+ corners). -% We possibly need to insert negative |\vskip| to remove space between -% preceding text and top rule. -% \begin{TODO} -% Use |\vspace| instead of |\vskip|? -% \end{TODO} -% \begin{macrocode} - \ifx\lst@frametshape\@empty\else - \lst@frameH T\lst@frametshape - \ifvoid\z@\else - \par\lst@parshape - \@tempdima-\baselineskip \advance\@tempdima\ht\z@ - \ifdim\prevdepth<\@cclvi\p@\else - \advance\@tempdima\prevdepth - \fi - \ifdim\@tempdima<\z@ - \vskip\@tempdima\vskip\lineskip - \fi - \noindent\box\z@\par - \lineskiplimit\maxdimen \lineskip\z@ - \fi - \lst@frameSpreadV\lst@framextopmargin - \fi} -% \end{macrocode} -% |\parshape\lst@parshape| ensures that the top rules correctly indented. -% The bug was reported by \lsthelper{Marcin~Kasperski}{1999/04/28}{top rules -% indented right inside itemize}. -% -% We typeset left and right rules every line. -% \begin{macrocode} -\lst@AddToHook{EveryLine}{\lst@framelr} -\global\let\lst@framelr\@empty -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameExit} -% The rules at the bottom. -% \begin{macrocode} -\lst@AddToHook{DeInit} - {\ifx\lst@framebshape\@empty\else \lst@frameExit \fi} -\gdef\lst@frameExit{% - \lst@frameSpreadV\lst@framexbottommargin - \lst@frameH B\lst@framebshape - \ifvoid\z@\else - \everypar{}\par\lst@parshape\nointerlineskip\noindent\box\z@ - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameSpreadV} -% sets rules for vertical spread. -% \begin{macrocode} -\gdef\lst@frameSpreadV#1{% - \ifdim\z@=#1\else - \everypar{}\par\lst@parshape\nointerlineskip\noindent - \lst@frameMakeBoxV\z@{#1}{\z@}% - \box\z@ - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@frameTR} -% \begin{macro}{\lst@frameBR} -% \begin{macro}{\lst@frameBL} -% \begin{macro}{\lst@frameTL} -% These macros make a vertical and horizontal rule. -% The implicit argument |\@tempdima| gives the size of two corners and is -% provided by |\lst@frameh|. -% \begin{macrocode} -\gdef\lst@frameTR{% - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@ - \kern-\lst@framerulewidth - \raise\lst@framerulewidth\hbox{% - \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}} -\gdef\lst@frameBR{% - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@ - \kern-\lst@framerulewidth - \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@} -\gdef\lst@frameBL{% - \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@ - \kern-\lst@framerulewidth - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@} -\gdef\lst@frameTL{% - \raise\lst@framerulewidth\hbox{% - \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}% - \kern-\lst@framerulewidth - \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@} -% \end{macrocode} -% \end{macro}\end{macro}\end{macro}\end{macro} -% -% \begin{macro}{\lst@frameRoundT} -% \begin{macro}{\lst@frameRoundB} -% are helper macros to typeset round corners. We set height and depth to -% the visible parts of the circle font. -% \begin{macrocode} -\gdef\lst@frameRoundT{% - \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}% - \ht\@tempboxa\lst@framerulewidth - \box\@tempboxa} -\gdef\lst@frameRoundB{% - \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}% - \dp\@tempboxa\z@ - \box\@tempboxa} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@frameRTR} -% \begin{macro}{\lst@frameRBR} -% \begin{macro}{\lst@frameRBL} -% \begin{macro}{\lst@frameRTL} -% The round corners. -% \begin{macrocode} -\gdef\lst@frameRTR{% - \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth - \kern.5\@tempdima \lst@frameRoundT \hss}} -\gdef\lst@frameRBR{% - \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth - \advance\@tempcnta\@ne \kern.5\@tempdima \lst@frameRoundB \hss}} -\gdef\lst@frameRBL{% - \advance\@tempcnta\tw@ \lst@frameRoundB - \kern-.5\@tempdima} -\gdef\lst@frameRTL{% - \advance\@tempcnta\thr@@\lst@frameRoundT - \kern-.5\@tempdima} -% \end{macrocode} -% \end{macro}\end{macro}\end{macro}\end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Macro use for make} -% -% \begin{aspect}{make} -% \begin{macro}{\lst@makemode} -% \begin{macro}{\lst@ifmakekey} -% If we've entered the special mode for Make, we save whether the last -% identifier has been a first order keyword. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{make} -% \end{macrocode} -% \begin{macrocode} -\lst@NewMode\lst@makemode -\lst@AddToHook{Output}{% - \ifnum\lst@mode=\lst@makemode - \ifx\lst@thestyle\lst@gkeywords@sty - \lst@makekeytrue - \fi - \fi} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@makekeytrue{\let\lst@ifmakekey\iftrue} -\gdef\lst@makekeyfalse{\let\lst@ifmakekey\iffalse} -\global\lst@makekeyfalse % init -% \end{macrocode} -% \end{macro}\end{macro} -% -% \begin{lstkey}{makemacrouse} -% adjusts the character table if necessary -% \begin{macrocode} -\lst@Key{makemacrouse}f[t]{\lstKV@SetIf{#1}\lst@ifmakemacrouse} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@MakeSCT} -% If `macro use' is on, the opening |$(| prints preceding characters, enters -% the special mode and merges the two characters with the following output. -% -% \begin{macrocode} -\gdef\lst@MakeSCT{% - \lst@ifmakemacrouse - \lst@ReplaceInput{$(}{% - \lst@PrintToken - \lst@EnterMode\lst@makemode{\lst@makekeyfalse}% - \lst@Merge{\lst@ProcessOther\$\lst@ProcessOther(}}% -% \end{macrocode} -% The closing parenthesis tests for the mode and either processes |)| as usual -% or outputs it right here (in keyword style if a keyword was between |$(| and -% |)|). -% \begin{macrocode} - \lst@ReplaceInput{)}{% - \ifnum\lst@mode=\lst@makemode - \lst@PrintToken - \begingroup - \lst@ProcessOther)% - \lst@ifmakekey - \let\lst@currstyle\lst@gkeywords@sty - \fi - \lst@OutputOther - \endgroup - \lst@LeaveMode - \else - \expandafter\lst@ProcessOther\expandafter)% - \fi}% -% \end{macrocode} -% If \keyname{makemacrouse} is off then both |$(| are just `others'. -% \begin{macrocode} - \else - \lst@ReplaceInput{$(}{\lst@ProcessOther\$\lst@ProcessOther(}% - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \section{Typesetting a listing} -% -% \begingroup -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% \endgroup -% \begin{macro}{\lst@lineno} -% \begin{lstkey}{print} -% \begin{lstkey}{firstline} -% \begin{lstkey}{lastline} -% \begin{lstkey}{linerange} -% The `current line' counter and three keys. -% \begin{macrocode} -\newcount\lst@lineno % \global -\lst@AddToHook{InitVars}{\global\lst@lineno\@ne} -% \end{macrocode} -% \begin{macrocode} -\lst@Key{print}{true}[t]{\lstKV@SetIf{#1}\lst@ifprint} -\lst@Key{firstline}\relax{\def\lst@firstline{#1\relax}} -\lst@Key{lastline}\relax{\def\lst@lastline{#1\relax}} -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{PreSet} - {\let\lst@firstline\@ne \def\lst@lastline{9999999\relax}} -% \end{macrocode} -% The following code is just copied from the current development version. -% \begin{macrocode} -\lst@Key{linerange}\relax{\lstKV@OptArg[]{#1}{% - \def\lst@interrange{##1}\def\lst@linerange{##2,}}} -\lst@AddToHook{PreSet}{\def\lst@firstline{1\relax}% - \let\lst@linerange\@empty} -\lst@AddToHook{Init} -{\ifx\lst@linerange\@empty - \edef\lst@linerange{{\lst@firstline}-{\lst@lastline},}% - \fi - \lst@GetLineInterval}% -\def\lst@GetLineInterval{\expandafter\lst@GLI\lst@linerange\@nil} -\def\lst@GLI#1,#2\@nil{\def\lst@linerange{#2}\lst@GLI@#1--\@nil} -\def\lst@GLI@#1-#2-#3\@nil{% - \ifx\@empty#1\@empty - \let\lst@firstline\@ne - \else - \def\lst@firstline{#1\relax}% - \fi - \ifx\@empty#2\@empty - \def\lst@lastline{9999999\relax}% - \else - \ifx -#2% - \let\lst@lastline\lst@firstline - \else - \def\lst@lastline{#2\relax}% - \fi - \fi} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey}\end{lstkey}\end{lstkey}\end{macro} -% -% \begin{lstkey}{nolol} -% is just a key here. We'll use it below, of course. -% \begin{macrocode} -\lst@Key{nolol}{false}[t]{\lstKV@SetIf{#1}\lst@ifnolol} -\def\lst@nololtrue{\let\lst@ifnolol\iftrue} -\let\lst@ifnolol\iffalse % init -% \end{macrocode} -% \end{lstkey} -% -% -% \subsection{Floats, boxes and captions} -% -% \begin{lstkey}{captionpos} -% \begin{lstkey}{abovecaptionskip} -% \begin{lstkey}{belowcaptionskip} -% \begin{lstkey}{label} -% \begin{lstkey}{title} -% \begin{lstkey}{caption} -% Some keys and \ldots -% \begin{macrocode} -\lst@Key{captionpos}{t}{\def\lst@captionpos{#1}} -\lst@Key{abovecaptionskip}\smallskipamount{\def\lst@abovecaption{#1}} -\lst@Key{belowcaptionskip}\smallskipamount{\def\lst@belowcaption{#1}} -% \end{macrocode} -% \lsthelper{Rolf~Niepraschk}{2000/01/10}{key: title} proposed \keyname{title}. -% \begin{macrocode} -\lst@Key{label}\relax{\def\lst@label{#1}} -\lst@Key{title}\relax{\def\lst@title{#1}\let\lst@caption\relax} -\lst@Key{caption}\relax{\lstKV@OptArg[{#1}]{#1}% - {\def\lst@caption{##2}\def\lst@@caption{##1}}% - \let\lst@title\@empty} -\lst@AddToHookExe{TextStyle} - {\let\lst@caption\@empty \let\lst@@caption\@empty - \let\lst@title\@empty \let\lst@label\@empty} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\thelstlisting} -% \begin{macro}{\lstlistingname} -% \ldots\space and how the caption numbers look like. I switched to -% |\@ifundefined| (instead of |\ifx| |\@undefined|) after an error report from -% \lsthelper{Denis~Girou}{1999/07/26}{incompatible if hyperref loaded before -% listings}. -% \begin{macrocode} -\@ifundefined{thechapter} - {\newcounter{lstlisting} - \renewcommand\thelstlisting{\@arabic\c@lstlisting}} - {\newcounter{lstlisting}[chapter] - \renewcommand\thelstlisting - {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstlisting}} -% \end{macrocode} -% \begin{macrocode} -\lst@UserCommand\lstlistingname{Listing} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@MakeCaption} -% Before defining this macro, we ensure that some other control sequences -% exist---\lsthelper{Adam~Prugel-Bennett}{2001/02/19}{\abovecaptionskip -% undefined in slides.cls} reported problems with the slides document class. -% In particular we allocate above- and belowcaption skip registers and define -% |\@makecaption|, which is an exact copy of the definition in the article -% class. To respect the LPPL: you should have a copy of this class on your -% \TeX\ system or you can obtain a copy from the CTAN, e.g.~from the ftp-server -% \texttt{ftp.dante.de}. -% -% Axel Sommerfeldt proposed a couple of improvements regarding captions and -% titles. The first is to separate the definitions of the skip registers and -% |\@makecaption|. -% \begin{macrocode} -\@ifundefined{abovecaptionskip} -{\newskip\abovecaptionskip - \newskip\belowcaptionskip}{} -\@ifundefined{@makecaption} -{\long\def\@makecaption#1#2{% - \vskip\abovecaptionskip - \sbox\@tempboxa{#1: #2}% - \ifdim \wd\@tempboxa >\hsize - #1: #2\par - \else - \global \@minipagefalse - \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% - \fi - \vskip\belowcaptionskip}% -}{} -% \end{macrocode} -% The introduction of |\fnum@lstlisting| is also due to Axel. Previously the -% replacement text was used directly in |\lst@MakeCaption|. A |\noindent| has -% been moved elsewhere and became |\@parboxrestore| after a bug report from -% \lsthelper{Frank~Mittelbach}{2004/02/13}{Re: Info: Inkompatibilit\"at -% zwischen caption und listings}. -% \begin{macrocode} -\def\fnum@lstlisting{% - \lstlistingname - \ifx\lst@@caption\@empty\else~\thelstlisting\fi}% -% \end{macrocode} -% Captions are set only for display style listings -- thanks to -% \lsthelper{Peter~L\"offler}{2004/04/24}{pdfTeX warning (dest): name{figure.1} -% has been referenced but does not exist} for reporting the bug and to -% \lsthelper{Axel~Sommerfeldt}{2004/02/27}{Re: caption + listings + hyperref} -% for analyzing the bug. -% We |\refstepcounter| the listing counter if and only if |\lst@@caption| is -% not empty. Otherwise we ensure correct hyper-references, -% see |\lst@HRefStepCounter| below. We do this once a listing, namely at the -% top. -% \begin{macrocode} -\def\lst@MakeCaption#1{% - \lst@ifdisplaystyle - \ifx #1t% - \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else - \expandafter\refstepcounter - \fi {lstlisting}% - \ifx\lst@label\@empty\else \label{\lst@label}\fi -% \end{macrocode} -% The following code has been moved here from the \hookname{Init} hook after -% a bug report from \lsthelper{Rolf~Niepraschk}{2003/06/11}{pagebreak between -% caption and listing}. Moreover the initialization of |\lst@name| et al have -% been inserted here after a bug report from \lsthelper{Werner~Struckmann} -% {2003/06/25}{undefined control sequence \lst@name}. -% We make a `lol' entry if the name is neither empty nor a single space. But -% we test |\lst@|(|@|)|caption| and |\lst@ifnolol| first. -% \begin{macrocode} - \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl - \global\let\lst@name\lst@arg \global\let\lstname\lst@name - \lst@ifnolol\else - \ifx\lst@@caption\@empty - \ifx\lst@caption\@empty - \ifx\lst@intname\@empty \else \def\lst@temp{ }% - \ifx\lst@intname\lst@temp \else - \addcontentsline{lol}{lstlisting}\lst@name - \fi\fi - \fi - \else - \addcontentsline{lol}{lstlisting}% - {\protect\numberline{\thelstlisting}\lst@@caption}% - \fi - \fi - \fi -% \end{macrocode} -% We make a caption if and only if the caption is not empty and the user -% requested a caption at |#1| $\in\{\mathtt t,\mathtt b\}$. To disallow -% pagebreaks between caption (or title) and a listing, we redefine the -% primitive |\vskip| locally to insert |\nobreak|s. Note that we allow -% pagebreaks in front of a `top-caption' and after a `bottom-caption'. -% \begin{TODO} -% This redefinition is a brute force method. Is there a better one? -% \end{TODO} -% \begin{macrocode} - \ifx\lst@caption\@empty\else - \lst@IfSubstring #1\lst@captionpos - {\begingroup \let\@@vskip\vskip - \def\vskip{\afterassignment\lst@vskip \@tempskipa}% - \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}% - \par\@parboxrestore\normalsize\normalfont % \noindent (AS) - \ifx #1t\allowbreak \fi - \ifx\lst@title\@empty - \lst@makecaption\fnum@lstlisting\lst@caption % (AS) - \else - \lst@maketitle\lst@title % (AS) - \fi - \ifx #1b\allowbreak \fi - \endgroup}{}% - \fi - \fi} -% \end{macrocode} -% I've inserted |\normalsize| after a bug report from -% \lsthelper{Andreas~Matthias}{2000/01/04}{caption affected by basicstyle} -% and moved it in front of |\@makecaption| after receiving another from -% \lsthelper{Sonja~Weidmann}{2000/02/01}{listings and caption packages -% not compatible}. -% \end{macro} -% -% \begin{macro}{\lst@makecaption} -% \begin{macro}{\lst@maketitle} -% Axel proposed the first definition. The other two are default definitions. -% They may be adjusted to make \packagename{listings} compatible with other -% packages and classes. -% \begin{macrocode} -\def\lst@makecaption{\@makecaption} -\def\lst@maketitle{\@makecaption\lst@title@dropdelim} -\def\lst@title@dropdelim#1{\ignorespaces} -% \end{macrocode} -% The following \packagename{caption}(\packagename{2}) support comes also from -% Axel. -% \begin{macrocode} -\AtBeginDocument{% -\@ifundefined{captionlabelfalse}{}{% - \def\lst@maketitle{\captionlabelfalse\@makecaption\@empty}}% -\@ifundefined{caption@startrue}{}{% - \def\lst@maketitle{\caption@startrue\@makecaption\@empty}}% -} -% \end{macrocode} -% \end{macro}\end{macro} -% -% \begin{macro}{\lst@HRefStepCounter} -% This macro sets the listing number to a negative value since the user -% shouldn't refer to such a listing. If the \packagename{hyperref} package -% is present, we use `lstlisting' (argument from above) to hyperref to. -% The groups have been added to prevent other packages (namely -% \packagename{tabularx}) from reading the locally changed counter -% and writing it back globally. Thanks to \lsthelper{Michael~Niedermair} -% {2001/09/18}{strange numbering of listings} for the report. Unfortunately -% this localization led to another bug, see |\theHlstnumber|. -% \begin{macrocode} -\def\lst@HRefStepCounter#1{% - \begingroup - \c@lstlisting\lst@neglisting - \advance\c@lstlisting\m@ne \xdef\lst@neglisting{\the\c@lstlisting}% - \ifx\hyper@refstepcounter\@undefined\else - \hyper@refstepcounter{#1}% - \fi - \endgroup} -\gdef\lst@neglisting{\z@}% init -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{boxpos} -% \begin{macro}{\lst@boxtrue} -% sets the vertical alignment of the (possibly) used box respectively indicates -% that a box is used. -% \begin{macrocode} -\lst@Key{boxpos}{c}{\def\lst@boxpos{#1}} -% \end{macrocode} -% \begin{macrocode} -\def\lst@boxtrue{\let\lst@ifbox\iftrue} -\let\lst@ifbox\iffalse -% \end{macrocode} -% \end{macro}\end{lstkey} -% -% \begin{lstkey}{float} -% \begin{lstkey}{floatplacement} -% Matthias Zenger asked for double-column floats, so I've inserted some code. -% We first check for a star \ldots -% \begin{macrocode} -\lst@Key{float}\relax[\lst@floatplacement]{% - \lstKV@SwitchCases{#1}% - {true&\let\lst@floatdefault\lst@floatplacement - \let\lst@float\lst@floatdefault\\% - false&\let\lst@floatdefault\relax - \let\lst@float\lst@floatdefault - }{\def\lst@next{\@ifstar{\let\lst@beginfloat\@dblfloat - \let\lst@endfloat\end@dblfloat - \lst@KFloat}% - {\let\lst@beginfloat\@float - \let\lst@endfloat\end@float - \lst@KFloat}} - \edef\lst@float{#1}% - \expandafter\lst@next\lst@float\relax}} -% \end{macrocode} -% \ldots\ and define |\lst@float|. -% \begin{macrocode} -\def\lst@KFloat#1\relax{% - \ifx\@empty#1\@empty - \let\lst@float\lst@floatplacement - \else - \def\lst@float{#1}% - \fi} -% \end{macrocode} -% The setting |\lst@AddToHook{PreSet}{\let\lst@float\relax}| has been -% changed on request of \lsthelper{Tanguy~Fautr\'e}{2004/02/02}{listings -% not following float directive?}. This also led to some adjustments above. -% \begin{macrocode} -\lst@Key{floatplacement}{tbp}{\def\lst@floatplacement{#1}} -\lst@AddToHook{PreSet}{\let\lst@float\lst@floatdefault} -\lst@AddToHook{TextStyle}{\let\lst@float\relax} -\let\lst@floatdefault\relax % init -% \end{macrocode} -% |\lst@doendpe| is set according to |\lst@float| -- thanks to -% \lsthelper{Andreas~Schmidt}{2004/05/15}{wrong spacing when a floating listing -% follows \section} and \lsthelper{Heiko~Oberdiek}{2004/05/18}{dito}. -% \begin{macrocode} -\lst@AddToHook{DeInit}{% - \ifx\lst@float\relax - \global\let\lst@doendpe\@doendpe - \else - \global\let\lst@doendpe\@empty - \fi} -% \end{macrocode} -% The float type |\ftype@lstlisting| is set according to whether the -% \packagename{float} package is loaded and whether \texttt{figure} and -% \texttt{table} floats are defined. This is done at |\begin{document}| to -% make the code independent of the order of package loading. -% \begin{macrocode} -\AtBeginDocument{% -\@ifundefined{c@float@type}% - {\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}} - {\edef\ftype@lstlisting{\the\c@float@type}% - \addtocounter{float@type}{\value{float@type}}}% -} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% -% \subsection{Init and EOL} -% -% \begin{lstkey}{aboveskip} -% \begin{lstkey}{belowskip} -% We define and initialize these keys and prevent extra spacing for `inline' -% listings (in particular if \packagename{fancyvrb} interface is active, -% problem reported by \lsthelper{Denis~Girou}{1999/08/03}{wrong spacing}). -% \begin{macrocode} -\lst@Key{aboveskip}\medskipamount{\def\lst@aboveskip{#1}} -\lst@Key{belowskip}\medskipamount{\def\lst@belowskip{#1}} -\lst@AddToHook{TextStyle} - {\let\lst@aboveskip\z@ \let\lst@belowskip\z@} -% \end{macrocode} -% \end{lstkey}\end{lstkey} -% -% \begin{lstkey}{everydisplay} -% \begin{macro}{\lst@ifdisplaystyle} -% Some things depend on display-style listings. -% \begin{macrocode} -\lst@Key{everydisplay}{}{\def\lst@EveryDisplay{#1}} -\lst@AddToHook{TextStyle}{\let\lst@ifdisplaystyle\iffalse} -\lst@AddToHook{DisplayStyle}{\let\lst@ifdisplaystyle\iftrue} -\let\lst@ifdisplaystyle\iffalse -% \end{macrocode} -% \end{macro} -% \end{lstkey} -% -% \begin{macro}{\lst@Init} -% Begin a float if requested. -% \begin{macrocode} -\def\lst@Init#1{% - \begingroup - \ifx\lst@float\relax\else - \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}% - \expandafter\@tempa - \fi -% \end{macrocode} -% In restricted horizontal \TeX\ mode we switch to |\lst@boxtrue|. -% In that case we make appropriate box(es) around the listing. -% \begin{macrocode} - \ifhmode\ifinner \lst@boxtrue \fi\fi - \lst@ifbox - \lsthk@BoxUnsafe - \hbox to\z@\bgroup - $\if t\lst@boxpos \vtop - \else \if b\lst@boxpos \vbox - \else \vcenter \fi\fi - \bgroup \par\noindent - \else - \lst@ifdisplaystyle - \lst@EveryDisplay - \par\penalty-50\relax - \vspace\lst@aboveskip - \fi - \fi -% \end{macrocode} -% Moved |\vspace| after |\par|---or we can get an empty line atop listings. -% Bug reported by \lsthelper{Jim~Hefferon}{1999/08/27}{empty line before -% listings with |\lstinputlisting|}. -% -% Now make the top caption. -% \begin{macrocode} - \normalbaselines - \abovecaptionskip\lst@abovecaption\relax - \belowcaptionskip\lst@belowcaption\relax - \lst@MakeCaption t% -% \end{macrocode} -% Some initialization. -% I removed |\par\nointerlineskip| |\normalbaselines| after bug report from -% \lsthelper{Jim~Hefferon}{1999/08/23}{bad vertical space after lstlisting}. -% He reported the same problem as Aidan Philip Heerdegen (see below), but I -% immediately saw the bug here since Jim used |\parskip|$\,\neq0$. -% \begin{macrocode} - \lsthk@PreInit \lsthk@Init - \lst@ifdisplaystyle - \global\let\lst@ltxlabel\@empty - \if@inlabel - \lst@ifresetmargins - \leavevmode - \else - \xdef\lst@ltxlabel{\the\everypar}% - \lst@AddTo\lst@ltxlabel{% - \global\let\lst@ltxlabel\@empty - \everypar{\lsthk@EveryLine\lsthk@EveryPar}}% - \fi - \fi - \everypar\expandafter{\lst@ltxlabel - \lsthk@EveryLine\lsthk@EveryPar}% - \else - \everypar{}\let\lst@NewLine\@empty - \fi - \lsthk@InitVars \lsthk@InitVarsBOL -% \end{macrocode} -% The end of line character chr(13)=|^^M| controls the processing, see the -% definition of |\lst@MProcessListing| below. -% The argument |#1| is either |\relax| or |\lstenv@backslash|. -% \begin{macrocode} - \lst@Let{13}\lst@MProcessListing - \let\lst@Backslash#1% - \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}% - \lst@InitFinalize} -% \end{macrocode} -% Note: From version 0.19 on `listing processing' is implemented as an internal -% mode, namely a mode with special character table. Since a bug report from -% \lsthelper{Fermin~Reig}{2002/09/04}{bad top frame inside figure+centering} -% |\rightskip| and the others are reset via \hookname{PreInit} and not via -% \hookname{InitVars}. -% \begin{macrocode} -\let\lst@InitFinalize\@empty % init -\lst@AddToHook{PreInit} - {\rightskip\z@ \leftskip\z@ \parfillskip=\z@ plus 1fil - \let\par\@@par} -\lst@AddToHook{EveryLine}{}% init -\lst@AddToHook{EveryPar}{}% init -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{showlines} -% lets the user control whether empty lines at the end of a listing are -% printed. But you know that if you've read the User's guide. -% \begin{macrocode} -\lst@Key{showlines}f[t]{\lstKV@SetIf{#1}\lst@ifshowlines} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@DeInit} -% Output the remaining characters and update all things. First I missed to -% to use |\lst@ifdisplaystyle| here, but then \lsthelper{KP~Gores}{2001/07/11} -% {\csname{par} after each \lstinline} reported a problem. -% The |\everypar| has been put behind |\lsthk@ExitVars| after a bug report by -% \lsthelper{Michael~Niedermair}{2002/05/14}{listings.sty und caption} and -% I've added |\normalbaselines| after a bug report by \lsthelper{Georg~Rehm} -% {2002/05/14}{listings.sty und lange captions} and |\normalcolor| after a -% report by \lsthelper{Walter~E.~Brown}{2004/03/01}{captions at bottom of -% listings inherit color from basicstyle}. -% \begin{macrocode} -\def\lst@DeInit{% - \lst@XPrintToken \lst@EOLUpdate - \global\advance\lst@newlines\m@ne - \lst@ifshowlines - \lst@DoNewLines - \else - \setbox\@tempboxa\vbox{\lst@DoNewLines}% - \fi - \lst@ifdisplaystyle \par\removelastskip \fi - \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor -% \end{macrocode} -% Place the bottom caption. -% \begin{macrocode} - \lst@MakeCaption b% -% \end{macrocode} -% Close the boxes if necessary and make a rule to get the right width. -% I added the |\par\nointerlineskip| (and removed |\nointerlineskip| later -% again) after receiving a bug report from \lsthelper{Aidan~Philip~Heerdegen} -% {1999/07/23}{wrong vertical spacing}. |\everypar{}| is due to a bug report -% from \lsthelper{Sonja~Weidmann}{2000/02/01}{listings and caption packages -% not compatible}. -% \begin{macrocode} - \lst@ifbox - \egroup $\hss \egroup - \vrule\@width\lst@maxwidth\@height\z@\@depth\z@ - \else - \lst@ifdisplaystyle - \par\penalty-50\vspace\lst@belowskip - \fi - \fi -% \end{macrocode} -% End the float if necessary. -% \begin{macrocode} - \ifx\lst@float\relax\else - \expandafter\lst@endfloat - \fi - \endgroup} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@maxwidth} -% is to be allocated, initialized and updated. -% \begin{macrocode} -\newdimen\lst@maxwidth % \global -\lst@AddToHook{InitVars}{\global\lst@maxwidth\z@} -\lst@AddToHook{InitVarsEOL} - {\ifdim\lst@currlwidth>\lst@maxwidth - \global\lst@maxwidth\lst@currlwidth - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EOLUpdate} -% What do you think this macro does? -% \begin{macrocode} -\def\lst@EOLUpdate{\lsthk@EOL \lsthk@InitVarsEOL} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@MProcessListing} -% This is what we have to do at EOL while processing a listing. -% We output all remaining characters and update the variables. -% If we've reached the last line, we check whether there is a next line -% interval to input or not. -% \begin{macrocode} -\def\lst@MProcessListing{% - \lst@XPrintToken \lst@EOLUpdate \lsthk@InitVarsBOL - \global\advance\lst@lineno\@ne - \ifnum \lst@lineno>\lst@lastline - \lst@ifdropinput \lst@LeaveMode \fi - \ifx\lst@linerange\@empty - \expandafter\expandafter\expandafter\lst@EndProcessListing - \else - \lst@interrange - \lst@GetLineInterval - \expandafter\expandafter\expandafter\lst@SkipToFirst - \fi - \else - \expandafter\lst@BOLGobble - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@EndProcessListing} -% Default definition is |\endinput|. -% This works for |\lstinputlisting|. -% \begin{macrocode} -\let\lst@EndProcessListing\endinput -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{gobble} -% The key sets the number of characters to gobble each line. -% \begin{macrocode} -\lst@Key{gobble}{0}{\def\lst@gobble{#1}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lst@BOLGobble} -% If the number is positive, we set a temporary counter and start a loop. -% \begin{macrocode} -\def\lst@BOLGobble{% - \ifnum\lst@gobble>\z@ - \@tempcnta\lst@gobble\relax - \expandafter\lst@BOLGobble@ - \fi} -% \end{macrocode} -% A nonpositive number terminates the loop (by not continuing). -% Note: This is not the macro just used in |\lst@BOLGobble|. -% \begin{macrocode} -\def\lst@BOLGobble@@{% - \ifnum\@tempcnta>\z@ - \expandafter\lst@BOLGobble@ - \fi} -% \end{macrocode} -% If we gobble a backslash, we have to look whether this backslash ends an -% environment. Whether the coming characters equal e.g.~|end{lstlisting}|, -% we either end the environment or insert all just eaten characters after the -% `continue loop' macro. -% \begin{macrocode} -\def\lstenv@BOLGobble@@{% - \lst@IfNextChars\lstenv@endstring{\lstenv@End}% - {\advance\@tempcnta\m@ne \expandafter\lst@BOLGobble@@\lst@eaten}} -% \end{macrocode} -% Now comes the loop: if we read |\relax|, EOL or FF, the next operation is -% exactly the same token. Note that for FF (and tabs below) we test against -% a macro which contains |\lst@ProcessFormFeed|. This was a bug analyzed by -% \lsthelper{Heiko~Oberdiek}{2002/04/16}{Re: first experience ...}. -% \begin{macrocode} -\def\lst@BOLGobble@#1{% - \let\lst@next#1% - \ifx \lst@next\relax\else - \ifx \lst@next\lst@MProcessListing\else - \ifx \lst@next\lst@processformfeed\else -% \end{macrocode} -% Otherwise we use one of the two submacros. -% \begin{macrocode} - \ifx \lst@next\lstenv@backslash - \let\lst@next\lstenv@BOLGobble@@ - \else - \let\lst@next\lst@BOLGobble@@ -% \end{macrocode} -% Now we really gobble characters. A tabulator decreases the temporary counter -% by |\lst@tabsize| (and deals with remaining amounts, if necessary), \ldots -% \begin{macrocode} - \ifx #1\lst@processtabulator - \advance\@tempcnta-\lst@tabsize\relax - \ifnum\@tempcnta<\z@ - \lst@length-\@tempcnta \lst@PreGotoTabStop - \fi -% \end{macrocode} -% \ldots\space whereas any other character decreases the counter by one. -% \begin{macrocode} - \else - \advance\@tempcnta\m@ne - \fi - \fi \fi \fi \fi - \lst@next} -% \end{macrocode} -% \begin{macrocode} -\def\lst@processformfeed{\lst@ProcessFormFeed} -\def\lst@processtabulator{\lst@ProcessTabulator} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{List of listings} -% -% \begin{lstkey}{name} -% \begin{macro}{\lstname} -% \begin{macro}{\lst@name} -% \begin{macro}{\lst@intname} -% Each pretty-printing command values |\lst@intname| before setting any keys. -% \begin{macrocode} -\lst@Key{name}\relax{\def\lst@intname{#1}} -\lst@AddToHookExe{PreSet}{\global\let\lst@intname\@empty} -\lst@AddToHook{PreInit}{% - \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl - \global\let\lst@name\lst@arg \global\let\lstname\lst@name} -% \end{macrocode} -% Use of |\lst@ReplaceIn| removes a bug first reported by -% \lsthelper{Magne~Rudshaug}{1998/01/09}{_ and list of listings}. -% Here is the replacement list. -% \begin{macrocode} -\def\lst@filenamerpl{_\textunderscore $\textdollar -\textendash} -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{lstkey} -% -% \begin{macro}{\l@lstlisting} -% prints one `lol' line. -% \begin{macrocode} -\def\l@lstlisting#1#2{\@dottedtocline{1}{1.5em}{2.3em}{#1}{#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstlistlistingname} -% contains simply the header name. -% \begin{macrocode} -\lst@UserCommand\lstlistlistingname{Listings} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstlistoflistings} -% We make local adjustments and call |\tableofcontents|. This way, -% redefinitions of that macro (e.g.~without any |\MakeUppercase| inside) -% also take effect on the list of listings. -% \begin{macrocode} -\lst@UserCommand\lstlistoflistings{\bgroup - \let\contentsname\lstlistlistingname - \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}% - \tableofcontents \egroup} -% \end{macrocode} -% For KOMA-script classes, we define it a la KOMA thanks to a bug report by -% \lsthelper{Tino~Langer}{2003/11/01}{koma-script's listsleft option does not -% affect lol}. -% \begin{macrocode} -\@ifpackageloaded{scrlfile} -{\newcommand*\lol@heading{\float@listhead{\lstlistlistingname}} - \renewcommand*\lstlistoflistings{% - \begingroup% - \if@twocolumn - \@restonecoltrue\onecolumn - \else - \@restonecolfalse - \fi - \lol@heading% - \@parskipfalse\@parskip@indent% - \@starttoc{lol}% - \if@restonecol\twocolumn\fi - \endgroup}% -}{} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Inline listings}\label{iInlineListings} -% -% \begin{macro}{\lstinline} -% In addition to |\lsthk@PreSet|, we use |boxpos=b| and flexiblecolumns. -% I've inserted |\leavevmode| after bug report from \lsthelper{Michael~Weber} -% {1999/12/16}{wrong spacing in list environments}. \lsthelper{Olivier~Lecarme} -% {2001/07/30}{inconsistent `break' when \lstinline is used inside caption} -% reported a problem which has gone after removing |\let| |\lst@newlines| -% |\@empty| (now |\lst@newlines| is a counter!). Unfortunately I don't know -% the reason for inserting this code some time ago! At the end of the macro we -% check the delimiter. -% \begin{macrocode} -\newcommand\lstinline[1][]{% - \leavevmode\bgroup % \hbox\bgroup --> \bgroup - \def\lst@boxpos{b}% - \lsthk@PreSet\lstset{flexiblecolumns,#1}% - \lsthk@TextStyle - \@ifnextchar\bgroup{\afterassignment\lst@InlineG \let\@let@token}% - \lstinline@} -\def\lstinline@#1{% - \lst@Init\relax - \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}} -\lst@AddToHook{TextStyle}{}% init -% \end{macrocode} -% \begin{macrocode} -\lst@AddToHook{SelectCharTable}{\lst@inlinechars} -\global\let\lst@inlinechars\@empty -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@InlineM} -% \begin{macro}{\lst@InlineJ} -% treat the cases of `normal' inlines and inline listings inside an argument. -% In the first case the given character ends the inline listing and EOL within -% such a listing immediately ends it and produces an error message. -% \begin{macrocode} -\def\lst@InlineM#1{\gdef\lst@inlinechars{% - \lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}% - \lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty - \PackageError{Listings}{lstinline ended by EOL}\@ehc}}% - \lst@inlinechars} -% \end{macrocode} -% In the other case we get all characters up to |#1|, make these characters -% active, execute (typeset) them and end the listing (all via temporary macro). -% That's all about it. -% \begin{macrocode} -\def\lst@InlineJ#1{% - \def\lst@temp##1#1{% - \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg - \lst@DeInit\egroup}% - \lst@temp} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\lst@InlineG} -% is experimental. -% \begin{macrocode} -\def\lst@InlineG{% - \lst@Init\relax - \lst@IfNextCharActive{\lst@InlineM\}}% - {\let\lst@arg\@empty \lst@InlineGJ}} -\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest} -\def\lst@InlineGJTest{% - \ifx\@let@token\egroup - \afterassignment\lst@InlineGJEnd - \expandafter\let\expandafter\@let@token - \else - \ifx\@let@token\@sptoken - \let\lst@next\lst@InlineGJReadSp - \else - \let\lst@next\lst@InlineGJRead - \fi - \expandafter\lst@next - \fi} -\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup} -\def\lst@InlineGJRead#1{% - \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}% - \lst@InlineGJ} -\def\lst@InlineGJReadSp#1{% - \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}% - \lst@InlineGJ#1} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{The input command}\label{iTheInputCommand} -% -% \begin{macro}{\lst@MakePath} -% \begin{lstkey}{inputpath} -% The macro appends a slash to a path if necessary. -% \begin{macrocode} -\def\lst@MakePath#1{\ifx\@empty#1\@empty\else\lst@MakePath@#1/\@nil/\fi} -\def\lst@MakePath@#1/{#1/\lst@MakePath@@} -\def\lst@MakePath@@#1/{% - \ifx\@nil#1\expandafter\@gobble - \else \ifx\@empty#1\else #1/\fi \fi - \lst@MakePath@@} -% \end{macrocode} -% Now we can empty the path or use |\lst@MakePath|. -% \begin{macrocode} -\lst@Key{inputpath}{}{\edef\lst@inputpath{\lst@MakePath{#1}}} -% \end{macrocode} -% \end{lstkey} -% \end{macro} -% -% \begin{macro}{\lstinputlisting} -% inputs the listing or asks the user for a new file name. -% \begin{macrocode} -\def\lstinputlisting{% - \begingroup \lst@setcatcodes \lst@inputlisting} -\newcommand\lst@inputlisting[2][]{% - \endgroup - \def\lst@set{#1}% - \IfFileExists{\lst@inputpath#2}% - {\expandafter\lst@InputListing\expandafter{\lst@inputpath#2}}% - {\filename@parse{\lst@inputpath#2}% - \edef\reserved@a{\noexpand\lst@MissingFileError - {\filename@area\filename@base}% - {\ifx\filename@ext\relax tex\else\filename@ext\fi}}% - \reserved@a}% - \lst@doendpe \@newlistfalse \ignorespaces} -% \end{macrocode} -% We use |\lst@doendpe| to remove indention at the beginning of the next -% line---except there is an empty line after |\lstinputlisting|. Bug was -% reported by \lsthelper{David~John~Evans}{1999/06/08}{indention after -% listings} and \lsthelper{David~Carlisle}{1999/06/08}{LaTeX `display -% environment' code} pointed me to the solution. -% \end{macro} -% -% \begin{macro}{\lst@MissingFileError} -% is a derivation of \LaTeX's |\@missingfileerror|. The parenthesis have been -% added after \lsthelper{Heiko~Oberdiek}{2003/01/14}{File `Makefile.tex' not -% found} reported about a problem discussed on TEX-D-L. -% \begin{macrocode} -\def\lst@MissingFileError#1#2{% - \typeout{^^J! Package Listings Error: File `#1(.#2)' not found.^^J% - ^^JType X to quit or to proceed,^^J% - or enter new name. (Default extension: #2)^^J}% - \message{Enter file name: }% - {\endlinechar\m@ne \global\read\m@ne to\@gtempa}% -% \end{macrocode} -% Typing |x| or |X| exits. -% \begin{macrocode} - \ifx\@gtempa\@empty \else - \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi - \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi -% \end{macrocode} -% In all other cases we try the new file name. -% \begin{macrocode} - \filename@parse\@gtempa - \edef\filename@ext{% - \ifx\filename@ext\relax#2\else\filename@ext\fi}% - \edef\reserved@a{\noexpand\IfFileExists % - {\filename@area\filename@base.\filename@ext}% - {\noexpand\lst@InputListing % - {\filename@area\filename@base.\filename@ext}}% - {\noexpand\lst@MissingFileError - {\filename@area\filename@base}{\filename@ext}}}% - \expandafter\reserved@a % - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@ifdraft} -% makes use of |\lst@ifprint|. \lsthelper{Enrico~Straube}{2002/02/12} -% {de.comp.text.tex: listings und draft Modus} requested the final option. -% \begin{macrocode} -\let\lst@ifdraft\iffalse -\DeclareOption{draft}{\let\lst@ifdraft\iftrue} -\DeclareOption{final}{\let\lst@ifdraft\iffalse} -\lst@AddToHook{PreSet} - {\lst@ifdraft - \let\lst@ifprint\iffalse - \@gobbletwo\fi\fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@InputListing} -% The one and only argument is the file name, but we have the `implicit' -% argument |\lst@set|. Note that |\lst@Init| takes |\relax| as argument. -% \begin{macrocode} -\def\lst@InputListing#1{% - \begingroup - \lsthk@PreSet \gdef\lst@intname{#1}% - \expandafter\lstset\expandafter{\lst@set}% - \lsthk@DisplayStyle - \catcode\active=\active - \lst@Init\relax \let\lst@gobble\z@ - \lst@SkipToFirst - \lst@ifprint \def\lst@next{\input{#1}}% - \else \let\lst@next\@empty \fi - \lst@next - \lst@DeInit - \endgroup} -% \end{macrocode} -% The line |\catcode\active=\active|, which makes the CR-character active, -% has been added after a bug report by \lsthelper{Rene~H.~Larsen}{2002/04/15} -% {\lstinputlistings and texcl conflict}. -% \end{macro} -% -% \begin{macro}{\lst@SkipToFirst} -% The end of line character either processes the listing or is responsible for -% dropping lines up to first printing line. -% \begin{macrocode} -\def\lst@SkipToFirst{% - \ifnum \lst@lineno<\lst@firstline -% \end{macrocode} -% We drop the input and redefine the end of line characters. -% \begin{macrocode} - \lst@BeginDropInput\lst@Pmode - \lst@Let{13}\lst@MSkipToFirst - \lst@Let{10}\lst@MSkipToFirst - \else - \expandafter\lst@BOLGobble - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@MSkipToFirst} -% We just look whether to drop more lines or to leave the mode which restores -% the definition of chr(13) and chr(10). -% \begin{macrocode} -\def\lst@MSkipToFirst{% - \global\advance\lst@lineno\@ne - \ifnum \lst@lineno=\lst@firstline - \lst@LeaveMode \global\lst@newlines\z@ - \lsthk@InitVarsBOL - \expandafter\lst@BOLGobble - \fi} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{The environment} -% -% -% \subsubsection{Low-level processing} -% -% \begin{macro}{\lstenv@DroppedWarning} -% gives a warning if characters have been dropped. -% \begin{macrocode} -\def\lstenv@DroppedWarning{% - \ifx\lst@dropped\@undefined\else - \PackageWarning{Listings}{Text dropped after begin of listing}% - \fi} -\let\lst@dropped\@undefined % init -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@Process} -% We execute `|\lstenv@ProcessM|' or |\lstenv@ProcessJ| according to whether we -% find an active EOL or a nonactive |^^J|. -% \begin{macrocode} -\begingroup \lccode`\~=`\^^M\lowercase{% -\gdef\lstenv@Process#1{% - \ifx~#1% -% \end{macrocode} -% We make no extra |\lstenv@ProcessM| definition since there is nothing to do -% at all if we've found an active EOL. -% \begin{macrocode} - \lstenv@DroppedWarning \let\lst@next\lst@SkipToFirst - \else\ifx^^J#1% - \lstenv@DroppedWarning \let\lst@next\lstenv@ProcessJ - \else - \let\lst@dropped#1\let\lst@next\lstenv@Process - \fi \fi - \lst@next} -}\endgroup -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@ProcessJ} -% Now comes the horrible scenario: a listing inside an argument. We've -% already worked in section \ref{iApplicationsTo} for this. Here we must get -% all characters up to `end environment'. We distinguish the cases `command -% fashion' and `true environment'. -% \begin{macrocode} -\def\lstenv@ProcessJ{% - \let\lst@arg\@empty - \ifx\@currenvir\lstenv@name - \expandafter\lstenv@ProcessJEnv - \else -% \end{macrocode} -% The first case is pretty simple: The code is terminated by -% |\end|\meta{name of environment}. Thus we expand that control sequence -% before defining a temporary macro, which gets the listing and does all -% the rest. Back to the definition of |\lstenv@ProcessJ| we call the -% temporary macro after expanding |\fi|. -% \begin{macrocode} - \expandafter\def\expandafter\lst@temp\expandafter##1% - \csname end\lstenv@name\endcsname - {\lst@InsideConvert{##1}\lstenv@ProcessJ@}% - \expandafter\lst@temp - \fi} -% \end{macrocode} -% We must append an active backslash and the `end string' to |\lst@arg|. So all -% (in fact most) other processing won't notice that the code has been inside -% an argument. But the EOL character is chr(10)=|^^J| now and not chr(13). -% \begin{macrocode} -\begingroup \lccode`\~=`\\\lowercase{% -\gdef\lstenv@ProcessJ@{% - \lst@lExtend\lst@arg - {\expandafter\ \expandafter~\lstenv@endstring}% - \catcode10=\active \lst@Let{10}\lst@MProcessListing -% \end{macrocode} -% We execute |\lst@arg| to typeset the listing. -% \begin{macrocode} - \lst@SkipToFirst \lst@arg} -}\endgroup -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@ProcessJEnv} -% The `true environment' case is more complicated. We get all characters up to -% an |\end| and the following argument. If that equals |\lstenv@name|, we have -% found the end of environment and start typesetting. -% \begin{macrocode} -\def\lstenv@ProcessJEnv#1\end#2{\def\lst@temp{#2}% - \ifx\lstenv@name\lst@temp - \lst@InsideConvert{#1}% - \expandafter\lstenv@ProcessJ@ - \else -% \end{macrocode} -% Otherwise we append the characters including the eaten |\end| and the eaten -% argument to current |\lst@arg|. And we look for the end of environment again. -% \begin{macrocode} - \lst@InsideConvert{#1\\end\{#2\}}% - \expandafter\lstenv@ProcessJEnv - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@backslash} -% Coming to a backslash we either end the listing or process a backslash and -% insert the eaten characters again. -% \begin{macrocode} -\def\lstenv@backslash{% - \lst@IfNextChars\lstenv@endstring - {\lstenv@End}% - {\expandafter\lsts@backslash \lst@eaten}}% -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@End} -% This macro has just been used and terminates a listing environment: -% We call the `end environment' macro using |\end| or as a command. -% \begin{macrocode} -\def\lstenv@End{% - \ifx\@currenvir\lstenv@name - \edef\lst@next{\noexpand\end{\lstenv@name}}% - \else - \def\lst@next{\csname end\lstenv@name\endcsname}% - \fi - \lst@next} -% \end{macrocode} -% \end{macro} -% -% -% \subsubsection{\cs{lstnewenvironment}} -% -% \begin{macro}{\lstnewenvironment} -% Now comes the main command. We define undefined environments only. On the -% parameter text |#1#2#| (in particular the last sharp) see the paragraph -% following example 20.5 on page 204 of `The \TeX book'. -% \begin{macrocode} -\lst@UserCommand\lstnewenvironment#1#2#{% - \@ifundefined{#1}% - {\let\lst@arg\@empty - \lst@XConvert{#1}\@nil - \expandafter\lstnewenvironment@\lst@arg{#1}{#2}}% - {\PackageError{Listings}{Environment `#1' already defined}\@eha - \@gobbletwo}} -\def\@tempa#1#2#3{% -\gdef\lstnewenvironment@##1##2##3##4##5{% - \begingroup -% \end{macrocode} -% A lonely `end environment' produces an error. -% \begin{macrocode} - \global\@namedef{end##2}{\lstenv@Error{##2}}% -% \end{macrocode} -% The `main' environment macro defines the environment name for later use and -% calls a submacro getting all arguments. We open a group and make EOL active. -% This ensures |\@ifnextchar[| not to read characters of the listing---it reads -% the active EOL instead. -% \begin{macrocode} - \global\@namedef{##2}{\def\lstenv@name{##2}% - \begingroup \lst@setcatcodes \catcode\active=\active - \csname##2@\endcsname}% -% \end{macrocode} -% The submacro is defined via |\new@command|. We misuse |\l@ngrel@x| to make -% the definition |\global| and refine \LaTeX's |\@xargdef|. -% \begin{macrocode} - \let\l@ngrel@x\global - \let\@xargdef\lstenv@xargdef - \expandafter\new@command\csname##2@\endcsname##3% -% \end{macrocode} -% First we execute |##4|=\meta{begin code}. Then follows the definition of -% the terminating string (|end{lstlisting}| or |endlstlisting|, for example): -% \begin{macrocode} - {\lsthk@PreSet ##4% - \ifx\@currenvir\lstenv@name - \def\lstenv@endstring{#1#2##1#3}% - \else - \def\lstenv@endstring{#1##1}% - \fi -% \end{macrocode} -% We redefine (locally) `end environment' since ending is legal now. -% Note that the redefinition also works inside a \TeX\ comment line. -% \begin{macrocode} - \@namedef{end##2}{\lst@DeInit ##5\endgroup - \lst@doendpe \@ignoretrue}% -% \end{macrocode} -% |\lst@doendpe| again removes the indention problem. -% -% Finally we start the processing. The |\lst@EndProcessListing| assignment -% has been moved in front of |\lst@Init| after a bug report by -% \lsthelper{Andreas~Deininger}{2002/11/11}{Compiling just stops}. -% \begin{macrocode} - \lsthk@DisplayStyle - \let\lst@EndProcessListing\lstenv@SkipToEnd - \lst@Init\lstenv@backslash - \lst@ifprint - \expandafter\expandafter\expandafter\lstenv@Process - \else - \expandafter\lstenv@SkipToEnd - \fi - \lst@insertargs}% - \endgroup}% -} -\let\lst@arg\@empty \lst@XConvert{end}\{\}\@nil -\expandafter\@tempa\lst@arg -\let\lst@insertargs\@empty -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@xargdef} -% This is a derivation of \LaTeX's |\@xargdef|. We expand the submacro's name, -% use |\gdef| instead of |\def|, and hard code a kind of |\@protected@testopt|. -% \begin{macrocode} -\def\lstenv@xargdef#1{ - \expandafter\lstenv@xargdef@\csname\string#1\endcsname#1} -\def\lstenv@xargdef@#1#2[#3][#4]#5{% - \@ifdefinable#2{% - \gdef#2{% - \ifx\protect\@typeset@protect - \expandafter\lstenv@testopt - \else - \@x@protect#2% - \fi - #1% - {#4}}% - \@yargdef - #1% - \tw@ - {#3}% - {#5}}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@testopt} -% The difference between this macro and |\@testopt| is that we temporaryly -% reset the catcode of the EOL character |^^M| to read the optional argument. -% \begin{macrocode} -\long\def\lstenv@testopt#1#2{% - \@ifnextchar[{\catcode\active5\relax \lstenv@testopt@#1}% - {#1[{#2}]}} -\def\lstenv@testopt@#1[#2]{% - \catcode\active\active - #1[#2]} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@SkipToEnd} -% We use the temporary definition -% \begin{itemize}\item[] -% |\long\def\lst@temp##1\|\meta{content of \textup{\cs{lstenv@endstring}}}|{\lstenv@End}| -% \end{itemize} -% which gobbles all characters up to the end of environment and finishes it. -% \begin{macrocode} -\begingroup \lccode`\~=`\\\lowercase{% -\gdef\lstenv@SkipToEnd{% - \long\expandafter\def\expandafter\lst@temp\expandafter##\expandafter - 1\expandafter~\lstenv@endstring{\lstenv@End}% - \lst@temp} -}\endgroup -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstenv@Error} -% is called by a lonely `end environment'. -% \begin{macrocode} -\def\lstenv@Error#1{\PackageError{Listings}{Extra \string\end#1}% - {I'm ignoring this, since I wasn't doing a \csname#1\endcsname.}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@TestEOLChar} -% Here we test for the two possible EOL characters. -% \begin{macrocode} -\begingroup \lccode`\~=`\^^M\lowercase{% -\gdef\lst@TestEOLChar#1{% - \def\lst@insertargs{#1}% - \ifx ~#1\@empty \else - \ifx^^J#1\@empty \else - \global\let\lst@intname\lst@insertargs - \let\lst@insertargs\@empty - \fi \fi} -}\endgroup -% \end{macrocode} -% \end{macro} -% -% \begin{environment}{lstlisting} -% The awkward work is done, the definition is quite easy now. We test whether -% the user has given the name argument, set the keys, and deal with -% continued line numbering. -% \begin{macrocode} -\lstnewenvironment{lstlisting}[2][] - {\lst@TestEOLChar{#2}% - \lstset{#1}% - \csname\@lst @SetFirstNumber\endcsname} - {\csname\@lst @SaveFirstNumber\endcsname} -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \end{environment} -% -% -% \section{Documentation support} -% -% \begin{syntax} -% \item[0.19] -% |\begin{lstsample}|\marg{point list}\marg{left}\marg{right} -% -% \leavevmode\hspace*{-\leftmargini}|\end{lstsample}| -% -% Roughly speaking all material in between this environment is executed -% `on the left side' and typeset verbatim on the right. \meta{left} is -% executed before the left side is typeset, and similarly \meta{right} -% before the right-hand side. -% -% \meta{point list} is used as argument to the \keyname{point} key. -% This is a special key used to highlight the keys in the examples. -% -% \item[1.0] -% |\begin{lstxsample}|\marg{point list} -% -% \leavevmode\hspace*{-\leftmargini}|\end{lstxsample}| -% -% The material in between is (a) added to the left side of the next -% \texttt{lstsample} environment and (b) typeset verbatim using the -% whole line width. -% -% \item[0.21] |\newdocenvironment|\marg{name}\marg{short name}\marg{begin code}\marg{end code} -% -% The \meta{name} environment can be used in the same way as `macro'. -% The provided(!) definitions -% |\Print|\meta{short name}|Name| -% and |\SpecialMain|\meta{short name}|Index| -% control printing in the margin and indexing as the defaults -% |\PrintMacroName| and |\SpecialMainIndex| do. -% -% This command is used to define the `aspect' and `lstkey' environments. -% -%\item[0.21] \texttt{macroargs} environment -% -% This `enumerate' environment uses as labels `|#1| =', `|#2| =', -% and so on. -% -% \item \texttt{TODO} environment -% \item \texttt{ALTERNATIVE} environment -% \item \texttt{REMOVED} environment -% \item \texttt{OLDDEF} environment -% -% These environments enclose comments on `to do's', alternatives and -% removed or old definitions. -% -% \item[0.21] |\lstscanlanguages|\meta{list macro}\marg{input files}\marg{don't input} -% -% scans \marg{input files}$\setminus$\marg{don't input} for language -% definitions. The available languages are stored in \meta{list macro} -% using the form \meta{language}|(|\meta{dialtect}|),|. -% -% \item[0.21] |\lstprintlanguages|\meta{list macro} -% -% prints the languages in two column format. -% \end{syntax} -% and a lot of more simple commands. -% -% -% \subsection{Required packages} -% -% Most of the `required' packages are optional. -% \begin{macrocode} -%<*doc> -\let\lstdoc@currversion\fileversion -\RequirePackage[writefile]{listings}[2004/09/07] -\newif\iffancyvrb \IfFileExists{fancyvrb.sty}{\fancyvrbtrue}{} -\newif\ifcolor \IfFileExists{color.sty}{\colortrue}{} -\lst@false -\newif\ifhyper -\@ifundefined{pdfoutput} - {} - {\ifnum\pdfoutput>\z@ \lst@true \fi} -\@ifundefined{VTeXversion} - {} - {\ifnum\OpMode>\z@ \lst@true \fi} -\lst@if \IfFileExists{hyperref.sty}{\hypertrue}{}\fi -\newif\ifalgorithmic \IfFileExists{algorithmic.sty}{\algorithmictrue}{} -\newif\iflgrind \IfFileExists{lgrind.sty}{\lgrindtrue}{} -\iffancyvrb \RequirePackage{fancyvrb}\fi -\ifhyper \RequirePackage[colorlinks]{hyperref}\else - \def\href#1{\texttt}\fi -\ifcolor \RequirePackage{color}\fi -\ifalgorithmic \RequirePackage{algorithmic}\fi -\iflgrind \RequirePackage{lgrind}\fi -\RequirePackage{nameref} -\RequirePackage{url} -\renewcommand\ref{\protect\T@ref} -\renewcommand\pageref{\protect\T@pageref} -% \end{macrocode} -% -% -% \subsection{Environments for notes} -% -% \begin{macro}{\lst@BeginRemark} -% \begin{macro}{\lst@EndRemark} -% We begin with two simple definitions \ldots -% \begin{macrocode} -\def\lst@BeginRemark#1{% - \begin{quote}\topsep0pt\let\small\footnotesize\small#1:} -\def\lst@EndRemark{\end{quote}} -% \end{macrocode} -% \end{macro}\end{macro} -% -% \begin{environment}{TODO} -% \begin{environment}{ALTERNATIVE} -% \begin{environment}{REMOVED} -% \begin{environment}{OLDDEF} -% \ldots\space used to define some environments. -% \begin{macrocode} -\newenvironment{TODO} - {\lst@BeginRemark{To do}}{\lst@EndRemark} -\newenvironment{ALTERNATIVE} - {\lst@BeginRemark{Alternative}}{\lst@EndRemark} -\newenvironment{REMOVED} - {\lst@BeginRemark{Removed}}{\lst@EndRemark} -\newenvironment{OLDDEF} - {\lst@BeginRemark{Old definition}}{\lst@EndRemark} -% \end{macrocode} -% \end{environment}\end{environment}\end{environment}\end{environment} -% -% \begin{environment}{advise} -% \begin{macro}{\advisespace} -% The environment uses |\@listi|. -% \begin{macrocode} -\def\advise{\par\list\labeladvise - {\advance\linewidth\@totalleftmargin - \@totalleftmargin\z@ - \@listi - \let\small\footnotesize \small\sffamily - \parsep \z@ \@plus\z@ \@minus\z@ - \topsep6\p@ \@plus1\p@\@minus2\p@ - \def\makelabel##1{\hss\llap{##1}}}} -\let\endadvise\endlist -% \end{macrocode} -% \begin{macrocode} -\def\advisespace{\hbox{}\qquad} -\def\labeladvise{$\to$} -% \end{macrocode} -% \end{macro} -% \end{environment} -% -% \begin{environment}{syntax} -% \begin{macro}{\syntaxbreak} -% \begin{macro}{\syntaxnewline} -% \begin{macro}{\syntaxor} -% This environment uses |\list| with a special |\makelabel|, \ldots -% \begin{macrocode} -\newenvironment{syntax} - {\list{}{\itemindent-\leftmargin - \def\makelabel##1{\hss\lst@syntaxlabel##1,,,,\relax}}} - {\endlist} -% \end{macrocode} -% \ldots\ which is defined here. The comma separated items are placed as -% needed. -% \begin{macrocode} -\def\lst@syntaxlabel#1,#2,#3,#4\relax{% - \llap{\scriptsize\itshape#3}% - \def\lst@temp{#2}% - \expandafter\lst@syntaxlabel@\meaning\lst@temp\relax - \rlap{\hskip-\itemindent\hskip\itemsep\hskip\linewidth - \llap{\ttfamily\lst@temp}\hskip\labelwidth - \def\lst@temp{#1}% - \ifx\lst@temp\lstdoc@currversion#1\fi}} -\def\lst@syntaxlabel@#1>#2\relax - {\edef\lst@temp{\zap@space#2 \@empty}} -% \end{macrocode} -% \begin{macrocode} -\newcommand*\syntaxnewline{\newline\hbox{}\kern\labelwidth} -\newcommand*\syntaxor{\qquad or\qquad} -\newcommand*\syntaxbreak - {\hfill\kern0pt\discretionary{}{\kern\labelwidth}{}} -\let\syntaxfill\hfill -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{environment} -% -% \begin{macro}{\alternative} -% iterates down the list and inserts vertical rule(s). -% \begin{macrocode} -\def\alternative#1{\lst@true \alternative@#1,\relax,} -\def\alternative@#1,{% - \ifx\relax#1\@empty - \expandafter\@gobble - \else - \ifx\@empty#1\@empty\else - \lst@if \lst@false \else $\vert$\fi - \textup{\texttt{#1}}% - \fi - \fi - \alternative@} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Extensions to \textsf{doc}} -% -% \begin{macro}{\m@cro@} -% We need a slight modification of \packagename{doc}'s internal macro. -% The former argument |#2| has become |#3|. This change is not marked below. -% The second argument is now \meta{short name}. -% \begin{macrocode} -\long\def\m@cro@#1#2#3{\endgroup \topsep\MacroTopsep \trivlist - \edef\saved@macroname{\string#3}% - \def\makelabel##1{\llap{##1}}% - \if@inlabel - \let\@tempa\@empty \count@\macro@cnt - \loop \ifnum\count@>\z@ - \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat - \edef\makelabel##1{\llap{\vtop to\baselineskip - {\@tempa\hbox{##1}\vss}}}% - \advance \macro@cnt \@ne - \else \macro@cnt\@ne \fi - \edef\@tempa{\noexpand\item[% - #1% - \noexpand\PrintMacroName - \else -% \end{macrocode} -% The next line has been modified. -% \begin{macrocode} - \expandafter\noexpand\csname Print#2Name\endcsname % MODIFIED - \fi - {\string#3}]}% - \@tempa - \global\advance\c@CodelineNo\@ne - #1% - \SpecialMainIndex{#3}\nobreak - \DoNotIndex{#3}% - \else -% \end{macrocode} -% Ditto. -% \begin{macrocode} - \csname SpecialMain#2Index\endcsname{#3}\nobreak % MODIFIED - \fi - \global\advance\c@CodelineNo\m@ne - \ignorespaces} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\macro} -% \begin{macro}{\environment} -% These two definitions need small adjustments due to the modified |\m@cro@|. -% \begin{macrocode} -\def\macro{\begingroup - \catcode`\\12 - \MakePrivateLetters \m@cro@ \iftrue {Macro}}% MODIFIED -\def\environment{\begingroup - \catcode`\\12 - \MakePrivateLetters \m@cro@ \iffalse {Env}}% MODIFIED -% \end{macrocode} -% \end{macro}\end{macro} -% -% \begin{macro}{\newdocenvironment} -% This command simply makes definitions similar to `environment' and provides -% the printing and indexing commands. -% \begin{macrocode} -\def\newdocenvironment#1#2#3#4{% - \@namedef{#1}{#3\begingroup \catcode`\\12\relax - \MakePrivateLetters \m@cro@ \iffalse {#2}}% - \@namedef{end#1}{#4\endmacro}% - \@ifundefined{Print#2Name}{\expandafter - \let\csname Print#2Name\endcsname\PrintMacroName}{}% - \@ifundefined{SpecialMain#2Index}{\expandafter - \let\csname SpecialMain#2Index\endcsname\SpecialMainIndex}{}} -% \end{macrocode} -% \end{macro} -% -% \begin{environment}{aspect} -% \begin{macro}{\PrintAspectName} -% \begin{macro}{\SpecialMainAspectIndex} -% The environment and its `print' and `index' commands. -% \begin{macrocode} -\newdocenvironment{aspect}{Aspect}{}{} -\def\PrintAspectName#1{} -\def\SpecialMainAspectIndex#1{% - \@bsphack - \index{aspects:\levelchar\protect\aspectname{#1}\encapchar main}% - \@esphack} -% \end{macrocode} -% \end{macro}\end{macro}\end{environment} -% -% \begin{environment}{lstkey} -% \begin{macro}{\PrintKeyName} -% \begin{macro}{\SpecialMainKeyIndex} -% One more environment with its `print' and `index' commands. -% \begin{macrocode} -\newdocenvironment{lstkey}{Key}{}{} -\def\PrintKeyName#1{\strut\keyname{#1}\ } -\def\SpecialMainKeyIndex#1{% - \@bsphack - \index{keys\levelchar\protect\keyname{#1}\encapchar main}% - \@esphack} -% \end{macrocode} -% \end{macro}\end{macro}\end{environment} -% -% \begin{macro}{\labelargcount} -% \begin{environment}{macroargs} -% We just allocate a counter and use \LaTeX's |\list| to implement this -% environment. -% \begin{macrocode} -\newcounter{argcount} -\def\labelargcount{\texttt{\#\arabic{argcount}}\hskip\labelsep$=$} -% \end{macrocode} -% \begin{macrocode} -\def\macroargs{\list\labelargcount - {\usecounter{argcount}\leftmargin=2\leftmargin - \parsep \z@ \@plus\z@ \@minus\z@ - \topsep4\p@ \@plus\p@ \@minus2\p@ - \itemsep\z@ \@plus\z@ \@minus\z@ - \def\makelabel##1{\hss\llap{##1}}}} -\def\endmacroargs{\endlist\@endparenv} -% \end{macrocode} -% \end{environment}\end{macro} -% -% -% \subsection{The \texttt{lstsample} environment} -% -% \begin{environment}{lstsample} -% We store the verbatim part and write the source code also to file. -% \begin{macrocode} -\lst@RequireAspects{writefile} -% \end{macrocode} -% \begin{macrocode} -\newbox\lst@samplebox -\lstnewenvironment{lstsample}[3][] - {\global\let\lst@intname\@empty - \gdef\lst@sample{#2}% - \setbox\lst@samplebox=\hbox\bgroup - \setkeys{lst}{language={},style={},tabsize=4,gobble=5,% - basicstyle=\small\ttfamily,basewidth=0.51em,point={#1}} - #3% - \lst@BeginAlsoWriteFile{\jobname.tmp}} - {\lst@EndWriteFile\egroup -% \end{macrocode} -% Now |\lst@samplebox| contains the verbatim part. -% If it's too wide, we use atop and below instead of left and right. -% \begin{macrocode} - \ifdim \wd\lst@samplebox>.5\linewidth - \begin{center}% - \hbox to\linewidth{\box\lst@samplebox\hss}% - \end{center}% - \lst@sampleInput - \else - \begin{center}% - \begin{minipage}{0.45\linewidth}\lst@sampleInput\end{minipage}% - \qquad - \begin{minipage}{0.45\linewidth}% - \hbox to\linewidth{\box\lst@samplebox\hss}% - \end{minipage}% - \end{center}% - \fi} -% \end{macrocode} -% The new keyword class \keyname{point}. -% \begin{macrocode} -\lst@InstallKeywords{p}{point}{pointstyle}\relax{keywordstyle}{}ld -% \end{macrocode} -% \end{environment} -% -% \begin{environment}{lstxsample} -% Omitting |\lst@EndWriteFile| leaves the file open. -% \begin{macrocode} -\lstnewenvironment{lstxsample}[1][] - {\begingroup - \setkeys{lst}{belowskip=-\medskipamount,language={},style={},% - tabsize=4,gobble=5,basicstyle=\small\ttfamily,% - basewidth=0.51em,point={#1}} - \lst@BeginAlsoWriteFile{\jobname.tmp}} - {\endgroup - \endgroup} -% \end{macrocode} -% \end{environment} -% -% \begin{macro}{\lst@sampleInput} -% inputs the `left-hand' side. -% \begin{macrocode} -\def\lst@sampleInput{% - \MakePercentComment\catcode`\^^M=10\relax - \small\lst@sample - {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}% - {\lst@ProcessTabulator}}% - \leavevmode \input{\jobname.tmp}}\MakePercentIgnore} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Miscellaneous} -% -% \paragraph{Sectioning and cross referencing} -% We begin with a redefinition paragraph. -% \begin{macrocode} -\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% - {1.25ex \@plus1ex \@minus.2ex}% - {-1em}% - {\normalfont\normalsize\bfseries}} -% \end{macrocode} -% We introduce |\lstref| which prints section number together with its name. -% \begin{macrocode} -\def\lstref#1{\emph{\ref{#1} \nameref{#1}}} -% \end{macrocode} -% Moreover we adjust the table of contents. -% \begin{macrocode} -\def\@part[#1]#2{\addcontentsline{toc}{part}{#1}% - {\parindent\z@ \raggedright \interlinepenalty\@M - \normalfont \huge \bfseries #2\markboth{}{}\par}% - \nobreak\vskip 3ex\@afterheading} -\renewcommand*\l@section[2]{% - \addpenalty\@secpenalty - \addvspace{.25em \@plus\p@}% - \setlength\@tempdima{1.5em}% - \begingroup - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - \leavevmode - \advance\leftskip\@tempdima - \hskip -\leftskip - #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par - \endgroup} -\renewcommand*\l@subsection{\@dottedtocline{2}{0pt}{2.3em}} -\renewcommand*\l@subsubsection{\@dottedtocline{3}{0pt}{3.2em}} -% \end{macrocode} -% -% \paragraph{Indexing} -% The `user' commands. |\rstyle| is defined below. -% \begin{macrocode} -\newcommand\ikeyname[1]{% - \lstkeyindex{#1}{}% - \lstaspectindex{#1}{}% - \keyname{#1}} -\newcommand\ekeyname[1]{% - \@bsphack - \lstkeyindex{#1}{\encapchar usage}% - \lstaspectindex{#1}{\encapchar usage}% - \@esphack} -\newcommand\rkeyname[1]{% - \@bsphack - \lstkeyindex{#1}{\encapchar main}% - \lstaspectindex{#1}{\encapchar main}% - \@esphack{\rstyle\keyname{#1}}} -% \end{macrocode} -% \begin{macrocode} -\newcommand\icmdname[1]{% - \@bsphack - \lstaspectindex{#1}{}% - \@esphack\texttt{\string#1}} -\newcommand\rcmdname[1]{% - \@bsphack - \lstaspectindex{#1}{\encapchar main}% - \@esphack\texttt{\rstyle\string#1}} -% \end{macrocode} -% One of the two yet unknown `index'-macros is empty, the other looks up -% the aspect name for the given argument. -% \begin{macrocode} -\def\lstaspectindex#1#2{% - \global\@namedef{lstkandc@\string#1}{}% - \@ifundefined{lstisaspect@\string#1} - {\index{unknown\levelchar - \protect\texttt{\protect\string\string#1}#2}}% - {\index{\@nameuse{lstisaspect@\string#1}\levelchar - \protect\texttt{\protect\string\string#1}#2}}% -} -\def\lstkeyindex#1#2{% -% \index{key\levelchar\protect\keyname{#1}#2}% -} -% \end{macrocode} -% The key/command to aspect relation is defined near the top of this file using -% the following command. In future the package should read this information -% from the aspect files. -% \begin{macrocode} -\def\lstisaspect[#1]#2{% - \global\@namedef{lstaspect@#1}{#2}% - \lst@AddTo\lst@allkeysandcmds{,#2}% - \@for\lst@temp:=#2\do - {\ifx\@empty\lst@temp\else - \global\@namedef{lstisaspect@\lst@temp}{#1}% - \fi}} -\gdef\lst@allkeysandcmds{} -% \end{macrocode} -% This relation is also good to print all keys and commands of a particular -% aspect \ldots -% \begin{macrocode} -\def\lstprintaspectkeysandcmds#1{% - \lst@true - \expandafter\@for\expandafter\lst@temp - \expandafter:\expandafter=\csname lstaspect@#1\endcsname\do - {\lst@if\lst@false\else, \fi \texttt{\lst@temp}}} -% \end{macrocode} -% \ldots\ or to check the reference. Note that we've defined -% |\lstkandc@|\meta{name} in |\lstaspectindex|. -% \begin{macrocode} -\def\lstcheckreference{% - \@for\lst@temp:=\lst@allkeysandcmds\do - {\ifx\lst@temp\@empty\else - \@ifundefined{lstkandc@\lst@temp} - {\typeout{\lst@temp\space not in reference guide?}}{}% - \fi}} -% \end{macrocode} -% -% \paragraph{Unique styles} -% \begin{macrocode} -\newcommand*\lst{\texttt{lst}} -\newcommand*\Cpp{C\texttt{++}} -\let\keyname\texttt -\let\keyvalue\texttt -\let\hookname\texttt -\newcommand*\aspectname[1]{{\normalfont\sffamily#1}} -% \end{macrocode} -% \begin{macrocode} -\DeclareRobustCommand\packagename[1]{% - {\leavevmode\text@command{#1}% - \switchfontfamily\sfdefault\rmdefault - \check@icl #1\check@icr - \expandafter}}% -\renewcommand\packagename[1]{{\normalfont\sffamily#1}} -\def\switchfontfamily#1#2{% - \begingroup\xdef\@gtempa{#1}\endgroup - \ifx\f@family\@gtempa\fontfamily#2% - \else\fontfamily#1\fi - \selectfont} -% \end{macrocode} -% The color mainly for keys and commands in the reference guide. -% \begin{macrocode} -\ifcolor - \definecolor{darkgreen}{rgb}{0,0.5,0} - \def\rstyle{\color{darkgreen}} -\else - \let\rstyle\empty -\fi -% \end{macrocode} -% -% \paragraph{Commands for credits and helpers} -% \begin{macrocode} -\gdef\lst@emails{} -\newcommand*\lstthanks[2] - {#1\lst@AddTo\lst@emails{,#1,<#2>}% - \ifx\@empty#2\@empty\typeout{Missing email for #1}\fi} -\newcommand*\lsthelper[3] - {{\let~\ #1}% - \lst@IfOneOf#1\relax\lst@emails - {}{\typeout{^^JWarning: Unknown helper #1.^^J}}} -% \end{macrocode} -% -% \paragraph{Languages and styles} -% \begin{macrocode} -\lstdefinelanguage[doc]{Pascal}{% - morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,% - do,downto,else,end,false,file,for,function,get,goto,if,in,% - integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,% - procedure,put,read,readln,real,record,repeat,reset,rewrite,set,% - text,then,to,true,type,unpack,until,var,while,with,write,writeln},% - sensitive=false,% - morecomment=[s]{(*}{*)},% - morecomment=[s]{\{}{\}},% - morestring=[d]{'}} -% \end{macrocode} -% \begin{macrocode} -\lstdefinestyle{} - {basicstyle={},% - keywordstyle=\bfseries,identifierstyle={},% - commentstyle=\itshape,stringstyle={},% - numberstyle={},stepnumber=1,% - pointstyle=\pointstyle} -\def\pointstyle{% - {\let\lst@um\@empty \xdef\@gtempa{\the\lst@token}}% - \expandafter\lstkeyindex\expandafter{\@gtempa}{}% - \expandafter\lstaspectindex\expandafter{\@gtempa}{}% - \rstyle} -\lstset{defaultdialect=[doc]Pascal,language=Pascal,style={}} -% \end{macrocode} -% -% -% \subsection{Scanning languages} -% -% \begin{macro}{\lstscanlanguages} -% We modify some internal definitions and input the files. -% \begin{macrocode} -\def\lstscanlanguages#1#2#3{% - \begingroup - \def\lst@DefDriver@##1##2##3##4[##5]##6{% - \lst@false - \lst@lAddTo\lst@scan{##6(##5),}% - \begingroup - \@ifnextchar[{\lst@XDefDriver{##1}##3}{\lst@DefDriver@@##3}}% - \def\lst@XXDefDriver[##1]{}% - \lst@InputCatcodes - \def\lst@dontinput{#3}% - \let\lst@scan\@empty - \lst@for{#2}\do{% - \lst@IfOneOf##1\relax\lst@dontinput - {}% - {\InputIfFileExists{##1}{}{}}}% - \global\let\@gtempa\lst@scan - \endgroup - \let#1\@gtempa} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstprintlanguages} -% |\do| creates a box of width 0.5|\linewidth| or |\linewidth| depending -% on how wide the argument is. This leads to `two column' output. -% The other main thing is sorting the list and begin with the output. -% \begin{macrocode} -\def\lstprintlanguages#1{% - \def\do##1{\setbox\@tempboxa\hbox{##1\space\space}% - \ifdim\wd\@tempboxa<.5\linewidth \wd\@tempboxa.5\linewidth - \else \wd\@tempboxa\linewidth \fi - \box\@tempboxa\allowbreak}% - \begin{quote} - \par\noindent - \hyphenpenalty=\@M \rightskip=\z@\@plus\linewidth\relax - \lst@BubbleSort#1% - \expandafter\lst@NextLanguage#1\relax(\relax),% - \end{quote}} -% \end{macrocode} -% We get and define the current language and \ldots -% \begin{macrocode} -\def\lst@NextLanguage#1(#2),{% - \ifx\relax#1\else - \def\lst@language{#1}\def\lst@dialects{(#2),}% - \expandafter\lst@NextLanguage@ - \fi} -% \end{macrocode} -% \ldots\space gather all available dialect of this language (note that the -% list has been sorted) -% \begin{macrocode} -\def\lst@NextLanguage@#1(#2),{% - \def\lst@temp{#1}% - \ifx\lst@temp\lst@language - \lst@lAddTo\lst@dialects{(#2),}% - \expandafter\lst@NextLanguage@ - \else -% \end{macrocode} -% or begin to print this language with all its dialects. Therefor we sort the -% dialects -% \begin{macrocode} - \do{\lst@language - \ifx\lst@dialects\lst@emptydialect\else - \expandafter\lst@NormedDef\expandafter\lst@language - \expandafter{\lst@language}% - \space(% - \lst@BubbleSort\lst@dialects - \expandafter\lst@PrintDialects\lst@dialects(\relax),% - )% - \fi}% - \def\lst@next{\lst@NextLanguage#1(#2),}% - \expandafter\lst@next - \fi} -\def\lst@emptydialect{(),} -% \end{macrocode} -% and print the dialect with appropriate commas in between. -% \begin{macrocode} -\def\lst@PrintDialects(#1),{% - \ifx\@empty#1\@empty empty\else - \lst@PrintDialect{#1}% - \fi - \lst@PrintDialects@} -\def\lst@PrintDialects@(#1),{% - \ifx\relax#1\else - , \lst@PrintDialect{#1}% - \expandafter\lst@PrintDialects@ - \fi} -% \end{macrocode} -% Here we take care of default dialects. -% \begin{macrocode} -\def\lst@PrintDialect#1{% - \lst@NormedDef\lst@temp{#1}% - \expandafter\ifx\csname\@lst dd@\lst@language\endcsname\lst@temp - \texttt{\underbar{#1}}% - \else - \texttt{#1}% - \fi} -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Bubble sort} -% -% \begin{macro}{\lst@IfLE} -% \meta{string 1}|\relax\@empty|\meta{string 2}|\relax\@empty|\marg{then}\meta{else}. -% If \meta{string 1} $\leq$ \meta{string 2}, we execute \meta{then} and -% \meta{else} otherwise. -% Note that this comparision is case insensitive. -% \begin{macrocode} -\def\lst@IfLE#1#2\@empty#3#4\@empty{% - \ifx #1\relax - \let\lst@next\@firstoftwo - \else \ifx #3\relax - \let\lst@next\@secondoftwo - \else - \lowercase{\ifx#1#3}% - \def\lst@next{\lst@IfLE#2\@empty#4\@empty}% - \else - \lowercase{\ifnum`#1<`#3}\relax - \let\lst@next\@firstoftwo - \else - \let\lst@next\@secondoftwo - \fi - \fi - \fi \fi - \lst@next} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@BubbleSort} -% is in fact a derivation of bubble sort. -% \begin{macrocode} -\def\lst@BubbleSort#1{% - \ifx\@empty#1\else - \lst@false -% \end{macrocode} -% We `bubble sort' the first, second, \ldots\ elements and \ldots -% \begin{macrocode} - \expandafter\lst@BubbleSort@#1\relax,\relax,% -% \end{macrocode} -% \ldots\space then the second, third, \ldots\ elements until no elemets have -% been swapped. -% \begin{macrocode} - \expandafter\lst@BubbleSort@\expandafter,\lst@sorted - \relax,\relax,% - \let#1\lst@sorted - \lst@if - \def\lst@next{\lst@BubbleSort#1}% - \expandafter\expandafter\expandafter\lst@next - \fi - \fi} -\def\lst@BubbleSort@#1,#2,{% - \ifx\@empty#1\@empty - \def\lst@sorted{#2,}% - \def\lst@next{\lst@BubbleSort@@}% - \else - \let\lst@sorted\@empty - \def\lst@next{\lst@BubbleSort@@#1,#2,}% - \fi - \lst@next} -% \end{macrocode} -% But the bubbles rise only one step per call. Putting the elements at their -% top most place would be inefficient (since \TeX\ had to read much more -% parameters in this case). -% \begin{macrocode} -\def\lst@BubbleSort@@#1,#2,{% - \ifx\relax#1\else - \ifx\relax#2% - \lst@lAddTo\lst@sorted{#1,}% - \expandafter\expandafter\expandafter\lst@BubbleSort@@@ - \else - \lst@IfLE #1\relax\@empty #2\relax\@empty - {\lst@lAddTo\lst@sorted{#1,#2,}}% - {\lst@true \lst@lAddTo\lst@sorted{#2,#1,}}% - \expandafter\expandafter\expandafter\lst@BubbleSort@@ - \fi - \fi} -\def\lst@BubbleSort@@@#1\relax,{} -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \end{macro} -% -% -% \section{Interfaces to other programs} -% -% -% \subsection{0.21 compatibility} -% -% \begin{aspect}{0.21} -% Some keys have just been renamed. -% \begin{macrocode} -%<*0.21> -\lst@BeginAspect{0.21} -% \end{macrocode} -% -% \begin{macrocode} -\lst@Key{labelstyle}{}{\def\lst@numberstyle{#1}} -\lst@Key{labelsep}{10pt}{\def\lst@numbersep{#1}} -\lst@Key{labelstep}{0}{% - \ifnum #1=\z@ \KV@lst@numbers{none}% - \else \KV@lst@numbers{left}\fi - \def\lst@stepnumber{#1\relax}} -\lst@Key{firstlabel}\relax{\def\lst@firstnumber{#1\relax}} -\lst@Key{advancelabel}\relax{\def\lst@advancenumber{#1\relax}} -\let\c@lstlabel\c@lstnumber -\lst@AddToHook{Init}{\def\thelstnumber{\thelstlabel}} -\newcommand*\thelstlabel{\@arabic\c@lstlabel} -% \end{macrocode} -% A |\let| in the second last line has been changed to |\def| after a bug -% report by \lsthelper{Venkatesh~Prasad~Ranganath}{2002/08/31}{Undefined -% control sequence \thelstnumber with 0.21-option}. -% \begin{macrocode} -\lst@Key{first}\relax{\def\lst@firstline{#1\relax}} -\lst@Key{last}\relax{\def\lst@lastline{#1\relax}} -% \end{macrocode} -% \begin{macrocode} -\lst@Key{framerulewidth}{.4pt}{\def\lst@framerulewidth{#1}} -\lst@Key{framerulesep}{2pt}{\def\lst@rulesep{#1}} -\lst@Key{frametextsep}{3pt}{\def\lst@frametextsep{#1}} -\lst@Key{framerulecolor}{}{\lstKV@OptArg[]{#1}% - {\ifx\@empty##2\@empty - \let\lst@rulecolor\@empty - \else - \ifx\@empty##1\@empty - \def\lst@rulecolor{\color{##2}}% - \else - \def\lst@rulecolor{\color[##1]{##2}}% - \fi - \fi}} -\lst@Key{backgroundcolor}{}{\lstKV@OptArg[]{#1}% - {\ifx\@empty##2\@empty - \let\lst@bkgcolor\@empty - \else - \ifx\@empty##1\@empty - \def\lst@bkgcolor{\color{##2}}% - \else - \def\lst@bkgcolor{\color[##1]{##2}}% - \fi - \fi}} -\lst@Key{framespread}{\z@}{\def\lst@framespread{#1}} -\lst@AddToHook{PreInit} - {\@tempdima\lst@framespread\relax \divide\@tempdima\tw@ - \edef\lst@framextopmargin{\the\@tempdima}% - \let\lst@framexrightmargin\lst@framextopmargin - \let\lst@framexbottommargin\lst@framextopmargin - \advance\@tempdima\lst@xleftmargin\relax - \edef\lst@framexleftmargin{\the\@tempdima}} -% \end{macrocode} -% \lsthelper{Harald~Harders}{1998/03/30}{inner- and outerspread} had the idea -% of two spreads (inner and outer). We either divide the dimension by two or -% assign the two dimensions to inner- and outerspread. -% \begin{macrocode} -\newdimen\lst@innerspread \newdimen\lst@outerspread -\lst@Key{spread}{\z@,\z@}{\lstKV@CSTwoArg{#1}% - {\lst@innerspread##1\relax - \ifx\@empty##2\@empty - \divide\lst@innerspread\tw@\relax - \lst@outerspread\lst@innerspread - \else - \lst@outerspread##2\relax - \fi}} -\lst@AddToHook{BoxUnsafe}{\lst@outerspread\z@ \lst@innerspread\z@} -\lst@Key{wholeline}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins} -\lst@Key{indent}{\z@}{\def\lst@xleftmargin{#1}} -\lst@AddToHook{PreInit} - {\lst@innerspread=-\lst@innerspread - \lst@outerspread=-\lst@outerspread - \ifodd\c@page \advance\lst@innerspread\lst@xleftmargin - \else \advance\lst@outerspread\lst@xleftmargin \fi - \ifodd\c@page - \edef\lst@xleftmargin{\the\lst@innerspread}% - \edef\lst@xrightmargin{\the\lst@outerspread}% - \else - \edef\lst@xleftmargin{\the\lst@outerspread}% - \edef\lst@xrightmargin{\the\lst@innerspread}% - \fi} -% \end{macrocode} -% \begin{macrocode} -\lst@Key{defaultclass}\relax{\def\lst@classoffset{#1}} -\lst@Key{stringtest}\relax{}% dummy -\lst@Key{outputpos}\relax{\lst@outputpos#1\relax\relax} -% \end{macrocode} -% \begin{macrocode} -\lst@Key{stringspaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces} -\lst@Key{visisblespaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowspaces} -\lst@Key{visibletabs}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowtabs} -% \end{macrocode} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{\textsf{fancyvrb}} -% -% \lsthelper{Denis~Girou}{1998/07/26}{fancyvrb} asked whether -% \packagename{fancyvrb} and \packagename{listings} could work together. -% -% \begin{lstkey}{fancyvrb} -% We set the boolean and call a submacro. -% \begin{macrocode} -%<*kernel> -\lst@Key{fancyvrb}\relax[t]{% - \lstKV@SetIf{#1}\lst@iffancyvrb - \lstFV@fancyvrb} -\ifx\lstFV@fancyvrb\@undefined - \gdef\lstFV@fancyvrb{\lst@RequireAspects{fancyvrb}\lstFV@fancyvrb} -\fi -% -% \end{macrocode} -% \end{lstkey} -% -% \begin{aspect}{fancyvrb} -% We end the job if \packagename{fancyvrb} is not present. -% \begin{macrocode} -%<*misc> -\lst@BeginAspect{fancyvrb} -% \end{macrocode} -% \begin{macrocode} -\@ifundefined{FancyVerbFormatLine} - {\typeout{^^J% - ***^^J% - *** `listings.sty' needs `fancyvrb.sty' right now.^^J% - *** Please ensure its availability and try again.^^J% - ***^^J}% - \batchmode \@@end}{} -% \end{macrocode} -% -% \begin{macro}{\lstFV@fancyvrb} -% We assign the correct |\FancyVerbFormatLine| macro. -% \begin{macrocode} -\gdef\lstFV@fancyvrb{% - \lst@iffancyvrb - \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine\else - \let\lstFV@FVFL\FancyVerbFormatLine - \let\FancyVerbFormatLine\lstFV@FancyVerbFormatLine - \fi - \else - \ifx\lstFV@FVFL\@undefined\else - \let\FancyVerbFormatLine\lstFV@FVFL - \let\lstFV@FVFL\@undefined - \fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstFV@VerbatimBegin} -% We initialize things if necessary. -% \begin{macrocode} -\gdef\lstFV@VerbatimBegin{% - \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine - \lsthk@TextStyle \lsthk@BoxUnsafe - \lsthk@PreSet - \lst@activecharsfalse - \let\normalbaselines\relax -% \end{macrocode} -% \begin{TODO} -% Is this |\let| bad? -% \end{TODO} -% I inserted |\lst@ifresetmargins|\ldots|\fi| after a bug report from -% \lsthelper{Peter~Bartke}{1999/11/18}{wrong fancyvrb frame}. The linewidth -% is saved and restored since a bug report by \lsthelper{Denis~Girou} -% {2003/07/04}{problem in list environments with fancyvrb=true}. -% \begin{macrocode} -\xdef\lstFV@RestoreData{\noexpand\linewidth\the\linewidth\relax}% - \lst@Init\relax - \lst@ifresetmargins \advance\linewidth-\@totalleftmargin \fi -\lstFV@RestoreData - \everypar{}\global\lst@newlines\z@ - \lst@mode\lst@nomode \let\lst@entermodes\@empty - \lst@InterruptModes -% \end{macrocode} -% \lsthelper{Rolf~Niepraschk}{1998/11/25}{ligatures problem} reported a bug -% concerning ligatures to \lsthelper{Denis~Girou}{1998/11/27}{use |\@noligs|}. -% \begin{macrocode} -%% D.G. modification begin - Nov. 25, 1998 - \let\@noligs\relax -%% D.G. modification end - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lstFV@VerbatimEnd} -% A box and macro must exist after |\lst@DeInit|. -% We store them globally. -% \begin{macrocode} -\gdef\lstFV@VerbatimEnd{% - \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine - \global\setbox\lstFV@gtempboxa\box\@tempboxa - \global\let\@gtempa\FV@ProcessLine - \lst@mode\lst@Pmode - \lst@DeInit - \let\FV@ProcessLine\@gtempa - \setbox\@tempboxa\box\lstFV@gtempboxa - \par - \fi} -% \end{macrocode} -% The |\par| has been added after a bug report by \lsthelper{Peter~Bartke} -% {2002/04/10}{TeX is not in vertical mode when leaving "Verbatim"}. -% \begin{macrocode} -\newbox\lstFV@gtempboxa -% \end{macrocode} -% \end{macro} -% -% \noindent -% We insert |\lstFV@VerbatimBegin| and |\lstFV@VerbatimEnd| where necessary. -% \begin{macrocode} -\lst@AddTo\FV@VerbatimBegin\lstFV@VerbatimBegin -\lst@AddToAtTop\FV@VerbatimEnd\lstFV@VerbatimEnd -\lst@AddTo\FV@LVerbatimBegin\lstFV@VerbatimBegin -\lst@AddToAtTop\FV@LVerbatimEnd\lstFV@VerbatimEnd -\lst@AddTo\FV@BVerbatimBegin\lstFV@VerbatimBegin -\lst@AddToAtTop\FV@BVerbatimEnd\lstFV@VerbatimEnd -% \end{macrocode} -% -% \begin{macro}{\lstFV@FancyVerbFormatLine} -% `@' terminates the argument of |\lst@FVConvert|. -% Moreover |\lst@ReenterModes| and |\lst@InterruptModes| encloses some code. -% This ensures that we have same group level at the beginning and at the end of -% the macro---even if the user begins but doesn't end a comment, which means -% one open group. -% Furthermore we use |\vtop| and reset |\lst@newlines| to allow line breaking. -% \begin{macrocode} -\gdef\lstFV@FancyVerbFormatLine#1{% - \let\lst@arg\@empty \lst@FVConvert#1\@nil - \global\lst@newlines\z@ - \vtop{\noindent\lst@parshape - \lst@ReenterModes - \lst@arg \lst@PrintToken\lst@EOLUpdate\lsthk@InitVarsBOL - \lst@InterruptModes}} -% \end{macrocode} -% The |\lst@parshape| inside |\vtop| is due to a bug report from -% \lsthelper{Peter~Bartke}{1999/11/18}{wrong par indention with fancyvrb}. -% A |\leavevmode| became |\noindent|. -% \end{macro} -% -% \begin{lstkey}{fvcmdparams} -% \begin{lstkey}{morefvcmdparams} -% These keys adjust \lst@FVcmdparams, which will be used by the following -% conversion macro. The base set of commands and parameter numbers was -% provided by \lsthelper{Denis~Girou}{2002/05/31}{init of fvcmdparams}. -% \begin{macrocode} -\lst@Key{fvcmdparams}% - {\overlay\@ne}% - {\def\lst@FVcmdparams{,#1}} -\lst@Key{morefvcmdparams}\relax{\lst@lAddTo\lst@FVcmdparams{,#1}} -% \end{macrocode} -% \end{lstkey} -% \end{lstkey} -% -% \begin{macro}{\lst@FVConvert} -% We do conversion or \ldots -% \begin{macrocode} -\gdef\lst@FVConvert{\@tempcnta\z@ \lst@FVConvertO@}% -\gdef\lst@FVConvertO@{% - \ifcase\@tempcnta - \expandafter\futurelet\expandafter\@let@token - \expandafter\lst@FVConvert@@ - \else -% \end{macrocode} -% \ldots\ we append arguments without conversion, argument by argument, -% |\@tempcnta| times. -% \begin{macrocode} - \expandafter\lst@FVConvertO@a - \fi} -\gdef\lst@FVConvertO@a#1{% - \lst@lAddTo\lst@arg{{#1}}\advance\@tempcnta\m@ne - \lst@FVConvertO@}% -% \end{macrocode} -% Since |\@ifnextchar\bgroup| might fail, we have to use |\ifcat| here. -% Bug reported by \lsthelper{Denis~Girou}{1999/07/26}{fancyvrb=true + `second -% commandchar' other than \{ doesn't work}. -% However we don't gobble space tokens as |\@ifnextchar| does. -% \begin{macrocode} -\gdef\lst@FVConvert@@{% - \ifcat\noexpand\@let@token\bgroup \expandafter\lst@FVConvertArg - \else \expandafter\lst@FVConvert@ \fi} -% \end{macrocode} -% Coming to such a catcode${}={}$1 character we convert the argument and add -% it together with group delimiters to |\lst@arg|. -% We also add |\lst@PrintToken|, which prints all collected characters before -% we forget them. -% Finally we continue the conversion. -% \begin{macrocode} -\gdef\lst@FVConvertArg#1{% - {\let\lst@arg\@empty - \lst@FVConvert#1\@nil - \global\let\@gtempa\lst@arg}% - \lst@lExtend\lst@arg{\expandafter{\@gtempa\lst@PrintToken}}% - \lst@FVConvert} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@FVConvert@#1{% - \ifx \@nil#1\else - \if\relax\noexpand#1% - \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}% - \else - \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}% - \fi - \expandafter\lst@FVConvert - \fi} -% \end{macrocode} -% Having no |\bgroup|, we look whether we've found the end of the input, and -% convert one token ((non)active character or control sequence). -% \begin{macrocode} -\gdef\lst@FVConvert@#1{% - \ifx \@nil#1\else - \if\relax\noexpand#1% - \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}% -% \end{macrocode} -% Here we check for registered commands with arguments and set the value of -% |\@tempcnta| as required. -% \begin{macrocode} - \def\lst@temp##1,#1##2,##3##4\relax{% - \ifx##3\@empty \else \@tempcnta##2\relax \fi}% - \expandafter\lst@temp\lst@FVcmdparams,#1\z@,\@empty\relax - \else - \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}% - \fi - \expandafter\lst@FVConvertO@ - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{Omega support} -% -% \begingroup -% $\Omega$ support looks easy---I hope it works at least in some cases. -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% \begin{macrocode} -\@ifundefined{ocp}{} - {\lst@AddToHook{OutputBox}% - {\let\lst@ProcessLetter\@firstofone - \let\lst@ProcessDigit\@firstofone - \let\lst@ProcessOther\@firstofone}} -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \endgroup -% -% -% \subsection{\textsf{LGrind}} -% -% \begin{aspect}{lgrind} -% \begin{macro}{\lst@LGGetNames} -% is used to extract the language names from |\lst@arg| (the -% \packagename{LGrind} definition). -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords,comments,strings,language]{lgrind} -% \end{macrocode} -% \begin{macrocode} -\gdef\lst@LGGetNames#1:#2\relax{% - \lst@NormedDef\lstlang@{#1}\lst@ReplaceInArg\lstlang@{|,}% - \def\lst@arg{:#2}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LGGetValue} -% returns in |\lst@LGvalue| the value of capability |#1| given by the list -% |\lst@arg|. If |#1| is not found, we have |\lst@if|=|\iffalse|. -% Otherwise it is true and the ``cap=value'' pair is removed from the list. -% First we test for |#1| and -% \begin{macrocode} -\gdef\lst@LGGetValue#1{% - \lst@false - \def\lst@temp##1:#1##2##3\relax{% - \ifx\@empty##2\else \lst@LGGetValue@{#1}\fi} - \expandafter\lst@temp\lst@arg:#1\@empty\relax} -% \end{macrocode} -% remove the pair if necessary. -% \begin{macrocode} -\gdef\lst@LGGetValue@#1{% - \lst@true - \def\lst@temp##1:#1##2:##3\relax{% - \@ifnextchar=\lst@LGGetValue@@{\lst@LGGetValue@@=}##2\relax - \def\lst@arg{##1:##3}}% - \expandafter\lst@temp\lst@arg\relax} -\gdef\lst@LGGetValue@@=#1\relax{\def\lst@LGvalue{#1}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LGGetComment} -% stores the comment delimiters (enclosed in braces) in |#2| if comment of type -% |#1| is present and not a comment line. Otherwise |#2| is empty. -% \begin{macrocode} -\gdef\lst@LGGetComment#1#2{% - \let#2\@empty - \lst@LGGetValue{#1b}% - \lst@if - \let#2\lst@LGvalue - \lst@LGGetValue{#1e}% - \ifx\lst@LGvalue\lst@LGEOL - \edef\lstlang@{\lstlang@,commentline={#2}}% - \let#2\@empty - \else - \edef#2{{#2}{\lst@LGvalue}}% - \fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LGGetString} -% does the same for string delimiters, but it doesn't `return' any value. -% \begin{macrocode} -\gdef\lst@LGGetString#1#2{% - \lst@LGGetValue{#1b}% - \lst@if - \let#2\lst@LGvalue - \lst@LGGetValue{#1e}% - \ifx\lst@LGvalue\lst@LGEOL - \edef\lstlang@{\lstlang@,morestringizer=[l]{#2}}% - \else -% \end{macrocode} -% we must check for |\e|, i.e.~whether we have to use \texttt doubled or -% \texttt backslashed stringizer. -% \begin{macrocode} - \ifx #2\lst@LGvalue - \edef\lstlang@{\lstlang@,morestringizer=[d]{#2}}% - \else - \edef\lst@temp{\lst@LGe#2}% - \ifx \lst@temp\lst@LGvalue - \edef\lstlang@{\lstlang@,morestringizer=[b]{#2}}% - \else - \PackageWarning{Listings}% - {String #2...\lst@LGvalue\space not supported}% - \fi - \fi - \fi - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LGDefLang} -% defines the language given by |\lst@arg|, the definition part, and -% |\lst@language@|, the language name. First we remove unwanted stuff from -% |\lst@arg|, e.g.~we replace |:\ :| by |:|. -% \begin{macrocode} -\gdef\lst@LGDefLang{% - \lst@LGReplace - \let\lstlang@\empty -% \end{macrocode} -% Get the keywords and values of friends. -% \begin{macrocode} - \lst@LGGetValue{kw}% - \lst@if - \lst@ReplaceInArg\lst@LGvalue{{ },}% - \edef\lstlang@{\lstlang@,keywords={\lst@LGvalue}}% - \fi -% \end{macrocode} -% \begin{macrocode} - \lst@LGGetValue{oc}% - \lst@if - \edef\lstlang@{\lstlang@,sensitive=f}% - \fi -% \end{macrocode} -% \begin{macrocode} - \lst@LGGetValue{id}% - \lst@if - \edef\lstlang@{\lstlang@,alsoletter=\lst@LGvalue}% - \fi -% \end{macrocode} -% Now we get the comment delimiters and use them as single or double comments -% according to whether there are two or four delimiters. -% Note that |\lst@LGGetComment| takes care of comment lines. -% \begin{macrocode} - \lst@LGGetComment a\lst@LGa - \lst@LGGetComment c\lst@LGc - \ifx\lst@LGa\@empty - \ifx\lst@LGc\@empty\else - \edef\lstlang@{\lstlang@,singlecomment=\lst@LGc}% - \fi - \else - \ifx\lst@LGc\@empty - \edef\lstlang@{\lstlang@,singlecomment=\lst@LGa}% - \else - \edef\lstlang@{\lstlang@,doublecomment=\lst@LGc\lst@LGa}% - \fi - \fi -% \end{macrocode} -% Now we parse the stringizers. -% \begin{macrocode} - \lst@LGGetString s\lst@LGa - \lst@LGGetString l\lst@LGa -% \end{macrocode} -% We test for the continuation capability and -% \begin{macrocode} - \lst@LGGetValue{tc}% - \lst@if - \edef\lstlang@{\lstlang@,lgrindef=\lst@LGvalue}% - \fi -% \end{macrocode} -% define the language. -% \begin{macrocode} - \expandafter\xdef\csname\@lst LGlang@\lst@language@\endcsname - {\noexpand\lstset{\lstlang@}}% -% \end{macrocode} -% Finally we inform the user of all ignored capabilities. -% \begin{macrocode} - \lst@ReplaceInArg\lst@arg{{: :}:}\let\lst@LGvalue\@empty - \expandafter\lst@LGDroppedCaps\lst@arg\relax\relax - \ifx\lst@LGvalue\@empty\else - \PackageWarningNoLine{Listings}{Ignored capabilities for - \space `\lst@language@' are\MessageBreak\lst@LGvalue}% - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LGDroppedCaps} -% just drops a previous value and appends the next capabilty name to -% |\lst@LGvalue|. -% \begin{macrocode} -\gdef\lst@LGDroppedCaps#1:#2#3{% - \ifx#2\relax - \lst@RemoveCommas\lst@LGvalue - \else - \edef\lst@LGvalue{\lst@LGvalue,#2#3}% - \expandafter\lst@LGDroppedCaps - \fi} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\lst@LGReplace} -% \begin{macro}{\lst@LGe} -% We replace `escaped \verb!:^$|!' by catcode 11 versions, and other strings -% by some kind of short versions (which is necessary to get the above -% definitions work). -% \begin{macrocode} -\begingroup -\catcode`\/=0 -\lccode`\z=`\:\lccode`\y=`\^\lccode`\x=`\$\lccode`\v=`\| -\catcode`\\=12\relax -/lowercase{% -/gdef/lst@LGReplace{/lst@ReplaceInArg/lst@arg - {{\:}{z }{\^}{y}{\$}{x}{\|}{v}{ \ }{ }{:\ :}{:}{\ }{ }{\(}({\)})}} -/gdef/lst@LGe{\e} -} -/endgroup -% \end{macrocode} -% \end{macro}\end{macro} -% -% \begin{macro}{\lst@LGRead} -% reads one language definition and defines the language if the correct one -% is found. -% \begin{macrocode} -\gdef\lst@LGRead#1\par{% - \lst@LGGetNames#1:\relax - \def\lst@temp{endoflanguagedefinitions}% - \ifx\lstlang@\lst@temp - \let\lst@next\endinput - \else - \expandafter\lst@IfOneOf\lst@language@\relax\lstlang@ - {\lst@LGDefLang \let\lst@next\endinput}% - {\let\lst@next\lst@LGRead}% - \fi - \lst@next} -% \end{macrocode} -% \end{macro} -% -% \begin{lstkey}{lgrindef} -% We only have to request the language and -% \begin{macrocode} -\lst@Key{lgrindef}\relax{% - \lst@NormedDef\lst@language@{#1}% - \begingroup - \@ifundefined{lstLGlang@\lst@language@}% - {\everypar{\lst@LGRead}% - \catcode`\\=12\catcode`\{=12\catcode`\}=12\catcode`\%=12% - \catcode`\#=14\catcode`\$=12\catcode`\^=12\catcode`\_=12\relax - \input{\lstlgrindeffile}% - }{}% - \endgroup -% \end{macrocode} -% select it or issue an error message. -% \begin{macrocode} - \@ifundefined{lstLGlang@\lst@language@}% - {\PackageError{Listings}% - {LGrind language \lst@language@\space undefined}% - {The language is not loadable. \@ehc}}% - {\lsthk@SetLanguage - \csname\@lst LGlang@\lst@language@\endcsname}} -% \end{macrocode} -% \end{lstkey} -% -% \begin{macro}{\lstlgrindeffile} -% contains just the file name. -% \begin{macrocode} -\@ifundefined{lstlgrindeffile} - {\lst@UserCommand\lstlgrindeffile{lgrindef.}}{} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \subsection{\textsf{hyperref}} -% -% \begin{aspect}{hyper} -% \begin{macrocode} -%<*misc> -\lst@BeginAspect[keywords]{hyper} -% \end{macrocode} -% -% \begin{lstkey}{hyperanchor} -% \begin{lstkey}{hyperlink} -% determine the macro to set an anchor and a link, respectively. -% \begin{macrocode} -\lst@Key{hyperanchor}\hyper@@anchor{\let\lst@hyperanchor#1} -\lst@Key{hyperlink}\hyperlink{\let\lst@hyperlink#1} -% \end{macrocode} -% \end{lstkey}\end{lstkey} -% Again, the main thing is a special working procedure. First we extract the -% contents of |\lst@token| and get a free macro name for this current character -% string (using prefix |lstHR@| and a number as suffix). Then we make this -% free macro equivalent to |\@empty|, so it is not used the next time. -% \begin{macrocode} -\lst@InstallKeywords{h}{hyperref}{}\relax{} - {\begingroup - \let\lst@UM\@empty \xdef\@gtempa{\the\lst@token}% - \endgroup - \lst@GetFreeMacro{lstHR@\@gtempa}% - \global\expandafter\let\lst@freemacro\@empty -% \end{macrocode} -% |\@tempcnta| is the suffix of the free macro. We use it here to refer to -% the last occurence of the same string. To do this, we redefine the output -% macro |\lst@alloverstyle| to set an anchor \ldots -% \begin{macrocode} - \@tempcntb\@tempcnta \advance\@tempcntb\m@ne - \edef\lst@alloverstyle##1{% - \let\noexpand\lst@alloverstyle\noexpand\@empty - \noexpand\smash{\raise\baselineskip\hbox - {\noexpand\lst@hyperanchor{lst.\@gtempa\the\@tempcnta}% - {\relax}}}% -% \end{macrocode} -% \ldots\space and a link to the last occurence (if there is any). -% \begin{macrocode} - \ifnum\@tempcnta=\z@ ##1\else - \noexpand\lst@hyperlink{lst.\@gtempa\the\@tempcntb}{##1}% - \fi}% - } - od -% \end{macrocode} -% -% \begin{macrocode} -\lst@EndAspect -% -% \end{macrocode} -% \end{aspect} -% -% -% \section{Epilogue} -% -% \begingroup -% \begin{macrocode} -%<*kernel> -% \end{macrocode} -% Each option adds the aspect name to |\lst@loadaspects| or removes it from that data macro. -% \begin{macrocode} -\DeclareOption*{\expandafter\lst@ProcessOption\CurrentOption\relax} -\def\lst@ProcessOption#1#2\relax{% - \ifx #1!% - \lst@DeleteKeysIn\lst@loadaspects{#2}% - \else - \lst@lAddTo\lst@loadaspects{,#1#2}% - \fi} -% \end{macrocode} -% The following aspects are loaded by default. -% \begin{macrocode} -\@ifundefined{lst@loadaspects} - {\def\lst@loadaspects{strings,comments,escape,style,language,% - keywords,labels,lineshape,frames,emph,index}% - }{} -% \end{macrocode} -% We load the patch file, \ldots -% \begin{macrocode} -\InputIfFileExists{lstpatch.sty}{}{} -% \end{macrocode} -% \ldots\ process the options, \ldots -% \begin{macrocode} -\let\lst@ifsavemem\iffalse -\DeclareOption{savemem}{\let\lst@ifsavemem\iftrue} -\DeclareOption{noaspects}{\let\lst@loadaspects\@empty} -\ProcessOptions -% \end{macrocode} -% \ldots\ and load the aspects. -% \begin{macrocode} -\lst@RequireAspects\lst@loadaspects -\let\lst@loadaspects\@empty -% \end{macrocode} -% If present we select the empty style and language. -% \begin{macrocode} -\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle} -\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage} -% \end{macrocode} -% Finally we load the configuration files. -% \begin{macrocode} -\InputIfFileExists{listings.cfg}{}{} -\InputIfFileExists{lstlocal.cfg}{}{} -%\lst@ReportAllocs -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -% \endgroup -% -% -% \section{History} -% \begingroup\small -% Only major changes are listed here. Introductory version numbers of commands -% and keys are in the sources of the guides, which makes this history fairly -% short. -% \renewcommand\labelitemi{--} -% \begin{itemize} -% \item[0.1] from 1996/03/09 -% \item test version to look whether package is possible or not -% \item[0.11] from 1996/08/19 -%\iffalse -% \item additional blank option (= language) -%\fi -% \item improved alignment -% \item[0.12] from 1997/01/16 -% \item nearly `perfect' alignment -% \item[0.13] from 1997/02/11 -%\iffalse -% \item additional languages: Eiffel, Fortran 90, Modula-2, Pascal XSC -%\fi -% \item load on demand: language specific macros moved to driver files -% \item comments are declared now and not implemented for each language again -% (this makes the \TeX\ sources easier to read) -% \item[0.14] from 1997/02/18 -% \item User's guide rewritten, Implementation guide uses macro environment -% \item (non) case sensitivity implemented and multiple string types, -% i.e.~Modula-2 handles both string types: quotes and double quotes -%\iffalse -% \item comment declaration is user-accessible -% \item package compatible to \verb!german.sty! -%\fi -% \item[0.15] from 1997/04/18 -%\iffalse -% \item additional languages: Java, Turbo Pascal -%\fi -% \item package renamed from \packagename{listing} to \packagename{listings} -% since the first already exists -% \item[0.16] from 1997/06/01 -%\iffalse -% \item changed `$<$' to `$>$' in |\lst@SkipToFirst| -% \item bug removed: |\lst@Init| must be placed before |\lst@SkipToFirst| -%\fi -% \item listing environment rewritten -% \item[0.17] from 1997/09/29 -%\iffalse -% \item |\spreadlisting| works correct now (e.g.~page numbers don't move right) -%\fi -% \item speed up things (quick `if parameter empty', all |\long| except one -% removed, faster \verb!\lst@GotoNextTabStop!, etc.) -% \item improved alignment of wide other characters (e.g.~$==$) -%\iffalse -% \item many new languages: Ada, Algol, Cobol, Comal 80, Elan, Fortran 77, -% Lisp, Logo, Matlab, Oberon, Perl, PL/I, Simula, SQL, \TeX -%\fi -% \item[pre-0.18] from 1998/03/24 (unpublished) -%\iffalse -% \item bug concerning |\labelstyle| (becomes \keyname{numberstyle}) removed -% (now oldstylenum example works) -%\fi -% \item experimental implementation of character classes -% \item[0.19] from 1998/11/09 -% \item character classes and new \lst-aspects seem to be good -% \item user interface uses \packagename{keyval} package -% \item \packagename{fancyvrb} support -% \item[0.20] from 1999/07/12 -% \item new keyword detection mechanism -% \item new aspects: \aspectname{writefile}, \aspectname{breaklines}, -% captions, \aspectname{html} -%\iffalse -% \item improved \packagename{fancyvrb} support -%\fi -% \item all aspects reside in a single file and the language drivers in -% currently two files -% \item[0.21] 2000/08/23 -% \item completely new User's guide -% \item experimental format definitions -% \item keyword classes replaced by families -% \item dynamic modes -% \item[1.0$\beta$] 2001/09/21 -% \item key names synchronized with \packagename{fancyvrb} -% \item \aspectname{frames} aspect extended -% \item new output concept (delaying and merging) -% \item[1.0] 2002/04/01 -% \item update of all documentation sections including Developer's guide -% \item delimiters unified -% \item[1.1] 2003/06/21 -% \item bugfix-release with some new keys -% \item[1.2] 2004/02/13 -% \item bugfix-release with two new keys and new section \ref{rArbitraryLinerangeMarkers} -% \item[1.3] 2004/09/07 -% \item another bugfix-release with LPPL-1.3-compliance -% \end{itemize} -% \endgroup -% -% -% \Finale -% -\endinput diff --git a/Master/texmf-dist/source/latex/listings/listings-1.3.ins b/Master/texmf-dist/source/latex/listings/listings-1.3.ins deleted file mode 100644 index 97fd6526d9f..00000000000 --- a/Master/texmf-dist/source/latex/listings/listings-1.3.ins +++ /dev/null @@ -1,48 +0,0 @@ -%% -%% This file generates files required to use the listings package. -%% At your command prompt write -%% -%% tex listings.ins -%% -%% -%% (w)(c) 1996--1999,2002--2004 Carsten Heinz -%% -%% This file is distributed under the terms of the LaTeX Project Public -%% License from CTAN archives in directory macros/latex/base/lppl.txt. -%% Either version 1.3 or, at your option, any later version. -%% -\input docstrip -\preamble -\endpreamble - -\usedir{tex/latex/listings} -\keepsilent -\askforoverwritefalse - - -% -% generate base package -% -\generate{ - \file{listings.sty}{\from{listings-1.3.dtx}{kernel}} - \file{lstmisc.sty}{\from{listings-1.3.dtx}{misc,0.21}} - \file{lstdoc.sty}{\from{listings-1.3.dtx}{doc}} - \file{lstdrvrs.ins}{\from{lstdrvrs-1.3.dtx}{install}} - \file{listings.cfg}{\from{lstdrvrs-1.3.dtx}{config}} -} - -% -% generate language driver files -% -\batchinput{lstdrvrs.ins} - - -\Msg{*} -\Msg{* You probably need to move all created `.sty' and `.cfg'} -\Msg{* files into a directory searched by TeX.} -\Msg{*} -\Msg{* And don't forget to refresh your filename database} -\Msg{* if your TeX distribution uses such a database.} -\Msg{*} - -\endbatchfile diff --git a/Master/texmf-dist/source/latex/listings/listings.dtx b/Master/texmf-dist/source/latex/listings/listings.dtx new file mode 100644 index 00000000000..667ac65bded --- /dev/null +++ b/Master/texmf-dist/source/latex/listings/listings.dtx @@ -0,0 +1,16516 @@ +% \iffalse +% +% Trademarks appear throughout this documentation without any trademark +% symbol, so you can't assume that a name is free. There is no intention +% of infringement; the usage is to the benefit of the trademark owner. +% +% +% S O F T W A R E L I C E N S E +% ================================= +% +% The files listings.dtx and listings.ins and all files generated +% from only these two files are referred to as `the listings package' +% or simply `the package'. lstdrvrs.dtx and the files generated from +% that file are `drivers'. +% +% The listings package is copyright 1996--2004 Carsten Heinz, and +% continued maintenance on the package is copyright 2006--2007 Brooks Moses. +% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/ +% 2007 any individual author listed in the driver files. +% +% The listings package and its drivers may be distributed and/or modified +% under the conditions of the LaTeX Project Public License, either version +% 1.3 of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2003/12/01 or later. +% +% The package has the LPPL maintenance status "maintained". +% +% The Current Maintainer is Brooks Moses . +% +% end of software license +% +% +%<*driver> +\documentclass[a4paper]{ltxdoc} +\DisableCrossrefs +\OnlyDescription + +\usepackage{lstdoc,textcomp} +\makeindex + +\begin{document} + \DocInput{listings.dtx} +\end{document} +% +% \fi +% +%^^A +%^^A Command/key to aspect relation +%^^A ================================ +%^^A +%\lstisaspect[strings]{string,morestring,deletestring,stringstyle,showstringspaces} +%\lstisaspect[comments]{comment,morecomment,deletecomment,commentstyle} +%\lstisaspect[comment styles]{b,d,l,n,s,ib,id,il,in,is} +%\lstisaspect[pod]{printpod,podcomment} +%\lstisaspect[escape]{texcl,escapebegin,escapeend,escapechar,escapeinside,mathescape} +%\lstisaspect[keywords]{sensitive,classoffset,keywords,morekeywords,deletekeywords,keywordstyle,ndkeywords,morendkeywords,deletendkeywords,ndkeywordstyle,keywordsprefix,otherkeywords} +%\lstisaspect[emph]{emph,moreemph,deleteemph,emphstyle} +%\lstisaspect[tex]{texcs,moretexcs,deletetexcs,texcsstyle} +%\lstisaspect[directives]{directives,moredirectives,deletedirectives,directivestyle} +%\lstisaspect[html]{tag,usekeywordsintag,tagstyle,markfirstintag} +%\lstisaspect[keywordcomments]{keywordcomment,morekeywordcomment,deletekeywordcomment,keywordcommentsemicolon} +%\lstisaspect[index]{index,moreindex,deleteindex,indexstyle,\string\lstindexmacro} +%\lstisaspect[procnames]{procnamestyle,indexprocnames,procnamekeys,moreprocnamekeys,deleteprocnamekeys} +%\lstisaspect[style]{style,\string\lstdefinestyle,\string\lst@definestyle,\string\lststylefiles} +%\lstisaspect[language]{language,alsolanguage,defaultdialect,\string\lstalias,\string\lstdefinelanguage,\string\lst@definelanguage,\string\lstloadlanguages,\string\lstlanguagefiles} +%\lstisaspect[formats]{format,fmtindent,\string\lstdefineformat,\string\lst@defineformat,\string\lstformatfiles} +%\lstisaspect[labels]{numbers,numberstyle,numbersep,stepnumber,numberblanklines,firstnumber,\string\thelstnumber,numberfirstline} +%\lstisaspect[lineshape]{xleftmargin,xrightmargin,resetmargins,linewidth,lineskip,breaklines,breakindent,breakautoindent,prebreak,postbreak,breakatwhitespace} +%\lstisaspect[frames]{framexleftmargin,framexrightmargin,framextopmargin,framexbottommargin,backgroundcolor,fillcolor,rulecolor,rulesepcolor,rulesep,framerule,framesep,frameshape,frameround,frame} +%\lstisaspect[make]{makemacrouse} +%\lstisaspect[fancyvrb]{fancyvrb,fvcmdparams,morefvcmdparams} +%\lstisaspect[lgrind]{lgrindef,\string\lstlgrindeffile} +%\lstisaspect[hyper]{hyperref,morehyperref,deletehyperref,hyperanchor,hyperlink} +%\lstisaspect[kernel]{basewidth,fontadjust,columns,flexiblecolumns,identifierstyle,^^A +% tabsize,showtabs,tab,showspaces,keepspaces,formfeed,SelectCharTable,^^A +% MoreSelectCharTable,extendedchars,alsoletter,alsodigit,alsoother,excludedelims,^^A +% literate,basicstyle,print,firstline,lastline,linerange,nolol,captionpos,abovecaptionskip,^^A +% belowcaptionskip,label,title,caption,\string\lstlistingname,boxpos,float,^^A +% floatplacement,aboveskip,belowskip,everydisplay,showlines,emptylines,gobble,name,^^A +% \string\lstname,\string\lstlistlistingname,\string\lstlistoflistings,^^A +% \string\lstnewenvironment,\string\lstinline,\string\lstinputlisting,lstlisting,^^A +% \string\lstloadaspects,\string\lstset,\string\thelstlisting,\string\lstaspectfiles,^^A +% inputencoding,delim,moredelim,deletedelim,upquote,numberbychapter,^^A +% \string\lstMakeShortInline,\string\lstDeleteShortInline} +%\lstisaspect[doc]{lstsample,lstxsample}^^A environment +%\lstisaspect[experimental]{includerangemarker,rangebeginprefix,rangebeginsuffix,rangeendprefix,rangeendsuffix,rangeprefix,rangesuffix} +% +%^^A +%^^A The long awaited beginning of documentation +%^^A ============================================= +%^^A +%\newbox\abstractbox +%\setbox\abstractbox=\vbox{ +% \begin{abstract} +% The \packagename{listings} package is a source code printer for \LaTeX. +% You can typeset stand alone files as well as listings with an environment +% similar to \texttt{verbatim} as well as you can print code snippets using +% a command similar to |\verb|. +% Many parameters control the output and if your preferred programming +% language isn't already supported, you can make your own definition. +% \end{abstract}} +% +% \title{\vspace*{-2\baselineskip}The \textsf{Listings} Package} +% \author{Copyright 1996--2004, Carsten Heinz% +% \\ Copyright 2006--2007, Brooks Moses +% \\ Maintainer: Brooks Moses\thanks{Brooks % +% Moses became the maintainer of the \packagename{listings} +% package in 2006; see the Preface for details.}~ % +% \textless\lstemail\textgreater} +% \date{2007/02/22\enspace\enspace Version 1.4\\ \box\abstractbox} +% \def\lstemail{\href{mailto:bmoses@dpdx.net}{\texttt{bmoses@dpdx.net}}} +% \ifhyper +% \hypersetup{pdfsubject=Package guide,pdfauthor=Brooks Moses } +% \fi +% +% \csname @twocolumntrue\endcsname +% \maketitle +%^^A \enlargethispage{2\baselineskip} +% \csname @starttoc\endcsname{toc} +% \onecolumn +% +% +% \section*{Preface} +% +% \paragraph{Transition of package maintenance} +% The \TeX\ world lost contact with Carsten Heinz in late 2004, shortly after +% he released version 1.3b of the \packagename{listings} package. After many +% attempts to reach him had failed, Hendri Adriaens took over maintenance of +% the package in accordance with the LPPL's procedure for abandoned packages. +% He then passed the maintainership of the package to Brooks Moses, who had +% volunteered for the position while this procedure was going through. +% +% This release, version 1.4, is the first substantial bugfix release since +% I accepted maintainership of the package. I would like to thank the +% numerous people who reported bugs to me, and particularly those who +% suggested fixes. Thanks in addition to those who provided +% new language definitions and suggestions for improvements. +% +% \paragraph{News and changes} +% Version 1.4 is the fourth bugfix release. There are no substantial changes +% in this version, but a number of minor changes and fixes. The primary news +% is that the documentation has been substantially copyedited, and improved +% in a number of ways to document workarounds and things learned from the +% recent bug reports. +% +% A |numberbychapter| key has been added, to control whether listings are +% numbered sequentially or by chapter in document classes that provide +% chapters. +% +% The |\lstMakeShortInline| command can be used to define single-character +% inline-listing macros, much like the \packagename{shortvrb} package +% allows for verbatim inline text. +% +% A new |spaceflexible| column alignment style has been added, which is +% similar to the |flexible| style except that it only inserts extra space +% to recover the column alignment at locations where there is already +% existing space. +% +% A |s| string type has been added, akin to the |s| comment type. This is +% used in the Ruby language definition. +% +% The |\lst@for| routine has been sped up substantially, thanks to some code +% provided by Hendri Adriaens. Hopefully this will result in a significant +% speedup of the runtime of the overall package. +% +% Among the bugs fixed are the |*| option to |texcs|, which was quite badly +% broken; the interaction of background colors with inline listings and with +% frames; listing captions being broken in AMS document classes; and better +% integration of the list of listings with KOMAscript document class and other +% document clases that use the |\float@addtolists| mechanism. +% +% The following languages were added: |command.com| (DOS/Windows) batch files, +% Common Intermediate Language, Lingo, Postscript, PSTricks, and SPARQL. +% The following dialects of existing languages were added: Ada (2005), +% Assembler (Motorola68k), and Mathematica (5.2). The definitions for ABAP, +% Fortran, Octave, Python, Ruby, and TCL have been improved. Thanks go to the +% contributers. +% +% \vfill +% \paragraph{Thanks} +% There are many people I have to thank for fruitful communication, posting +% their ideas, giving error reports, adding programming languages to +% \texttt{lstdrvrs.dtx}, and so on. Their names are listed in section +% \ref{uClosingAndCredits}. +% +% \paragraph{Trademarks} +% Trademarks appear throughout this documentation without any trademark +% symbol; they are the property of their respective trademark owner. +% There is no intention of infringement; the usage is to the benefit of the +% trademark owner. +% +% +% \clearpage +% +% +% \part{User's guide} +% +% +% \section{Getting started}\label{uGettingStarted} +% +% +% \subsection{A minimal file}\label{uAMinimalFile} +% +% Before using the \packagename{listings} package, you should be familiar with +% the \LaTeX\ typesetting system. You need not to be an expert. +% Here is a minimal file for \packagename{listings}. +% \begin{verbatim} +% \documentclass{article} +% \usepackage{listings} +% +% \begin{document} +% \lstset{language=Pascal} +% +% % Insert Pascal examples here. +% +% \end{document}\end{verbatim} +% Now type in this first example and run it through \LaTeX. +% \begin{advise} +% \item Must I do that really? +% \advisespace +% Yes and no. Some books about programming say this is good. +% What a mistake! Typing takes time---which is wasted if the code is clear to +% you. And if you need that time to understand what is going on, the +% author of the book should reconsider the concept of presenting the +% crucial things---you might want to say that about this guide even---or +% you're simply inexperienced with programming. If only the latter case +% applies, you should spend more time on reading (good) books about +% programming, (good) documentations, and (good) source code from other +% people. Of course you should also make your own experiments. +% You will learn a lot. However, running the example through \LaTeX\ +% shows whether the \packagename{listings} package is installed correctly. +% \item The example doesn't work. +% \advisespace +% Are the two packages \packagename{listings} and \packagename{keyval} +% installed on your system? Consult the administration tool of your +% \TeX\ distribution, your system administrator, the local \TeX\ and +% \LaTeX\ guides, a \TeX\ FAQ, and section \ref{rInstallation}---in +% that order. If you've checked \emph{all} these sources and are +% still helpless, you might want to write a post to a \TeX\ newsgroup +% like \texttt{comp.text.tex}. +% \item Should I read the software license before using the package? +% \advisespace +% Yes, but read this \emph{Getting started} section first to decide +% whether you are willing to use the package.^^A ;-) +% \end{advise} +% +% +% \subsection{Typesetting listings} +% +% Three types of source codes are supported: code snippets, code segments, and +% listings of stand alone files. Snippets are placed inside paragraphs and the +% others as separate paragraphs---the difference is the same as between text +% style and display style formulas. +% \begin{advise} +% \item No matter what kind of source you have, if a listing contains national +% characters like \'e, \L, \"a, or whatever, you must tell the +% package about it! Section \lstref{uSpecialCharacters} discusses this issue. +% \end{advise} +% +% \paragraph{Code snippets} +% The well-known \LaTeX\ command |\verb| typesets code snippets verbatim. +% The new command |\lstinline| pretty-prints the code, for example +%`\lstinline!var i:integer;!' is typeset by +%`{\rstyle|\lstinline|}|!var i:integer;!|'. The exclamation marks delimit +% the code and can be replaced by any character not in the code; +% |\lstinline$var i:integer;$| gives the same result. +% +% \paragraph{Displayed code} +% The \texttt{lstlisting} environment typesets the enclosed source code. Like +% most examples, the following one shows verbatim \LaTeX\ code on the right +% and the result on the left. You might take the right-hand side, put it into +% the minimal file, and run it through \LaTeX. +% \begin{lstsample}[lstlisting]{}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% It can't be easier. +% \begin{advise} +% \item That's not true. The name `\texttt{listing}' is shorter. +% \advisespace +% Indeed. But other packages already define environments with that name. +% To be compatible with such packages, all commands and environments of +% the \packagename{listings} package use the prefix `\texttt{lst}'. +% \end{advise} +% The environment provides an optional argument. It tells the package to +% perform special tasks, for example, to print only the lines 2--5: +% \begin{lstsample}{\lstset{frame=trbl,framesep=0pt}\label{gFirstKey=ValueList}}{} +% \begin{lstlisting}[firstline=2, +% lastline=5] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item Hold on! Where comes the frame from and what is it good for? +% \advisespace +% You can put frames around all listings except code snippets. +% You will learn how later. The frame shows that empty lines at the end +% of listings aren't printed. This is line 5 in the example. +% \item Hey, you can't drop my empty lines! +% \advisespace +% You can tell the package not to drop them: +% The key `\ikeyname{showlines}' controls these empty lines and is +% described in section \ref{rTypesettingListings}. Warning: First +% read ahead on how to use keys in general. +% \item I get obscure error messages when using `\ikeyname{firstline}'. +% \advisespace +% That shouldn't happen. Make a bug report as described in section +% \lstref{uTroubleshooting}. +% \end{advise} +% +% \paragraph{Stand alone files} +% Finally we come to |\lstinputlisting|, the command used to pretty-print +% stand alone files. It has one optional and one file name argument. +% Note that you possibly need to specify the relative path to the file. +% Here now the result is printed below the verbatim code since both together +% don't fit the text width. +% \begin{lstsample}{\lstset{comment=[l]\%,columns=fullflexible}}{\lstset{alsoletter=\\,emph=\\lstinputlisting,emphstyle=\rstyle}\lstaspectindex{\lstinputlisting}{}} +% \lstinputlisting[lastline=4]{listings.sty} +% \end{lstsample} +% \begin{advise} +% \item The spacing is different in this example. +% \advisespace +% Yes. The two previous examples have aligned columns, i.e.~columns with +% identical numbers have the same horizontal position---this package +% makes small adjustments only. The columns in the example here are not +% aligned. This is explained in section \ref{uFixedAndFlexibleColumns} +% (keyword: full flexible column format). +% \end{advise} +% +% Now you know all pretty-printing commands and environments. It remains +% to learn the parameters which control the work of the \packagename{listings} +% package. This is, however, the main task. Here are some of them. +% +% +% \subsection{Figure out the appearance}\label{gFigureOutTheAppearance} +% +% Keywords are typeset bold, comments in italic shape, and spaces in strings +% appear as \textvisiblespace. You don't like these settings? Look at this: +%\ifcolor +% \begin{lstxsample}[basicstyle,keywordstyle,identifierstyle,commentstyle,stringstyle,showstringspaces] +% \lstset{% general command to set parameter(s) +% basicstyle=\small, % print whole listing small +% keywordstyle=\color{black}\bfseries\underbar, +% % underlined bold black keywords +% identifierstyle=, % nothing happens +% commentstyle=\color{white}, % white comments +% stringstyle=\ttfamily, % typewriter type for strings +% showstringspaces=false} % no special string spaces +% \end{lstxsample} +%\else +% \begin{lstxsample}[basicstyle,keywordstyle,identifierstyle,commentstyle,stringstyle,showstringspaces] +% \lstset{% general command to set parameter(s) +% basicstyle=\small, % print whole listing small +% keywordstyle=\bfseries\underbar, +% % underlined bold keywords +% identifierstyle=, % nothing happens +% commentstyle=\itshape, % default +% stringstyle=\ttfamily, % typewriter type for strings +% showstringspaces=false} % no special string spaces +% \end{lstxsample} +%\fi +% \begin{lstsample}{}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +%\ifcolor +% \begin{advise} +% \item You've requested white coloured comments, but I can see the comment +% on the left side. +% \advisespace +% There are a couple of possible reasons: +% (1) You've printed the documentation on nonwhite paper. +% (2) If you are viewing this documentation as a \texttt{.dvi}-file, your +% viewer seems to have problems with colour specials. Try to print +% the page on white paper. +% (3) If a printout on white paper shows the comment, the colour +% specials aren't suitable for your printer or printer driver. +% Recreate the documentation and try it again---and ensure that +% the \packagename{color} package is well-configured. +% \end{advise} +%\fi +% The styles use two different kinds of commands. |\ttfamily| and |\bfseries| +% both take no arguments but |\underbar| does; it underlines the following +% argument. In general, the \emph{very last} command may read exactly one +% argument, namely some material the package typesets. There's one exception. +% The last command of \ikeyname{basicstyle} \emph{must not} read any +% tokens---or you will get deep in trouble. +% \begin{advise} +% \item `|basicstyle=\small|' looks fine, but comments look really bad with +% `|commentstyle=\tiny|' and empty basic style, say. +% \advisespace +% Don't use different font sizes in a single listing. +% \item But I really want it! +% \advisespace +% No, you don't. +%^^A The package adjusts internal data after selecting the basic style at +%^^A the beginning of each listing. This is a problem if you change the +%^^A font size for comments or strings, for example. +%^^A Section \ref{rColumnAlignment} shows how to overcome this. +%^^A But once again: Don't use different font sizes in a single listing +%^^A unless you really know what you are doing. +% \end{advise} +% +% \paragraph{Warning}\label{wStrikingStyles} +% You should be very careful with striking styles; the recent example is rather +% moderate---it can get horrible. \emph{Always use decent highlighting.} +% Unfortunately it is difficult to give more recommendations since they depend +% on the type of document you're creating. Slides or other presentations often +% require more striking styles than books, for example. +% In the end, it's \emph{you} who have to find the golden mean! +% +% +% \subsection{Seduce to use}\label{gSeduceToUse} +% +% You know all pretty-printing commands and some main parameters. Here now +% comes a small and incomplete overview of other features. The table of +% contents and the index also provide information. +% +% \paragraph{Line numbers} +% are available for all displayed listings, e.g.~tiny numbers on the left, each +% second line, with 5pt distance to the listing: +% \begin{lstxsample}[numbers,numberstyle,stepnumber,numbersep] +% \lstset{numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=5pt} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item I can't get rid of line numbers in subsequent listings. +% \advisespace +% `|numbers=none|' turns them off. +% \item Can I use these keys in the optional arguments? +% \advisespace +% Of course. Note that optional arguments modify values for one +% particular listing only: you change the appearance, step or distance +% of line numbers for a single listing. The previous values are +% restored afterwards. +% \end{advise} +% The environment allows you to interrupt your listings: you can end a listing +% and continue it later with the correct line number even if there are other +% listings in between. Read section \ref{uLineNumbers} for a thorough +% discussion. +% +% \paragraph{Floating listings} +% Displayed listings may float: +% \begin{lstsample}{\lstset{frame=tb}}{} +% \begin{lstlisting}[float,caption=A floating example] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% Don't care about the parameter \ikeyname{caption} now. And if you put the +% example into the minimal file and run it through \LaTeX, please don't wonder: +% you'll miss the horizontal rules since they are described elsewhere. +% \begin{advise} +% \item \LaTeX's float mechanism allows one to determine the placement of floats. +% How can I do that with these? +% \advisespace +% You can write `|float=tp|', for example. +% \end{advise} +% +% \paragraph{Other features} +% There are still features not mentioned so far: automatic breaking of long +% lines, the possibility to use \LaTeX\ code in listings, automated indexing, +% or personal language definitions. +% One more little teaser? Here you are. But note that the result is not +% produced by the \LaTeX\ code on the right alone. The main parameter is +% hidden. +% \begin{lstsample}{\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}}{} +% \begin{lstlisting} +% if (i<=0) then i := 1; +% if (i>=0) then i := 0; +% if (i<>0) then i := 0; +% \end{lstlisting} +% \end{lstsample} +% +% You're not sure whether you should use \packagename{listings}? +% Read the next section! +% +% +% \subsection{Alternatives} +% +% \begin{advise} +% \item Why do you list alternatives? +% \advisespace +% Well, it's always good to know the competitors.^^A :-) +% \item I've read the descriptions below and the \packagename{listings} package +% seems to incorporate all the features. Why should I use one of the +% other programs? +% \advisespace +% Firstly, the descriptions give a taste and not a complete overview, +% secondly, \packagename{listings} lacks some properties, and, ultimately, +% you should use the program matching your needs most precisely. +% \end{advise} +% This package is certainly not the final utility for typesetting source code. +% Other programs do their job very well, if you are not satisfied with +% \packagename{listings}. Some are independent of \LaTeX, others come as +% separate program plus \LaTeX\ package, and others are packages which +% don't pretty-print the source code. The second type includes converters, +% cross compilers, and preprocessors. Such programs create \LaTeX\ files +% you can use in your document or stand alone ready-to-run \LaTeX\ files. +% +% Note that I'm not dealing with any literate programming tools here, which +% could also be alternatives. However, you should have heard of the +% \texttt{WEB} system, the tool Prof.~Donald E.~Knuth developed and made use +% of to document and implement \TeX. +% +% \paragraph{\href{http://www.infres.enst.fr/~demaille/a2ps}{\packagename{a2ps}}} +% started as `ASCII to PostScript' converter, but today you can invoke the +% program with \texttt{--pretty-print=}\meta{language} option. If your +% favourite programming language is not already supported, you can write your +% own so-called style sheet. You can request line numbers, borders, headers, +% multiple pages per sheet, and many more. You can even print symbols like +% $\forall$ or $\alpha$ instead of their verbose forms. If you just want +% program listings and not a document with some listings, this is the best +% choice. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/nonfree/support/lgrind}{\packagename{LGrind}}} +% is a cross compiler and comes with many predefined programming languages. +% For example, you can put the code on the right in your document, invoke +% \packagename{LGrind} with \texttt{-e} option (and file names), and run the +% created file through \LaTeX. You should get a result similar to the +% left-hand side: +% \begin{center} +% \begin{minipage}{0.45\linewidth} +%\iflgrind +% \LGindent=0pt +% \LGinlinefalse\LGbegin\lgrinde +% \L{\LB{\K{for}_\V{i}:=\V{maxint}_\K{to}_\N{0}_\K{do}}} +% \L{\LB{\K{begin}}} +% \L{\LB{____\C{}\{_do_nothing_\}\CE{}}} +% \L{\LB{\K{end};}} +% \L{\LB{}} +% \L{\LB{\V{Write}(\S{}{'}Case_insensitive_{'}\SE{});}} +% \L{\LB{\V{WritE}(\S{}{'}Pascal_keywords.{'}\SE{});}} +% \endlgrinde\LGend +%\else +% \packagename{LGrind} not installed. +%\fi +% \end{minipage} +% \begin{minipage}{0.45\linewidth} +% \begin{verbatim} +% %[ +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% %]\end{verbatim} +% \end{minipage} +% \end{center} +% If you use |%(| and |%)| instead of |%[| and |%]|, you get a code snippet +% instead of a displayed listing. Moreover you can get line numbers to the +% left or right, use arbitrary \LaTeX\ code in the source code, print symbols +% instead of verbose names, make font setup, and more. You will (have to) +% like it (if you don't like \packagename{listings}). +% +% Note that \packagename{LGrind} contains code with a no-sell license and is +% thus nonfree software. +% +% \paragraph{\href{ftp://axp3.sv.fh-mannheim.de/cvt2latex}{\packagename{cvt2ltx}}} +% is a family of `source code to \LaTeX' converters for C, Objective C, \Cpp, +% IDL and Perl. Different styles, line numbers and other qualifiers can be +% chosen by command-line option. Unfortunately it isn't documented how other +% programming languages can be added. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/support/C++2LaTeX-1_1pl1}{\packagename{\Cpp2\LaTeX}}} +% is a C/\Cpp\ to \LaTeX\ converter. You can specify the fonts for comments, +% directives, keywords, and strings, or the size of a tabulator. But as far as +% I know you can't number lines. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/support/slatex}{\packagename{S\LaTeX}}} +% is a pretty-printing Scheme program (which invokes \LaTeX\ automatically) +% especially designed for Scheme and other Lisp dialects. It supports stand +% alone files, text and display listings, and you can even nest the +% commands/environments if you use \LaTeX\ code in comments, for example. +% Keywords, constants, variables, and symbols are definable and use of +% different styles is possible. No line numbers. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/support/tiny_c2l}{\packagename{tiny\textunderscore c2ltx}}} +% is a C/\Cpp/Java to \LaTeX\ converter based on \packagename{cvt2ltx} (or the +% other way round?). It supports line numbers, block comments, \LaTeX\ code +% in/as comments, and smart line breaking. Font selection and tabulators are +% hard-coded, i.e.~you have to rebuild the program if you want to change the +% appearance. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/misc}{\packagename{listing}}} +% ---note the missing \packagename{s}---is not a pretty-printer and the +% aphorism about documentation at the end of \texttt{listing.sty} is not +% true.\space ^^A :-) +% It defines |\listoflistings| and a nonfloating environment for listings. +% All font selection and indention must be done by hand. However, it's +% useful if you have another tool doing that work, e.g.~\packagename{LGrind}. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/alg}{\packagename{alg}}} +% provides essentially the same functionality as \packagename{algorithms}. +% So read the next paragraph and note that the syntax will be different. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/algorithms}{\packagename{algorithms}}} +% goes a quite different way. You describe an algorithm and the package +% formats it, for example +% \begin{center} +% \begin{minipage}{0.45\linewidth} +%\ifalgorithmicpkg +% \begin{algorithmic} +% \IF {$i\leq0$} +% \STATE $i\gets1$ +% \ELSE\IF {$i\geq0$} +% \STATE $i\gets0$ +% \ENDIF\ENDIF +% \end{algorithmic} +%\else +% \packagename{algorithms} not installed. +%\fi +% \end{minipage} +% \begin{minipage}{0.45\linewidth} +% \begin{verbatim} +%\begin{algorithmic} +%\IF{$i\leq0$} +%\STATE $i\gets1$ +%\ELSE\IF{$i\geq0$} +%\STATE $i\gets0$ +%\ENDIF\ENDIF +%\end{algorithmic}\end{verbatim} +% \end{minipage} +% \end{center} +% As this example shows, you get a good looking algorithm even from a bad +% looking input. The package provides a lot more constructs like |for|-loops, +% |while|-loops, or comments. You can request line numbers, `ruled', `boxed' +% and floating algorithms, a list of algorithms, and you can customize the +% terms \textbf{if}, \textbf{then}, and so on. +% +% \paragraph{\href{http://www.mimuw.edu.pl/~wolinski/pretprin.html}{\packagename{pretprin}}} +% is a package for pretty-printing texts in formal languages---as the title +% in TUGboat, Volume 19 (1998), No.~3 states. It provides environments which +% pretty-print \emph{and} format the source code. Analyzers for Pascal and +% Prolog are defined; adding other languages is easy---if you are or get a bit +% familiar with automatons and formal languages. +% +% \paragraph{\packagename{alltt}} +% defines an environment similar to \texttt{verbatim} except that |\|, |{| and +% |}| have their usual meanings. This means that you can use commands in the +% verbatims, e.g.~select different fonts or enter math mode. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/moreverb}{\packagename{moreverb}}} +% requires \packagename{verbatim} and provides verbatim output to a file, +% `boxed' verbatims and line numbers. +% +% \paragraph{\packagename{verbatim}} +% defines an improved version of the standard \texttt{verbatim} environment and +% a command to input files verbatim. +% +% \paragraph{\href{http://www.ctan.org/tex-archive/macros/latex/contrib/fancyvrb}{\packagename{fancyvrb}}} +% is, roughly speaking, a superset of \packagename{alltt}, +% \packagename{moreverb}, and \packagename{verbatim}, but many more parameters +% control the output. The package provides frames, line numbers on the left or +% on the right, automatic line breaking (difficult), and more. For example, an +% interface to \packagename{listings} exists, i.e.~you can pretty-print source +% code automatically. +% The package \packagename{fvrb-ex} builds on \packagename{fancyvrb} and +% defines environments to present examples similar to the ones in this guide. +% +% +% \section{The next steps}\label{uTheNextSteps} +% +% Now, before actually using the \packagename{listings} package, you should +% \emph{really} read the software license. It does not cost much time and +% provides information you probably need to know. +% +% +% \subsection{Software license}\label{uSoftwareLicense} +% +% The files \texttt{listings.dtx} and \texttt{listings.ins} and all +% files generated from only these two files are referred to as `the +% \packagename{listings} package' or simply `the package'. +% \texttt{lstdrvrs.dtx} and the files generated from that file are +% `drivers'. +% +% \paragraph{Copyright} +% The \packagename{listings} package is copyright 1996--2004 Carsten Heinz, +% and copyright 2006 Brooks Moses. The drivers are copyright any individual +% author listed in the driver files. +% +% \paragraph{Distribution and modification} +% The \packagename{listings} package and its drivers may be distributed +% and/or modified under the conditions of the LaTeX Project Public License, +% either version 1.3 of this license or (at your option) any later version. +% The latest version of this license is in +% \href{http://www.latex-project.org/lppl.txt}{http://www.latex-project.org/lppl.txt} +% and version 1.3 or later is part of all distributions of LaTeX version +% 2003/12/01 or later. +% +% \paragraph{Contacts} +% Read section \lstref{uTroubleshooting} on how to submit a bug report. +% Send all other comments, ideas, and additional programming languages to +% \lstemail\ using \texttt{listings} as part of the subject. +% +% +% \subsection{Package loading}\label{uPackageLoading} +% +% As usual in \LaTeX, the package is loaded by +% |\usepackage[|\meta{options}|]{listings}|, +% where |[|\meta{options}|]| is optional and gives a comma separated list of +% options. Each either loads an additional \packagename{listings} aspect, or +% changes default properties. Usually you don't have to take care of such +% options. But in some cases it could be necessary: if you want to compile +% documents created with an earlier version of this package or if you use +% special features. Here's an incomplete list of possible options. +% \begin{advise} +% \item Where is a list of all of the options? +% \advisespace +% In the developer's guide since they were introduced to debug the +% package more easily. Read section \ref{uHowTos} on how to get that +% guide. +% \end{advise} +% \begin{description} +% \item[\normalfont\texttt{0.21}]\leavevmode +% +% invokes a compatibility mode for compiling documents written for +% \packagename{listings} version 0.21. +% +% \item[\normalfont\texttt{draft}]\leavevmode +% +% The package prints no stand alone files, but shows the captions and +% defines the corresponding labels. +% Note that a global |\documentclass|-option \texttt{draft} is +% recognized, so you don't need to repeat it as a package option. +% +% \item[\normalfont\texttt{final}]\leavevmode\label{uoption:final} +% +% Overwrites a global \texttt{draft} option. +% +% \item[\normalfont\texttt{savemem}]\leavevmode +% +% tries to save some of \TeX's memory. If you switch between languages +% often, it could also reduce compile time. But all this depends on the +% particular document and its listings. +% \end{description} +% Note that various experimental features also need explicit loading via +% options. Read the respective lines in section \ref{rExperimentalFeatures}. +% +% \medbreak +% After package loading it is recommend to load all used dialects of programming +% languages with the following command. It is faster to load several languages +% with one command than loading each language on demand. +% \begin{syntax} +% \item {\rstyle\icmdname\lstloadlanguages}\marg{comma separated list of languages} +% +% Each language is of the form \oarg{dialect}\meta{language}. Without +% the optional \oarg{dialect} the package loads a default dialect. So +% write `|[Visual]C++|' if you want Visual \Cpp\ and `|[ISO]C++|' for +% ISO \Cpp. Both together can be loaded by the command +% |\lstloadlanguages{[Visual]C++,[ISO]C++}|. +% +% Table \ref{uPredefinedLanguages} on page \pageref{uPredefinedLanguages} +% shows all defined languages and their dialects. +% \end{syntax} +%^^A After or even before language loading, you might want to define default +%^^A dialects---just to be independent of configuration files. +% +% +% \subsection{The key=value interface}\label{uTheKey=ValueInterface} +% +% This package uses the \packagename{keyval} package from the +% \packagename{graphics} bundle by David Carlisle. Each parameter is +% controlled by an associated key and a user supplied value. For example, +% \ikeyname{firstline} is a key and |2| a valid value for this key. +% +% The command {\rstyle\icmdname\lstset} gets a comma separated list of +% ``key|=|value'' pairs. The first list with more than a single entry is on +% page \pageref{gFirstKey=ValueList}: |firstline=2,lastline=5|. +% \begin{advise} +% \item So I can write `|\lstset{firstline=2,lastline=5}|' once for all? +% \advisespace +% No. `\ikeyname{firstline}' and `\ikeyname{lastline}' belong to a small +% set of +% keys which are only used on individual listings. However, your command is +% not illegal---it has no effect. You have to use these keys inside the +% optional argument of the environment or input command. +% \item What's about a better example of a key|=|value list? +% \advisespace +% There is one in section \ref{gFigureOutTheAppearance}. +% \item `|language=[77]Fortran|' does not work inside an optional argument. +% \advisespace +% You must put braces around the value if a value with optional argument +% is used inside an optional argument. In the case here write +% `|language={[77]Fortran}|' to select Fortran 77. +% \item If I use the `\ikeyname{language}' key inside an optional argument, the +% language isn't active when I typeset the next listing. +% \advisespace +% All parameters set via `|\lstset|' keep their values up to the end of +% the current environment or group. Afterwards the previous values are +% restored. The optional parameters of the two pretty-printing commands +% and the `\texttt{lstlisting}' environment take effect on the particular +% listing only, i.e.~values are restored immediately. For example, you +% can select a main language and change it for special listings. +% \item \icmdname\lstinline\ has an optional argument? +% \advisespace +% Yes. And from this fact comes a limitation: you can't use the left +% bracket `|[|' as delimiter unless you specify at least an empty +% optional argument as in `|\lstinline[][var i:integer;[|'. +% If you forget this, you will either get a ``runaway argument'' error +% from \TeX, or an error message from the \packagename{keyval} package. +% \end{advise} +% +% +% \subsection{Programming languages}\label{uProgrammingLanguages} +% +% You already know how to activate programming languages---at least Pascal. +% An optional parameter selects particular dialects of a language. For example, +% |language=[77]Fortran| selects Fortran 77 and |language=[XSC]Pascal| does the +% same for Pascal XSC. The general form is +% {\rstyle\ikeyname{language}}|=|\oarg{dialect}\meta{language}. +% If you want to get rid of keyword, comment, and string detection, use +% |language={}| as an argument to |\lstset| or as optional argument. +% +% Table \ref{uPredefinedLanguages} shows all predefined languages and dialects. +% Use the listed names as \meta{language} and \meta{dialect}, respectively. If +% no dialect or `empty' is given in the table, just don't specify a dialect. +% Each underlined dialect is default; it is selected if you leave out +% the optional argument. The predefined defaults are the newest language +% versions or standard dialects. +%^^A +%^^A Make table of predefined languages. +%^^A +%\let\lstlanguages\empty +%\makeatletter +%\@for\lst@temp:={lstlang1.sty,lstlang2.sty,lstlang3.sty}\do +% {\IfFileExists\lst@temp{}{\let\lstlanguages\relax}} +%\makeatother +%\ifx\lstlanguages\relax +% \PackageWarningNoLine{Listings} +% {Standard drivers not available.\MessageBreak +% Please check your installation.\MessageBreak +% Compilation aborted} +% \csname @@end\expandafter\endcsname +%\fi +%\lstscanlanguages\lstlanguages{lstlang1.sty,lstlang2.sty,lstlang3.sty}{}^^A +%\def\topfigrule{\hrule\kern-0.4pt\relax}^^A +%\let\botfigrule\topfigrule +%\belowcaptionskip=\smallskipamount +% \begin{table}[tbhp] +% \small +% \caption{Predefined languages. +% Note that some definitions are preliminary, for example HTML and XML. +% Each underlined dialect is the default dialect.}^^A +% \label{uPredefinedLanguages}^^A +% \makeatletter +% \setbox\@tempboxa\hbox{^^A +% \InputIfFileExists{listings.cfg}{\lst@InputCatcodes}{}}^^A +% \lstprintlanguages\lstlanguages +% \end{table} +%^^A +%^^A end of table +%^^A +%\lstset{defaultdialect=[doc]Pascal}^^A restore +% \begin{advise} +% \item How can I define default dialects? +% \advisespace +% Check section \ref{rLanguagesAndStyles} for `\keyname{defaultdialect}'. +% \item I have C code mixed with assembler lines. Can \packagename{listings} +% pretty-print such source code, i.e.~highlight keywords and comments of +% both languages? +% \advisespace +% `\ikeyname{alsolanguage}|=|\oarg{dialect}\meta{language}' selects a +% language additionally to the active one. So you only have to write a +% language definition for your assembler dialect, which doesn't interfere +% with the definition of C, say. Moreover you might want to use the key +% `\keyname{classoffset}' described in section \ref{rLanguagesAndStyles}. +% \item How can I define my own language? +% \advisespace +% This is discussed in section \ref{rLanguageDefinitions}. And if you +% think that other people could benefit by your definition, you might +% want to send it to the address in section \ref{uSoftwareLicense}. +% Then it will be published under the \LaTeX\ Project Public License. +% \end{advise} +% Note that the arguments \meta{language} and \meta{dialect} are case +% insensitive and that spaces have no effect. +% +% +% \subsection{Special characters}\label{uSpecialCharacters} +% +% +% \paragraph{Tabulators} +% You might get unexpected output if your sources contain tabulators. +% The package assumes tabulator stops at columns 9, 17, 25, 33, and so on. +% This is predefined via |tabsize=8|. If you change the eight to the number +% $n$, you will get tabulator stops at columns $n+1,2n+1,3n+1,$ and so on. +% \begin{lstsample}[tabsize]{}{} +% \lstset{tabsize=2} +% \begin{lstlisting} +% 123456789 +% { one tabulator } +% { two tabs } +% 123 { 123 + two tabs } +% \end{lstlisting} +% \end{lstsample} +% For better illustration, the left-hand side uses |tabsize=2| but the verbatim +% code |tabsize=4|. Note that |\lstset| modifies the values for all following +% listings in the same environment or group. This is no problem here since the +% examples are typeset inside minipages. If you want to change settings for a +% single listing, use the optional argument. +% +% +% \paragraph{Visible tabulators and spaces} +% One can make spaces and tabulators visible: +% \begin{lstsample}[showspaces,showtabs,tab]{}{} +% \lstset{showspaces=true, +% showtabs=true, +% tab=\rightarrowfill} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% If you request \ikeyname{showspaces} but no \ikeyname{showtabs}, +% tabulators are converted to visible spaces. +% The default definition of \ikeyname{tab} produces a `wide visible space' +% \lstinline[showtabs]! !. So you might want to use |$\to$|, |$\dashv$| +% or something else instead. +% \begin{advise} +% \item Some sort of advice: (1) You should really indent lines of source code +% to make listings more readable. (2) Don't indent some lines with +% spaces and others via tabulators. Changing the tabulator size (of your +% editor or pretty-printing tool) completely disturbs the columns. +% (3) As a consequence, never share your files with differently tab sized +% people!^^A true only if you use tabulators, just :-) +% \item To make the \LaTeX\ code more readable, I indent the environments' +% program listings. How can I remove that indention in the output? +% \advisespace +% Read `How to gobble characters' in section \ref{uHowTos}. +% \end{advise} +% +% +% \paragraph{Form feeds} +% Another special character is a form feed causing an empty line by default. +% {\rstyle\ikeyname{formfeed}}|=\newpage| would result in a new page every +% form feed. Please note that such definitions (even the default) might get +% in conflict with frames. +% +% +% \paragraph{National characters} +% If you type in such characters directly as characters of codes 128--255 and +% use them also in listings, let the package know it---or you'll get really +% funny results. {\rstyle\ikeyname{extendedchars}}|=true| allows and +% |extendedchars=false| prohibits \packagename{listings} from handling +% extended characters in listings. If you use them, you should load +% \packagename{fontenc}, \packagename{inputenc} and/or +% any other package which defines the characters. +% \begin{advise} +% \item I have problems using \packagename{inputenc} together with +% \packagename{listings}. +% \advisespace +% This could be a compatibility problem. Make a bug report as described +% in section \lstref{uTroubleshooting}. +% \end{advise} +% The extended characters don't cover Arabic, Chinese, Hebrew, Japanese, and so +% on---specifically, any encoding which uses multiple bytes per character. +% +% Thus, if you use the a package that supports multibyte characters, such as +% the \packagename{CJK} or \packagename {ucs} packages for Chinese and +% UTF-8 characters, you must avoid letting \packagename{listings} +% process the extended characters. It is generally best to also specify +% |extendedchars=false| to avoid having \packagename{listings} get entangled +% in the other package's extended-character treatment. +% +% If you do have a listing contained within a CJK environment, and want to have +% CJK characters inside the listing, you can place them within a comment that +% escapes to \LaTeX -- see section \ref{rEscapingToLaTeX} for how to do that. +% (If the listing is not inside a CJK environment, you can simply put a small +% CJK environment within the escaped-to-\LaTeX portion of the comment.) +% +% Similarly, if you are using UTF-8 extended characters in a listing, they must +% be placed within an escape to \LaTeX. +% +% Also, section \ref{uNationalCharacters} has a few details on how to work with +% extended characters in the context of $\Lambda$. +% +% +% \subsection{Line numbers}\label{uLineNumbers} +% +% You already know the keys \ikeyname{numbers}, \ikeyname{numberstyle}, +% \ikeyname{stepnumber}, and \ikeyname{numbersep} from section +% \ref{gSeduceToUse}. Here now we deal with continued listings. +% You have two options to get consistent line numbering across listings. +% +% \begin{lstsample}[firstnumber]{\lstset{numbers=left,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} +% \begin{lstlisting}[firstnumber=100] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% \end{lstlisting} +% And we continue the listing: +% \begin{lstlisting}[firstnumber=last] +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% In the example, \ikeyname{firstnumber} is initially set to 100; some lines +% later the value is \texttt{last}, which continues the numbering of the last +% listing. Note that the empty line at the end of the first part is not printed +% here, but it counts for line numbering. You should also notice that you can +% write |\lstset{firstnumber=last}| once and get consecutively numbered code +% lines---except you specify something different for a particular listing. +% +% On the other hand you can use |firstnumber=auto| and name your listings. +% Listings with identical names (case sensitive!) share a line counter. +% \begin{lstsample}[name]{\lstset{numbers=left,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} +% \begin{lstlisting}[name=Test] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% +% \end{lstlisting} +% And we continue the listing: +% \begin{lstlisting}[name=Test] +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% The next |Test| listing goes on with line number {\makeatletter\lstno@Test}, +% no matter whether there are other listings in between. +% \begin{advise} +% \item Okay. And how can I get decreasing line numbers? +% \advisespace +% Sorry, what? +% \advisespace +% Decreasing line numbers as on page \pageref{rDecreasingLabels}. +% \advisespace +% May I suggest to demonstrate your individuality by other means? +% If you differ, you should try a negative `\ikeyname{stepnumber}' +% (together with `\ikeyname{firstnumber}'). +% \end{advise} +% +% Read section \ref{uHowTos} on how to reference line numbers. +% +% +% \subsection{Layout elements} +% +% It's always a good idea to structure the layout by vertical space, +% horizontal lines, or different type sizes and typefaces. The best to stress +% whole listings are---not all at once---colours, frames, vertical space, and +% captions. The latter are also good to refer to listings, of course. +% +% \paragraph{Vertical space} +% The keys {\rstyle\ikeyname{aboveskip}} and {\rstyle\ikeyname{belowskip}} +% control the vertical space above and below displayed listings. Both keys get +% a dimension or skip as value and are initialized to |\medskipamount|. +% +% \paragraph{Frames} +% The key \ikeyname{frame} takes the verbose values \keyvalue{none}, +% \keyvalue{leftline}, \keyvalue{topline}, \keyvalue{bottomline}, +% \keyvalue{lines} (top and bottom), \keyvalue{single} for single frames, or +% \keyvalue{shadowbox}. +% \begin{lstsample}[frame]{}{} +% \begin{lstlisting}[frame=single] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item The rules aren't aligned. +% \advisespace +% This could be a bug of this package or a problem with your +% \texttt{.dvi} driver. \emph{Before} sending a bug report to the package +% author, modify the parameters described in section \ref{rFrames} +% heavily. And do this step by step! +% For example, begin with `|framerule=10mm|'. If the rules are +% misaligned by the same (small) amount as before, the problem does not +% come from the rule width. So continue with the next parameter. Also, +% Adobe Acrobat sometimes has single-pixel rounding errors which can +% cause small misalignments at the corners when PDF files are displayed +% on screen; these are unfortunately normal. +% \end{advise} +% Alternatively you can control the rules at the \texttt{t}op, \texttt{r}ight, +% \texttt{b}ottom, and \texttt{l}eft directly by using the four initial letters +% for single rules and their upper case versions for double rules. +% \begin{lstsample}[frame]{}{} +% \begin{lstlisting}[frame=trBL] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% Note that a corner is drawn if and only if both adjacent rules are requested. +% You might think that the lines should be drawn up to the edge, but what's +% about round corners? The key \ikeyname{frameround} must get exactly four +% characters as value. The first character is attached to the upper right +% corner and it continues clockwise. `\texttt{t}' as character makes the +% corresponding corner round. +% \begin{lstsample}[frameround]{}{} +% \lstset{frameround=fttt} +% \begin{lstlisting}[frame=trBL] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% Note that \ikeyname{frameround} has been used together with |\lstset| and thus +% the value affects all following listings in the same group or environment. +% Since the listing is inside a \texttt{minipage} here, this is no problem. +% \begin{advise} +% \item Don't use frames all the time, and in particular not with short listings. +% This would emphasize nothing. Use frames for $10\%$ or even less of +% your listings, for your most important ones. +% \item If you use frames on floating listings, do you really want frames? +% \advisespace +% No, I want to separate floats from text. +% \advisespace +% Then it is better to redefine \LaTeX's `|\topfigrule|' and +% `|\botfigrule|'. For example, you could write +% `|\renewcommand*\topfigrule{\hrule\kern-0.4pt\relax}|' and make the +% same definition for |\botfigrule|. +% \end{advise} +% +% \paragraph{Captions} +% Now we come to \ikeyname{caption} and \ikeyname{label}. You might guess +% (correctly) that they can be used in the same manner as \LaTeX's |\caption| +% and |\label| commands, although here it is also possible to have a caption +% regardless of whether or not the listing is in a float: +% \begin{lstsample}[caption,label]{\lstset{xleftmargin=.05\linewidth}}{} +% \begin{lstlisting}[caption={Useless code},label=useless] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% Afterwards you could refer to the listing via |\ref{useless}|. By default +% such a listing gets an entry in the list of listings, which can be printed +% with the command {\rstyle\icmdname\lstlistoflistings}. The key +% {\rstyle\ikeyname{nolol}} suppresses an entry for both the environment or +% the input command. Moreover, you can specify a short caption for the list +% of listings: +% \keyname{caption}|={|\oarg{short}\meta{long}|}|. +% Note that the whole value is enclosed in braces since an optional value is +% used in an optional argument. +% +% If you don't want the label \texttt{\lstlistingname} plus number, you should +% use \ikeyname{title}: +% \begin{lstsample}[title]{\lstset{xleftmargin=.05\linewidth}}{} +% \begin{lstlisting}[title={`Caption' without label}] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item Something goes wrong with `\keyname{title}' in my document: in front of +% the title is a delimiter. +% \advisespace +% The result depends on the document class; some are not compatible. +% Contact the package author for a work-around. +% \end{advise} +% +% \paragraph{Colours} +% One more element. You need the \packagename{color} package and can then +% request coloured background via +% \ikeyname{backgroundcolor}|=|\meta{color command}. +% \begin{advise} +% \item Great! I love colours. +% \advisespace +% Fine, yes, really. And I like to remind you of the warning about +% striking styles on page \pageref{wStrikingStyles}. +% \end{advise} +%\ifcolor +% \begin{lstxsample}[backgroundcolor] +% \lstset{backgroundcolor=\color{yellow}} +% \end{lstxsample} +%\else +% \begin{verbatim} +% color package not installed\end{verbatim} +%\fi +% \begin{lstsample}{}{} +% \begin{lstlisting}[frame=single, +% framerule=0pt] +% for i:=maxint to 0 do +% begin +% j:=square(root(i)); +% end; +% \end{lstlisting} +% \end{lstsample} +% The example also shows how to get coloured space around the whole listing: +% use a frame whose rules have no width. +% +% +% \subsection{Emphasize identifiers}\label{uEmphasizeIdentifiers} +% +% Recall the pretty-printing commands and environment. |\lstinline| prints +% code snippets, |\lstinputlisting| whole files, and \texttt{lstlisting} +% pieces of code which reside in the \LaTeX\ file. And what are these +% different `types' of source code good for? Well, it just happens that a +% sentence contains a code fragment. Whole files are typically included in or +% as an appendix. Nevertheless some books about programming also include such +% listings in normal text sections---to increase the number of pages. +% Nowadays source code should be shipped on disk or CD-ROM and only the main +% header or interface files should be typeset for reference. So, please, don't +% misuse the \packagename{listings} package. But let's get back to the topic. +% +% Obviously `\texttt{lstlisting} source code' isn't used to make an executable +% program from. Such source code has some kind of educational purpose or even +% didactic. +% \begin{advise} +% \item What's the difference between educational and didactic? +% \advisespace +% Something educational can be good or bad, true or false. +% Didactic is true by definition.^^A :-) +% \end{advise} +% Usually \emph{keywords} are highlighted when the package typesets a piece of +% source code. This isn't necessary for readers who know the programming +% language well. The main matter is the presentation of interface, library or +% other functions or variables. If this is your concern, here come the right +% keys. Let's say, you want to emphasize the functions |square| and |root|, +% for example, by underlining them. Then you could do it like this: +% \begin{lstxsample}[emph,emphstyle] +% \lstset{emph={square,root},emphstyle=\underbar} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% j:=square(root(i)); +% end; +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item Note that the list of identifiers |{square,root}| is enclosed in +% braces. Otherwise the \packagename{keyval} package would complain +% about an undefined key \keyname{root} since the comma finishes the +% key=value pair. +% Note also that you \emph{must} put braces around the value if you +% use an optional argument of a key inside an optional argument of a +% pretty-printing command. Though it is not necessary, the following +% example uses these braces. They are typically forgotten when they +% become necessary, +% \end{advise} +% +% Both keys have an optional \meta{class number} argument for multiple +% identifier lists: +%\ifcolor +% \begin{lstxsample}[emph,emphstyle] +% \lstset{emph={square}, emphstyle=\color{red}, +% emph={[2]root,base},emphstyle={[2]\color{blue}}} +% \end{lstxsample} +%\else +% \begin{lstxsample}[emph,emphstyle] +% \lstset{emph={square}, emphstyle=\underbar, +% emph={[2]root,base},emphstyle={[2]\fbox}} +% \end{lstxsample} +%\fi +% \begin{lstsample}{}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% j:=square(root(i)); +% end; +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item What is the maximal \meta{class number}? +% \advisespace +% $2^{31}-1=2\,147\,483\,647$. But \TeX's memory will exceed before you +% can define so many different classes. +% \end{advise} +% +% One final hint: Keep the lists of identifiers disjoint. Never use a keyword +% in an `emphasize' list or one name in two different lists. Even if your +% source code is highlighted as expected, there is no guarantee that it is +% still the case if you change the order of your listings or if you use the +% next release of this package. +% +% +%\iffalse +% \subsection{*Listing alignment}\label{uListingAlignment} +% +% The examples are typeset with centered \texttt{minipage}s. That's the reason +% why you can't see that line numbers are printed in the margin. Now we +% separate the minipage margin and the minipage by a vertical rule: +% \begin{lstsample}{\lstset{frame=l,framesep=0pt,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} +% Some text before +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% The listing is lined up with the normal text. The parameter \ikeyname{xleftmargin} +% moves the listing to the right (or left if the dimension is negative). +% \begin{lstsample}{\lstset{frame=l,framesep=0pt,numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} +% Some text before +% \begin{lstlisting}[xleftmargin=15pt] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% +% \begin{lstlisting}{ } +% Write('Insensitive'); +% WritE('keywords.'); +% \end{lstlisting} +% \end{lstsample} +% Note again that optional arguments change settings for single listings. +% +% If you use environments like \texttt{itemize} or \texttt{enumerate}, there +% is `natural' indention coming from these environments. By default the +% \packagename{listings} package respects this. But you might use +% |resetmargins=true| (or |false|) to make your own decision. You can use it +% together with |xleftmargin|, of course. +% \begin{advise} +% \item I get heavy overfull |\hbox|es from some listings. +% \advisespace +% This comes from long lines in your listings. You have some options +% to get rid of the overful |\hbox|es. Firstly I recommend to typeset +% listings in smaller fonts than the surrounding text, for example +% `|basicstyle=\small|'. Secondly you might want to use the flexible +% column format. Thirdly you can increase the line width or set it +% explicitly, refer section \ref{rMarginsAndLineShape}. +% If all this doesn't help, you might want to change +% `\ikeyname{basewidth}', but be careful! The two unknown items are +% explained in the next section. +% \end{advise} +% +% You might need to control the vertical position of listings with the +% \ikeyname{boxpos} key, for example, if you use them in \texttt{minipage} or +% \texttt{tabular} environments. Here `listings' means \texttt{lstlisting} or +% |\lstinputlisting|. As the following example shows, you can even place such +% listings inside paragraphs, but you must force the package to do this by +% enclosing the listing in |\hbox{| and |}|. +% \begin{advise} +% \item Is it good form to use the \TeX-primitive `|\hbox|' in a \LaTeX\ +% document? +% \advisespace +% No, it's not. But \LaTeX's `|\mbox|' does not work in this example: +% \end{advise} +% \begin{lstsample}{}{} +% Here are some multi-line listings inside a paragraph. +% The `boxpos' key controls their vertical alignment: +% \hbox{\begin{lstlisting}[boxpos=c] +% center +% center +% \end{lstlisting}} +% \hbox{\begin{lstlisting}[boxpos=b] +% bottom baseline +% bottom baseline +% \end{lstlisting}} +% \hbox{\begin{lstlisting}[boxpos=t] +% top baseline +% top baseline +% \end{lstlisting}} +% \end{lstsample} +%\fi +% +% +% \subsection{Indexing}\label{uIndexing} +% +% Indexing is just like emphasizing identifiers---I mean the usage: +% \begin{lstxsample}[index] +% \lstset{index={square},index={[2]root}} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% j:=square(root(i)); +% end; +% \end{lstlisting} +% \end{lstsample} +% Of course, you can't see anything here. You will have to look at the index. +% \begin{advise} +% \item Why is the `\ikeyname{index}' key able to work with multiple identifier +% lists? +% \advisespace +% This question is strongly related to the `{\rstyle\ikeyname{indexstyle}}' +% key. Someone might want to create multiple indexes or want to insert +% prefixes like `|constants|', `|functions|', `|keywords|', and so on. +% The `\ikeyname{indexstyle}' key works like the other style keys except +% that the last token \emph{must} take an argument, namely the +% (printable form of the) current identifier. +% +% You can define `|\newcommand\indexkeywords[1]{\index{keywords, #1}}|' +% and make similar definitions for constant or function names. Then +% `|indexstyle=[1]\indexkeywords|' might meet your purpose. This becomes +% easier if you want to create multiple indexes with the +% \href{http://www.ctan.org/tex-archive/macros/latex/contrib/camel} +% {\packagename{index}} package. +% If you have defined appropriate new indexes, it is possible to write +% `|indexstyle=\index[keywords]|', for example. +% +% \item Let's say, I want to index all keywords. It would be annoying to +% type in all the keywords again, specifically if the used programming +% language changes frequently. +% \advisespace +% Just read ahead. +% \end{advise} +% The \ikeyname{index} key has in fact two optional arguments. The first is the +% well-known \meta{class number}, the second is a comma separated list of other +% keyword classes whose identifiers are indexed. The indexed identifiers then +% change automatically with the defined keywords---not automagically, it's not +% an illusion.^^A :-) +% +% Eventually you need to know the names of the keyword classes. It's usually +% the key name followed by a class number, for example, |emph2|, |emph3|, +% \ldots, |keywords2| or |index5|. But there is no number for the first order +% classes |keywords|, |emph|, |directives|, and so on. +% \begin{advise} +% \item `|index=[keywords]|' does not work. +% \advisespace +% The package can't guess which optional argument you mean. Hence you +% must specify both if you want to use the second one. You should try +% `|index=[1][keywords]|'. +% \end{advise} +% +% +% \subsection{Fixed and flexible columns}\label{uFixedAndFlexibleColumns} +% +% The first thing a reader notices---except different styles for keywords, +% etc.---is the column alignment. Arne John Glenstrup invented the flexible +% column format in 1997. Since then some efforts were made to develop this +% branch farther. Currently four column formats are provided: fixed, flexible, +% space-flexible, and full flexible. Take a close look at the following +% examples. +% \begin{center} +% \lstset{style={},language={}} +% \def\sample{\begin{lstlisting}^^J WOMEN\ \ are^^A +% ^^J \ \ \ \ \ \ \ MEN^^A +% ^^J WOMEN are^^A +% ^^J better MEN^^J \end{lstlisting}} +% \begin{tabular}{@{}c@{\qquad\quad}c@{\qquad\quad}c@{\qquad\quad}c@{}} +% {\rstyle\ikeyname{columns}}|=| & \texttt{fixed} & \texttt{flexible} & \texttt{fullflexible}\\ +% & (at {\makeatletter\lst@widthfixed}) +% & (at {\makeatletter\lst@widthflexible}) +% & (at {\makeatletter\lst@widthflexible})\\ +% \noalign{\medskip} +% \lstset{basicstyle=\ttfamily,basewidth=0.51em}\sample +% & \lstset{columns=fixed}\sample +% & \lstset{columns=flexible}\sample +% & \lstset{columns=fullflexible}\sample +% \end{tabular} +% \end{center} +% \begin{advise} +% \item Why are women better men? +% \advisespace +% Do you want to philosophize? Well, have I ever said that the +% statement ``women are better men'' is true? I can't even remember this +% about ``women are men'' \ldots . ^^A ;-) +% \end{advise} +% In the abstract one can say: The fixed column format ruins the spacing +% intended by the font designer, while the flexible formats ruin the column +% alignment (possibly) intended by the programmer. Common to all is that the +% input characters are translated into a sequence of basic output units like +% \begingroup \lstset{gobble=6,xleftmargin=\leftmargini} +% \makeatletter +%^^A Make \fbox around each output unit. +% \fboxsep=0pt +% \def\lst@alloverstyle#1{\fbox{\kern-\fboxrule\strut#1}\kern-\fboxrule} +% \begin{lstlisting}[basewidth=1em] +% if x=y then write('align') +% else print('align'); +% \end{lstlisting} +% Now, the fixed format puts $n$ characters into a box of width $n\times{} +% $`base width', where the base width is {\makeatletter\lst@widthfixed} in the +% example. The format shrinks and stretches the space between the characters +% to make them fit the box. As shown in the example, some character strings look +% \hbox to 2em{b\hss a\hss d} +% or +% \hbox to 2em{w\hss o\hss r\hss s\hss e}, +% but the output is vertically aligned. +% \endgroup +% +% If you don't need or like this, you should use a flexible format. All +% characters are typeset at their natural width. In particular, they never +% overlap. If a word requires more space than reserved, the rest of the line +% simply moves to the right. The difference between the three formats is that +% the full flexible format cares about nothing else, while the normal flexible +% and space-flexible formats try to fix the column alignment if a character +% string needs less space than `reserved'. The normal flexible format will +% insert make-up space to fix the alignment at spaces, before and after +% identifiers, and before and after sequences of other characters; the +% space-flexible format will only insert make-up space by stretching +% existing spaces. In the flexible example above, the two MENs are vertically +% aligned since some space has been inserted in the fourth line to fix the +% alignment. In the full flexible format, the two MENs are not aligned. +% +% Note that both flexible modes printed the two blanks in the first line as a +% single blank, but for different reasons: the normal flexible format fixes +% the column alignment (as would the space-flexible format), and the full +% flexible format doesn't care about the second space. +% +% +% \section{Advanced techniques}\label{uAdvancedTechniques} +% +% +% \subsection{Style definitions} +% +% It is obvious that a pretty-printing tool like this requires some kind of +% language selection and definition. The first has already been described and +% the latter is convered by the next section. However, it is very convenient +% to have the same for printing styles: at a central place of your document +% they can be modified easily and the changes take effect on all listings. +% +% Similar to languages, +% {\rstyle\ikeyname{style}}|=|\meta{style name} +% activates a previously defined style. A definition is as easy: +% {\rstyle|\lstdefinestyle|}\marg{style name}\marg{key=value list}. +% Keys not used in such a definition are untouched by the corresponding style +% selection, of course. For example, you could write +% \begin{verbatim} +% \lstdefinestyle{numbers} +% {numbers=left, stepnumber=1, numberstyle=\tiny, numbersep=10pt} +% \lstdefinestyle{nonumbers} +% {numbers=none}\end{verbatim} +% and switch from listings with line numbers to listings without ones and vice +% versa simply by |style=nonumbers| and |style=numbers|, respectively. +% \begin{advise} +% \item You could even write +% `|\lstdefinestyle{C++}{language=C++,style=numbers}|'. +% Style and language names are independent of each other and so might +% coincide. Moreover it is possible to activate other styles. +% +% \item It's easy to crash the package using styles. Write +% '|\lstdefinestyle{crash}{style=crash}|' and '|\lstset{style=crash}|'. +% \TeX's capacity will exceed, sorry [parameter stack size]. Only bad +% boys use such recursive calls, but only good girls use this package. +% Thus the problem is of minor interest.^^A :-) +% \end{advise} +% +% +% \subsection{Language definitions}\label{uLanguageDefinitions} +% +% These are like style definitions except for an optional dialect name and an +% optional base language---and, of course, a different command name and +% specialized keys. In the simple case it's +% {\rstyle|\lstdefinelanguage|}\marg{language name}\marg{key=value list}. +% For many programming languages it is sufficient to specify keywords and +% standard function names, comments, and strings. Let's look at an example. +% \begin{lstxsample}[morekeywords,sensitive,morecomment,morestring] +% \lstdefinelanguage{rock} +% {morekeywords={one,two,three,four,five,six,seven,eight, +% nine,ten,eleven,twelve,o,clock,rock,around,the,tonight}, +% sensitive=false, +% morecomment=[l]{//}, +% morecomment=[s]{/*}{*/}, +% morestring=[b]", +% } +% \end{lstxsample} +% \begingroup \csname lst@EndWriteFile\endcsname +% \bigbreak +% +% \noindent +% There isn't much to say about keywords. They are defined like identifiers +% you want to emphasize. Additionally you need to specify whether they are +% case sensitive or not. And yes: you could insert |[2]| in front of the +% keyword \texttt{one} to define the keywords as `second order' and print them +% in |keywordstyle={[2]...}|. +% \begin{advise} +% \item I get a `\texttt{Missing = inserted for }|\ifnum|' error when I select +% my language. +% \advisespace +% Did you forget the comma after `|keywords={...}|'? And if you encounter +% unexpected characters after selecting a language (or style), you have +% probably forgotten a different comma or you have given to many +% arguments to a key, for example, |morecomment=[l]{--}{!}|. +% \end{advise} +% +% So let's turn to comments and strings. Each value starts with a +% \emph{mandatory} \oarg{type} argument followed by a changing number of +% opening and closing delimiters. Note that each delimiter (pair) requires a +% key=value on its own, even if types are equal. Hence, you'll need to insert +% \texttt{morestring=[b]'} if single quotes open and close string or character +% literals in the same way as double quotes do in the example. +% +% Eventually you need to know the types and their numbers of delimiters. The +% reference guide contains full lists, here we discuss only the most common. +% For strings these are {\rstyle\texttt{b}} and {\rstyle\texttt{d}} with one +% delimiter each. This delimiter opens and closes the string and inside a +% string it is either escaped by a \texttt backslash or it is \texttt doubled. +% The comment type {\rstyle\texttt{l}} requires exactly one delimiter, which +% starts a comment on any column. This comment goes up to the end of line. +% The other two most common comment types are {\rstyle\texttt{s}} and +% {\rstyle\texttt{n}} with two delimiters each. The first delimiter opens a +% comment which is terminated by the second delimiter. In contrast to the +% \texttt s-type, \texttt n-type comments can be nested. +% \begin{lstxsample}[b,d,l,s,n] +% \lstset{morecomment=[l]{//}, +% morecomment=[s]{/*}{*/}, +% morecomment=[n]{(*}{*)}, +% morestring=[b]", +% morestring=[d]'} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% "str\"ing " not a string +% 'str''ing ' not a string +% // comment line +% /* comment/**/ not a comment +% (* nested (**) still comment +% comment *) not a comment +% \end{lstlisting} +% \end{lstsample} +% \begin{advise} +% \item Is it \emph{that} easy? +% \advisespace +% Almost. There are some troubles you can run into. For example, if +% `\texttt{-*}' starts a comment line and `\texttt{-*-}' a string +% (unlikely but possible), then you must define the shorter delimiter +% first. +% Another problem: by default some characters are not allowed inside +% keywords, for example `\texttt{-}', `\texttt{:}', `\texttt{.}', and +% so on. The reference guide covers this problem by introducing some +% more keys, which let you adjust the standard character table +% appropriately. But note that white space characters are prohibited +% inside keywords. +% \end{advise} +% Finally remember that this section is only an introduction to language +% definitions. There are more keys and possibilities. +% +% +% \subsection{Delimiters}\label{uDelimiters} +% +% You already know two special delimiter classes: comments and strings. +% However, their full syntax hasn't been described so far. For example, +% \ikeyname{commentstyle} applies to all comments---unless you specify +% something different. The \emph{optional} \oarg{style} argument follows the +% \emph{mandatory} \oarg{type} argument. +%\ifcolor +% \begin{lstxsample} +% \lstset{morecomment=[l][keywordstyle]{//}, +% morecomment=[s][\color{white}]{/*}{*/}} +% \end{lstxsample} +%\else +% \begin{lstxsample} +% \lstset{morecomment=[l][keywordstyle]{//}, +% morecomment=[s][\underbar]{/*}{*/}} +% \end{lstxsample} +%\fi +% \begin{lstsample}{}{} +% \begin{lstlisting} +% // bold comment line +% a single /* comment */ +% \end{lstlisting} +% \end{lstsample} +% As you can see, you have the choice between specifying the style explicitly +% by \LaTeX\ commands or implicitly by other style keys. But, you're right, +% some implicitly defined styles have no seperate keys, for example the second +% order keyword style. Here---and never with the number 1---you just append +% the order to the base key: \texttt{keywordstyle2}. +% +% You ask for an application? Here you are: one can define different printing +% styles for `subtypes' of a comment, for example +%\ifcolor +% \begin{lstxsample} +% \lstset{morecomment=[s][\color{blue}]{/*+}{*/}, +% morecomment=[s][\color{red}]{/*-}{*/}} +% \end{lstxsample} +%\else +% \begin{lstxsample} +% \lstset{morecomment=[s][\upshape]{/*+}{*/}, +% morecomment=[s][\bfseries]{/*-}{*/}} +% \end{lstxsample} +%\fi +% \begin{lstsample}{\lstset{morecomment=[s]{/*}{*/}}}{} +% \begin{lstlisting} +% /* normal comment */ +% /*+ keep cool */ +% /*- danger! */ +% \end{lstlisting} +% \end{lstsample} +% Here, the comment style is not applied to the second and third line. +% \begin{advise} +% \item Please remember that both `extra' comments must be defined \emph{after} +% the normal comment, since the delimiter `\texttt{/*}' is a substring of +% `\texttt{/*+}' and `\texttt{/*-}'. +% +% \item I have another question. Is `\texttt{language=}\meta{different +% language}' the only way to remove such additional delimiters? +% \advisespace +% Call {\rstyle\ikeyname{deletecomment}} and/or +% {\rstyle\ikeyname{deletestring}} with the same arguments to remove +% the delimiters (but you don't need to provide the optional style +% argument). +% \end{advise} +% Eventually, you might want to use the prefix \texttt{i} on any comment type. +% Then the comment is not only invisible, it is completely discarded from the +% output! +% \begin{lstxsample}[is] +% \lstset{morecomment=[is]{/*}{*/}} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% begin /* comment */ end +% begin/* comment */end +% \end{lstlisting} +% \end{lstsample} +% +% Okay, and now for the real challenges. More general delimiters can be defined +% by the key {\rstyle\ikeyname{moredelim}}. Legal types are {\rstyle\texttt{l}} +% and {\rstyle\texttt{s}}. These types can be preceded by an \texttt{i}, but +% this time \emph{only the delimiters} are discarded from the output. This way +% you can select styles by markers. +% \begin{lstxsample} +% \lstset{moredelim=[is][\ttfamily]{|}{|}} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% roman |typewriter| +% \end{lstlisting} +% \end{lstsample} +% You can even let the package detect keywords, comments, strings, and other +% delimiters inside the contents. +% \begin{lstxsample} +% \lstset{moredelim=*[s][\itshape]{/*}{*/}} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% /* begin +% (* comment *) +% ' string ' */ +% \end{lstlisting} +% \end{lstsample} +% Moreover, you can force the styles to be applied cumulatively. +% \begin{lstxsample} +% \lstset{moredelim=**[is][\ttfamily]{|}{|}, % cumulative +% moredelim=*[s][\itshape]{/*}{*/}} % not so +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting} +% /* begin +% ' string ' +% |typewriter| */ +% +% | begin +% ' string ' +% /*typewriter*/ | +% \end{lstlisting} +% \end{lstsample} +% Look carefully at the output and note the differences. The second +% \texttt{begin} is not printed in bold typewriter type since standard +% \LaTeX\ has no such font. +% +% This suffices for an introduction. Now go and find some more applications. +% +% +% \subsection{Closing and credits}\label{uClosingAndCredits} +% +% You've seen a lot of keys but you are far away from knowing all of them. +% The next step is the real use of the \packagename{listings} package. +% Please take the following advice. Firstly, look up the known commands and +% keys in the reference guide to get a notion of the notation there. Secondly, +% poke around with these keys to learn some other parameters. Then, hopefully, +% you'll be prepared if you encounter any problems or need some special things. +% +% \begin{advise} +% \item +% There is one question `you' haven't asked all the last pages: who is to +% blame. Carsten Heinz wrote the guides, coded the \packagename{listings} +% package and wrote some language drivers. Brooks Moses currently maintains +% the package. Other people defined more languages +% or contributed their ideas; many others made bug reports, but only the first +% bug finder is listed. +%^^A +%^^A Thanks for error reports (first bug finder only), new programming +%^^A languages, etc. +%^^A Special thanks for communication which lead to kernel extensions, and to +%^^A Hendri Adriaens for reviving maintenance on the package. +%^^A +% Special thanks go to (alphabetical order) +% \begin{quote} +% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth +% \lstthanks{Hendri~Adriaens}{-}, +% \lstthanks{Andreas~Bartelt}{Andreas.Bartelt@Informatik.Uni-Oldenburg.DE}, +% \lstthanks{Jan~Braun}{Jan.Braun@tu-bs.de}, +% \lstthanks{Denis~Girou}{Denis.Girou@idris.fr}, +% \lstthanks{Arne~John~Glenstrup}{panic@diku.dk}, +% \lstthanks{Frank~Mittelbach}{frank.mittelbach@latex-project.org}, +% \lstthanks{Rolf~Niepraschk}{niepraschk@PTB.DE}, +% \lstthanks{Rui~Oliveira}{rco@di.uminho.pt}, +% \lstthanks{Jens~Schwarzer}{schwarzer@schwarzer.dk}, and +% \lstthanks{Boris~Veytsman}{boris@plmsc.psu.edu}. +% \end{quote} +% Moreover we wish to thank +% \begin{quote} +% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth +% \lstthanks{Bj{\o}rn~{\AA}dlandsvik}{bjorn@imr.no}, +% \lstthanks{Omair-Inam~Abdul-Matin}{-}, +% \lstthanks{Gaurav~Aggarwal}{gaurav@ics.uci.edu}, +% \lstthanks{Jason~Alexander}{jalex@ea.oac.uci.edu}, +% \lstthanks{Andrei~Alexandrescu}{-}, +% \lstthanks{Holger~Arndt}{-}, +% \lstthanks{Donald~Arseneau}{ASND@erich.triumf.ca}, +% \lstthanks{David~Aspinall}{David.Aspinall@ed.ac.uk}, +% \lstthanks{Frank~Atanassow}{-}, +% \lstthanks{Claus~Atzenbeck}{Claus.Atzenbeck@stud.uni-regensburg.de}, +% \lstthanks{Michael~Bachmann}{-}, +% \lstthanks{Luca~Balzerani}{-}, +% \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de} (big thankyou), ^^A beta tester +% \lstthanks{Heiko~Bauke}{-}, +% \lstthanks{Oliver~Baum}{oli.baum@web.de}, +% \lstthanks{Ralph~Becket}{rbeck@microsoft.com}, +% \lstthanks{Andres~Becerra~Sandoval}{abecerra@univalle.edu.co}, +% \lstthanks{Kai~Below}{below@tu-harburg.de}, +% \lstthanks{Matthias~Bethke}{-}, +% \lstthanks{Javier~Bezos}{javier.bezos@bancoval.es}, +% \lstthanks{Olaf~Trygve~Berglihn}{olafb@pvv.org}, ^^A {1999/11/29}{3-char comment delimiter don't work (Python)} +% \lstthanks{Geraint~Paul~Bevan}{geraint@users.sf.net}, +% \lstthanks{Peter~Biechele}{peter.biechele@physik.uni-freiburg.de}, +% \lstthanks{Beat~Birkhofer}{beat@birkhofer.ch}, +% \lstthanks{Fr\'ed\'eric~Boulanger}{Frederic.Boulanger@supelec.fr}, +% \lstthanks{Joachim~Breitner}{-}, +% \lstthanks{Martin~Brodbeck}{Martin.Brodbeck@gmx.de}, +% \lstthanks{Walter~E.~Brown}{WB@fnal.gov}, +% \lstthanks{Achim~D.~Brucker}{brucker@informatik.uni-freiburg.de}, +% \lstthanks{J\'an Bu\v{s}a}{-}, +% \lstthanks{Thomas~ten~Cate}{-}, +% \lstthanks{David~Carlisle}{davidc@nag.co.uk}, +% \lstthanks{Bradford~Chamberlain}{brad@cs.washington.edu}, +% \lstthanks{Brian~Christensen}{-}, +% \lstthanks{Neil~Conway}{-}, +% \lstthanks{Patrick~Cousot}{Patrick.Cousot@wanadoo.fr}, +% \lstthanks{Xavier~Cr\'egut}{cregut@enseeiht.fr}, +% \lstthanks{Christopher~Creutzig}{-}, +% \lstthanks{Holger~Danielsson}{dani@fbg.schwerte.de}, +% \lstthanks{Andreas~Deininger}{deininger@uni-kassel.de}, +% \lstthanks{Robert~Denham}{Robert.Denham@dnr.qld.gov.au}, +% \lstthanks{Detlev~Dr\"oge}{droege@informatik.uni-koblenz.de}, +% \lstthanks{Anders~Edenbrandt}{Anders.Edenbrandt@dna.lth.se}, +% \lstthanks{Mark~van~Eijk}{mark@luon.net}, +% \lstthanks{Norbert~Eisinger}{Norbert.Eisinger@informatik.uni-muenchen.de}, +% \lstthanks{Brian~Elmegaard}{-}, +% \lstthanks{Jon~Ericson}{Jon.Ericson@jpl.nasa.gov}, +% \lstthanks{Thomas~Esser}{te@dbs.uni-hannover.de}, +% \lstthanks{Chris~Edwards}{edwch00p@infoscience.otago.ac.nz}, +% \lstthanks{David~John~Evans}{Matrix.Software@dial.pipex.com}, +% \lstthanks{Tanguy~Fautr\'e}{tfautre@pandora.be}, +% \lstthanks{Ulrike~Fischer}{-}, +% \lstthanks{Robert~Frank}{rf7@ukc.ac.uk}, +% \lstthanks{Michael~Franke}{-}, +% \lstthanks{Ignacio~Fern\'andez~Galv\'an}{-}, +% \lstthanks{Martine~Gautier}{-} +% \lstthanks{Daniel~Gazard}{gazard_d@epita.fr}, +% \lstthanks{Daniel~Gerigk}{Daniel.Gerigk@ePost.de}, +% \lstthanks{Dr.~Christoph~Giess}{-}, +% \lstthanks{KP~Gores}{kp.gores@web.de}, +% \lstthanks{Adam~Grabowski}{adam@mizar.org}, +% \lstthanks{Jean-Philippe~Grivet}{grivet@cnrs-orleans.fr}, +% \lstthanks{Christian~Gudrian}{Christian.Gudrian@kawo1.rwth-aachen.de}, +% \lstthanks{Jonathan~de~Halleux}{dehalleux@auto.ucl.ac.be}, +% \lstthanks{Carsten~Hamm}{carsten.hamm@siemens.com}, +% \lstthanks{Martina~Hansel}{Martina.Hansel@fhtw-berlin.de}, +% \lstthanks{Harald~Harders}{h.harders@tu-bs.de}, +% \lstthanks{Christian~Haul}{haul@dvs1.informatik.tu-darmstadt.de}, +% \lstthanks{Aidan~Philip~Heerdegen}{Aidan.Heerdegen@anu.edu.au}, +% \lstthanks{Jim~Hefferon}{Hefferon9@aol.com}, +% \lstthanks{Heiko~Heil}{info@heiko-heil.de}, +% \lstthanks{J\"urgen~Heim}{heim@astro.uni-tuebingen.de}, +% \lstthanks{Martin~Heller}{-}, +% \lstthanks{Stephan~Hennig}{-}, +% \lstthanks{Alvaro~Herrera}{alvherre@dcc.uchile.cl}, +% \lstthanks{Richard~Hoefter}{hoefter@gmx.de}, +% \lstthanks{Dr.~Jobst~Hoffmann}{HOFFMANN@rz.rwth-aachen.de}, +% \lstthanks{Torben~Hoffmann}{toho@it.dtu.dk}, +% \lstthanks{Morten~H\o gholm}{-}, +% \lstthanks{Berthold~H\"ollmann}{bhoel@starship.python.net}, +% \lstthanks{G\'erard~Huet}{-}, +% \lstthanks{Hermann~H\"uttler}{hermann.huettler@gmx.net}, +% \lstthanks{Ralf~Imh\"auser}{snoopy@tribal.line.org}, +% \lstthanks{R.~Isernhagen}{R.Isernhagen@FH-Wolfenbuettel.DE}, +% \lstthanks{Oldrich~Jedlicka}{ojedlick@students.zcu.cz}, +% \lstthanks{Dirk~Jesko}{jesko@iti.cs.uni-magdeburg.de}, +% \lstthanks{Lo\"\i c~Joly}{-}, +% \lstthanks{Christian~Kaiser}{chk@combit.net}, +% \lstthanks{Bekir~Karaoglu}{karabekirus@yahoo.com}, +% \lstthanks{Marcin~Kasperski}{Marcin.Kasperski@softax.com.pl}, +% \lstthanks{Christian~Kindinger}{chkind@uni-wuppertal.de}, +% \lstthanks{Steffen~Klupsch}{steffen@vlsi.informatik.tu-darmstadt.de}, +% \lstthanks{Markus~Kohm}{-}, +% \lstthanks{Peter~K\"oller}{pkoeller@metaprojekt.de} (big thankyou), ^^A beta tester +% \lstthanks{Reinhard~Kotucha}{Reinhard.Kotucha@web.de}, +% \lstthanks{Stefan~Lagotzki}{info@lagotzki.de}, +% \lstthanks{Tino~Langer}{langer@tournex.de}, +% \lstthanks{Rene~H.~Larsen}{rhl@traceroute.dk}, +% \lstthanks{Olivier~Lecarme}{ol@i3s.unice.fr}, +% \lstthanks{Thomas~Leduc}{Thomas.Leduc@lsv.ens-cachan.fr}, +% \lstthanks{Dr.~Peter~Leibner}{Peter.Leibner@sta.siemens.de}, +% \lstthanks{Thomas~Leonhardt}{leonhardt@informatik.tu-darmstadt.de} (big thankyou), ^^A beta tester +% \lstthanks{Magnus~Lewis-Smith}{Magnus.Lewis-Smith@pace.co.uk}, +% \lstthanks{Knut~Lickert}{knut.lickert@gmx.de}, +% \lstthanks{Benjamin~Lings}{-}, +% \lstthanks{Dan~Luecking}{luecking@uark.edu}, +% \lstthanks{Peter~L\"offler}{-}, +% \lstthanks{Markus~Luisser}{-}, +% \lstthanks{Kris~Luyten}{no email available}, +% \lstthanks{Jos\'e~Romildo~Malaquias}{romildo@urano.iceb.ufop.br}, +% \lstthanks{Andreas~Matthias}{amat@kabsi.at}, +% \lstthanks{Patrick~TJ~McPhee}{ptjm@interlog.com}, +% ^^A \lstthanks{Brooks~Moses}{-}, +% \lstthanks{Riccardo~Murri}{riccardo.murri@gmx.it}, +% \lstthanks{Knut~M\"uller}{knut@physik3.gwdg.de}, +% \lstthanks{Svend~Tollak~Munkejord}{svendm@efisms.energy.sintef.no}, +% \lstthanks{Gerd~Neugebauer}{gerd.neugebauer@gmx.de}, +% \lstthanks{Torsten~Neuer}{tneuer@inwise.de}, +% \lstthanks{Enzo~Nicosia}{-}, +% \lstthanks{Michael~Niedermair}{m.g.n@gmx.de}, +% \lstthanks{Xavier~Noria}{fxn@hashref.com}, +% \lstthanks{Heiko~Oberdiek}{oberdiek@ruf.uni-freiburg.de}, +% \lstthanks{Xavier~Olive}{-}, +% \lstthanks{Alessio~Pace}{-}, +% \lstthanks{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}, +% \lstthanks{Morten~H.~Pedersen}{mhp@dadlnet.dk}, +% \lstthanks{Xiaobo~Peng}{-}, +% \lstthanks{Zvezdan~V.~Petkovic}{zpetkovic@acm.org}, +% \lstthanks{Michael~Piefel}{piefel@informatik.hu-berlin.de}, +% \lstthanks{Michael~Piotrowski}{mxp@linguistik.uni-erlangen.de}, +% \lstthanks{Manfred~Piringer}{sz0490@rrze.uni-erlangen.de}, +% \lstthanks{Vincent~Poirriez}{Vincent.Poirriez@univ-valenciennes.fr}, +% \lstthanks{Adam~Prugel-Bennett}{apb@ecs.soton.ac.uk}, +% \lstthanks{Ralf~Quast}{rquast@hs.uni-hamburg.de}, +% \lstthanks{Aslak~Raanes}{araanes@ifi.ntnu.no}, +% \lstthanks{Venkatesh~Prasad~Ranganath}{vranganath@cox.net}, +% \lstthanks{Tobias~Rapp}{-}, +% \lstthanks{Jeffrey~Ratcliffe}{-}, +% \lstthanks{Georg~Rehm}{Georg.Rehm@germanistik.uni-giessen.de}, +% \lstthanks{Fermin~Reig}{reig@ics.uci.edu}, +% \lstthanks{Detlef~Reimers}{dreimers@aol.com}, +% \lstthanks{Stephen~Reindl}{stephen.reindl@vodafone.com}, +% \lstthanks{Franz~Rinnerthaler}{-}, +% \lstthanks{Peter~Ruckdeschel}{Peter.Ruckdeschel@uni-bayreuth.de}, +% \lstthanks{Magne~Rudshaug}{magne@ife.no}, +% \lstthanks{Jonathan~Sauer}{jonathan.sauer@gmx.de}, +% \lstthanks{Vespe~Savikko}{vespe@cs.tut.fi}, +% \lstthanks{Mark~Schade}{-}, +% \lstthanks{Gunther~Schmidl}{gschmidl@gmx.at}, +% \lstthanks{Andreas~Schmidt}{-}, +% \lstthanks{Walter~Schmidt}{wschmi@arcor.de}, +% \lstthanks{Christian~Schneider}{-}, +% \lstthanks{Jochen~Schneider}{jschneider@ds3.etech.haw-hamburg.de}, +% \lstthanks{Benjamin~Schubert}{benjamin.schubert@berlin.de}, +% \lstthanks{Sebastian~Schubert}{-}, +% \lstthanks{Uwe~Siart}{uwe.siart@ei.tum.de}, +% \lstthanks{Axel~Sommerfeldt}{axel@sommerfeldt.net}, +% \lstthanks{Richard~Stallman}{-}, +% \lstthanks{Nigel~Stanger}{nstanger@infoscience.otago.ac.nz}, +% \lstthanks{Martin~Steffen}{ms@informatik.uni-kiel.de}, +% \lstthanks{Andreas~Stephan}{Andreas.Stephan@victoria.de}, +% \lstthanks{Stefan~Stoll}{stoll@phys.chem.ethz.ch}, +% \lstthanks{Enrico~Straube}{no email available}, +% \lstthanks{Werner~Struckmann}{struck@ips.cs.tu-bs.de}, +% \lstthanks{Martin~S\"u\ss kraut}{Edon.Myder@web.de}, +% \lstthanks{Gabriel~Tauro}{gabriel@informatik.uni-jena.de}, +% \lstthanks{Winfried~Theis}{theis@statistik.uni-dortmund.de}, +% \lstthanks{Jens~T.~Berger~Thielemann}{jensthi@ifi.uio.no}, +% \lstthanks{William~Thimbleby}{-}, +% \lstthanks{Arnaud~Tisserand}{arnaud.tisserand@ens-lyon.fr}, +% \lstthanks{Jens~Troeger}{-}, +% \lstthanks{Kalle~Tuulos}{kalle.tuulos@nic.fi}, +% \lstthanks{Gregory~Van~Vooren}{Gregory.VanVooren@rug.ac.be}, +% \lstthanks{Timothy~Van~Zandt}{tvz@econ.insead.edu}, +% \lstthanks{J\"org~Viermann}{-}, +% \lstthanks{Thorsten~Vitt}{vitt@informatik.hu-berlin.de}, +% \lstthanks{Herbert~Voss}{voss@perce.de} (big thankyou), ^^A beta tester +% \lstthanks{Edsko~de~Vries}{devriese@tcd.ie}, +% \lstthanks{Herfried~Karl~Wagner}{hirf@gmx.at}, +% \lstthanks{Dominique~de~Waleffe}{ddw@miscrit.be}, +% \lstthanks{Bernhard~Walle}{-}, +% \lstthanks{Jared~Warren}{warren@cs.queensu.ca}, +% \lstthanks{Michael~Weber}{mweber@informatik.hu-berlin.de}, +% \lstthanks{Sonja~Weidmann}{Sonja.Weidmann@gmx.de}, +% \lstthanks{Andreas~Weidner}{-}, +% \lstthanks{Herbert~Weinhandl}{weinhand@grz08u.unileoben.ac.at}, +% \lstthanks{Robert~Wenner}{robert.wenner@gmx.de}, +% \lstthanks{Michael~Wiese}{wiese@itwm.uni-kl.de}, +% \lstthanks{James~Willans}{-}, +% \lstthanks{J\"orn~Wilms}{wilms@rocinante.colorado.edu}, +% \lstthanks{Kai~Wollenweber}{kai@ece.WPI.EDU}, +% \lstthanks{Ulrich~G.~Wortmann}{uliw@erdw.ethz.ch}, +% \lstthanks{Cameron~H.G.~Wright}{-}, +% \lstthanks{Andrew~Zabolotny}{-}, and +% \lstthanks{Florian~Z\"ahringer}{-}. +% \end{quote} +% There are probably other people who contributed to this package. +% If I've missed your name, send an email. +% \end{advise} +% +% +% \part{Reference guide} +% +% +% \section{Main reference}\label{rMainReference} +% +% Your first training is completed. Now that you've left the User's guide, the +% friend telling you what to do has gone. Get more practice and become a +% journeyman!^^A :-) +% \begin{advise} +% \item Actually, the friend hasn't gone. There are still some advices, but +% only from time to time. +% \end{advise} +% +% +% \subsection{How to read the reference} +% +% Commands, keys and environments are presented as follows. +% \begin{syntax} +% \item[1.0,default,hints] \texttt{command}, \texttt{environment} or +% \keyname{key} with \meta{parameters} +% +% This field contains the explanation; here we describe the other fields. +% +% If present, the label in the left margin provides extra information: +% `\textit{addon}' indicates additionally introduced functionality, +% `\textit{changed}' a modified key, `\textit{data}' a command just +% containing data (which is therefore adjustable via |\renewcommand|), +% and so on. Some keys and functionality are `\emph{bug}'-marked or +% with a \dag-sign. These features might change in future or could be +% removed, so use them with care. +% +% If there is verbatim text touching the right margin, it is the +% predefined value. Note that some keys default to this value every +% listing, namely the keys which can be used on individual listings only. +% \end{syntax} +% Regarding the parameters, please keep in mind the following: +% \begin{enumerate} +% \item A list always means a comma separated list. You must put braces around +% such a list. Otherwise you'll get in trouble with the +% \packagename{keyval} package; it complains about an undefined key. +% \item You must put parameter braces around the whole value of a key if you +% use an \oarg{optional argument} of a key inside an optional +% \oarg{key=value list}: +% |\begin{lstlisting}[caption=|{\rstyle|{|}|[one]two|{\rstyle|}|}|]|. +% \item Brackets `|[ ]|' usually enclose optional arguments and must be typed +% in verbatim. Normal brackets `[ ]' always indicate an optional argument +% and must not be typed in. Thus |[*]| must be typed in exactly as is, +% but [|*|] just gets |*| if you use this argument. +% \item A vertical rule indicates an alternative, e.g.~^^A +% \meta{\alternative{true,false}} allows either \texttt{true} or +% \texttt{false} as arguments. +% \item If you want to enter one of the special characters |{}#%\|, this +% character must be escaped with a backslash. This means that you must +% write |\}| for the single character `right brace'---but of course not +% for the closing paramater character. +% \end{enumerate} +% +% +% \subsection{Typesetting listings}\label{rTypesettingListings} +% +% \begin{syntax} +% \item[0.19] \rcmdname\lstset\marg{key=value list} +% +% sets the values of the specified keys, see also section +% \ref{uTheKey=ValueInterface}. +% The parameters keep their values up to the end of the current group. +% In contrast, all optional \meta{key=value list}s below modify the +% parameters for single listings only. +% +% \item[0.18] \rcmdname\lstinline\oarg{key=value list}\meta{character}\meta{source code}\meta{same character} +% +% works like |\verb| but respects the active language and style. These +% listings use flexible columns unless requested differently in the +% optional argument, and do not support frames or background colors. +% You can write `|\lstinline!var i:integer;!|' and get +% `\lstinline!var i:integer;!'. +% +% Since the command first looks ahead for an optional argument, you must +% provide at least an empty one if you want to use |[| as +% \meta{character}. +% +% \dag\ An experimental implementation has been done to support the +% syntax |\lstinline|\oarg{key=value list}\marg{source code}. Try it if +% you want and report success and failure. A known limitation is that +% inside another argument the last source code token must not be an +% explicit space token---and, of course, using a listing inside another +% argument is itself experimental, see section \ref{rListingsInsideArguments}. +% +% See also section \ref{rShortInline} for commands to create short analogs +% for the |\lstinline| command. +% +% \item[0.15] |\begin{|\texttt{\rstyle lstlisting}|}|\oarg{key=value list} +% +% \leavevmode\hspace*{-\leftmargini}|\end{|\texttt{\rstyle lstlisting}|}| +% +% typesets the code in between as a displayed listing. +% +% In contrast to the environment of the \packagename{verbatim} package, +% \LaTeX\ code on the same line and after the end of environment is +% typeset respectively executed. +% +% \item[0.1] \rcmdname\lstinputlisting\oarg{key=value list}\marg{file name} +% +% typesets the stand alone source code file as a displayed listing. +% \end{syntax} +% +% +% \subsection{Space and placement} +% +% \begin{syntax} +% \item[0.20,floatplacement] \rkeyname{float}|=|[|*|]\meta{subset of \textup{\texttt{tbph}}}\syntaxor\rkeyname{float} +% +% makes sense on individual displayed listings only and lets them float. +% The argument controls where \LaTeX\ is \emph{allowed} to put the float: +% at the top or bottom of the current/next page, on a separate page, or +% here where the listing is. +% +% The optional star can be used to get a double-column float in a +% two-column document. +% +% \item[0.21,tbp] \rkeyname{floatplacement}|=|\meta{place specifiers} +% +% is used as place specifier if \keyname{float} is used without value. +% +% \item[0.21,\medskipamount] \rkeyname{aboveskip}|=|\meta{dimension} +% \item[0.21,\medskipamount] \rkeyname{belowskip}|=|\meta{dimension} +% +% define the space above and below displayed listings. +% +% \item[0.17,0pt,\dag] \rkeyname{lineskip}|=|\meta{dimension} +% +% specifies additional space between lines in listings. +% +% \item[0.18,c,\dag] \rkeyname{boxpos}|=|\meta{\alternative{b,c,t}} +% +% Sometimes the \packagename{listings} package puts a |\hbox| around a +% listing---or it couldn't be printed or even processed correctly. +% The key determines the vertical alignment to the surrounding material: +% bottom baseline, centered or top baseline. +% \end{syntax} +% +% +% \subsection{The printed range} +% +% \begin{syntax} +% \item[0.12,true] \rkeyname{print}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{print} +% +% controls whether an individual displayed listing is typeset. Even if +% set false, the respective caption is printed and the label is defined. +% +% Note: If the package is loaded without the \texttt{draft} option, you +% can use this key together with |\lstset|. In the other case the key +% can be used to typeset particular listings despite using the +% \texttt{draft} option. +% +% \item[0.1,1] \rkeyname{firstline}|=|\meta{number} +% \item[0.1,9999999] \rkeyname{lastline}|=|\meta{number} +% +% can be used on individual listings only. They determine the physical +% input lines used to print displayed listings. +% +% \item[1.2] \rkeyname{linerange}|={|\meta{first1}\texttt-\meta{last1}\texttt,\meta{first2}\texttt-\meta{last2}\texttt, and so on|}|\label{uoption:linerange} +% +% can be used on individual listings only. The given line ranges +% of the listing are displayed. The intervals must be sorted and must +% not intersect. +% +% \item[0.20,false] \rkeyname{showlines}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{showlines} +% +% If true, the package prints empty lines at the end of listings. +% Otherwise these lines are dropped (but they count for line numbering). +% +% \item[1.0] \rkeyname{emptylines}|=|[|*|]\meta{number} +% +% sets the maximum of empty lines allowed. If there is a block of more +% than \meta{number} empty lines, only \meta{number} ones are printed. +% Without the optional star, line numbers can be disturbed when blank +% lines are omitted; with the star, the lines keep their original +% numbers. +% +% \item[0.19,0] \rkeyname{gobble}|=|\meta{number} +% +% gobbles \meta{number} characters at the beginning of each +% \emph{environment} code line. This key has no effect on \cs{lstinline} +% or \cs{lstinputlisting}. +% +% Tabulators expand to \ikeyname{tabsize} spaces before they are gobbled. +% Code lines with fewer than \ikeyname{gobble} characters are considered +% empty. Never indent the end of environment by more characters. +% \end{syntax} +% +% +% \subsection{Languages and styles}\label{rLanguagesAndStyles} +% +% Please note that the arguments \meta{language}, \meta{dialect}, and +% \meta{style name} are case insensitive and that spaces have no effect. +% \begin{syntax} +% \item[0.18,{{}}] \rkeyname{style}|=|\meta{style name} +% +% activates the key=value list stored with |\lstdefinestyle|. +% +% \item[0.19] \rcmdname\lstdefinestyle\marg{style name}\marg{key=value list} +% +% stores the key=value list. +% +% \item[0.17,{{}}] \rkeyname{language}|=|\oarg{dialect}\meta{language} +% +% activates a (dialect of a) programming language. The `empty' default +% language detects no keywords, no comments, no strings, and so on; it +% may be useful for typesetting plain text. +% If \meta{dialect} is not specified, the package chooses the default +% dialect, or the empty dialect if there is no default dialect. +% +% Table \ref{uPredefinedLanguages} on page \pageref{uPredefinedLanguages} +% lists all languages and dialects provided by \texttt{lstdrvrs.dtx}. +% The predefined default dialects are underlined. +% +% \item[0.21] \rkeyname{alsolanguage}|=|\oarg{dialect}\meta{language} +% +% activates a (dialect of a) programming language in addition to the +% current active one. Note that some language definitions interfere with +% each other and are plainly incompatible; for instance, if one is case +% sensitive and the other is not. +% +% Take a look at the \ikeyname{classoffset} key in section +% \ref{rFigureOutTheAppearance} if you want to highlight the keywords +% of the languages differently. +% +% \item[0.19] \rkeyname{defaultdialect}|=|\oarg{dialect}\meta{language} +% +% defines \meta{dialect} as default dialect for \meta{language}. +% If you have defined a default dialect other than empty, for example +% |defaultdialect=[iama]fool|, you can't select the empty dialect, even +% not with |language=[]fool|. +% \end{syntax} +% +% Finally, here's a small list of language-specific keys. +% \begin{syntax} +% \item[0.19,false,optional] \rkeyname{printpod}|=|\meta{\alternative{true,false}} +% +% prints or drops PODs in Perl. +% +% \item[0.20,true,{renamed,optional}] \rkeyname{usekeywordsintag}|=|\meta{\alternative{true,false}}\label{uoption:usekeywordsintag} +% +% The package either use the first order keywords in tags or prints all +% identifiers inside |<>| in keyword style. +% +% \item[1.1,{{}},optional] \rkeyname{tagstyle}|=|\meta{style}\label{uoption:tagstyle} +% +% determines the style in which tags and their content is printed. +% +% \item[1.1,false,optional] \rkeyname{markfirstintag}|=|\meta{style}\label{uoption:markfirstintag} +% +% prints the first name in tags with keyword style. +% +% \item[0.20,true,optional] \rkeyname{makemacrouse}|=|\meta{\alternative{true,false}} +% +% Make specific: Macro use of identifiers, which are defined as first +% order keywords, also prints the surrounding |$(| and |)| in keyword +% style. e.g.~you could get +% \textbf{\textdollar(}\textbf{strip} \textdollar(BIBS)\textbf{)}. +% If deactivated you get +% \textdollar(\textbf{strip} \textdollar(BIBS)). +% \end{syntax} +% +% +% \subsection{Figure out the appearance}\label{rFigureOutTheAppearance} +% +% \begin{syntax} +% \item[0.18,{{}}] \rkeyname{basicstyle}|=|\meta{basic style} +% +% is selected at the beginning of each listing. You could use +% |\footnotesize|, |\small|, |\itshape|, |\ttfamily|, or something like +% that. The last token of \meta{basic style} must not read any following +% characters. +% +% \item[0.18,{{}}] \rkeyname{identifierstyle}|=|\meta{style} +% \item[0.11,\itshape] \rkeyname{commentstyle}|=|\meta{style} +% \item[0.12,{{}}] \rkeyname{stringstyle}|=|\meta{style} +% +% determines the style for non-keywords, comments, and strings. The +% \emph{last} token can be an one-parameter command like |\textbf| or +% |\underbar|. +% +% \item[0.11,\bfseries,addon] \rkeyname{keywordstyle}|=|\oarg{number}[\textasteriskcentered]\meta{style}\label{roption:keywordstyle} +% +% is used to print keywords. The optional \meta{number} argument is the +% class number to which the style should be applied. +% +% Add-on: If you use the optional star after the (optional) class number, the +% keywords are printed uppercase\,---\,even if a language is case +% sensitive and defines lowercase keywords only. Maybe there should also be an +% option for lowercase keywords \ldots +% +% \item[0.19,keywordstyle,deprecated] \rkeyname{ndkeywordstyle}|=|\meta{style} +% +% is equivalent to |keywordstyle=2|\meta{style}. +% +% \item[1.0,0] \rkeyname{classoffset}|=|\meta{number} +% +% is added to all class numbers before the styles, keywords, identifiers, +% etc.~are assigned. The example below defines the keywords directly; +% you could do it indirectly by selecting two different languages. +% \end{syntax} +%\ifcolor +% \begin{lstxsample} +% \lstset{classoffset=0, +% morekeywords={one,three,five},keywordstyle=\color{red}, +% classoffset=1, +% morekeywords={two,four,six},keywordstyle=\color{blue}, +% classoffset=0}% restore default +% \end{lstxsample} +%\else +% \begin{lstxsample} +% \lstset{classoffset=0, +% morekeywords={one,three,five},keywordstyle=\itshape, +% classoffset=1, +% morekeywords={two,four,six},keywordstyle=\bfseries}, +% classoffset=0}% restore default +% \end{lstxsample} +%\fi +% \begin{lstsample}{}{} +% \begin{lstlisting} +% one two three +% four five six +% \end{lstlisting} +% \end{lstsample} +% +% \begin{syntax} +% \item[0.20,keywordstyle,{addon,bug,optional}] \rkeyname{texcsstyle}|=|[|*|]\oarg{class number}\meta{style}\label{roption:texcsstyle} +% \item[0.20,keywordstyle,optional] \rkeyname{directivestyle}|=|\meta{style} +% +% determine the style of \TeX\ control sequences and directives. +% Note that these keys are present only if you've chosen an appropriate +% language. +% +% The optional star of |texcsstyle| also highlights the backslash in +% front of the control sequence name. Note that this option is set for +% all |texcs| lists. +% +% Bug: \texttt{texcs\ldots} interferes with other keyword lists. If, for +% example, \texttt{emph} contains the word \texttt{foo}, then the control +% sequence |\foo| will show up in \texttt{emphstyle}. +% +% \item[0.21] \rkeyname{emph}|=|\oarg{number}\marg{identifier list} +% \item[0.21] \rkeyname{moreemph}|=|\oarg{number}\marg{identifier list} +% \item[0.21] \rkeyname{deleteemph}|=|\oarg{number}\marg{identifier list} +% \item[0.21] \rkeyname{emphstyle}|=|\oarg{number}\marg{style} +% +% respectively define, add or remove the \meta{identifier list} from +% `emphasize class \meta{number}', or define the style for that class. +% If you don't give an optional argument, the package assumes +% \meta{number}$\,=1$. +% +% These keys are described more detailed in section +% \ref{uEmphasizeIdentifiers}. +% +% \item[1.0] \rkeyname{delim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)} +% \item[1.0] \rkeyname{moredelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)} +% \item[1.0] \rkeyname{deletedelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt]\meta{delimiter\textup(s\textup)} +% +% define, add, or remove user supplied delimiters. (Note that this does +% not affect strings or comments.) +% +% In the first two cases \meta{style} is used to print the delimited +% code (and the delimiters). Here, \meta{style} could be something like +% |\bfseries| or |\itshape|, or it could refer to other styles via +% \texttt{keywordstyle}, \texttt{keywordstyle2}, \texttt{emphstyle}, +% etc. +% +% Supported types are \texttt{l} and \texttt{s}, see the comment keys in +% section \ref{uLanguageDefinitions} for an explanation. If you use the +% prefix \texttt i, i.e.~\texttt{il} or \texttt{is}, the delimiters are +% not printed, which is some kind of invisibility. +% +% If you use one optional star, the package will detect keywords, +% comments, and strings inside the delimited code. With both optional +% stars, aditionally the style is applied cumulatively; see section +% \ref{uDelimiters}. +% \end{syntax} +% +% +% \subsection{Getting all characters right} +% +% \begin{syntax} +% \item[0.18,true] \rkeyname{extendedchars}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{extendedchars} +% +% allows or prohibits extended characters in listings, that means +% (national) characters of codes 128--255. If you use extended +% characters, you should load \packagename{fontenc} and/or +% \packagename{inputenc}, for example. +% +% \item[1.0,{{}}] \rkeyname{inputencoding}|=|\meta{encoding} +% +% determines the input encoding. The usage of this key requires the +% \packagename{inputenc} package; nothing happens if it's not loaded. +% +% \item[1.1,false] \rkeyname{upquote}|=|\meta{\alternative{true,false}}\label{uoption:upquote} +% +% determines whether the left and right quote are printed |`'| or +% \texttt{\textasciigrave\textquotesingle}. +% This key requires the \packagename{textcomp} package if true. +% +% \item[0.12,8] \rkeyname{tabsize}|=|\meta{number} +% +% sets tabulator stops at columns $\meta{number}+1$, $2\cdot\meta{number}+1$, $3\cdot\meta{number}+1$, and so on. +% Each tabulator in a listing moves the current column to the next +% tabulator stop. +% +% \item[0.20,false] \rkeyname{showtabs}|=|\meta{\alternative{true,false}} +% +% make tabulators visible or invisible. A visible tabulator looks like +% \lstinline[showtabs]! !, but that can be changed. If you choose +% invisible tabulators but visible spaces, tabulators are converted to +% an appropriate number of spaces. +% +% \item[0.20] \rkeyname{tab}|=|\meta{tokens} +% +% \meta{tokens} is used to print a visible tabulator. You might want to use |$\to$|, |$\mapsto$|, |$\dashv$| or something like that instead of the strange default definition. +% +% \item[0.20,false] \rkeyname{showspaces}|=|\meta{\alternative{true,false}} +% +% lets all blank spaces appear {\textvisiblespace} or as blank spaces. +% +% \item[0.12,true] \rkeyname{showstringspaces}|=|\meta{\alternative{true,false}} +% +% lets blank spaces in strings appear {\textvisiblespace} or as blank +% spaces. +% +% \item[0.19,\bigbreak] \rkeyname{formfeed}|=|\meta{tokens} +% +% Whenever a listing contains a form feed, \meta{tokens} is executed. +% \end{syntax} +% +% +% \subsection{Line numbers}\label{rLineNumbers} +% +% \begin{syntax} +% \item[1.0,none] \rkeyname{numbers}|=|\meta{\alternative{none,left,right}} +% +% makes the package either print no line numbers, or put them on the +% left or the right side of a listing. +% +% \item[0.16,1] \rkeyname{stepnumber}|=|\meta{number} +% +% All lines with ``line number $\equiv 0$ modulo \meta{number}'' get a +% line number. +% If you turn line numbers on and off with \keyname{numbers}, the +% parameter \keyname{stepnumber} will keep its value. Alternatively you +% can turn them off via |stepnumber=0| and on with a nonzero number, and +% keep the value of \keyname{numbers}. +% +% \item[1.1,false] \rkeyname{numberfirstline}|=|\meta{\alternative{true,false}}\label{uoption:numberfirstline} +% +% The first line of each listing gets numbered (if numbers are on at all) +% even if the line number is not divisible by \keyname{stepnumber}. +% +% \item[0.16,{{}}] \rkeyname{numberstyle}|=|\meta{style} +% +% determines the font and size of the numbers. +% +% \item[0.19,10pt] \rkeyname{numbersep}|=|\meta{dimension} +% +% is the distance between number and listing. +% +% \item[1.0,true] \rkeyname{numberblanklines}|=|\meta{\alternative{true,false}} +% +% If this is set to false, blank lines get no printed line number. +% +% \item[0.20,auto] \rkeyname{firstnumber}|=|\meta{\alternative{auto,last,\normalfont\meta{number}}} +% +% \texttt{auto} lets the package choose the first number: a new listing +% starts with number one, a named listing continues the most recent +% same-named listing (see below), and a stand alone file begins with +% the number corresponding to the first input line. +% +% \texttt{last} continues the numbering of the most recent listing and +% \meta{number} sets it to the number. +% +% \item[1.0] \rkeyname{name}|=|\meta{name} +% +% names a listing. Displayed environment-listings with the same name +% share a line counter if |firstnumber=auto| is in effect. +% +% \item[0.20,\arabic{lstnumber},data] \rcmdname\thelstnumber +% +% prints the lines' numbers. +% \end{syntax} +% We show an example on how to redefine |\thelstnumber|. But if you test it, +% you won't get the result shown on the left. +% \begin{lstxsample} +% \renewcommand*\thelstnumber{\oldstylenums{\the\value{lstnumber}}} +% \end{lstxsample} +% \begin{lstsample}{\lstset{stepnumber=-1}\label{rDecreasingLabels}}{} +% \begin{lstlisting}[numbers=left, +% firstnumber=753] +% begin { empty lines } +% +% +% +% +% +% +% end; { empty lines } +% \end{lstlisting} +% \end{lstsample} +% +% \begin{advise} +% \item +% The example shows a sequence $n,n+1,\ldots,n+7$ of 8 three-digit figures such that the sequence contains each digit $0,1,\ldots,9$. +% But 8 is not minimal with that property. +% Find the minimal number and prove that it is minimal. +% How many minimal sequences do exist? +% +% Now look at the generalized problem: +% Let $k\in\{1,\ldots,10\}$ be given. +% Find the minimal number $m\in\{1,\ldots,10\}$ such that there is a sequence $n,{n+1},\ldots,\allowbreak{n+m-1}$ of $m$ $k$-digit figures which contains each digit $\{0,\ldots,9\}$. +% Prove that the number is minimal. +% How many minimal sequences do exist? +% +% If you solve this problem with a computer, write a \TeX\ program! +% \end{advise} +% +% +% \subsection{Captions} +% +% In despite of \LaTeX\ standard behaviour, captions and floats are independent +% from each other here; you can use captions with non-floating listings. +% \begin{syntax} +% \item[0.21] \rkeyname{title}|=|\meta{title text} +% +% is used for a title without any numbering or label. +% +% \item[0.20] \rkeyname{caption}|={|\oarg{short}\meta{caption text}|}| +% +% The caption is made of \cs{lstlistingname} followed by a running +% number, a seperator, and \meta{caption text}. Either the caption text +% or, if present, \meta{short} will be used for the list of listings. +% +% \item[0.21] \rkeyname{label}|=|\meta{name} +% +% makes a listing referable via |\ref|\marg{name}. +% +% \item[0.16] \rcmdname\lstlistoflistings +% +% prints a list of listings. Each entry is with descending priority +% either the short caption, the caption, the file name or the name of the +% listing, see also the key \keyname{name} in section \ref{rLineNumbers}. +% +% \item[1.0] \rkeyname{nolol}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{nolol} +% +% If true, the listing does not make it into the list of listings. +% +% \item[0.16,Listings,data] \rcmdname\lstlistlistingname +% +% The header name for the list of listings. +% +% \item[0.20,Listing,data] \rcmdname\lstlistingname +% +% The caption label for listings. +% +% \item[0.20,\arabic{lstlisting},data] \rcmdname\thelstlisting +% +% prints the running number of the caption. +% +% \item[1.4,true] \rkeyname{numberbychapter}|=|\meta{\alternative{true,false}} +% +% If true, and |\thechapter| exists, listings are numbered by chapter. +% Otherwise, they are numbered sequentially from the beginning of the +% document. This key can only be used before |\begin{document}|. +% +% \item[0.19] \rcmdname\lstname +% +% prints the name of the current listing which is either the file name or +% the name defined by the \keyname{name} key. This command can be used to +% define a caption or title template, for example by +% |\lstset{caption=\lstname}|. +% +% \item[0.20,t] \rkeyname{captionpos}|=|\meta{subset of \textup{\texttt{tb}}} +% +% specifies the positions of the caption: top and/or bottom of the +% listing. +% +% \item[0.20,\smallskipamount] \rkeyname{abovecaptionskip}|=|\meta{dimension} +% \item[0.20,\smallskipamount] \rkeyname{belowcaptionskip}|=|\meta{dimension} +% +% is the vertical space respectively above or below each caption. +% \end{syntax} +% +% +% \subsection{Margins and line shape}\label{rMarginsAndLineShape} +% +% \begin{syntax} +% \item[0.21,\linewidth] \rkeyname{linewidth}|=|\meta{dimension} +% +% defines the base line width for listings. The following three keys are +% taken into account additionally. +% +% \item[0.19,0pt] \rkeyname{xleftmargin}|=|\meta{dimension} +% \item[1.0,0pt] \rkeyname{xrightmargin}|=|\meta{dimension} +% +% The dimensions are used as extra margins on the left and right. Line +% numbers and frames are both moved accordingly. +% +% \item[0.19,false] \rkeyname{resetmargins}|=|\meta{\alternative{true,false}} +% +% If true, indention from list environments like \texttt{enumerate} or +% \texttt{itemize} is reset, i.e.~not used. +% +% \item[0.20,false] \rkeyname{breaklines}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breaklines} +% +% activates or deactivates automatic line breaking of long lines. +% +% \item[1.2,false] \rkeyname{breakatwhitespace}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breakatwhitespace}\label{uoption:breakatwhitespace} +% +% If true, it allows line breaks only at white space. +% +% \item[0.20,{{}}] \rkeyname{prebreak}|=|\meta{tokens} +% \item[0.20,{{}}] \rkeyname{postbreak}|=|\meta{tokens} +% +% \meta{tokens} appear at the end of the current line respectively at the beginning of the next (broken part of the) line. +% +% You must not use dynamic space (in particular spaces) since internally we use |\discretionary|. +% However |\space| is redefined to be used inside \meta{tokens}. +% +% \item[0.20,20pt] \rkeyname{breakindent}|=|\meta{dimension} +% +% is the indention of the second, third, \ldots\ line of broken lines. +% +% \item[0.20,true] \rkeyname{breakautoindent}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{breakautoindent} +% +% activates or deactivates automatic indention of broken lines. This +% indention is used additionally to \ikeyname{breakindent}, see the +% example below. +% Visible spaces or visible tabulators might set this auto +% indention to zero. +% \end{syntax} +% In the following example we use tabulators to create long lines, but the +% verbatim part uses |tabsize=1|. +% \begin{lstxsample} +% \lstset{postbreak=\space, breakindent=5pt, breaklines} +% \end{lstxsample} +% \begin{lstsample}{\lstset{string=[d]",tabsize=6}}{\lstset{tabsize=1}\hfuzz=1in} +% \begin{lstlisting} +% "A long string is broken!" +% "Another long line." +% \end{lstlisting} +% +% \begin{lstlisting}[breakautoindent +% =false] +% { Now auto indention is off. } +% \end{lstlisting} +% \end{lstsample} +% +% +% \subsection{Frames}\label{rFrames} +% +% \begin{syntax} +% \item[1.0,none] \rkeyname{frame}|=|\meta{\alternative{none,leftline,topline,bottomline,lines,single,shadowbox}} +% +% draws either no frame, a single line on the left, at the top, at the +% bottom, at the top and bottom, a whole single frame, or a shadowbox. +% +% Note that \packagename{fancyvrb} supports the same frame types except +% \texttt{shadowbox}. The shadow color is \keyname{rulesepcolor}, see +% below. +% +% \item[0.19,{{}}] \rkeyname{frame}|=|\meta{subset of \textup{\texttt{trblTRBL}}} +% +% The characters \texttt{trblTRBL} designate lines at the top and +% bottom of a listing and to lines on the right and left. Upper case +% characters are used to draw double rules. So |frame=tlrb| draws a +% single frame and |frame=TL| double lines at the top and on the left. +% +% Note that frames usually reside outside the listing's space. +% +% \item[0.20,ffff] \rkeyname{frameround}|=|\meta{\alternative{t,f}}\meta{\alternative{t,f}}\meta{\alternative{t,f}}\meta{\alternative{t,f}} +% +% The four letters designate the top right, bottom right, bottom +% left and top left corner. In this order. \texttt{t} makes the +% according corner round. If you use round corners, the rule width is +% controlled via |\thinlines| and |\thicklines|. +% +% Note: The size of the quarter circles depends on \keyname{framesep} +% and is independent of the extra margins of a frame. The size is +% possibly adjusted to fit \LaTeX's circle sizes. +% +% \item[0.19,3pt] \rkeyname{framesep}|=|\meta{dimension} +% \item[0.19,2pt] \rkeyname{rulesep}|=|\meta{dimension} +% +% control the space between frame and listing and between double rules. +% +% \item[0.19,0.4pt] \rkeyname{framerule}|=|\meta{dimension} +% +% controls the width of the rules. +% +% \item[1.0,0pt] \rkeyname{framexleftmargin}|=|\meta{dimension} +% \item[1.0,0pt] \rkeyname{framexrightmargin}|=|\meta{dimension} +% \item[1.0,0pt] \rkeyname{framextopmargin}|=|\meta{dimension} +% \item[1.0,0pt] \rkeyname{framexbottommargin}|=|\meta{dimension} +% +% are the dimensions which are used additionally to \keyname{framesep} +% to make up the margin of a frame. +% +% \item[0.21] \rkeyname{backgroundcolor}|=|\meta{color command} +% \item[0.21] \rkeyname{rulecolor}|=|\meta{color command} +% \item[1.0] \rkeyname{fillcolor}|=|\meta{color command} +% \item[1.0] \rkeyname{rulesepcolor}|=|\meta{color command} +% +% specify the colour of the background, the rules, the space between +% `text box' and first rule, and of the space between two rules, +% respectively. +% Note that the value requires a |\color| command, for example +% \keyname{rulecolor}|=\color{blue}|. +% \end{syntax} +% \ikeyname{frame} does not work with |fancyvrb=true| or when the package +% internally makes a |\hbox| around the listing! And there are certainly more +% problems with other commands; please take the time to make a (bug) report. +%\ifcolor +% \begin{lstxsample} +% \lstset{framexleftmargin=5mm, frame=shadowbox, rulesepcolor=\color{blue}} +% \end{lstxsample} +%\else +% \lstset{framexleftmargin=5mm, frame=shadowbox} +%\fi +% \begin{lstsample}{}{} +% \begin{lstlisting}[numbers=left] +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% +% Note here the use of |framexleftmargin| to include the line numbers inside +% the frame. +% +% Do you want exotic frames? Try the following key if you want, for example, +% \begin{lstsample}{\lstset{frameshape={RYRYNYYYY}{yny}{yny}{RYRYNYYYY}}}{} +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% \begin{syntax} +% \item[0.20,,\dag] \rkeyname{frameshape}|=|\marg{top shape}\marg{left shape}\marg{right shape}\marg{bottom shape} +% +% gives you full control over the drawn frame parts. +% The arguments are not case sensitive. +% +% Both \meta{left shape} and \meta{right shape} are `left-to-right' +% \alternative{y,n} character sequences (or empty). Each |y| lets the +% package draw a rule, otherwise the rule is blank. These vertical rules +% are drawn `left-to-right' according to the specified shapes. +% The example above uses |yny|. +% +% \meta{top shape} and \meta{bottom shape} are `left-rule-right' +% sequences (or empty). The first `left-rule-right' sequence is attached +% to the most inner rule, the second to the next, and so on. +% Each sequence has three characters: `rule' is either |y| or |n|; +% `left' and `right' are |y|, |n| or |r| (which makes a corner round). +% The example uses |RYRYNYYYY| for both shapes: +% |RYR| describes the most inner (top and bottom) frame shape, |YNY| +% the middle, and |YYY| the most outer. +% \end{syntax} +% To summarize, the example above used +% \begin{verbatim} +% \lstset{frameshape={RYRYNYYYY}{yny}{yny}{RYRYNYYYY}}\end{verbatim} +% Note that you are not resticted to two or three levels. +% However you'll get in trouble if you use round corners when they are too big. +% +% +% \subsection{Indexing} +% +% \begin{syntax} +% \item[0.19] \rkeyname{index}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers} +% \item[0.21] \rkeyname{moreindex}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers} +% \item[0.21] \rkeyname{deleteindex}|=|\oarg{number}\oarg{keyword classes}\marg{identifiers} +% +% define, add and remove \meta{identifiers} and \meta{keyword classes} +% from the index class list \meta{number}. If you don't specify the +% optional number, the package assumes \meta{number} $=1$. +% +% Each appearance of the explicitly given identifiers and each appearance +% of the identifiers of the specified \meta{keyword classes} is indexed. +% For example, you could write |index=[1][keywords]| to index all +% keywords. Note that |[1]| is required here---otherwise we couldn't use +% the second optional argument. +% +% \item[0.19,\lstindexmacro] \rkeyname{indexstyle}|=|\oarg{number}\meta{tokens \textup(one-parameter command\textup)} +% +% \meta{tokens} actually indexes the identifiers for the list +% \meta{number}. In contrast to the style keys, \meta{tokens} +% \emph{must} read exactly one parameter, namely the identifier. +% Default definition is\icmdname{\lstindexmacro}\vspace*{-\itemsep} +% \begin{verbatim} +% \newcommand\lstindexmacro[1]{\index{{\ttfamily#1}}}\end{verbatim} +% \vspace*{-\itemsep}which you shouldn't modify. +% Define your own indexing commands and use them as argument to this key. +% \end{syntax} +% Section \ref{uIndexing} describes this feature in detail. +% +% +% \subsection{Column alignment}\label{rColumnAlignment} +% +% \begin{syntax} +% \item[1.0,{[c]fixed}] \rkeyname{columns}|=|\oarg{\alternative{c,l,r}}\meta{alignment} +% +% selects the column alignment. The \meta{alignment} can be |fixed|, +% |flexible|, |spaceflexible|, or |fullflexible|; see section +% \ref{uFixedAndFlexibleColumns} for details. +% +% The optional |c|, |l|, or |r| controls the horizontal orientation of +% smallest output units (keywords, identifiers, etc.). The arguments work +% as follows, where vertical bars visualize the effect: +% $\vert$\lstinline[columns={[c]fixed}]!listing!$\vert$, +% $\vert$\lstinline[columns={[l]fixed}]!listing!$\vert$, and +% $\vert$\lstinline[columns={[r]fixed}]!listing!$\vert$ +% in fixed column mode, +% $\vert$\lstinline[columns={[c]flexible}]!listing!$\vert$, +% $\vert$\lstinline[columns={[l]flexible}]!listing!$\vert$, and +% $\vert$\lstinline[columns={[r]flexible}]!listing!$\vert$ +% with flexible columns, and +% $\vert$\lstinline[columns={[c]fullflexible}]!listing!$\vert$, +% $\vert$\lstinline[columns={[l]fullflexible}]!listing!$\vert$, and +% $\vert$\lstinline[columns={[r]fullflexible}]!listing!$\vert$ +% with space-flexible or full flexible columns (which ignore the +% optional argument, since they do not add extra space around +% printable characters). +% +% \item[0.18,false] \rkeyname{flexiblecolumns}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{flexiblecolumns} +% +% selects the most recently selected flexible or fixed column format, +% refer to section \ref{uFixedAndFlexibleColumns}. +% +% \item[0.21,false,\dag] \rkeyname{keepspaces}|=|\meta{\alternative{true,false}} +% +% |keepspaces=true| tells the package not to drop spaces to fix column +% alignment and always converts tabulators to spaces. +% +% \item[0.16] \rkeyname{basewidth}|=|\meta{dimension}\syntaxor +% \item[0.18,{{0.6em,0.45em}}] \rkeyname{basewidth}|={|\meta{fixed}|,|\meta{flexible mode}|}| +% +% sets the width of a single character box for fixed and flexible column +% mode (both to the same value or individually). +% +% \item[0.20,false] \rkeyname{fontadjust}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{fontadjust} +% +% If true the package adjusts the base width every font selection. +% This makes sense only if \ikeyname{basewidth} is given in font specific +% units like `em' or `ex'---otherwise this boolean has no effect. +% +% After loading the package, it doesn't adjust the width every font +% selection: it looks at \ikeyname{basewidth} each listing and uses the +% value for the whole listing. This is possibly inadequate if the style +% keys in section \ref{rFigureOutTheAppearance} make heavy font size +% changes, see the example below. +% +% Note that this key might disturb the column alignment and might have an +% effect on the keywords' appearance! +% \end{syntax} +% \begin{lstsample}{\lstset{basicstyle=\normalsize}}{} +% \lstset{commentstyle=\scriptsize} +% \begin{lstlisting} +% { scriptsize font +% doesn't look good } +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% \begin{lstsample}{\lstset{basicstyle=\normalsize,commentstyle=\scriptsize}}{} +% \begin{lstlisting}[fontadjust] +% { scriptsize font +% looks better now } +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{lstlisting} +% \end{lstsample} +% +% +% \subsection{Escaping to \LaTeX}\label{rEscapingToLaTeX} +% +% \textbf{Note:} {\itshape Any escape to \LaTeX\ may disturb the column +% alignment since the package can't control the spacing there.} +% \begin{syntax} +% \item[0.18,false] \rkeyname{texcl}|=|\meta{\alternative{true,false}}\syntaxor\rkeyname{texcl} +% +% activates or deactivates \LaTeX\ comment lines. If activated, comment +% line delimiters are printed as usual, but the comment line text (up to +% the end of line) is read as \LaTeX\ code and typeset in comment style. +% \end{syntax} +% The example uses \Cpp\ comment lines (but doesn't say how to define them). +% Without |\upshape| we would get \textit{calculate} since the comment style +% is |\itshape|. +% \begin{lstsample}{\lstset{morecomment=[l]//}}{} +% \begin{lstlisting}[texcl] +% // \upshape calculate $a_{ij}$ +% A[i][j] = A[j][j]/A[i][j]; +% \end{lstlisting} +% \end{lstsample} +% +% \begin{syntax} +% \item[0.19,false] \rkeyname{mathescape}|=|\meta{\alternative{true,false}} +% +% activates or deactivates special behaviour of the dollar sign. +% If activated a dollar sign acts as \TeX's text math shift. +% +% This key is useful if you want to typeset formulas in listings. +% +% \item[0.19,{{}}] \rkeyname{escapechar}|=|\meta{character}\syntaxor\rkeyname{escapechar}|={}| +% +% If not empty the given character escapes the user to \LaTeX: all code +% between two such characters is interpreted as \LaTeX\ code. Note that +% \TeX's special characters must be entered with a preceding backslash, +% e.g.~|escapechar=\%|. +% +% \item[0.20,{{}}] \rkeyname{escapeinside}|=|\meta{character}\meta{character}\syntaxor\rkeyname{escapeinside}|={}| +% +% Is a generalization of \ikeyname{escapechar}. If the value is not +% empty, the package escapes to \LaTeX\ between the first and second +% character. +% +% \item[0.20,{{}}] \rkeyname{escapebegin}|=|\meta{tokens} +% \item[0.20,{{}}] \rkeyname{escapeend}|=|\meta{tokens} +% +% The tokens are executed at the beginning respectively at the end of +% each escape, in particular for \ikeyname{texcl}. +% See section \ref{uNationalCharacters} for an application. +% \end{syntax} +% +% \begin{lstsample}{\lstset{morecomment=[l]//}}{} +% \begin{lstlisting}[mathescape] +% // calculate $a_{ij}$ +% $a_{ij} = a_{jj}/a_{ij}$; +% \end{lstlisting} +% \end{lstsample} +% +% \begin{lstsample}{\lstset{morecomment=[l]//}}{} +% \begin{lstlisting}[escapechar=\%] +% // calc%ulate $a_{ij}$% +% %$a_{ij} = a_{jj}/a_{ij}$%; +% \end{lstlisting} +% \end{lstsample} +% +% \begin{lstsample}{\lstset{morecomment=[l]//}}{} +% \lstset{escapeinside=`'} +% \begin{lstlisting} +% // calc`ulate $a_{ij}$' +% `$a_{ij} = a_{jj}/a_{ij}$'; +% \end{lstlisting} +% \end{lstsample} +% In the first example the comment line up to $a_{ij}$ has been typeset by the +% \packagename{listings} package in comment style. The $a_{ij}$ itself is +% typeset in `\TeX\ math mode' without comment style. About half of the +% comment line of the second example has been typeset by this package, and +% the rest is in `\LaTeX\ mode'. +% +% To avoid problems with the current and future version of this package: +% \begin{enumerate} +% \item Don't use any commands of the \packagename{listings} package when you +% have escaped to \LaTeX. +% \item Any environment must start and end inside the same escape. +% \item You might use |\def|, |\edef|, etc., but do not assume that the +% definitions are present later, unless they are |\global|. +% \item |\if \else \fi|, groups, math shifts |$| and |$$|, \ldots\ must be +% balanced within each escape. +% \item \ldots +% \end{enumerate} +% Expand that list yourself and mail me about new items. +% +% +% \subsection{Interface to \textsf{fancyvrb}} +% +% The \packagename{fancyvrb} package---fancy verbatims---from Timothy van Zandt +% provides macros for reading, writing and typesetting verbatim code. It has +% some remarkable features the \packagename{listings} package doesn't have. +% (Some are possible, but you must find somebody who will implement them |;-)|. +% \begin{syntax} +% \item[0.19] \rkeyname{fancyvrb}|=|\meta{\alternative{true,false}} +% +% activates or deactivates the interface. If active, verbatim code is +% read by \packagename{fancyvrb} but typeset by \packagename{listings}, +% i.e.~with emphasized keywords, strings, comments, and so on. +% Internally we use a very special definition of |\FancyVerbFormatLine|. +% +% This interface works with |Verbatim|, |BVerbatim| and |LVerbatim|. +% But you shouldn't use \packagename{fancyvrb}'s \keyname{defineactive}. +% (As far as I can see it doesn't matter since it does nothing at all, +% but for safety \ldots .) +% If \packagename{fancyvrb} and \packagename{listings} provide similar +% functionality, you should use \packagename{fancyvrb}'s. +% +% \item[1.1,{\overlay 1}] \rkeyname{fvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}\ldots\label{uoption:fvcmdparams} +% \item[1.1] \rkeyname{morefvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}\ldots\label{uoption:morefvcmdparams} +% +% If you use \packagename{fancyvrb}'s \keyname{commandchars}, you must +% tell the \packagename{listings} package how many arguments each command +% takes. If a command takes no arguments, there is nothing to do. +% +% The first (third, fifth, \ldots) parameter to the keys is the command +% and the second (fourth, sixth, \ldots) is the number of arguments +% that command takes. So, if you want to use |\textcolor{red}{keyword}| +% with the \packagename{fancyvrb}-\packagename{listings} interface, you +% should write |\lstset{morefvcmdparams=\textcolor 2}|. +% \end{syntax} +% +% \iffancyvrb +% \begin{lstsample}{}{} +% \lstset{morecomment=[l]\ }% :-) +% \fvset{commandchars=\\\{\}} +% +% \begin{BVerbatim} +% First verbatim line. +% \fbox{Second} verbatim line. +% \end{BVerbatim} +% +% \par\vspace{72.27pt} +% +% \lstset{fancyvrb} +% \begin{BVerbatim} +% First verbatim line. +% \fbox{Second} verbatim line. +% \end{BVerbatim} +% \lstset{fancyvrb=false} +% \end{lstsample} +% The lines typeset by the \packagename{listings} package are wider since the +% default \ikeyname{basewidth} doesn't equal the width of a single typewriter type +% character. Moreover, note that the first space begins a comment as defined at +% the beginning of the example. +% \else +% \begin{center} +% \packagename{fancyvrb} seems to be unavailable on your platform, thus the +% example couldn't be printed here. +% \end{center} +% \fi +% +% +% \subsection{Environments}\label{rEnvironments} +% +% If you want to define your own pretty-printing environments, try the +% following command. The syntax comes from \LaTeX's |\newenvironment|. +% \begin{syntax} +% \item[0.19] \rcmdname\lstnewenvironment\\ +% \marg{name}\oarg{number}\oarg{opt.~default~arg.}\\ +% |{|\meta{starting code}|}|\\ +% |{|\meta{ending code}|}| +% \end{syntax} +% As a simple example we could just select a particular language. +% \begin{lstxsample} +% \lstnewenvironment{pascal} +% {\lstset{language=pascal}} +% {} +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{pascal} +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% \end{pascal} +% \end{lstsample} +% Doing other things is as easy, for example, using more keys and adding an +% optional argument to adjust settings each listing: +% \begin{verbatim} +%\lstnewenvironment{pascalx}[1][] +% {\lstset{language=pascal,numbers=left,numberstyle=\tiny,float,#1}} +% {}\end{verbatim} +% +% +% \subsection{Short Inline Listing Commands}\label{rShortInline} +% +% Short equivalents of |\lstinline| can also be defined, in a manner similar +% to the short verbatim macros provided by \packagename{shortvrb}. +% +% \begin{syntax} +% \item[1.4] \rcmdname\lstMakeShortInline[\oarg{options}]\meta{character} +% +% defines \meta{character} to be an equivalent of +% |\lstinline|[\oarg{options}]\meta{character}, +% allowing for a convenient syntax when using lots of inline listings. +% +% \item[1.4] \rcmdname\lstDeleteShortInline\meta{character} +% +% removes a definition of \meta{character} created by |\lstMakeShortInline|, +% and returns \meta{character} to its previous meaning. +% \end{syntax} +% +% +% \subsection{Language definitions}\label{rLanguageDefinitions} +% +% You should first read section \ref{uLanguageDefinitions} for an introduction +% to language definitions. Otherwise you're probably unprepared for the full +% syntax of |\lstdefinelanguage|. +% \begin{syntax} +% \item[0.19] \rcmdname\lstdefinelanguage\syntaxnewline[\oarg{dialect}]\marg{language}\syntaxnewline[\oarg{base dialect}\marg{and base language}]\syntaxnewline\marg{key=value list}\syntaxnewline[\oarg{list of required aspects \textup(keywordcomments,texcs,etc.\textup)}] +% +% defines the (given dialect of the) programming language \meta{language}. +% If the language definition is based on another definition, you must +% specify the whole \oarg{base dialect}\marg{and base language}. Note +% that an empty \meta{base dialect} uses the default dialect! +% +% The last optional argument should specify all required aspects. This is +% a delicate point since the aspects are described in the developer's +% guide. You might use existing languages as templates. For example, +% ANSI C uses \aspectname{keywords}, \aspectname{comments}, +% \aspectname{strings} and \aspectname{directives}. +% +% \icmdname{\lst@definelanguage} has the same syntax and is used to +% define languages in the driver files. +% +% \begin{advise} +% \item Where should I put my language definition? +% \advisespace +% If you need the language for one particular document, put it into +% the preamble of that document. Otherwise create the local file +% `\texttt{lstlang0.sty}' or add the definition to that file, but use +% `|\lst@definelanguage|' instead of `|\lstdefinelanguage|'. +% However, you might want to send the definition to the address in +% section \ref{uSoftwareLicense}. Then it will be included with the +% rest of the languages distributed with the package, and published under +% the \LaTeX\ Project Public License. +% \end{advise} +% +% \item[0.18] \rcmdname\lstalias\marg{alias}\marg{language} +% +% defines an alias for a programming language. Each \meta{alias} is +% redirected to the same dialect of \meta{language}. +% It's also possible to define an alias for one particular dialect only: +% +% \item[0.18] \rcmdname\lstalias\oarg{alias dialect}\marg{alias}\oarg{dialect}\marg{language} +% +% Here all four parameters are \emph{nonoptional} and an alias with empty +% \meta{dialect} will select the default dialect. Note that aliases +% cannot be chained: The two aliases `|\lstalias{foo1}{foo2}|' and +% `|\lstalias{foo2}{foo3}|' will \emph{not} redirect |foo1| to |foo3|. +% \end{syntax} +% All remaining keys in this section are intended for building language +% definitions. \emph{No other key should be used in such a definition!} +% +% +% \paragraph{Keywords} +% We begin with keyword building keys. Note: {\itshape If you want to enter +% {\upshape|\|, |{|, |}|, |%|, |#|} or {\upshape|&|} as (part of) an argument +% to the keywords below, you must do it with a preceding backslash!} +% \begin{syntax} +% \item[1.0,,{\dag bug}] \rkeyname{keywordsprefix}|=|\meta{prefix} +% +% All identifiers starting with \meta{prefix} will be printed as first +% order keywords. +% +% Bugs: Currently there are several limitations. +% (1) The prefix is always case sensitive. +% (2) Only one prefix can be defined at a time. +% (3) If used `standalone' outside a language definition, the key might +% work only after selecting a nonempty language (and switching back to +% the empty language if necessary). +% (4) The key does not respect the value of \keyname{classoffset} and +% has no optional class \meta{number} argument. +% +% \item[0.11] \rkeyname{keywords}|=|\oarg{number}\marg{list of keywords} +% \item[0.11] \rkeyname{morekeywords}|=|\oarg{number}\marg{list of keywords} +% \item[0.18] \rkeyname{deletekeywords}|=|\oarg{number}\marg{list of keywords} +% +% define, add to or remove the keywords from keyword list \meta{number}. +% The use of \keyname{keywords} is discouraged since it deletes all +% previously defined keywords in the list and is thus incompatible with +% the \keyname{alsolanguage} key. +% +% Please note the keys \ikeyname{alsoletter} and \ikeyname{alsodigit} +% below if you use unusual charaters in keywords. +% +% \item[0.19,,deprecated] \rkeyname{ndkeywords}|=|\marg{list of keywords} +% \item[0.19,,deprecated] \rkeyname{morendkeywords}|=|\marg{list of keywords} +% \item[0.19,,deprecated] \rkeyname{deletendkeywords}|=|\marg{list of keywords} +% +% define, add to or remove the keywords from keyword list 2; note that +% this is equivalent to |keywords=[2]|\ldots etc. +% The use of \keyname{ndkeywords} is strongly discouraged. +% +% \item[0.19,,{addon,optional}] \rkeyname{texcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)} +% \item[0.20,,{addon,optional}] \rkeyname{moretexcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)} +% \item[0.21,,{addon,optional}] \rkeyname{deletetexcs}|=|\oarg{class number}\marg{list of control sequences \textup(without backslashes\textup)} +% +% Ditto for control sequences in \TeX\ and \LaTeX. +% +% \item[0.18,,optional] \rkeyname{directives}|=|\marg{list of compiler directives} +% \item[0.21,,optional] \rkeyname{moredirectives}|=|\marg{list of compiler directives} +% \item[0.21,,optional] \rkeyname{deletedirectives}|=|\marg{list of compiler directives} +% +% defines compiler directives in C, \Cpp, Objective-C, and POV. +% +% \item[0.14] \rkeyname{sensitive}|=|\meta{\alternative{true,false}} +% +% makes the keywords, control sequences, and directives case sensitive +% and insensitive, respectively. This key affects the keywords, control +% sequences, and directives only when a listing is processed. In all +% other situations they are case sensitive, for example, +% |deletekeywords={save,Test}| removes `save' and `Test', but neither +% `SavE' nor `test'. +% +% \item[0.19] \rkeyname{alsoletter}|=|\marg{character sequence} +% \item[0.19] \rkeyname{alsodigit}|=|\marg{character sequence} +% \item[0.19] \rkeyname{alsoother}|=|\marg{character sequence} +% +% All identifiers (keywords, directives, and such) consist of a letter +% followed by alpha-numeric characters (letters and digits). +% For example, if you write +% |keywords={one-two,\#include}|, +% the minus sign must become a digit and the sharp a letter since the +% keywords can't be detected otherwise. +% +% Table \ref{rStdCharTable} show the standard configuration of the +% \packagename{listings} package. The three keys overwrite the default +% behaviour. Each character of the sequence becomes a letter, digit +% and other, respectively. +% +% \item[0.20] \rkeyname{otherkeywords}|=|\marg{keywords} +% +% Defines keywords that contain other characters, or start with digits. +% Each given `keyword' is printed in keyword style, but without changing +% the `letter', `digit' and `other' status of the characters. This key +% is designed to define keywords like |=>|, |->|, |-->|, |--|, |::|, and +% so on. If one keyword is a subsequence of another (like |--| and +% |-->|), you must specify the shorter first. +% +% \item[0.20,,{renamed,optional}] \rkeyname{tag}|=|\meta{character}\meta{character}\syntaxor\rkeyname{tag}|={}|\label{uoption:tag} +% +% The first order keywords are active only between the first and second +% character. This key is used for HTML. +% \end{syntax} +% +% \begin{table}[tb] +% \caption{Standard character table}\label{rStdCharTable} +% \begin{tabular}{ll} +% class & characters\\ +% \noalign{\smallskip} +% letter & \texttt{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}\\ +% & \texttt{a b c d e f g h i j k l m n o p q r s t u v w x y z}\\ +% & \texttt{@ \textdollar\ } |_|\\ +% digit & \texttt{0 1 2 3 4 5 6 7 8 9}\\ +% other & \texttt{!\ " \#\ \%\ \&\ ' ( ) * + , - .\ / :\ ; < = > ?}\\ +% & {\catcode`\|=12\texttt{[ \char92\ ] \textasciicircum\ \char123\ | \char125\ \textasciitilde}}\\ +% space & chr(32)\\ +% tabulator & chr(9)\\ +% form feed & chr(12)\\ +% \noalign{\smallskip} +% \end{tabular} +% \par\noindent +% Note: Extended characters of codes 128--255 (if defined) are \emph{currently} +% letters. +% \end{table} +% +% +% \paragraph{Strings} +% \begin{syntax} +% \item[0.12] \rkeyname{string}|=|\oarg{\alternative{b,d,m,bd,s}}\marg{delimiter \textup(character\textup)} +% \item[0.21] \rkeyname{morestring}|=|\oarg{\alternative{b,d,m,bd,s}}\marg{delimiter} +% \item[0.21] \rkeyname{deletestring}|=|\oarg{\alternative{b,d,m,bd,s}}\marg{delimiter} +% +% define, add to or delete the delimiter from the list of string +% delimiters. Starting and ending delimiters are the same, i.e.~in the +% source code the delimiters must match each other. +% +% The optional argument is the type and controls the how the delimiter +% itself is represented in a string or character literal: it is escaped by a +% |b|ackslash, |d|oubled (or both is allowed via |bd|). Alternately, the +% type can refer to an unusual form of delimiter: |s|tring delimiters (akin +% to the |s| comment type) or |m|atlab-style delimiters. The latter is a +% special type for Ada and Matlab and possibly other languages where the +% string delimiters are also used for other purposes. It is equivalent +% to |d|, except that a string does not start after a letter, a right +% parenthesis, a right bracket, or some other characters. +% \end{syntax} +% +% +% \paragraph{Comments} +% \begin{syntax} +% \item[0.13] \rkeyname{comment}|=|\oarg{type}\meta{delimiter\textup(s\textup)} +% \item[0.21] \rkeyname{morecomment}|=|\oarg{type}\meta{delimiter\textup(s\textup)} +% \item[0.21] \rkeyname{deletecomment}|=|\oarg{type}\meta{delimiter\textup(s\textup)} +% +% Ditto for comments, but some types require more than a single +% delimiter. The following overview uses \keyname{morecomment} as the +% example, but the examples apply to \keyname{comment} and \keyname{deletecomment} +% as well. +% +% \item[0.13] \keyname{morecomment}|=[l]|\meta{delimiter} +% +% The delimiter starts a comment line, which in general starts with the +% delimiter and ends at end of line. If the character sequence |//| +% should start a comment line (like in \Cpp, Comal 80 or Java), +% |morecomment=[l]//| is the correct declaration. For Matlab it +% would be |morecomment=[l]\%|---note the preceding backslash. +% +% \item[0.13] \keyname{morecomment}|=[s]|\marg{delimiter}\marg{delimiter} +% +% Here we have two delimiters. The second ends a comment starting with +% the first delimiter. If you require two such comments you can use this +% type twice. C, Java, PL/I, Prolog and SQL all define single comments +% via |morecomment=[s]{/*}{*/}|, and Algol does it with +% |morecomment=[s]{\#}{\#}|, which means that the sharp delimits both +% beginning and end of a single comment. +% +% \item[0.13] \keyname{morecomment}|=[n]|\marg{delimiter}\marg{delimiter} +% +% is similar to type |s|, but comments can be nested. Identical arguments +% are not allowed---think a while about it! +% Modula-2 and Oberon-2 use |morecomment=[n]{(*}{*)}|. +% +% \item[0.18] \keyname{morecomment}|=[f]|\meta{delimiter} +% \item[0.18] \keyname{morecomment}|=[f][commentstyle]|\oarg{n=preceding columns}\meta{delimiter} +% +% The delimiter starts a comment line if and only if it appears on a +% fixed column-number, namely if it is in column $n$ (zero based). +% +% \item[0.17,,optional] \rkeyname{keywordcomment}|=|\marg{keywords} +% \item[0.21,,optional] \rkeyname{morekeywordcomment}|=|\marg{keywords} +% \item[0.21,,optional] \rkeyname{deletekeywordcomment}|=|\marg{keywords} +% +% A keyword comment begins with a keyword and ends with the same keyword. +% Consider |keywordcomment={comment,co}|. Then +% `\textbf{comment}\allowbreak\ldots\textbf{comment}' and +% `\textbf{co}\ldots\textbf{co}' are comments. +% +% \item[0.17,,optional] \rkeyname{keywordcommentsemicolon}|=|\marg{keywords}\marg{keywords}\marg{keywords} +% +% The definition of a `keyword comment semicolon' requires three keyword +% lists, e.g.~|{end}{else,end}{comment}|. A semicolon always ends such a +% comment. Any keyword of the first argument begins a comment and any +% keyword of the second argument ends it (and a semicolon also); +% a comment starting with any keyword of the third argument is terminated +% with the next semicolon only. In the example all possible comments are +% `\textbf{end}\ldots\textbf{else}', `\textbf{end}\ldots\textbf{end}' +% (does not start a comment again) and `\textbf{comment}\ldots;' and +% `\textbf{end}\ldots;'. +% Maybe a curious definition, but Algol and Simula use such comments. +% +% Note: The keywords here need not to be a subset of the defined +% keywords. They won't appear in keyword style if they aren't. +% +% \item[0.17,,optional] \rkeyname{podcomment}|=|\meta{\alternative{true,false}} +% +% activates or deactivates PODs---Perl specific. +% \end{syntax} +% +% +% \subsection{Installation}\label{rInstallation} +% +% \paragraph{Software installation} +% \begin{enumerate} +% \item Following the \TeX\ directory structure (TDS), you should put the files +% of the \packagename{listings} package into directories as follows: +% \begin{center} +% \begin{tabular}{lcl} +% \texttt{listings.pdf}&$\to$&\texttt{texmf/doc/latex/listings}\\ +% \texttt{listings.dtx}, \texttt{listings.ins},\\ +% \texttt{listings.ind}, \texttt{lstpatch.sty},\\ +% \texttt{lstdrvrs.dtx}&$\to$&\texttt{texmf/source/latex/listings} +% \end{tabular} +% \end{center} +% Note that you may not have a patch file \texttt{lstpatch.sty}. +% If you don't use the TDS, simply adjust the directories below. +% \item Create the directory \texttt{texmf/tex/latex/listings} or, if it exists +% already, remove all +% files except \texttt{lst}\meta{whatever}\texttt{0.sty} and +% \texttt{lstlocal.cfg} from it. +% \item Change the working directory to \texttt{texmf/source/latex/listings} +% and run \texttt{listings.ins} through \TeX. +% \item Move the generated files to \texttt{texmf/tex/latex/listings} if this +% is not already done. +% \begin{center} +% \begin{tabular}{lcl} +% \texttt{listings.sty}, \texttt{lstmisc.sty}, +% &&\qquad(kernel and add-ons)\\ +% \texttt{listings.cfg}, +% &&\qquad(configuration file)\\ +% \texttt{lstlang}\meta{number}\texttt{.sty}, +% &&\qquad(language drivers)\\ +% \texttt{lstpatch.sty}&$\to$&\texttt{texmf/tex/latex/listings} +% \end{tabular} +% \end{center} +% \item If your \TeX\ implementation uses a file name database, update it. +% \item If you receive a patch file later on, put it where +% \texttt{listings.sty} is (and update the file name database). +% \end{enumerate} +% Note that \packagename{listings} requires at least version 1.10 of the +% \packagename{keyval} package included in the \packagename{graphics} bundle by +% David Carlisle. +% +% +% \paragraph{Software configuration} +% Read this only if you encounter problems with the standard configuration or +% if you want the package to suit foreign languages, for example. +% +% Never modify a file from the \packagename{listings} package, in particular +% not the configuration file. Each new installation or new version overwrites +% it. The software license allows modification, but I can't recommend it. +% It's better to create one or more of the files +% \begin{center} +% \begin{tabular}{lcl} +% \texttt{lstmisc0.sty} & for & local add-ons +% (see the developer's guide),\\ +% \texttt{lstlang0.sty} & for & local language definitions +% (see \ref{rLanguageDefinitions}), and\\ +% \texttt{lstlocal.cfg} & as & local configuration file +% \end{tabular} +% \end{center} +% and put them in the same directory as the other \packagename{listings} files. +% These three files are not touched by a new installation unless you remove them. +% If \texttt{lstlocal.cfg} exists, it is loaded after \texttt{listings.cfg}. +% You might want to change one of the following parameters. +% \begin{syntax} +% \item[,,data] \rcmdname\lstaspectfiles\quad contains~\rlap{\texttt{\lstaspectfiles}} +% \item[,,data] \rcmdname\lstlanguagefiles\quad contains~\rlap{\texttt{\lstlanguagefiles}} +% +% The package uses the specified files to find add-ons and language +% definitions. +% \end{syntax} +% Moreover, you might want to adjust +% \icmdname\lstlistlistingname, +% \icmdname\lstlistingname, +% \ikeyname{defaultdialect}, +% \icmdname\lstalias, or +% \icmdname\lstalias +% \ as described in earlier sections. +% +% +% \section{Experimental features}\label{rExperimentalFeatures} +% +% This section describes the more or less unestablished parts of this package. +% It's unlikely that they will all be removed (unless stated explicitly), but +% they are liable to (heavy) changes and improvements. Such features have been +% \dag-marked in the last sections. So, if you find anything \dag-marked here, +% you should be very, very careful. +% +% +% \subsection{Listings inside arguments}\label{rListingsInsideArguments} +% +% There are some things to consider if you want to use |\lstinline| or the +% listing environment inside arguments. Since \TeX\ reads the argument before +% the `\lst-macro' is executed, this package can't do anything to preserve the +% input: spaces shrink to one space, the tabulator and the end of line are +% converted to spaces, \TeX's comment character is not printable, and so on. +% Hence, \emph{you} must work a bit more. You have to put a backslash in front +% of each of the following four characters: |\{}%|. Moreover you must protect +% spaces in the same manner if: (i) there are two or more spaces following each +% other or (ii) the space is the first character in the line. +% That's not enough: Each line must be terminated with a `line feed' |^^J|. +% And you can't escape to \LaTeX\ inside such listings! +% +% The easiest examples are with |\lstinline| since we need no line feed. +% \begin{verbatim} +%\footnote{\lstinline{var i:integer;} and +% \lstinline!protected\ \ spaces! and +% \fbox{\lstinline!\\\{\}\%!}}\end{verbatim} +% yields\lstset{language=Pascal}\footnote{\lstinline{var i:integer;} and +% \lstinline!protected\ \ spaces! and +% \fbox{\lstinline!\\\{\}\%!}} +% if the current language is Pascal. Note that this example shows another +% experimental feature: use of argument braces as delimiters. This is +% described in section \ref{rTypesettingListings}. +% +% And now an environment example: +% \begin{lstsample}{\lstset{language={}}}{} +% \fbox{% +% \begin{lstlisting}^^J +% \ !"#$\%&'()*+,-./^^J +% 0123456789:;<=>?^^J +% @ABCDEFGHIJKLMNO^^J +% PQRSTUVWXYZ[\\]^_^^J +% `abcdefghijklmno^^J +% pqrstuvwxyz\{|\}~^^J +% \end{lstlisting}} +% \end{lstsample} +% \begin{advise} +% \item You might wonder that this feature is still experimental. The reason: +% You shouldn't use listings inside arguments; it's not always safe. +% \end{advise} +% +% +% \subsection{\dag\ Export of identifiers}\label{rExportOfIdentifiers} +% +% It would be nice to export function or procedure names. In general that's a +% dream so far. The problem is that programming languages use various syntaxes +% for function and procedure declaration or definition. A general interface is +% completely out of the scope of this package---that's the work of a compiler +% and not of a pretty-printing tool. However, it is possible for particular +% languages: in Pascal, for instance, each function or procedure definition and +% variable declaration is preceded by a particular keyword. +% Note that you must request the following keys with the \texttt{procnames} option: +% |\usepackage[procnames]{listings}|. +% \begin{syntax} +% \item[0.19,{{}},{\dag optional}] \rkeyname{procnamekeys}|=|\marg{keywords} +% \item[0.21,,\dag optional] \rkeyname{moreprocnamekeys}|=|\marg{keywords} +% \item[0.21,,\dag optional] \rkeyname{deleteprocnamekeys}|=|\marg{keywords} +% +% each specified keyword indicates a function or procedure definition. +% Any identifier following such a keyword appears in `procname' style. +% For Pascal you might use\vspace{-.5\baselineskip} +% \begin{verbatim} +% procnamekeys={program,procedure,function}\end{verbatim} +% +% \item[0.19,keywordstyle,\dag optional] \rkeyname{procnamestyle}|=|\meta{style} +% +% defines the style in which procedure and function names appear. +% +% \item[0.19,false,\dag optional] \rkeyname{indexprocnames}|=|\meta{\alternative{true,false}} +% +% If activated, procedure and function names are also indexed. +% \end{syntax} +% \begin{TODO} +% The \aspectname{procnames} aspect is unsatisfactory (and has been unchanged +% at least since 2000). It marks and indexes the function definitions so far, but +% it would be possible to mark also the following function calls, for example. +% A key could control whether function names are added to a special keyword +% class, which then appears in `procname' style. But should these names be +% added globally? There are good reasons for both. Of course, we would also +% need a key to reset the name list. +% \end{TODO} +% +% +% \subsection{\dag\ Hyperlink references}\label{rHyperReferences} +% +% This very small aspect must be requested via the \texttt{hyper} option since it +% is experimental. One possibility for the future is to combine this aspect +% with \aspectname{procnames}. Then it should be possible to click on a +% function name and jump to its definition, for example. +% \begin{syntax} +% \item[0.21,,{\dag optional}] \rkeyname{hyperref}|=|\marg{identifiers} +% \item[0.21,,{\dag optional}] \rkeyname{morehyperref}|=|\marg{identifiers} +% \item[0.21,,{\dag optional}] \rkeyname{deletehyperref}|=|\marg{identifiers} +% +% hyperlink the specified identifiers (via \packagename{hyperref} +% package). A `click' on such an identifier jumps to the previous +% occurrence. +% +% \item[0.21,\hyper@@anchor,{\dag optional}] \rkeyname{hyperanchor}|=|\meta{two-parameter macro} +% \item[0.21,\hyperlink,{\dag optional}] \rkeyname{hyperlink}|=|\meta{two-parameter macro} +% +% set a hyperlink anchor and link, respectively. +% The defaults are suited for the \packagename{hyperref} package. +% \end{syntax} +% +% +% \subsection{Literate programming} +% +% We begin with an example and hide the crucial key=value list. +% \begin{lstsample}{\lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}}{} +% \begin{lstlisting} +% var i:integer; +% +% if (i<=0) i := 1; +% if (i>=0) i := 0; +% if (i<>0) i := 0; +% \end{lstlisting} +% \end{lstsample} +% Funny, isn't it? We could leave |i := 0| in our listings instead of +% i| |$\gets$| |0, but that's not literate! ^^A :-) +% Now you might want to know how this has been done. Have a \emph{close} +% look at the following key. +% \begin{syntax} +% \item[0.20,,\dag] \rkeyname{literate}|=|[|*|]\meta{replacement item}\ldots\meta{replacement item} +% +% First note that there are no commas between the items. Each item +% consists of three arguments: +% \marg{replace}\marg{replacement text}\marg{length}. +% \meta{replace} is the original character sequence. +% Instead of printing these characters, we use \meta{replacement text}, +% which takes the width of \meta{length} characters in the output. +% +% Each `printing unit' in \meta{replacement text} \emph{must} be in braces +% unless it's a single character. For example, you must put braces +% around |$\leq$|. +% If you want to replace |<-1->| by |$\leftarrow1\rightarrow$|, the +% replacement item would be |{<-1->}{{$\leftarrow$}1{$\rightarrow$}}3|. +% Note the braces around the arrows. +% +% If one \meta{replace} is a subsequence of another \meta{replace}, you +% must define the shorter sequence first. For example, |{-}| must be defined +% before |{--}| and this before |{-->}|. +% +% The optional star indicates that literate replacements should not be +% made in strings, comments, and other delimited text. +% \end{syntax} +% In the example above, I've used +% \begin{verbatim} +% literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1\end{verbatim} +% \begin{TODO} +% Of course, it's good to have keys for adding and removing single +% \meta{replacement item}s. Maybe the key(s) should work in the same fashion +% as the string and comment definitions, i.e.~one item per key=value. +% This way it would be easier to provide better auto-detection in case of a +% subsequence. +% \end{TODO} +% +% +% \subsection{\textsf{LGrind} definitions}\label{rLGrindDefinitions} +% +% Yes, it's a nasty idea to steal language definitions from other programs. +% Nevertheless, it's possible for the \packagename{LGrind} definition +% file---at least partially. Please note that this file must be found by +% \TeX. +% \begin{syntax} +% \item[0.21,,{optional}] \rkeyname{lgrindef}|=|\meta{language} +% +% scans the \texttt{lgrindef} language definition file for +% \meta{language} and activates it if present. Note that not all +% \packagename{LGrind} capabilities have a \packagename{listings} +% analogue. +% +% Note that `Linda' language doesn't work properly since it defines +% compiler directives with preceding `|#|' as keywords. +% +% \item[0.21,lgrindef.,{data,optional}] \rcmdname\lstlgrindeffile +% +% contains the (path and) name of the definition file. +% \end{syntax} +% +% +% \subsection{\dag\ Automatic formatting} +% +% \lstloadaspects{formats}^^A +% The automatic source code formatting is far away from being good. First of +% all, there are no general rules on how source code should be formatted. So +% `format definitions' must be flexible. This flexibility requires a complex +% interface, a powerful `format definition' parser, and lots of code lines +% behind the scenes. Currently, format definitions aren't flexible enough +% (possibly not the definitions but the results). A single `format item' has +% the form +% \begin{itemize}\item[] +% \meta{input chars}|=|\oarg{exceptional chars}\meta{pre}\oarg{\texttt{\string\string}}\meta{post} +% \end{itemize} +% Whenever \meta{input chars} aren't followed by one of the \meta{exceptional +% chars}, formatting is done according to the rest of the value. If |\string| +% isn't specified, the input characters aren't printed (except it's an +% identifier or keyword). Otherwise \meta{pre} is `executed' before printing +% the original character string and \meta{post} afterwards. These two are +% `subsets' of +% \begin{itemize} +% \item |\newline| ---ensuring a new line; +% \item |\space| ---ensuring a whitespace; +% \item |\indent| ---increasing indention; +% \item |\noindent| ---descreasing indention. +% \end{itemize} +% Now we can give an example.\lstaspectindex{\lstdefineformat}{}\lstaspectindex{format}{} +% \begin{lstxsample} +% \lstdefineformat{C}{% +% \{=\newline\string\newline\indent,% +% \}=\newline\noindent\string\newline,% +% ;=[\ ]\string\space} +% \end{lstxsample} +% \begin{lstsample}{\lstset{language={}}}{} +% \begin{lstlisting}[format=C] +% for (int i=0;i<10; i++){/* wait */}; +% \end{lstlisting} +% \end{lstsample} +% Not good. But there is a (too?) simple work-around: +% \begin{lstxsample} +% \lstdefineformat{C}{% +% \{=\newline\string\newline\indent,% +% \}=[;]\newline\noindent\string\newline,% +% \};=\newline\noindent\string\newline,% +% ;=[\ ]\string\space} +% \end{lstxsample} +% \begin{lstsample}{\lstset{language={}}}{} +% \begin{lstlisting}[format=C] +% for (int i=0;i<10; i++){/* wait */}; +% \end{lstlisting} +% \end{lstsample} +% Sometimes the problem is just to find a suitable format definition. +% Further formatting is complicated. +% Here are only three examples with increasing level of difficulty. +% \begin{enumerate} +% \item Insert horizontal space to separate function/procedure name and +% following parenthesis or to separate arguments of a function, +% e.g.~add the space after a comma (if inside function call). +% \item Smart breaking of long lines. Consider long `and/or' expressions. +% Formatting should follow the logical structure! +% \item Context sensitive formatting rules. It can be annoying if empty +% or small blocks take three or more lines in the output---think of +% scrolling down all the time. So it would be nice if the block +% formatting was context sensitive. +% \end{enumerate} +% Note that this is a very first and clumsy attempt to provide automatic +% formatting---clumsy since the problem isn't trivial. Any ideas are welcome. +% Implementations also. Eventually you should know that you must request format +% definitions at package loading, e.g.~via |\usepackage[formats]{listings}|. +% +% \subsection{Arbitrary linerange markers}\label{rArbitraryLinerangeMarkers} +% +% Instead of using \keyname{linerange} with line numbers, one can use text +% markers. Each such marker consists of a \meta{prefix}, a \meta{text}, and a +% \meta{suffix}. You once (or more) define prefixes and suffixes and then use +% the marker text instead of the line numbers. +% \begin{lstxsample} +% \lstset{rangeprefix=\{\ ,% curly left brace plus space +% rangesuffix=\ \}}% space plus curly right brace +% \end{lstxsample} +% \begin{lstsample}{}{} +% \begin{lstlisting}% +% [linerange=loop\ 2-end] +% { loop 1 } +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% { end } +% { loop 2 } +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% { end } +% \end{lstlisting} +% \end{lstsample} +% Note that \TeX's special characters like the curly braces, the space, the +% percent sign, and such must be escaped with a backslash. +% \begin{syntax} +% \item[1.2] \rkeyname{rangebeginprefix}|=|\meta{prefix} +% \item[1.2] \rkeyname{rangebeginsuffix}|=|\meta{suffix} +% \item[1.2] \rkeyname{rangeendprefix}|=|\meta{prefix} +% \item[1.2] \rkeyname{rangeendsuffix}|=|\meta{suffix} +% +% define individual prefixes and suffixes for the begin- and end-marker. +% +% \item[1.2] \rkeyname{rangeprefix}|=|\meta{prefix} +% \item[1.2] \rkeyname{rangesuffix}|=|\meta{suffix} +% +% define identical prefixes and suffixes for the begin- and end-marker. +% +% \item[1.2,true] \rkeyname{includerangemarker}|=|\meta{\alternative{true,false}} +% +% shows or hides the markers in the output. +% \end{syntax} +% \begin{lstsample}{\lstset{rangeprefix=\{\ ,rangesuffix=\ \}}}{} +% \begin{lstlisting}% +% [linerange=loop\ 1-end, +% includerangemarker=false, +% frame=single] +% { loop 1 } +% for i:=maxint to 0 do +% begin +% { do nothing } +% end; +% { end } +% \end{lstlisting} +% \end{lstsample} +% +% +% \subsection{Multicolumn Listings}\label{rMulticolumnListings} +% +% When the \packagename{multicol} package is loaded, it can be used to typeset +% multi-column listings. These are specified with the |multicols| key. For +% example: +% \begin{lstsample}{}{} +% \begin{lstlisting}[multicols=2] +% if (i < 0) +% i = 0 +% j = 1 +% end if +% if (j < 0) +% j = 0 +% end if +% \end{lstlisting} +% \end{lstsample} +% +% The multicolumn option is known to fail with some keys. +% +% \begin{advise} +% \item Which keys? +% \advisespace +% Unfortunately, I don't know. Carsten left the code for this option +% in the version 1.3b patch file with only that cryptic note for +% documentation. Bug reports would be welcome, though I don't promise +% that they're fixable. ---Brooks +% \end{advise} +% +% +%\iffalse +% \section{Forthcoming ?} +% +% This section is rather rudimentary. It just lists some things I don't want +% to forget. +% +% First of all, I'd like to support even more languages, for example Maple, +% PostScript, and so on. Fortunately my lifetime is limited, so other +% people may do that work. Please (e-)mail me your language definitions. +% +% Then, there are several ideas for the future. Some have already been stated +% as `to do's; some came from other people and are stated below; some more are +% far from being implemented, +% e.g.~\keyname{linerange}|=|\oarg{inter}\marg{line range list} +% which prints all lines in the range and executes \meta{inter} when omitting +% some code lines. The main problem here are frames and background colours; +% what should happen to them? In fact, the problem is how this can be coded. +% Another idea is to change the background colour (or the basic style) for +% particular code blocks. This, too, is not easy. +% +%^^A Auto-detect whether surplus space (from spaces and tabs) isn't needed to fix +%^^A alignment of wide character combinations like |==| or |<>|. +%^^A +%^^A Make package compatible to calc package. +%^^A +%^^A Rewrite \lst@LAS, \lst@DefDriver, \lst@Require to distinguish loading +%^^A of languages (which don't need base languages at once) and aspects +%^^A (which need required aspects to be loaded). +% +% \lsthelper{Vincent~Poirriez}{1999/11/18}{code examples inside caml comments}: +% Inside caml comments, |[| and |]| should print the code in +% between in basicstyle (or another newly introduced style). Nesting of these +% `code example delimiters' is allowed, e.g.~|(* [[x;y]] *)|. +% +% \lsthelper{Claus~Atzenbeck}{1999/12/03}{`extendedchars=false' doesn't issue +% warning when extended characters are used}: issue warning in final mode if +% \ikeyname{extendedchars}|=false| but extended chars are used. +% +% \lsthelper{Andreas~Matthias}{2000/01/04}{define header/footer to print +% the listing name}: Make the header/footer print the listing name. Some +% people asked for continued captions. +%\fi +% +% +% \part{Tips and tricks} +% +% Note: This part of the documentation is under construction. +% Section \ref{uHowTos} must be sorted by topic and ordered in some way. +% Moreover a new section `Examples' is planned, but not written. +% Lack of time is the main problem \ldots +% +% +% \section{Troubleshooting}\label{uTroubleshooting} +% +% If you're faced with a problem with the \packagename{listings} package, there are +% some steps you should undergo before you make a bug report. First you should +% consult the reference guide to see whether the problem is already known. If not, +% create a \emph{minimal} file which reproduces the problem. Follow these +% instructions: +% \begin{enumerate} +% \item Start from the minimal file in section \ref{uAMinimalFile}. +% \item Add the \LaTeX\ code which causes the problem, but keep it short. +% In particular, keep the number of additional packages small. +% \item Remove some code from the file (and the according packages) until the +% problem disappears. Then you've found a crucial piece. +% \item Add this piece of code again and start over with step 3 until all code +% and all packages are substantial. +% \item You now have a minimal file. Send a bug report to the address on the +% first page of this documentation and include the minimal file together +% with the created \texttt{.log}-file. If you use a very special package +% (i.e.~one not on CTAN), also include the package if its software license +% allows it. +% \end{enumerate} +% +% +% \section{How tos}\label{uHowTos} +% +% +% \subsubsection*{How to reference line numbers} +% Perhaps you want to put |\label{|\meta{whatever}|}| into a \LaTeX\ escape which is +% inside a comment whose delimiters aren't printed? If you did that, the compiler +% won't see the \LaTeX\ code since it would be inside a comment, and the +% \packagename{listings} package wouldn't print anything since the delimiters would +% be dropped and |\label| doesn't produce any printable output, but you could still +% reference the line number. Well, your wish is granted. +% +% In Pascal, for example, you could make the package recognize the `special' +% comment delimiters |(*@| and |@*)| as begin-escape and end-escape sequences. +% Then you can use this special comment for |\label|s and other things. +% \begin{lstsample}{\lstset{numberstyle=\tiny,stepnumber=2,numbersep=5pt}}{} +% \lstset{escapeinside={(*@}{@*)}} +% +% \begin{lstlisting} +% for i:=maxint to 0 do +% begin +% { comment }(*@\label{comment}@*) +% end; +% \end{lstlisting} +% Line \ref{comment} shows a comment. +% \end{lstsample} +% \begin{advise} +% \item Can I use `|(*@|' and `|*)|' instead? +% \advisespace +% Yes. +% \item Can I use `|(*|' and `|*)|' instead? +% \advisespace +% Sure. If you want this. +% \item Can I use `|{@|' and `|@}|' instead? +% \advisespace +% No, never! The second delimiter is not allowed. The character `|@|' is +% defined to check whether the escape is over. But reading the lonely +% `end-argument' brace, \TeX\ encounters the error `\texttt{Argument of @ +% has an extra \char125}'. Sorry. +% \item Can I use `|{|' and `|}|' instead? +% \advisespace +% No. Again the second delimiter is not allowed. Here now \TeX\ would +% give you a `\texttt{Runaway argument}' error. Since `|}|' is defined to +% check whether the escape is over, it won't work as `end-argument' brace. +% \item And how can I use a comment line? +% \advisespace +% For example, write `|escapeinside={//*}{\^^M}|'. Here |\^^M| represents +% the end of line character. +% \end{advise} +% +% +% \subsubsection*{How to gobble characters} +% To make your \LaTeX\ code more readable, you might want to indent your +% \texttt{lstlisting} listings. This indention should not show up in the +% pretty-printed listings, however, so it must be removed. If you indent each code +% line by three characters, you can remove them via |gobble=3|: +% \begin{lstsample}{}{\lstset{showspaces}} +% \begin{lstlisting}[gobble=3] +% 1 for i:=maxint to 0 do +% 2 begin +% 3 { do nothing } +% 123end; +% +% Write('Case insensitive '); +% WritE('Pascal keywords.'); +% \end{lstlisting} +% \end{lstsample} +% Note that empty lines and the beginning and the end of the environment +% need not respect the indention. However, never indent the end by more than +% `\ikeyname{gobble}' characters. Moreover note that tabulators expand to +% |tabsize| spaces before we gobble. +% \begin{advise} +% \item Could I use `\ikeyname{gobble}' together with `|\lstinputlisting|'? +% \advisespace +% Yes, but it has no effect. +% +% \item Note that `\ikeyname{gobble}' can also be set via `|\lstset|'. +% \end{advise} +% +% +% \subsubsection*{How to include graphics} +% \lsthelper{Herbert~Weinhandl}{1999/09/06}{listings + eps} found a very easy +% way to include graphics in listings. Thanks for contributing this idea---an +% idea I would never have had. +% +% Some programming languages allow the dollar sign to be part of an identifier. +% But except for intermediate function names or library functions, this +% character is most often unused. The \packagename{listings} package defines +% the \ikeyname{mathescape} key, which lets `|$|' escape to \TeX's math mode. +% This makes the dollar character an excellent candidate for our purpose here: +% use a package which can include a graphic, set \ikeyname{mathescape} true, +% and include the graphic between two dollar signs, which are inside a comment. +% +% The following example is originally from a header file I got from Herbert. +% For the presentation here I use the \texttt{lstlisting} environment and an +% excerpt from the header file. The |\includegraphics| command is from +% David Carlisle's \packagename{graphics} bundle. +% \begin{verbatim} +% \begin{lstlisting}[mathescape=true] +% /* +% $ \includegraphics[height=1cm]{defs-p1.eps} $ +% */ +% typedef struct { +% Atom_T *V_ptr; /* pointer to Vacancy in grid */ +% Atom_T *x_ptr; /* pointer to (A|B) Atom in grid */ +% } ABV_Pair_T; +% \end{lstlisting}\end{verbatim} +% The result looks pretty good. Unfortunately you can't see it, because the +% graphic wasn't available when the manual was typeset. +% +% +% \subsubsection*{How to get closed frames on each page} +% The package supports closed frames only for listings which don't cross pages. +% If a listing is split on two pages, there is neither a bottom rule at the +% bottom of a page, nor a top rule on the following page. If you insist on +% these rules, you might want to use \texttt{framed.sty} by Donald Arseneau. +% Then you could write +% \begin{verbatim} +% \begin{framed} +% \begin{lstlisting} +% or \lstinputlisting{...} +% \end{lstlisting} +% \end{framed}\end{verbatim} +% The package also provides a \texttt{shaded} environment. If you use it, you +% shouldn't forget to define \texttt{shadecolor} with the \packagename{color} +% package. +% +% +% \subsubsection*{How to print national characters with $\Lambda$ and \packagename{listings}}\label{uNationalCharacters} +% +% Apart from typing in national characters directly, you can use the `escape' +% feature described in section \ref{rEscapingToLaTeX}. +% The keys \ikeyname{escapechar}, \ikeyname{escapeinside}, and \ikeyname{texcl} +% allow partial usage of \LaTeX\ code. +% +% Now, if you use $\Lambda$ (Lambda, the \LaTeX\ variant for Omega) and want, +% for example, Arabic comment lines, you need not write |\begin{arab}| +% \ldots\ |\end{arab}| each escaped comment line. This can be automated: +% \begin{verbatim} +% \lstset{escapebegin=\begin{arab},escapeend=\end{arab}} +% +% \begin{lstlisting}[texcl] +% // Replace text by Arabic comment. +% for (int i=0; i<1; i++) { }; +% \end{lstlisting}\end{verbatim} +% If your programming language doesn't have comment lines, you'll have to use +% \ikeyname{escapechar} or \ikeyname{escapeinside}: +% \begin{verbatim} +% \lstset{escapebegin=\begin{greek},escapeend=\end{greek}} +% +% \begin{lstlisting}[escapeinside=`'] +% /* `Replace text by Greek comment.' */ +% for (int i=0; i<1; i++) { }; +% \end{lstlisting}\end{verbatim} +% Note that the delimiters |`| and |'| are essential here. The example doesn't +% work without them. There is a more clever way if the comment delimiters of +% the programming language are single characters, like the braces in Pascal: +% \begin{verbatim} +% \lstset{escapebegin=\textbraceleft\begin{arab}, +% escapeend=\end{arab}\textbraceright} +% +% \begin{lstlisting}[escapeinside=\{\}] +% for i:=maxint to 0 do +% begin +% { Replace text by Arabic comment. } +% end; +% \end{lstlisting}\end{verbatim} +% Please note that the `interface' to $\Lambda$ is completely untested. +% Reports are welcome! +% +% +% \subsubsection*{How to get bold typewriter type keywords} +% Use the \href{http://www.ctan.org/tex-archive/fonts/luximono}{\packagename{LuxiMono}} package. +% +% \iffalse +% Many people asked for bold typewriter fonts since they aren't included in +% the \LaTeX\ standard distribution. Here now one answer on how to use them +% in spite of that. +% \begin{advise} +% \item Please note that I personally don't regard the following as a good +% solution. Such a bold typewriter type is too heavy. It would be better +% to use a light version of \texttt{cmtt} as basic font and \texttt{cmtt} +% or a \emph{slightly} heavier type for keywords. +% +% \item Why don't you tell us how to use the better solution? +% \advisespace +% A light version of \texttt{cmtt} doesn't exist. If it's once available, +% you can do a similar job as described below. +% \end{advise} +% First of all, you'll need Metafont source files for bold typewriter, e.g.~ +% \texttt{cmbtt8.mf}, \texttt{cmbtt9.mf} and \texttt{cmbtt10.mf} from +% \href{ftp://ftp.dante.de/tex-archive/fonts/cm/mf-extra/bold} +% {CTAN/fonts/cm/mf-extra/bold}. +% Secondly you have to create \texttt{.tfm}-files, i.e.~run the Metafont +% program on these sources. This is possibly done automatically when you use +% the fonts in a document. Finally you must tell \LaTeX\ that you've installed +% bold typewriter fonts. Just use +% \begin{verbatim} +% \DeclareFontShape{OT1}{cmtt}{bx}{n} +% {<5><6><7><8>cmbtt8% +% <9>cmbtt9% +% <10><10.95>cmbtt10% +% <12><14.4><17.28><20.74><24.88>cmbtt10% +% }{}\end{verbatim} +% in the preamble of your document. If you use these fonts often, you might +% want to make a local copy of \texttt{ot1cmtt.fd} and replace the declaration +% there. But note that you're not allowed to distributed the modified file +% under its original name! +% \fi +% +% +% \subsubsection*{How to work with plain text} +% If you want to use \packagename{listings} to set plain text (perhaps with +% line numbers, or like |verbatim| but with line wrapping, or so forth, use +% the empty language: |\lstset{language=}|. +% +% +% \subsubsection*{How to get the developer's guide} +% In the \emph{source directory} of the listings package, i.e.~where +% the \texttt{.dtx} files are, create the file \texttt{ltxdoc.cfg} with the +% following contents. +% \begin{verbatim} +% \AtBeginDocument{\AlsoImplementation}\end{verbatim} +% Then run \texttt{listings.dtx} through \LaTeX\ twice, run Makeindex (with +% the |-s gind.ist| option), and then run \LaTeX\ one last time on +% \texttt{listings.dtx}. This creates the whole documentation including User's +% guide, Reference guide, Developer's guide, and Implementation. +% +% +% \makeatletter +%^^A \def\index@prologue{\section*{Index}\markboth{Index}{Index}} +% \def\index@prologue{\part{Index}\markboth{Index}{Index}} +% \makeatother +%^^A \StopEventually{\lstcheckreference\setcounter{IndexColumns}{2}\PrintIndex} +% \StopEventually{\setcounter{IndexColumns}{2}\PrintIndex} +% +% +% \part{Developer's guide} +% +% First I must apologize for this developer's guide since some parts are not +% explained as well as possible. But note that you are in a pretty good shape: +% this developer's guide exists! ^^A :-) +% You might want to peek into section \ref{dPackageExtensions} before reading +% section \ref{dBasicConcepts}. +% +% +% \section{Basic concepts}\label{dBasicConcepts} +% +% The functionality of the \packagename{listings} package appears to be +% divided into two parts: on the one hand commands which actually typeset +% listings and on the other via |\lstset| adjustable parameters. Both could +% be implemented in terms of \lst-aspects, which are simply collections of +% public keys and commands and internal hooks and definitions. The package +% defines a couple of aspects, in particular the kernel, the main engine. +% Other aspects drive this engine, and language and style definitions tell +% the aspects how to drive. The relations between car, driver and assistant +% driver are exactly reproduced---and I'll be your driving instructor. +% +% +% \subsection{Package loading}\label{dPackageLoading} +% +% Each option in |\usepackage[|\meta{options}|]{listings}| loads an aspect or +% \emph{prevents} the package from loading it if the aspect name is +% \emph{preceded by an exclamation mark}. This mechanism was designed to clear +% up the dependencies of different package parts and to debug the package. For +% this reason there is another option: +% \begin{syntax} +% \item[0.21,,option] \texttt{noaspects}\leavevmode +% +% deletes the list of aspects to load. Note that, for example, the +% option lists |0.21,!labels,noaspects| and |noaspects| are essentially +% the same: the kernel is loaded and no other aspect. +% \end{syntax} +% This is especially useful for aspect-testing since we can load exactly the +% required parts. Note, however, that an aspect is loaded later if a predefined +% programming language requests it. One can load aspects also by hand: +% \begin{syntax} +% \item[0.20] |\lstloadaspects|\marg{comma separated list of aspect names} +% +% loads the specified aspects if they are not already loaded. +% \end{syntax} +% Here now is a list of all aspects and related keys and commands---in the hope +% that this list is complete. +% \begin{description} +% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth\relax +% \item[\aspectname{strings}]\leavevmode +% +% \lstprintaspectkeysandcmds{strings} +% +% \item[\aspectname{comments}]\leavevmode +% +% \lstprintaspectkeysandcmds{comments} +% +% \item[\aspectname{pod}]\leavevmode +% +% \lstprintaspectkeysandcmds{pod} +% +% \item[\aspectname{escape}]\leavevmode +% +% \lstprintaspectkeysandcmds{escape} +% +% \item[\aspectname{writefile}] requires 1 |\toks|, 1 |\write| +% +% |\lst@BeginWriteFile|, |\lst@BeginAlsoWriteFile|, |\lst@EndWriteFile| +% +% \item[\aspectname{style}]\leavevmode +% +% empty style, \lstprintaspectkeysandcmds{style} +% +% \item[\aspectname{language}]\leavevmode +% +% empty language, \lstprintaspectkeysandcmds{language} +% +% \item[\aspectname{keywords}]\leavevmode +% +% \lstprintaspectkeysandcmds{keywords} +% +% \item[\aspectname{emph}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{emph} +% +% \item[\aspectname{html}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{html} +% +% \item[\aspectname{tex}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{tex} +% +% \item[\aspectname{directives}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{directives} +% +% \item[\aspectname{index}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{index} +% +% \item[\aspectname{procnames}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{procnames} +% +% \item[\aspectname{keywordcomments}] +% requires \aspectname{keywords}, \aspectname{comments} +% +% \lstprintaspectkeysandcmds{keywordcomments} +% +% \item[\aspectname{labels}] requires 2 |\count| +% +% \lstprintaspectkeysandcmds{labels} +% +% \item[\aspectname{lineshape}] requires 2 |\dimen| +% +% \lstprintaspectkeysandcmds{lineshape} +% +% \item[\aspectname{frames}] requires \aspectname{lineshape} +% +% \lstprintaspectkeysandcmds{frames} +% +% \item[\aspectname{make}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{make} +% +% \item[\aspectname{doc}] requires \aspectname{writefile} and 1 |\box| +% +% \lstprintaspectkeysandcmds{doc} +% +% \item[\aspectname{0.21}] defines old keys in terms of the new ones. +% \item[\aspectname{fancyvrb}] requires 1 |\box| +% +% \lstprintaspectkeysandcmds{fancyvrb} +% +% \item[\aspectname{lgrind}]\leavevmode +% +% \lstprintaspectkeysandcmds{lgrind} +% +% \item[\aspectname{hyper}] requires \aspectname{keywords} +% +% \lstprintaspectkeysandcmds{hyper} +% \end{description} +% The kernel allocates 6 |\count|, 4 |\dimen| and 1 |\toks|. +% Moreover it defines the following keys, commands, and environments: +% \begin{itemize}\item[] +% \hyphenpenalty=10000\relax \rightskip=0pt plus \linewidth\relax +% \lstprintaspectkeysandcmds{kernel}, \keyname{fancyvrb} +% \end{itemize} +% +% +% \subsection{How to define \lst-aspects}\label{dHowToDefineLstAspects} +% +% There are at least three ways to add new functionality: (a) you write an +% aspect of general interest, send it to me, and I'll just paste it into the +% implementation; (b) you write a `local' aspect not of general interest; or +% (c) you have an idea for an aspect and make me writing it. (a) and (b) are +% good choices.^^A :-) +% +% An aspect definition starts with |\lst@BeginAspect| plus arguments and ends +% with the next |\lst@EndAspect|. In particular, aspect definitions can't be +% nested. +% \begin{syntax} +% \item[0.20] |\lst@BeginAspect|[\oarg{list of required aspects}]\marg{aspect name} +% \item[0.20] |\lst@EndAspect| +% \end{syntax} +% The optional list is a comma separated list of required aspect names. +% The complete aspect is not defined in each of the following cases: +% \begin{enumerate} +% \item \meta{aspect name} is empty. +% \item The aspect is already defined. +% \item A required aspect is neither defined nor loadable via +% |\lstloadaspects|. +% \end{enumerate} +% Consequently you can't define a part of an aspect and later on another part. +% But it is possible to define aspect $A_1$ and later aspect $A_2$ which +% requires $A_1$. +% \begin{advise} +% \item Put local add-ons into `\texttt{lstmisc0.sty}'---this file is searched +% first by default. If you want to make add-ons for one particular +% document just replace the surrounding `|\lst@BeginAspect|' and +% `|\lst@EndAspect|' by `|\makeatletter|' and `|\makeatother|' and use +% the definitions in the preamble of your document. However, you have to +% load required aspects on your own. +% \end{advise} +% You can put any \TeX\ material in between the two commands, but note that +% definitions must be |\global| if you need them later---\LaTeX's |\newcommand| +% makes local definitions and can't be preceded by |\global|. So use the +% following commands, |\gdef|, and commands described in later sections. +% \begin{syntax} +% \item[0.20] |\lst@UserCommand|\meta{macro}\meta{parameter text}\marg{replacement text} +% +% The macro is (mainly) equivalent to |\gdef|. The purpose is to +% distinguish user commands and internal global definitions. +% +% \item[0.19] |\lst@Key|\marg{key name}\marg{init value}[\oarg{default value}]\marg{definition} +% \item[0.19] |\lst@Key|\marg{key name}|\relax|[\oarg{default value}]\marg{definition} +% +% defines a key using the \packagename{keyval} package from David +% Carlisle. \meta{definition} is the replacement text of a macro with +% one parameter. The argument is either the value from `key=value' or +% \meta{default value} if no `=value' is given. The helper macros +% |\lstKV@...| below might simplify \meta{definition}. +% +% The key is not initialized if the second argument is |\relax|. +% Otherwise \meta{init value} is the initial value given to the key. +% Note that we locally switch to |\globalsdefs=1| to ensure that +% initialization is not effected by grouping. +% +% \item[0.19] |\lst@AddToHook|\marg{name of hook}\marg{\TeX\ material} +% +% adds \TeX\ material at predefined points. Section \ref{dHooks} lists +% all hooks and where they are defined respectively executed. +% |\lst@AddToHook{A}{\csa}| before |\lst@AddToHook{A}{\csb}| +% \emph{does not} guarantee that |\csa| is executed before |\csb|. +% +% \item[0.20] |\lst@AddToHookExe|\marg{name of hook}\marg{\TeX\ material} +% +% also executes \meta{\TeX\ material} for initialization. You might use +% local variables---local in the sense of \TeX\ and/or usual programming +% languages---but when the code is executed for initialization all +% assignments are global: we set |\globaldefs| locally to one. +% +% \item[0.20] |\lst@UseHook|\marg{name of hook} +% +% executes the hook. +% \end{syntax} +% \begin{advise} +% \item Let's look at two examples. The first extends the package by adding +% some hook-material. If you want status messages, you might write +% \begin{verbatim} +% \lst@AddToHook{Init}{\message{\MessageBreak Processing listing ...}} +% \lst@AddToHook{DeInit}{\message{complete.\MessageBreak}}\end{verbatim} +% The second example introduces two keys to let the user control the +% messages. The macro |\lst@AddTo| is described in section +% \ref{dGeneralPurposeMacros}. +% \begin{verbatim} +% \lst@BeginAspect{message} +% \lst@Key{message}{Annoying message.}{\gdef\lst@message{#1}} +% \lst@Key{moremessage}\relax{\lst@AddTo\lst@message{\MessageBreak#1}} +% \lst@AddToHook{Init}{\typeout{\MessageBreak\lst@message}} +% \lst@EndAspect\end{verbatim} +% However, there are certainly aspects which are more useful. +% \end{advise} +% The following macros can be used in the \meta{definition} argument of the +% |\lst@Key| command to evaluate the argument. The additional prefix |KV| +% refers to the \packagename{keyval} package. +% \begin{syntax} +% \item[0.19] |\lstKV@SetIf|\marg{value}\meta{if macro} +% +% \meta{if macro} becomes |\iftrue| if the first character of +% \meta{value} equals |t| or |T|. Otherwise it becomes |\iffalse|. +% Usually you will use |#1| as \meta{value}. +% +% \item[1.0] \cs{lstKV@SwitchCases}\marg{value}\\ +% |{|\meta{string 1}|&|\meta{execute 1}|\\|\\ +% | |\meta{string 2}|&|\meta{execute 2}|\\|\\ +% \hbox to 3em{\hfill\vdots}\\ +% | |\meta{string $n$}|&|\meta{execute $n$}|}|\marg{else} +% +% Either execute \meta{else} or the \meta{value} matching part. +% +% \item[0.20] |\lstKV@TwoArg|\marg{value}\marg{subdefinition} +% \item[0.20] |\lstKV@ThreeArg|\marg{value}\marg{subdefinition} +% \item[0.20] |\lstKV@FourArg|\marg{value}\marg{subdefinition} +% +% \meta{subdefinition} is the replacement text of a macro with two, +% three, and four parameters. We call this macro with the arguments given +% by \meta{value}. Empty arguments are added if necessary. +% +% \item[0.19] |\lstKV@OptArg|\oarg{default arg.}\marg{value}\marg{subdefinition} +% +% |[|\meta{default arg.}|]| is \emph{not} optional. \meta{subdefinition} +% is the replacement text of a macro with parameter text |[##1]##2|. +% Note that the macro parameter character |#| is doubled since used +% within another macro. \meta{subdefinition} accesses these arguments +% via |##1| and |##2|. +% +% \meta{value} is usually the argument |#1| passed by the +% \packagename{keyval} package. If \meta{value} has no optional argument, +% \meta{default arg.} is inserted to provide the arguments to +% \meta{subdefinition}. +% +% \item[0.21] |\lstKV@XOptArg|\oarg{default arg.}\marg{value}\meta{submacro} +% +% Same as |\lstKV@OptArg| but the third argument \meta{submacro} is +% already a definition and not replacement text. +% +% \item[0.20] |\lstKV@CSTwoArg|\marg{value}\marg{subdefinition} +% +% \meta{value} is a \texttt comma \texttt separated list of one or two +% arguments. These are given to the subdefinition which is the +% replacement text of a macro with two parameters. An empty second +% argument is added if necessary. +% \end{syntax} +% \begin{advise} +% \item One more example. The key `\keyname{sensitive}' belongs to the aspect +% \aspectname{keywords}. Therefore it is defined in between +% `|\lst@BeginAspect{keywords}|' and `|\lst@EndAspect|', which is not shown +% here. +% \begin{verbatim} +% \lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive} +% \lst@AddToHookExe{SetLanguage}{\let\lst@ifsensitive\iftrue}\end{verbatim} +% The last line is equivalent to +% \begin{verbatim} +% \lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue} +% \global\let\lst@ifsensitive\iftrue\end{verbatim} +% We initialize the variable globally since the user might request an +% aspect in a group. Afterwards the variable is used locally---there is +% no |\global| in \meta{\TeX\ material}. Note that we could define and +% init the key as follows: +% \begin{verbatim} +% \lst@Key{sensitive}t[t]{\lstKV@SetIf{#1}\lst@ifsensitive} +% \lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue}\end{verbatim} +%\end{advise} +% +% +% \subsection{Internal modes}\label{dInternalModes} +% +% You probably know \TeX's conditional commands |\ifhmode|, |\ifvmode|, +% |\ifmmode|, and |\ifinner|. They tell you whether \TeX\ is in (restricted) +% horizontal or (internal) vertical or in (nondisplay) mathematical mode. For +% example, true |\ifhmode| and true |\ifinner| indicate restricted horizontal +% mode, which means that you are in a |\hbox|. The typical user doesn't care +% about such modes; \TeX/\LaTeX\ manages all this. But since you're reading the +% developer's guide, we discuss the analogue for the \packagename{listings} +% package now. It uses modes to distinguish comments from strings, `comment +% lines' from `single comments', and so on. +% +% The package is in `no mode' before reading the source code. In the phase of +% initialization it goes to `processing mode'. Afterwards the mode depends on +% the actual source code. For example, consider the line +% \begin{verbatim} +% "string" // comment\end{verbatim} +% and assume \texttt{language=C++}. Reading the string delimiter, the package +% enters `string mode' and processes the string. The matching closing delimiter +% leaves the mode, i.e.\ switches back to the general `processing mode'. Coming +% to the two slashes, the package detects a comment line; it therefore enters +% `comment line mode' and outputs the slashes. Usually this mode lasts to the +% end of line. +% +% But with \texttt{textcl=true} the \aspectname{escape} aspect immediately +% leaves `comment line mode', interrupts the current mode sequence, and enters +% `\TeX\ comment line mode'. At the end of line we reenter the previous mode +% sequence `no mode' $\to$ 'processing mode'. This escape to \LaTeX\ works +% since `no mode' implies that \TeX's characters and catcodes are present, +% whereas `processing mode' means that \packagename{listings}' characters and +% catcodes are active. +% +% \begin{table}[htbp] +% \caption{Internal modes}\label{dDefinedInternalModes} +% \def\lsttabspace{\hspace*{1em}\hfill} +% \begin{tabular}{@{}lp{0.56\linewidth}@{}} +% aspect\lsttabspace\meta{mode name} & Usage/We are processing \ldots\\ +% \noalign{\smallskip} +% kernel\lsttabspace |\lst@nomode| & +% If this mode is active, \TeX's `character table' is present; the other +% implication is not true. Any other mode \emph{may} imply that catcodes +% and\nobreak/\allowbreak or definitions of characters are changed. +% \\ +% \lsttabspace |\lst@Pmode| & +% is a general processing mode. If active we are processing a listing, +% but haven't entered a more special mode. +% \\ +% \lsttabspace |\lst@GPmode| & +% general purpose mode for language definitions. +% \\ +% \aspectname{pod}\lsttabspace |\lst@PODmode| & +% \ldots~a POD---Perl specific. +% \\ +% \aspectname{escape}\lsttabspace |\lst@TeXLmode| & +% \ldots~a comment line, but \TeX's character table is present---except +% the EOL character, which is needed to terminate this mode. +% \\ +% \lsttabspace |\lst@TeXmode| & +% indicates that \TeX's character table is present (except one user +% specified character, which is needed to terminate this mode). +% \\ +% \aspectname{directives}\lsttabspace |\lst@CDmode| & +% indicates that the current line began with a compiler directive. +% \\ +% \aspectname{keywordcomments}\lsttabspace |\lst@KCmode| & +% \ldots~a keyword comment. +% \\ +% \lsttabspace |\lst@KCSmode| & +% \ldots~a keyword comment which can be terminated by a semicolon only. +% \\ +% \aspectname{html}\lsttabspace |\lst@insidemode| & +% Active if we are between \texttt{<} and \texttt{>}. +% \\ +% \aspectname{make}\lsttabspace |\lst@makemode| & +% Used to indicate a keyword. +% \end{tabular} +% \end{table} +% Table \ref{dDefinedInternalModes} lists all static modes and which aspects +% they belong to. Most features use dynamically created mode numbers, for +% example all strings and comments. Each aspect may define its own mode(s) +% simply by allocating it/\allowbreak them inside the aspect definition. +% \begin{syntax} +% \item[0.19] |\lst@NewMode|\meta{mode \textup(control sequence\textup)} +% +% defines a new static mode, which is a nonnegative integer assigned to +% \meta{mode}. \meta{mode} should have the prefix \texttt{lst@} and +% suffix \texttt{mode}. +% +% \item[0.21] |\lst@UseDynamicMode|\marg{token\textup(s\textup)} +% +% inserts a dynamic mode number as argument to the token(s). +% +% This macro cannot be used to get a mode number when an aspect is +% loaded or defined. It can only be used every listing in the process +% of initialization, e.g.~to define comments when the character table +% is selected. +% +% \item[0.19,,changed] |\lst@EnterMode|\meta{mode}\marg{start tokens} +% +% opens a group level, enters the mode, and executes \meta{start tokens}. +% +% Use |\lst@modetrue| in \meta{start tokens} to prohibit future mode +% changes---except leaving the mode, of course. You must test yourself +% whether you're allowed to enter, see below. +% +% \item[0.19] |\lst@LeaveMode| +% +% returns to the previous mode by closing a group level if and only if +% the current mode isn't |\lst@nomode| already. You must test yourself +% whether you're allowed to leave a mode, see below. +% +%\iffalse +% \item[0.19] |\lst@LeaveAllModes| +% +% returns to |\lst@nomode|. +% This is some kind of emergency macro, so don't use it! +%\fi +% +% \item[0.19] |\lst@InterruptModes| +% \item[0.19] |\lst@ReenterModes| +% +% The first command returns to |\lst@nomode|, but saves the current mode +% sequence on a special stack. Afterwards the second macro returns to the +% previous mode. In between these commands you may enter any mode you +% want. In particular you can interrupt modes, enter some modes, and say +% `interrupt modes' again. Then two re-enters will take you back in front +% of the first `interrupt modes'. +% +% Remember that |\lst@nomode| implies that \TeX's character table is +% active. +% \end{syntax} +% Some variables show the internal state of processing. You are allowed to read +% them, but \emph{direct write access is prohibited}. Note: |\lst@ifmode| is +% \emph{not} obsolete since there is no relation between the boolean and the +% current mode. It will happen that we enter a mode without setting +% |\lst@ifmode| true, and we'll set it true without assigning any mode! +% \begin{syntax} +% \item[0.18,,counter] |\lst@mode| +% +% keeps the current mode number. Use |\ifnum\lst@mode=|\meta{mode name} +% to test against a mode. Don't modify the counter directly! +% +% \item[0.18,,boolean] |\lst@ifmode| +% +% No mode change is allowed if this boolean is true---except leaving the +% current mode. Use |\lst@modetrue| to modify this variable, but do it +% only in \meta{start tokens}. +% +% \item[1.0,,boolean] |\lst@ifLmode| +% +% Indicates whether the current mode ends at end of line. +% \end{syntax} +% +% +% \subsection{Hooks}\label{dHooks} +% +% Several problems arise if you want to define an aspect. +% You should and/or must +% (a) find additional functionality (of general interest) and implement it, +% (b) create the user interface, and +% (c) interface with the \packagename{listings} package, i.e.~find correct +% hooks and insert appropriate \TeX\ material. +% (a) is out of the scope of this developer's guide. The commands |\lstKV@...| +% in section \ref{dHowToDefineLstAspects} might help you with (b). Here now we +% describe all hooks of the \packagename{listings} package. +% +% All hooks are executed inside an overall group. This group starts somewhere +% near the beginning and ends somewhere at the end of each listing. Don't make +% any other assumptions on grouping. So define variables globally if it's +% necessary---and be alert of side effects if you don't use your own groups. +% \begin{syntax} +% \item \hookname{AfterBeginComment} +% +% is executed after the package has entered comment mode. +% The starting delimiter is usually typeset when the hook is called. +% +% \item \hookname{BoxUnsafe} +% +% Contains all material to deactivate all commands and registers which +% are possibly unsafe inside |\hbox|. It is used whenever the package +% makes a box around a listing and for \packagename{fancyvrb} support. +% +% \item \hookname{DeInit} +% +% Called at the very end of a listing but before closing the box from +% \hookname{BoxUnsafe} or ending a float. +% +% \item \hookname{DetectKeywords} +% +% This \hookname{Output} subhook is executed if and only if mode changes +% are allowed, i.e.~if and only if the package doesn't process a comment, +% string, and so on---see section \ref{dInternalModes}. +% +% \item \hookname{DisplayStyle} +% +% deactivates/activates features for displaystyle listings. +% +% \item \hookname{EmptyStyle} +% +% Executed to select the `empty' style---except the user has redefined +% the style. +% +% \item \hookname{EndGroup} +% +% Executed whenever the package closes a group, e.g.~at end of comment or +% string. +% +% \item \hookname{EOL} +% +% Called at each end of \emph{input} line, right before +% \hookname{InitVarsEOL}. +% +% \item \hookname{EveryLine} +% +% Executed at the beginning of each \emph{output} line, i.e.~more than +% once for broken lines. This hook must not change the horizontal or +% vertical position. +% +% \item \hookname{EveryPar} +% +% Executed once for each input line when the output starts. This hook +% must not change the horizontal or vertical position. +% +%^^A \item \hookname{ExcludeDelims} +%^^A +%^^A Executed by the \keyname{excludedelims} key before the excluded +%^^A delimiters are determined. +%^^A +% \item \hookname{ExitVars} +% +% Executed right before \hookname{DeInit}. +% +% \item \hookname{FontAdjust} +% +% adjusts font specific internal values (currently |\lst@width| only). +% +% \item \hookname{Init} +% +% Executed once each listing to initialize things before the character +% table is changed. It is called after \hookname{PreInit} and before +% \hookname{InitVars}. +% +% \item \hookname{InitVars} +% +% Called to init variables each listing. +% +% \item \hookname{InitVarsBOL} +% +% initializes variables at the beginning of each input line. +% +% \item \hookname{InitVarsEOL} +% +% updates variables at the end of each input line. +% +% \item \hookname{ModeTrue} +% +% executed by the package when mode changes become illegal. +% Here keyword detection is switched off for comments and strings. +% +% \item \hookname{OnEmptyLine} +% +% executed \emph{before} the package outputs an empty line. +% +% \item \hookname{OnNewLine} +% +% executed \emph{before} the package starts one or more new lines, +% i.e.~before saying |\par\noindent\hbox{}| (roughly speaking). +% +% \item \hookname{Output} +% +% Called before an identifier is printed. +% If you want a special printing style, modify |\lst@thestyle|. +% +% \item \hookname{OutputBox} +% +% used inside each output box. Currently it is only used to make the +% package work together with Lambda---hopefully. +% +% \item \hookname{OutputOther} +% +% Called before other character strings are printed. +% If you want a special printing style, modify |\lst@thestyle|. +% +% \item \hookname{PostOutput} +% +% Called after printing an identifier or any other output unit. +% +% \item \hookname{PostTrackKeywords} +% +% is a very special \hookname{Init} subhook to insert keyword tests and +% define keywords on demand. +% This hook is called after \hookname{TrackKeywords}. +% +% \item \hookname{PreInit} +% +% Called right before \hookname{Init} hook. +% +% \item \hookname{PreSet} +% +% Each typesetting command/environment calls this hook to initialize +% internals before any user supplied key is set. +% +% \item \hookname{SelectCharTable} +% +% is executed after the package has selected the standard character +% table. Aspects adjust the character table here and define string and +% comment delimiters, and such. +% +% \item \hookname{SetFormat} +% +% Called before internal assignments for setting a format are made. +% This hook determines which parameters are reset every format selection. +% +% \item \hookname{SetStyle} +% +% Called before internal assignments for setting a style are made. +% This hook determines which parameters are reset every style selection. +% +% \item \hookname{SetLanguage} +% +% Called before internal assignments for setting a language are made. +% This hook determines which parameters are reset every language +% selection. +% +% \item \hookname{TextStyle} +% +% deactivates/activates features for textstyle listings. +% +% \item \hookname{TrackKeywords} +% +% is a very special \hookname{Init} subhook to insert keyword tests and +% define keywords on demand. +% This hook is called before \hookname{PostTrackKeywords}. +% \end{syntax} +% +% +% \subsection{Character tables}\label{dCharacterTables} +% +% Now you know how a car looks like, and you can get a driving license if you +% take some practice. But you will have difficulties if you want to make heavy +% alterations to the car. So let's take a closer look and come to the most +% difficult part: the engine. We'll have a look at the big picture and fill in +% the details step by step. For our purpose it's good to override \TeX's +% character table. First we define a standard character table which contains +% \begin{itemize} +% \item letters: characters identifiers are out of, +% \item digits: characters for identifiers or numerical constants, +% \item spaces: characters treated as blank spaces, +% \item tabulators: characters treated as tabulators, +% \item form feeds: characters treated as form feed characters, and +% \item others: all other characters. +% \end{itemize} +% This character table is altered depending on the current programming language. +% We may define string and comment delimiters or other special characters. +% Table \ref{rStdCharTable} on page \pageref{rStdCharTable} shows the standard +% character table. It can be modified with the keys \keyname{alsoletter}, +% \keyname{alsodigit}, and \keyname{alsoother}. +% +% How do these `classes' work together? Let's say that the current character +% string is `|tr|'. Then letter `|y|' simply appends the letter and we get +% `|try|'. The next nonletter (and nondigit) causes the output of the +% characters. Then we collect all coming nonletters until reaching a letter +% again. This causes the output of the nonletters, and so on. Internally each +% character becomes active in the sense of \TeX\ and is defined to do the right +% thing, e.g.~we say +% \begin{verbatim} +% \def A{\lst@ProcessLetter A}\end{verbatim} +% where the first `|A|' is active and the second has letter catcode 11. +% The macro |\lst@ProcessLetter| gets one token and treats it as a letter. +% The following macros exist, where the last three get no explicit argument. +% \begin{syntax} +% \item[0.18] |\lst@ProcessLetter| \meta{spec.\ token} +% \item[0.18] |\lst@ProcessDigit| \meta{spec.\ token} +% \item[0.18] |\lst@ProcessOther| \meta{spec.\ token} +% \item[0.18] |\lst@ProcessTabulator| +% \item[0.18] |\lst@ProcessSpace| +% \item[0.20] |\lst@ProcessFormFeed| +% \end{syntax} +% \meta{spec.\ token} is supposed to do two things. Usually it expands to +% a printable version of the character. But if |\lst@UM| is equivalent to +% |\@empty|, \meta{spec.\ token} must expand to a \emph{character token}. +% For example, the sharp usually expands to |\#|, which is defined via +% |\chardef| and is not a character token. But if |\lst@UM| is equivalent to +% |\@empty|, the sharp expands to the character `|#|' (catcode 12). Note: +% \emph{Changes to} |\lst@UM| \emph{must be locally.} However, there should +% be no need to do such basic things yourself. The \packagename{listings} +% package provides advanced macros which use that feature, +% e.g.~|\lst@InstallKeywords| in section \ref{dKeywordsAndWorkingIdentifiers}. +% +% \begin{syntax} +% \item[0.18] |\lst@Def|\marg{character code}\meta{parameter text}\marg{definition} +% \item[0.18] |\lst@Let|\marg{character code}\meta{token} +% +% defines the specified character respectively assigns \meta{token}. +% The catcode table if not affected. Be careful if your definition has +% parameters: it is not safe to read more than one character ahead. +% Moreover, the argument can be \emph{arbitrary}; somtimes it's the next +% source code character, sometimes it's some code of the +% \packagename{listings} package, e.g.~|\relax|, |\@empty|, |\else|, +% |\fi|, and so on. Therefore don't use \TeX's ord-operator |`| on such +% an argument, e.g.~don't write |\ifnum`#1=65| to test against `|A|'. +% +% |\lst@Def| and |\lst@Let| are relatively slow. The real definition of +% the standard character table differs from the following example, but it +% could begin with +% \begin{verbatim} +% \lst@Def{9}{\lst@ProcessTabulator} +% \lst@Def{32}{\lst@ProcessSpace} +% \lst@Def{48}{\lst@ProcessDigit 0} +% \lst@Def{65}{\lst@ProcessLetter A}\end{verbatim} +% +%\iffalse +% \item[0.20] |\lst@activecharstrue| +% \item[0.20] |\lst@activecharsfalse| +% +% control whether selecting the character table also makes all characters +% active (standard/extended). This is usually true and therefore default. +% Only the \packagename{fancyvrb} interface sets it locally false. +%\fi +% \end{syntax} +% That's enough for the moment. Section \ref{dUsefulInternalDefinitions} +% presents advanced definitions to manipulate the character table, in +% particular how to add new comment or string types. +% +% +% \subsection{On the output} +% +% The \packagename{listings} package uses some variables to keep the output +% data. Write access is not recommended. Let's start with the easy ones. +% \begin{syntax} +% \item[0.17,,data] |\lst@lastother| +% +% equals \meta{spec.\ token} version of the last processed +% nonidentifier-character. Since programming languages redefine the +% standard character table, we use the original \meta{spec.\ token}. +% For example, if a double quote was processed last, |\lst@lastother| +% is not equivalent to the macro which enters and leaves string mode. +% It's equivalent to |\lstum@"|, where |"| belongs to the control +% sequence. Remember that \meta{spec.\ token} expands either to a +% printable or to a token character. +% +% |\lst@lastother| is equivalent to |\@empty| if such a character is not +% available, e.g.~at the beginning of a line. Sometimes an indentifier +% has already been printed after processing the last `other' character, +% i.e.~the character is far, far away. In this case |\lst@lastother| +% equals |\relax|. +% +% \item[0.17] |\lst@outputspace| +% +% Use this predefined \meta{spec.\ token} (obviously for character code +% 32) to test against |\lst@lastother|. +% +% \item[0.20] |\lstum@backslash| +% +% Use this predefined \meta{spec.\ token} (for character code 92) to test +% against |\lst@lastother|. In the replacement text for |\lst@Def| one +% could write |\ifx| |\lst@lastother| |\lstum@backslash| \ldots\ to test +% whether the last character has been a backslash. +% +% \item[0.20] |\lst@SaveOutputDef|\marg{character code}\meta{macro} +% +% Stores the \meta{spec.\ token} corresponding to \meta{character code} +% in \meta{macro}. This is the only safe way to get a correct meaning to +% test against |\lst@lastother|, for example +% |\lst@SaveOutputDef{"5C}\lstum@backslash|. +% +% You'll get a ``runaway argument'' error if \meta{character code} is not +% between 33 and 126 (inclusive). +% \end{syntax} +% Now let's turn to the macros dealing a bit more with the output data and +% state. +% \begin{syntax} +% \item[1.0] |\lst@XPrintToken| +% +% outputs the current character string and resets it. This macro keeps +% track of all variables described here. +% +% \item[0.18,,token] |\lst@token| +% +% contains the current character string. Each `character' usually +% expands to its printable version, but it must expand to a character +% token if |\lst@UM| is equivalent to |\@empty|. +% +% \item[0.12,,counter] |\lst@length| +% +% is the length of the current character string. +% +% \item[0.12,,dimension] |\lst@width| +% +% is the width of a single character box. +% +% \item[0.20,,global dimension] |\lst@currlwidth| +% +% is the width of so far printed line. +% +% \item[0.18,,global counter] |\lst@column| +% \item[0.12,,global counter] |\lst@pos| (nonpositive) +% +% |\lst@column|$-$|\lst@pos| is the length of the so far printed line. +% We use two counters since this simplifies tabulator handling: +% |\lst@pos| is a nonpositive representative of `length of so far +% printed line' modulo \keyname{tabsize}. +% It's usually not the biggest nonpositive representative. +% +% \item[0.20] |\lst@CalcColumn| +% +% |\@tempcnta| gets |\lst@column| $-$ |\lst@pos| $+$ |\lst@length|. +% This is the current column number minus one, or the current column +% number zero based. +% +% \item[0.18,,global dimension] |\lst@lostspace| +% +% equals `lost' space: desired current line width minus real line width. +% Whenever this dimension is positive the flexible column format can use +% this space to fix the column alignment. +% \end{syntax} +% +% +% \section{Package extensions}\label{dPackageExtensions} +% +% +% \subsection{Keywords and working identifiers}\label{dKeywordsAndWorkingIdentifiers} +% +% The \aspectname{keywords} aspect defines two main macros. Their respective +% syntax is shown on the left. On the right you'll find examples how the +% package actually defines some keys. +% \begin{syntax} +% \item[0.21] +% \cs{lst@InstallFamily} +% +% \marg{prefix}\syntaxfill \texttt k\\ +% \marg{name}\syntaxfill |{keywords}|\\ +% \marg{style name}\syntaxfill |{keywordstyle}|\\ +% \marg{style init}\syntaxfill |\bfseries|\\ +% \marg{default style name}\syntaxfill |{keywordstyle}|\\ +% \marg{working procedure}\syntaxfill |{}|\\ +% \meta{\alternative{l,o}}\syntaxfill |l|\\ +% \meta{\alternative{d,o}}\syntaxfill |d| +% +% installs either a keyword or `working' class of identifiers according +% to whether \meta{working procedure} is empty. +% +% The three keys \meta{name}, \keyname{more}\meta{name} and +% \keyname{delete}\meta{name}, and if not empty \meta{style name} are +% defined. The first order member of the latter one is initialized with +% \meta{style init} if not equivalent to |\relax|. If the user leaves a +% class style undefined, \meta{default style name} is used instead. +% Thus, make sure that this style is always defined. In the example, +% the first order keywordstyle is set to |\bfseries| and is the default +% for all other classes. +% +% If \meta{working procedure} is not empty, this code is executed when +% reaching such an (user defined) identifier. \meta{working procedure} +% takes exactly one argument, namely the class number to which the +% actual identifier belongs to. If the code uses variables and requires +% values from previous calls, you must define these variables +% |\global|ly. It's not sure whether working procedures are executed +% inside a (separate) group or not. +% +% \texttt l indicates a language key, i.e.~the lists are reset every +% language selection. \texttt o stands for `other' key. +% The keyword respectively working test is either installed at the +% \hookname{DetectKeyword} or \hookname{Output} hook according to +% \meta{\alternative{d,o}}. +% +% \item[0.20] +% \cs{lst@InstallKeywords} +% +% \marg{prefix}\syntaxfill \texttt{cs}\\ +% \marg{name}\syntaxfill |{texcs}|\\ +% \marg{style name}\syntaxfill |{texcsstyle}|\\ +% \marg{style init}\syntaxfill |\relax|\\ +% \marg{default style name}\syntaxfill |{keywordstyle}|\\ +% \marg{working procedure}\syntaxfill see below\\ +% \meta{\alternative{l,o}}\syntaxfill |l|\\ +% \meta{\alternative{d,o}}\syntaxfill |d| +% +% Same parameters, same functionality with one execption. The macro +% installs exactly one keyword class and not a whole family. Therefore +% the argument to \meta{working procedure} is constant (currently empty). +% +% The working procedure of the example reads as follows.\vspace*{-.5\baselineskip} +% \begin{verbatim} +% {\ifx\lst@lastother\lstum@backslash +% \let\lst@thestyle\lst@texcsstyle +% \fi}\end{verbatim} +%\vspace*{-.5\baselineskip} +% What does this procedure do? First of all it is called only if a +% keyword from the user supplied list (or language definition) is found. +% The procedure now checks for a preceding backslash and sets the output +% style accordingly. +% +%\iffalse +% \item[0.20] |\lst@InstallTest|\marg{prefix}\syntaxbreak +% |\lst@|\meta{name}|@list||\lst@|\meta{name}~|\lst@g|\meta{name}|@list||\lst@g|\meta{name}\syntaxbreak +% |\lst@g|\meta{name}|@sty|~\meta{\alternative{w,s}}\meta{\alternative{d,o}} +% +% installs a `working identifier' test or keyword style depending on +% \meta{\alternative{w,s}}. |\lst@g|\meta{name}|@sty| contains the +% working procedure or style macro. Note that the behaviour of the tests +% depends on the \texttt{savemem} option. +% The keyword respectively working test is either installed at the +% \hookname{DetectKeyword} or \hookname{Output} hook according to +% \meta{\alternative{d,o}}. +% +%^^A Either each call of this macro or each different \meta{prefix} inserts +%^^A another test (depending on the \texttt{savemem} option). +% +% |\lst@|\meta{name} contains the current identifier list and +% |\lst@|\meta{name}|@list| a `|\lst@|\meta{$n_i$}|\lst@g|\meta{$n_i$}' +% sequence of currently used classes. If no other classes are used, +% this equals |\lst@|\meta{name}|\lst@g|\meta{name}. The global versions +% |\lst@g|\ldots\ are used to keep track of the keywords. +% (This description needs improvement.) +%\fi +% \end{syntax} +% +% +% \subsection{Delimiters} +% +% We describe two stages: adding a new delimiter type to an existing class of +% delimiters and writing a new class. Each class has its name; currently exist +% \texttt{Comment}, \texttt{String}, and \texttt{Delim}. As you know, the +% latter and the first both provide the type \texttt l, but there is no string +% which starts with the given delimiter and ends at end of line. So we'll add +% it now! +% +% First of all we extend the list of string types by +% \begin{verbatim} +% \lst@AddTo\lst@stringtypes{,l}\end{verbatim} +% Then we must provide the macro which takes the user supplied delimiter and +% makes appropriate definitions. The command name consists of the prefix +% |\lst@|, the delimiter name, |DM| for using dynamic modes, and |@| followed +% by the type. +% \begin{verbatim} +% \gdef\lst@StringDM@l#1#2\@empty#3#4#5{% +% \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}}\end{verbatim} +% You can put these three lines into a \texttt{.sty}-file or surround them by +% |\makeatletter| and |\makeatother| in the preamble of a document. +% And that's all! +%{\makeatletter +%\lst@AddTo\lst@stringtypes{,l} +%\gdef\lst@StringDM@l#1#2\@empty#3#4#5{^^A +% \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} +%} +% \begin{lstsample}{}{} +% \lstset{string=[l]//} +% \begin{lstlisting} +% // This is a string. +% This isn't a string. +% \end{lstlisting} +% \end{lstsample} +% You want more details, of course. Let's begin with the arguments. +% \begin{itemize} +% \item The first argument \emph{after} |\@empty| is used to start the +% delimiter. It's provided by the delimiter class. +% \item The second argument \emph{after} |\@empty| is used to end the +% delimiter. It's also provided by the delimiter class. We didn't +% need it in the example, see the explanation below. +% \item The third argument \emph{after} |\@empty| is +% \marg{style}\meta{start tokens}. +% This with a preceding |\def\lst@currstyle| is used as argument to +% |\lst@EnterMode|. The delimiter class also provides it. In the +% example we `extended' |#5| by |\lst@Lmodetrue| (line mode true). +% The mode automatically ends at end of line, so we didn't need the +% end-delimiter argument. +% \end{itemize} +% And now for the other arguments. In case of dynamic modes, the first argument +% is the mode number. Then follow the user supplied delimiter(s) whose number +% must match the remaining arguments up to |\@empty|. For non-dynamic modes, +% you must either allocate a static mode yourself or use a predefined mode +% number. The delimiters then start with the first argument. +% +% Eventually let's look at the replacement text of the macro. The sequence +% |\lst@CArg #2\relax| puts two required arguments after |\lst@DefDelimB|. +% The syntax of the latter macro is +% \begin{syntax} +% \item[1.0] \cs{lst@DefDelimB} +% +% |{|\meta{1st}\meta{2nd}\marg{rest}|}|\syntaxfill |{//{}}|\\ +% \meta{save 1st}\syntaxfill |\lst@c/0|\\ +% \marg{execute}\syntaxfill|{}|\\ +% \marg{delim~exe~modetrue}\syntaxfill|{}|\\ +% \marg{delim~exe~modefalse}\syntaxfill|{}|\\ +% \meta{start-delimiter macro}\syntaxfill|#3|\\ +% \meta{mode number}\syntaxfill |{#1}|\\ +% |{|\marg{style}\meta{start tokens}|}|\syntaxfill |{#5\lst@Lmodetrue}| +% +% defines \meta{1st}\meta{2nd}\meta{rest} as starting-delimiter. +% \meta{execute} is executed when the package comes to \meta{1st}. +% \meta{delim~exe~modetrue} and \meta{delim~exe~modefalse} are +% executed only if the whole delimiter \meta{1st}\meta{2nd}\meta{rest} +% is found. Exactly one of them is called depending on |\lst@ifmode|. +% +% By default the package enters the mode if the delimiter is found +% \emph{and} |\lst@ifmode| is false. Internally we make an appropriate +% definition of |\lst@bnext|, which can be gobbled by placing +% |\@gobblethree| at the very end of \meta{delim exe modefalse}. +% One can provide an own definition (and gobble the default). +% +% \meta{save 1st} must be an undefined macro and is used internally to +% store the previous meaning of \meta{1st}. The arguments \meta{2nd} +% and/or \meta{rest} are empty if the delimiter has strictly less than +% three characters. All characters of \meta{1st}\meta{2nd}\meta{rest} +% must already be active (if not empty). +% That's not a problem since the macro |\lst@CArgX| does this job. +% +% \item[1.0] \cs{lst@DefDelimE} +% +% |{|\meta{1st}\meta{2nd}\marg{rest}|}|\\ +% \meta{save 1st}\\ +% \marg{execute}\\ +% \marg{delim~exe~modetrue}\\ +% \marg{delim~exe~modefalse}\\ +% \meta{end-delimiter macro}\\ +% \meta{mode number} +% +% Ditto for ending-delimiter with slight differences: +% \meta{delim~exe~modetrue} and \meta{delim~exe~modefalse} are executed +% depending on whether |\lst@mode| equals \meta{mode}. +% +% The package ends the mode if the delimiter is found and |\lst@mode| +% equals \meta{mode}. Internally we make an appropriate definition of +% |\lst@enext| (not |\lst@bnext|), which can be gobbled by placing +% |\@gobblethree| at the very end of \meta{delim exe modetrue}. +% +% \item[1.0] \cs{lst@DefDelimBE} +% +% followed by the same eight arguments as for |\lst@DefDelimB| and \ldots\\ +% \meta{end-delimiter macro} +% +% This is a combination of |\lst@DefDelimB| and |\lst@DefDelimE| for the +% case of starting and ending delimiter being the same. +% \end{syntax} +% We finish the first stage by examining two easy examples. +% \texttt d-type strings are defined by +% \begin{verbatim} +% \gdef\lst@StringDM@d#1#2\@empty#3#4#5{% +% \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4}\end{verbatim} +% (and an entry in the list of string types). +% Not a big deal. Ditto \texttt d-type comments: +% \begin{verbatim} +% \gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{% +% \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% +% \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}\end{verbatim} +% Here we just need to use both |\lst@DefDelimB| and |\lst@DefDelimE|. +% \goodbreak +% +% So let's get to the second stage. For illustration, here's the definition of +% the \texttt{Delim} class. The respective first argument to the service macro +% makes it delete all delimiters of the class, add the delimiter, or delete +% the particular delimiter only. +% \begin{verbatim} +% \lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}} +% \lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}} +% \lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}}\end{verbatim} +% The service macro itself calls another macro with appropriate arguments. +% \begin{verbatim} +% \gdef\lst@DelimKey#1#2{% +% \lst@Delim{}#2\relax{Delim}\lst@delimtypes #1% +% {\lst@BeginDelim\lst@EndDelim} +% i\@empty{\lst@BeginIDelim\lst@EndIDelim}}\end{verbatim} +% We have to look at those arguments. Above you can see the actual arguments +% for the \texttt{Delim} class, below are the \texttt{Comment} class ones. +% Note that the user supplied value covers the second and third line of +% arguments. +% \begin{syntax} +% \item[0.21,,changed] +% \cs{lst@Delim} +% +% \meta{default style macro}\syntaxfill \cs{lst@commentstyle}\\ \relax +% [\texttt*[\texttt*]]\texttt[\meta{type}\texttt][\texttt[\meta{style}\texttt][\texttt[\meta{type option}\texttt]]]\\ +% \meta{delimiter\textup(s\textup)}\cs{relax}\syntaxfill|#2|\cs{relax}\\ +% \marg{delimiter name}\syntaxfill|{Comment}|\\ +% \meta{delimiter types macro}\syntaxfill\texttt{\cs{lst@commenttypes}}\\ +% \alternative{\cs{@empty},\cs{@nil},\cs{relax}}\syntaxfill|#1|\\ +% \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginComment}\cs{lst@EndComment}|}|\\ +% \meta{extra prefix}\syntaxfill |i|\\ +% \meta{extra conversion}\syntaxfill |\@empty|\\ +% \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginIComment}\cs{lst@EndIComment}|}| +% +% Most arguments should be clear. We'll discuss the last four. Both +% \marg{begin- and end-delim macro} must contain exactly two control +% sequences, which are given to |\lst@|\meta{name}[|DM|]|@|\meta{type} +% to begin and end a delimiter. These are the arguments |#3| and |#4| in our +% first example of |\lst@StringDM@l|. Depending on whether the user chosen +% type starts with \meta{extra prefix}, the first two or the last control +% sequences are used. +% +% By default the package takes the delimiter(s), makes the characters active, +% and places them after |\lst@|\meta{name}[|DM|]|@|\meta{type}. If the user +% type starts with \meta{extra prefix}, \meta{extra conversion} might change +% the definition of |\lst@next| to choose a different conversion. The default +% is equivalent to |\lst@XConvert| with |\lst@false|. +% +% Note that \meta{type} never starts with \meta{extra prefix} since it is +% discarded. The functionality must be fully implemented by choosing a +% different \marg{begin- and end-delim macro} pair. +% \end{syntax} +% You might need to know the syntaxes of the \meta{begin- and end-delim macro}s. +% They are called as follows. +% \begin{syntax} +% \item[0.21] |\lst@Begin|\meta{whatever} +% +% \marg{mode} +% |{|\marg{style}\meta{start tokens}|}| +% \meta{delimiter}|\@empty| +% +% \item[0.21] |\lst@End|\meta{whatever} +% +% \marg{mode} +% \meta{delimiter}|\@empty| +% \end{syntax} +% The existing macros are internally defined in terms of |\lst@DelimOpen| and +% |\lst@DelimClose|, see the implementation. +% +% +% \subsection{Getting the kernel run} +% +% If you want new pretty-printing environments, you should be happy with +% section \ref{rEnvironments}. New commands like |\lstinline| or +% |\lstinputlisting| are more difficult. Roughly speaking you must follow +% these steps. +% \begin{enumerate} +% \item Open a group to make all changes local. +% \item \meta{Do whatever you want.} +% \item Call |\lsthk@PreSet| in any case. +% \item Now you \emph{might } want to (but need not) use |\lstset| to set some +% new values. +% \item \meta{Do whatever you want.} +% \item Execute |\lst@Init\relax| to finish initialization. +% \item \meta{Do whatever you want.} +% \item Eventually comes the source code, which is processed by the kernel. +% You must ensure that the characters are either not already read or all +% active. Moreover \emph{you} must install a way to detect the end of the +% source code. If you've reached the end, you must \ldots +% \item \ldots\ call |\lst@DeInit| to shutdown the kernel safely. +% \item \meta{Do whatever you want.} +% \item Close the group from the beginning. +% \end{enumerate} +% For example, consider the |\lstinline| command in case of being not inside an +% argument. Then the steps are as follows. +% \begin{enumerate} +% \item |\leavevmode\bgroup| opens a group. +% \item |\def\lst@boxpos{b}| `baseline' aligns the listing. +% \item |\lsthk@PreSet| +% \item |\lstset{flexiblecolumns,#1}| (|#1| is the user provided +% key=value list) +% \item |\lsthk@TextStyle| deactivates all features not safe here. +% \item |\lst@Init\relax| +% \item |\lst@Def{`#1}{\lst@DeInit\egroup}| installs the `end inline' +% detection, where |#1| is the next character after |\lstinline|. +% Moreover chr(13) is redefined to end the fragment in the same way but +% also issues an error message. +% \item Now comes the source code and \ldots +% \item \ldots\ |\lst@DeInit| (from |\lst@Def| above) ends the code snippet +% correctly. +% \item Nothing. +% \item |\egroup| (also from |\lst@Def|) closes the group. +% \end{enumerate} +% The real definition is different since we allow source code inside arguments. +% Read also section \ref{iTheInputCommand} if you really want to write +% pretty-printing commands. +% +% +% \section{Useful internal definitions}\label{dUsefulInternalDefinitions} +% +% This section requires an update. +% +% +% \subsection{General purpose macros}\label{dGeneralPurposeMacros} +% +% \begin{syntax} +% \item[0.19] |\lst@AddTo|\meta{macro}\marg{\TeX~material} +% +% adds \meta{\TeX~material} globally to the contents of \meta{macro}. +% +% \item[0.20] |\lst@Extend|\meta{macro}\marg{\TeX~material} +% +% calls |\lst@AddTo| after the first token of \meta{\TeX~material} is +% |\expand|ed|after|. For example, |\lst@Extend \a \b| merges the +% contents of the two macros and stores it globally in |\a|. +% +% \item[0.19] |\lst@lAddTo|\meta{macro}\marg{\TeX~material} +% \item[0.20] |\lst@lExtend|\meta{macro}\marg{\TeX~material} +% +% are local versions of |\lst@AddTo| and |\lst@Extend|. +% +% \item[0.18] |\lst@DeleteKeysIn|\meta{macro}\meta{macro \textup(keys to remove\textup)} +% +% Both macros contain a comma separated list of keys (or keywords). All +% keys appearing in the second macro are removed (locally) from the first. +% +% \item[0.19] |\lst@ReplaceIn|\meta{macro}\meta{macro \textup(containing replacement list\textup)} +% \item[0.20] |\lst@ReplaceInArg|\meta{macro}\marg{replacement list} +% +% The replacement list has the form $a_1b_1$\ldots$a_nb_n$, where each +% $a_i$ and $b_i$ is a character sequence (enclosed in braces if +% necessary) and may contain macros, but the first token of $b_i$ must +% not be equivalent to |\@empty|. Each sequence $a_i$ inside the first +% macro is (locally) replaced by $b_i$. +% The suffix |Arg| refers to the \emph{braced} second argument instead of +% a (nonbraced) macro. It's a hint that we get the `real' argument and +% not a `pointer' to the argument. +% +% \item[0.20] |\lst@IfSubstring|\marg{character sequence}\meta{macro}\marg{then}\marg{else} +% +% \meta{then} is executed if \meta{character sequence} is a substring of +% the contents of \meta{macro}. Otherwise \meta{else} is called. +% +% \item[0.12] |\lst@IfOneOf|\meta{character sequence}|\relax|\meta{macro}\marg{then}\marg{else} +% +% |\relax| terminates the first parameter here since it is faster than +% enclosing it in braces. \meta{macro} contains a comma separated list +% of identifiers. If the character sequence is one of these indentifiers, +% \meta{then} is executed, and otherwise \meta{else}. +% +% \item[0.21] |\lst@Swap|\marg{tok1}\marg{tok2} +% +% changes places of the following two tokens or arguments \emph{without} +% inserting braces. For example, |\lst@Swap{abc}{def}| expands to +% |defabc|. +% +% \item[0.18] |\lst@IfNextChars|\meta{macro}\marg{then}\marg{else} +% \item[0.19] |\lst@IfNextCharsArg|\marg{character sequence}\marg{then}\marg{else} +% +% Both macros execute either \meta{then} or \meta{else} according to +% whether the given character sequence respectively the contents of the +% given macro is found (after the three arguments). Note an important +% difference between these macros and \LaTeX's |\@ifnextchar|: +% We remove the characters behind the arguments until it is possible to +% decide which part must be executed. However, we save these characters +% in the macro |\lst@eaten|, so they can be inserted using \meta{then} or +% \meta{else}. +% +% \item[0.19] |\lst@IfNextCharActive|\marg{then}\marg{else} +% +% executes \meta{then} if next character is active, and \meta{else} +% otherwise. +% +% \item[0.20] |\lst@DefActive|\meta{macro}\marg{character sequence} +% +% stores the character sequence in \meta{macro}, but all characters +% become active. The string \emph{must not} contain a begin group, end +% group or escape character (|{}\|); it may contain a left brace, right +% brace or backslash with other meaning (= catcode). This command +% would be quite surplus if \meta{character sequence} is not already read +% by \TeX\ since such catcodes can be changed easily. It is explicitly +% allowed that the charcaters have been read, e.g.~in +% |\def\test{\lst@DefActive\temp{ABC}}|! +% +% Note that this macro changes |\lccode|s 0--9 without restoring them. +% +% \item[0.20] |\lst@DefOther|\meta{macro}\marg{character sequence} +% +% stores \meta{character sequence} in \meta{macro}, but all characters +% have catcode 12. Moreover all spaces are removed and control sequences +% are converted to their name without preceding backslash. For example, +% |\{ Chip \}| leads to |{Chip}| where all catcodes are 12---internally +% the primitive |\meaning| is used. +% +% \iffalse +% \item[0.19] |\lst@MakeActive|\marg{character sequence} +% +% stores the character sequence in |\lst@arg| and has the same +% restrictions as |\lst@DefActive|. If fact, the latter definition uses +% this macro here. +% \fi +% \end{syntax} +% +% +% \subsection{Character tables manipulated}\label{dCharacterTablesManipulated} +% +% \begin{syntax} +% \item[0.20] |\lst@SaveDef|\marg{character code}\meta{macro} +% +% Saves the current definition of the specified character in +% \meta{macro}. You should always save a character definition before you +% redefine it! And use the saved version instead of writing directly +% |\lst@Process|\ldots---the character could already be redefined and +% thus not equivalent to its standard definition. +% +% \item[0.20] |\lst@DefSaveDef|\marg{character code}\meta{macro}\meta{parameter text}\marg{definition} +% \item[0.20] |\lst@LetSaveDef|\marg{character code}\meta{macro}\meta{token} +% +% combine |\lst@SaveDef| and |\lst@Def| respectively |\lst@Let|. +% \end{syntax} +% Of course I shouldn't forget to mention \emph{where} to alter the character +% table. Hook material at \hookname{SelectCharTable} makes permanent changes, +% i.e.~it effects all languages. The following two keys can be used in any +% language definition and effects the particular language only. +% \begin{syntax} +% \item[0.20] |SelectCharTable=|\meta{\TeX\ code} +% \item[0.20] |MoreSelectCharTable=|\meta{\TeX\ code} +% +% uses \meta{\TeX\ code} (additionally) to select the character table. +% The code is executed after the standard character table is selected, +% but possibly before other aspects make more changes. Since previous +% meanings are always saved and executed inside the new definition, this +% should be harmless. +% \end{syntax} +% Here come two rather useless examples. Each point (full stop) will cause a +% message `|.|' on the terminal and in the |.log| file if language |useless| is +% active: +% \begin{verbatim} +% \lstdefinelanguage{useless} +% {SelectCharTable=\lst@DefSaveDef{46}% save chr(46) ... +% \lsts@point % ... in \lsts@point and ... +% {\message{.}\lsts@point}% ... use new definition +% }\end{verbatim} +% If you want to count points, you could write +% \begin{verbatim} +% \newcount\lst@points % \global +% \lst@AddToHook{Init}{\global\lst@points\z@} +% \lst@AddToHook{DeInit}{\message{Number of points: \the\lst@points}} +% \lstdefinelanguage[2]{useless} +% {SelectCharTable=\lst@DefSaveDef{46}\lsts@point +% {\global\advance\lst@points\@ne \lsts@point} +% }\end{verbatim} +% |% \global| indicates that the allocated counter is used globally. We zero +% the counter at the beginning of each listing, display a message about the +% current value at the end of a listing, and each processed point advances the +% counter by one. +% +% \begin{syntax} +% \item[0.21] |\lst@CArg|\meta{active characters}|\relax|\meta{macro} +% +% The string of active characters is split into \meta{1st}, \meta{2nd}, +% and \marg{rest}. If one doesn't exist, an empty argument is used. Then +% \meta{macro} is called with |{|\meta{1st}\meta{2nd}\marg{rest}|}| plus +% a yet undefined control sequence \meta{save 1st}. This macro is +% intended to hold the current definition of \meta{1st}, so \meta{1st} +% can be redefined without loosing information. +% +% \item[0.19] |\lst@CArgX|\meta{characters}|\relax|\meta{macro} +% +% makes \meta{characters} active before calling |\lst@CArg|. +% +% \item[0.21] |\lst@CDef{|\meta{1st}\meta{2nd}\marg{rest}|}|\meta{save 1st}\marg{execute}\marg{pre}\marg{post} +% +% should be used in connection with |\lst@CArg| or |\lst@CArgX|, i.e.~as +% \meta{macro} there. \meta{1st}, \meta{2nd}, and \meta{rest} must be +% active characters and \meta{save 1st} must be an undefined control +% sequence. +% +% Whenever the package reaches the character \meta{1st} (in a listing), +% \meta{execute} is executed. If the package detects the whole string +% \meta{1st}\meta{2nd}\meta{rest}, we additionally execute \meta{pre}, +% then the string, and finally \meta{post}. +% +% \item[0.21] |\lst@CDefX|\meta{1st}\meta{2nd}\marg{rest}\meta{save 1st}\marg{execute}\marg{pre}\marg{post} +% +% Ditto except that we execute \meta{pre} and \meta{post} without the +% original string if we reach \meta{1st}\meta{2nd}\meta{rest}. +% This means that the string is replaced by \meta{pre}\meta{post} (with +% preceding \meta{execute}). +% \end{syntax} +% As the final example, here's the definition of |\lst@DefDelimB|. +% \begin{verbatim} +% \gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{% +% \lst@CDef{#1}#2% +% {#3}% +% {\let\lst@bnext\lst@CArgEmpty +% \lst@ifmode #4\else +% #5% +% \def\lst@bnext{#6{#7}{#8}}% +% \fi +% \lst@bnext}% +% \@empty}\end{verbatim} +% You got it? +% +% +% \part{Implementation} +% +% +% \CheckSum{12359} +%^^A +%^^A Don't index TeX-primitives. +%^^A +% \DoNotIndex{\advance,\afterassignment,\aftergroup,\batchmode,\begingroup} +% \DoNotIndex{\box,\catcode,\char,\chardef,\closeout,\copy,\count,\csname,\def} +% \DoNotIndex{\dimen,\discretionary,\divide,\dp,\edef,\else,\end,\endcsname} +% \DoNotIndex{\endgroup,\endinput,\endlinechar,\escapechar,\everypar} +% \DoNotIndex{\expandafter,\fi,\gdef,\global,\globaldefs,\hbadness,\hbox} +% \DoNotIndex{\hrulefill,\hss,\ht} +% \DoNotIndex{\if,\ifdim,\iffalse,\ifhmode,\ifinner,\ifnum,\ifodd,\iftrue} +% \DoNotIndex{\ifvoid,\ifx,\ignorespaces,\immediate,\input,\jobname,\kern} +% \DoNotIndex{\lccode,\leftskip,\let,\long,\lower,\lowercase,\meaning,\message} +% \DoNotIndex{\multiply,\muskip,\noexpand,\noindent,\openout,\par,\parfillskip} +% \DoNotIndex{\parshape,\parskip,\raise,\read,\relax,\rightskip,\setbox,\skip} +% \DoNotIndex{\string,\the,\toks,\uppercase,\vbox,\vcenter,\vrule,\vtop,\wd} +% \DoNotIndex{\write,\xdef} +% +%^^A +%^^A Don't index LaTeX's private definitions. +%^^A +% \DoNotIndex{\@@end,\@@par,\@M,\@arabic,\@circlefnt,\@currentlabel} +% \DoNotIndex{\@currenvir,\@depth,\@doendpe,\@dottedtocline,\@eha,\@ehc} +% \DoNotIndex{\@empty,\@firstofone,\@firstoftwo,\@float,\@for,\@getcirc} +% \DoNotIndex{\@gobble,\@gobbletwo,\@halfwidth,\@height,\@ifnextchar} +% \DoNotIndex{\@ifundefined,\@ignoretrue,\@makecaption,\@makeother,\@namedef} +% \DoNotIndex{\@ne,\@noligs,\@notprerr,\@onlypreamble,\@secondoftwo,\@spaces} +% \DoNotIndex{\@starttoc,\@totalleftmargin,\@undefined,\@whilenum} +% \DoNotIndex{\@wholewidth,\@width} +% \DoNotIndex{\c@chapter,\c@figure,\c@page,\end@float,\f@family,\filename@area} +% \DoNotIndex{\filename@base,\filename@ext,\filename@parse,\if@twoside} +% \DoNotIndex{\l@ngrel@x,\m@ne,\new@command,\nfss@catcodes,\tw@,\thr@@} +% \DoNotIndex{\z@,\zap@space} +% +%^^A +%^^A Don't index LaTeX's package definitions. +%^^A +% \DoNotIndex{\AtEndOfPackage} +% \DoNotIndex{\CurrentOption,\DeclareOption,\IfFileExists,\InputIfFileExists} +% \DoNotIndex{\MessageBreak,\NeedsTeXFormat,\PackageError,\PackageWarning} +% \DoNotIndex{\ProcessOptions,\ProvidesFile,\ProvidesPackage,\RequirePackage} +% +%^^A +%^^A Don't index LaTeX's public definitions. +%^^A +% \DoNotIndex{\abovecaptionskip,\active,\addcontentsline,\addtocounter,\begin} +% \DoNotIndex{\belowcaptionskip,\bfseries,\bgroup,\bigbreak,\chapter} +% \DoNotIndex{\contentsname,\do,\egroup,\footnotesize,\index,\itshape} +% \DoNotIndex{\linewidth,\llap,\makeatletter,\newbox,\newcommand,\newcount} +% \DoNotIndex{\newcounter,\newdimen,\newtoks,\newwrite,\nointerlineskip} +% \DoNotIndex{\normalbaselines,\normalfont,\numberline,\pretolerance,\protect} +% \DoNotIndex{\qquad,\refstepcounter,\removelastskip,\renewcommand,\rlap} +% \DoNotIndex{\small,\smallbreak,\smallskipamount,\smash,\space,\strut} +% \DoNotIndex{\strutbox,\tableofcontents,\textasciicircum,\textasciitilde} +% \DoNotIndex{\textasteriskcentered,\textbackslash,\textbar,\textbraceleft} +% \DoNotIndex{\textbraceright,\textdollar,\textendash,\textgreater,\textless} +% \DoNotIndex{\textunderscore,\textvisiblespace,\thechapter,\ttdefault} +% \DoNotIndex{\ttfamily,\typeout,\value,\vphantom} +% +%^^A +%^^A Don't index definitions from other packages. +%^^A +% \DoNotIndex{\MakePercentComment,\MakePercentIgnore} +% +%^^A +%^^A Don't index 0.19 definitions. +%^^A +% \DoNotIndex{\listlistingsname,\listoflistings,\lstbox,\lstbox@} +% \DoNotIndex{\lstlanguage@} +% +%^^A +%^^A Don't index 0.20 subdefinitions. +%^^A +% \DoNotIndex{\lst@ATH@,\lst@BOLGobble@,\lst@BOLGobble@@,\lst@CArg@,\lst@CArg@@} +% \DoNotIndex{\lst@CBC@,\lst@CBC@@,\lst@CCECUse@,\lst@CCPutMacro@,\lst@DefLang@} +% \DoNotIndex{\lst@DefLang@@,\lst@DefOther@,\lst@DeleteKeysIn@,\lst@Escape@} +% \DoNotIndex{\lstframe@,\lst@frameH@,\lst@frameL@,\lst@frameR@} +% \DoNotIndex{\lst@FillFixed@,\lst@FindAlias@,\lst@FVConvert@} +% \DoNotIndex{\lst@IfNextChars@,\lst@IfNextChars@@,\lst@InsideConvert@} +% \DoNotIndex{\lst@InstallKeywords@,\lst@Key@,\lst@KeywordTestI@} +% \DoNotIndex{\lst@MakeActive@,\lst@MakeMoreKeywords@} +% \DoNotIndex{\lst@RC@,\lst@RC@@,\lst@ReplaceIn@,\lst@ReplaceInput@} +% \DoNotIndex{\lst@ReportAllocs@,\lst@SKS@,\lst@SKS@@,\lst@UBC@} +% \DoNotIndex{\lst@WorkingTestI@,\lstalias@,\lstalias@@,\lstalso@} +% \DoNotIndex{\lstdefinestyle@,\lstenv@BOLGobble@@} +% \DoNotIndex{\lstenv@ProcessJ@,\lstinline@,\lstKV@OptArg@,\lstKV@SetIf@} +% \DoNotIndex{\lstlang@,\lstnewenvironment@,\lst@outputpos,\lstset@} +% +% +% \section{Overture} +% +% \paragraph{Registers} +% For each aspect, the required numbers of registers are listed in section +% \lstref{dPackageLoading}. Furthermore, the \packagename{keyval} package +% allocates one token register. The macros, boxes and counters +% |\@temp|\ldots|a|/|b|, the dimensions |\@tempdim|\ldots, and the macro +% |\@gtempa| are also used, see the index. +% +% \paragraph{Naming conventions} +% Let's begin with definitions for the user. All these public macros have +% lower case letters and contain |lst|. Private macros and variables use the +% following prefixes (not up-to-date?): +% \begin{itemize} +% \item |\lst@| for a general macro or variable, +% \item |\lstenv@| if it is defined for the listing environment, +% \item |\lsts@| for |s|aved character meanings, +% \item |\lsthk@|\meta{name of hook} holds hook material, +% \item |\lst|\meta{prefix}|@| for various kinds of keywords and working +% identifiers. +% \item |\lstlang@|\meta{language}|@|\meta{dialect} contains a language and +% \item |\lststy@|\meta{the style} contains style definition, +% \item |\lstpatch@|\meta{aspect} to patch an aspect, +% +% \item |\lsta@|\meta{language}|$|\meta{dialect} contains alias, +% \item |\lsta@|\meta{language} contains alias for all dialects of a language, +% \item |\lstdd@|\meta{language} contains default dialect of a language +% (if present). +% \end{itemize} +% To distinguish procedure-like macros from data-macros, the name of procedure +% macros use upper case letters with each beginning word, e.g.~|\lst@AddTo|. +% A macro with suffix |@| is the main working-procedure for another definition, +% for example |\lstinputlisting@| does the main work for |\lstinputlisting|. +% +% \paragraph{Preamble} +% All files generated from this \texttt{listings.dtx} will get a header. +% \begin{macrocode} +%% Please read the software license in listings-1.3.dtx or listings-1.3.pdf. +%% +%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed +%% elsewhere in this file. +%% (c) 2006 Brooks Moses +%% +%% Send comments and ideas on the package, error reports and additional +%% programming languages to . +%% +% \end{macrocode} +% +% \paragraph{Identification} +% All files will have same date and version. +% \begin{macrocode} +\def\filedate{2004/09/07} +\def\fileversion{1.3} +% \end{macrocode} +% What we need and who we are. +% \begin{macrocode} +%<*kernel> +\NeedsTeXFormat{LaTeX2e} +\AtEndOfPackage{\ProvidesPackage{listings} + [\filedate\space\fileversion\space(Carsten Heinz)]} +% \end{macrocode} +% \begin{macro}{\lst@CheckVersion} +% can be used by the various driver files to guarantee the correct version. +% \begin{macrocode} +\def\lst@CheckVersion#1{\edef\reserved@a{#1}% + \ifx\lst@version\reserved@a \expandafter\@gobble + \else \expandafter\@firstofone \fi} +% \end{macrocode} +% \begin{macrocode} +\let\lst@version\fileversion +% +% \end{macrocode} +% \end{macro} +% For example by the miscellaneous file +% \begin{macrocode} +%<*misc> +\ProvidesFile{lstmisc.sty} + [\filedate\space\fileversion\space(Carsten Heinz)] +\lst@CheckVersion\fileversion + {\typeout{^^J% + ***^^J% + *** This file requires `listings.sty' version \fileversion.^^J% + *** You have a serious problem, so I'm exiting ...^^J% + ***^^J}% + \batchmode \@@end} +% +% \end{macrocode} +% or by the dummy patch. +% \begin{macrocode} +%<*patch> +\ProvidesFile{lstpatch.sty} + [\filedate\space\fileversion\space(Carsten Heinz)] +\lst@CheckVersion\lst@version{} +% +% \end{macrocode} +% \begin{macrocode} +%<*doc> +\ProvidesPackage{lstdoc} + [\filedate\space\fileversion\space(Carsten Heinz)] +% +% \end{macrocode} +% +% \paragraph{Category codes} +% We define two macros to ensure correct catcodes when we input other files of +% the \packagename{listings} package. +% +% \begin{macro}{\lst@InputCatcodes} +% |@| and |"| become letters. Tabulators and EOLs are ignored; this avoids +% unwanted spaces---in the case I've forgotten a comment character. +% \begin{macrocode} +%<*kernel> +\def\lst@InputCatcodes{% + \makeatletter \catcode`\"12% + \catcode`\^^@\active + \catcode`\^^I9% + \catcode`\^^L9% + \catcode`\^^M9% + \catcode`\%14% + \catcode`\~\active} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@RestoreCatcodes} +% To load the kernel, we will change some catcodes and lccodes. We restore them +% at the end of package loading. \lsthelper{Dr.~Jobst~Hoffmann}{2000/11/17} +% {incompatibility with typehtml package} reported an incompatibility with the +% \packagename{typehtml} package, which is resolved by |\lccode`\/`\/| below. +% \begin{macrocode} +\def\lst@RestoreCatcodes#1{% + \ifx\relax#1\else + \noexpand\catcode`\noexpand#1\the\catcode`#1\relax + \expandafter\lst@RestoreCatcodes + \fi} +\edef\lst@RestoreCatcodes{% + \noexpand\lccode`\noexpand\/`\noexpand\/% + \lst@RestoreCatcodes\"\^^I\^^M\~\^^@\relax + \catcode12\active} +% \end{macrocode} +% Now we are ready for +% \begin{macrocode} +\lst@InputCatcodes +\AtEndOfPackage{\lst@RestoreCatcodes} +% +% \end{macrocode} +% \end{macro} +% +% \paragraph{Statistics} +% \begin{macro}{\lst@GetAllocs} +% \begin{macro}{\lst@ReportAllocs} +% are used to show the allocated registers. +% \begin{macrocode} +%<*info> +\def\lst@GetAllocs{% + \edef\lst@allocs{% + 0\noexpand\count\the\count10,1\noexpand\dimen\the\count11,% + 2\noexpand\skip\the\count12,3\noexpand\muskip\the\count13,% + 4\noexpand\box\the\count14,5\noexpand\toks\the\count15,% + 6\noexpand\read\the\count16,7\noexpand\write\the\count17}} +\def\lst@ReportAllocs{% + \message{^^JAllocs:}\def\lst@temp{none}% + \expandafter\lst@ReportAllocs@\lst@allocs,\z@\relax\z@,} +\def\lst@ReportAllocs@#1#2#3,{% + \ifx#2\relax \message{\lst@temp^^J}\else + \@tempcnta\count1#1\relax \advance\@tempcnta -#3\relax + \ifnum\@tempcnta=\z@\else + \let\lst@temp\@empty + \message{\the\@tempcnta \string#2,}% + \fi + \expandafter\lst@ReportAllocs@ + \fi} +\lst@GetAllocs +% \end{macrocode} +% \end{macro}\end{macro} +% \begingroup +% \begin{macrocode} +% +% \end{macrocode} +% \endgroup +% +% \paragraph{Miscellaneous} +% \begin{macro}{\@lst} +% Just a definition to save memory space. +% \begin{macrocode} +%<*kernel> +\def\@lst{lst} +% +% \end{macrocode} +% \end{macro} +% +% +% \section{General problems} +% +% All definitions in this section belong to the kernel. +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% +%^^A \subsection{Quick `if parameter empty'} +%^^A +%^^A There are many situations where you have to look whether a macro parameter is empty. +%^^A We have at least two possibilities to test |#1|, for example: +%^^A \begin{center} +%^^A \begin{minipage}{0.35\linewidth} +%^^A \begin{verbatim} +%^^A\def\test{#1}% +%^^A\ifx \test\empty +%^^A % #1 is empty +%^^A\else +%^^A % #1 is not empty +%^^A\fi\end{verbatim} +%^^A \end{minipage} +%^^A \hskip2em\vrule\hskip2em +%^^A \begin{minipage}{0.35\linewidth} +%^^A \begin{verbatim} +%^^A\ifx \empty#1\empty +%^^A % #1 is empty +%^^A\else +%^^A % #1 is not empty +%^^A\fi\end{verbatim} +%^^A \end{minipage} +%^^A \end{center} +%^^A where |\empty| is defined by |\def\empty{}|, of course. +%^^A The left variant should be clear and works in any case. +%^^A The right-hand side works correct if and only if the first token of |#1| is +%^^A not equivalent to |\empty|. +%^^A This granted, the |\ifx| is true if and only if |#1| is empty (since |\empty| +%^^A left from |#1| is (not) compared with |\empty| on the right). +%^^A The two |\empty|s might be replaced by any other macro, which is not +%^^A equivalent to the first token of the argument. +%^^A But the definition of that macro shouldn't be too complex since this would +%^^A slow down the |\ifx|. +%^^A The right example needs about $45\%$ of the left's time. +%^^A Note that this \TeX{}nique lost its importance from version 0.18 on and that +%^^A other packages use |!| or |\relax| instead of |\empty|, for example. +%^^A +%^^A This \TeX nique is described in ``The \TeX book'' on page 376. +% +% +% \subsection{Substring tests}\label{iSubstringTests} +% +% \lstset{language=TeX,gobble=4,xleftmargin=20pt,columns=[l]fullflexible,mathescape,keywordstyle=\ttfamily,texcsstyle=\bfseries} +% \let\texverb\lstinline +% \lstnewenvironment{texcode}[1][]{\lstset{#1}}{} +% \lstset{keywords={def,key}} +% +% It's easy to decide whether a given character sequence is a substring of +% another string. For example, for the substring \texverb|def| we could say +% \begin{texcode} +% \def \lst@temp#1def#2\relax{% +% \ifx \@empty#2\@empty +% % "def" is not a substring +% \else +% % "def" is a substring +% \fi} +% +% \lst@temp $\meta{another\ string}$def\relax +% \end{texcode} +% When \TeX\ passes the arguments |#1| and |#2|, the second is empty if +% and only if \texverb|def| is not a substring. Without the additional +% \texverb|def\relax|, one would get a ``runaway argument'' error if +% \meta{another string} doesn't contain \texverb|def|. +% +% We use substring tests mainly in the special case of an identifier and a +% comma separated list of keys or keywords: +% \begin{texcode}[keywords=key] +% \def \lst@temp#1,key,#2\relax{% +% \ifx \@empty#2\@empty +% % `key' is not a keyword +% \else +% % `key' is a keyword +% \fi} +% +% \lst@temp,$\meta{list\ of\ keywords}$,key,\relax +% \end{texcode} +% This works very well and is quite fast. But we can reduce run time in the +% case that \texttt{key} is a keyword. Then |#2| takes the rest of the string, +% namely all keywords after \texttt{key}. +% Since \TeX\ inserts |#2| between the \texverb|\@empty|s, it must drop all of +% |#2| except the first character---which is compared with \texverb|\@empty|. +% We can redirect this rest to a third parameter: +% \begin{texcode}[keywords=key] +% \def \lst@temp#1,key,#2#3\relax{% +% \ifx \@empty#2% +% % "key" is not a keyword +% \else +% % "key" is a keyword +% \fi} +% +% \lst@temp,$\meta{list\ of\ keywords}$,key,\@empty\relax +% \end{texcode} +% That's a bit faster and an improvement for version 0.20. +% +% \begin{macro}{\lst@IfSubstring} +% The implementation should be clear from the discussion above. +% \begin{macrocode} +\def\lst@IfSubstring#1#2{% + \def\lst@temp##1#1##2##3\relax{% + \ifx \@empty##2\expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi}% + \expandafter\lst@temp#2#1\@empty\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@IfOneOf} +% Ditto. +% \begin{macrocode} +\def\lst@IfOneOf#1\relax#2{% + \def\lst@temp##1,#1,##2##3\relax{% + \ifx \@empty##2\expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi}% + \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax} +% \end{macrocode} +% \end{macro} +% \begin{REMOVED} +% One day, if there is need for a case insensitive key(word) test again, we +% can use two |\uppercase|s to normalize the first parameter: +% \begin{verbatim} +%\def\lst@IfOneOfInsensitive#1\relax#2{% +% \uppercase{\def\lst@temp##1,#1},##2##3\relax{% +% \ifx \@empty##2\expandafter\@secondoftwo +% \else \expandafter\@firstoftwo \fi}% +% \uppercase{% +% \expandafter\lst@temp\expandafter,#2,#1},\@empty\relax}\end{verbatim} +% Here we assume that macro |#2| already contains capital characters only, see +% the definition of |\lst@MakeMacroUppercase| at the very end of section +% \ref{iMakingTests}. If we \emph{must not} assume that, we could simply +% insert an |\expandafter| between the second |\uppercase| and the following +% brace. But this slows down the tests! +% \end{REMOVED} +% +% \begin{macro}{\lst@DeleteKeysIn} +% The submacro does the main work; we only need to expand the second +% macro---the list of keys to remove---and append the terminator |\relax|. +% \begin{macrocode} +\def\lst@DeleteKeysIn#1#2{% + \expandafter\lst@DeleteKeysIn@\expandafter#1#2,\relax,} +% \end{macrocode} +% `Replacing' the very last |\lst@DeleteKeysIn@| by |\lst@RemoveCommas| +% terminates the loop here. Note: The |\@empty| after |#2| ensures that this +% macro also works if |#2| is empty. +% \begin{macrocode} +\def\lst@DeleteKeysIn@#1#2,{% + \ifx\relax#2\@empty + \expandafter\@firstoftwo\expandafter\lst@RemoveCommas + \else + \ifx\@empty#2\@empty\else +% \end{macrocode} +% If we haven't reached the end of the list and if the key is not empty, we +% define a temporary macro which removes all appearances. +% \begin{macrocode} + \def\lst@temp##1,#2,##2{% + ##1% + \ifx\@empty##2\@empty\else + \expandafter\lst@temp\expandafter,% + \fi ##2}% + \edef#1{\expandafter\lst@temp\expandafter,#1,#2,\@empty}% + \fi + \fi + \lst@DeleteKeysIn@#1} +% \end{macrocode} +% \end{macro} +% \begin{OLDDEF} +% The following modification needs about $50\%$ more run time. +% It doesn't use |\edef| and thus also works with |\{| inside |#1|. +% However, we don't need that at the moment. +% \begin{verbatim} +% \def\lst@temp##1,#2,##2{% +% \ifx\@empty##2% +% \lst@lAddTo#1{##1}% +% \else +% \lst@lAddTo#1{,##1}% +% \expandafter\lst@temp\expandafter,% +% \fi ##2}% +% \let\@tempa#1\let#1\@empty +% \expandafter\lst@temp\expandafter,\@tempa,#2,\@empty\end{verbatim} +% \end{OLDDEF} +% +% \begin{macro}{\lst@RemoveCommas} +% The macro drops commas at the beginning and assigns the new value to |#1|. +% \begin{macrocode} +\def\lst@RemoveCommas#1{\edef#1{\expandafter\lst@RC@#1\@empty}} +\def\lst@RC@#1{\ifx,#1\expandafter\lst@RC@ \else #1\fi} +% \end{macrocode} +% \end{macro} +% \begin{OLDDEF} +% The following version works with |\{| inside the macro |#1|. +% \begin{verbatim} +%\def\lst@RemoveCommas#1{\expandafter\lst@RC@#1\@empty #1} +%\def\lst@RC@#1{% +% \ifx,#1\expandafter\lst@RC@ +% \else\expandafter\lst@RC@@\expandafter#1\fi} +%\def\lst@RC@@#1\@empty#2{\def#2{#1}}\end{verbatim} +% \end{OLDDEF} +% +% \begin{macro}{\lst@ReplaceIn} +% \begin{macro}{\lst@ReplaceInArg} +% These macros are similar to |\lst@DeleteKeysIn|, except that \ldots +% \begin{macrocode} +\def\lst@ReplaceIn#1#2{% + \expandafter\lst@ReplaceIn@\expandafter#1#2\@empty\@empty} +\def\lst@ReplaceInArg#1#2{\lst@ReplaceIn@#1#2\@empty\@empty} +% \end{macrocode} +% \ldots\space we replace |#2| by |#3| instead of |,#2,| by a single comma +% (which removed the key |#2| above). +% \begin{macrocode} +\def\lst@ReplaceIn@#1#2#3{% + \ifx\@empty#3\relax\else + \def\lst@temp##1#2##2{% + \ifx\@empty##2% + \lst@lAddTo#1{##1}% + \else + \lst@lAddTo#1{##1#3}\expandafter\lst@temp + \fi ##2}% + \let\@tempa#1\let#1\@empty + \expandafter\lst@temp\@tempa#2\@empty + \expandafter\lst@ReplaceIn@\expandafter#1% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Flow of control} +% +% \begin{macro}{\@gobblethree} +% is defined if and only if undefined. +% \begin{macrocode} +\providecommand*\@gobblethree[3]{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@GobbleNil} +% \begin{macrocode} +\def\lst@GobbleNil#1\@nil{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Swap} +% is just this: +% \begin{macrocode} +\def\lst@Swap#1#2{#2#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@if} +% \begin{macro}{\lst@true} +% \begin{macro}{\lst@false} +% A general |\if| for temporary use. +% \begin{macrocode} +\def\lst@true{\let\lst@if\iftrue} +\def\lst@false{\let\lst@if\iffalse} +\lst@false +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@IfNextCharsArg} +% is quite easy: We define a macro and call |\lst@IfNextChars|. +% \begin{macrocode} +\def\lst@IfNextCharsArg#1{% + \def\lst@tofind{#1}\lst@IfNextChars\lst@tofind} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@IfNextChars} +% We save the arguments and start a loop. +% \begin{macrocode} +\def\lst@IfNextChars#1#2#3{% + \let\lst@tofind#1\def\@tempa{#2}\def\@tempb{#3}% + \let\lst@eaten\@empty \lst@IfNextChars@} +% \end{macrocode} +% Expand the characters we are looking for. +% \begin{macrocode} +\def\lst@IfNextChars@{\expandafter\lst@IfNextChars@@\lst@tofind\relax} +% \end{macrocode} +% Now we can refine |\lst@tofind| and append the input character |#3| to +% |\lst@eaten|. +% \begin{macrocode} +\def\lst@IfNextChars@@#1#2\relax#3{% + \def\lst@tofind{#2}\lst@lAddTo\lst@eaten{#3}% + \ifx#1#3% +% \end{macrocode} +% If characters are the same, we either call |\@tempa| or continue the test. +% \begin{macrocode} + \ifx\lst@tofind\@empty + \let\lst@next\@tempa + \else + \let\lst@next\lst@IfNextChars@ + \fi + \expandafter\lst@next + \else +% \end{macrocode} +% If the characters are different, we call |\@tempb|. +% \begin{macrocode} + \expandafter\@tempb + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@IfNextCharActive} +% We compare the character |#3| with its active version |\lowercase{~}|. +% Note that the right brace between |\ifx~| and |#3| ends the |\lowercase|. +% The |\endgroup| restores the |\lccode|. +% \begin{macrocode} +\def\lst@IfNextCharActive#1#2#3{% + \begingroup \lccode`\~=`#3\lowercase{\endgroup + \ifx~}#3% + \def\lst@next{#1}% + \else + \def\lst@next{#2}% + \fi \lst@next #3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@for} +% A for-loop with expansion of the loop-variable. This was improved due to +% a suggestion by \lsthelper{Hendri~Adriaens}{2006/03/31}{speedup of +% \lst@for}. +% \begin{macrocode} +\def\lst@for#1\do#2{% + \def\lst@forbody##1{#2}% + \def\@tempa{#1}% + \ifx\@tempa\@empty\else\expandafter\lst@f@r#1,\@nil,\fi +} +\def\lst@f@r#1,{% + \def\@tempa{#1}% + \ifx\@tempa\@nnil\else\lst@forbody{#1}\expandafter\lst@f@r\fi +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Catcode changes}\label{iCatcodeChanges} +% +% A character gets its catcode right after reading it and \TeX\ has no +% primitive command to change attached catcodes. However, we can replace these +% characters by characters with same ASCII codes and different catcodes. +% It's not the same but suffices since the result is the same. +% Here we treat the very special case that all characters become active. +% If we want \texverb|\lst@arg| to contain an active version of the character +% |#1|, a prototype macro could be +% \begin{texcode} +% \def\lst@MakeActive#1{\lccode`\~=`#1\lowercase{\def\lst@arg{~}}} +% \end{texcode} +% The |\lowercase| changes the ASCII code of |~| to the one of |#1| since we +% have said that |#1| is the lower case version of |~|. +% Fortunately the |\lowercase| doesn't change the catcode, so we have an active +% version of |#1|. +% Note that |~| is usually active. +% +% \begin{macro}{\lst@MakeActive} +% We won't do this character by character. +% To increase speed we change nine characters at the same time (if nine +% characters are left). +% \begin{TODO} +% This was introduced when the delimiters were converted each listings. Now +% this conversion is done only each language selection. So we might want to +% implement a character by character conversion again to decrease the memory +% usage. +% \end{TODO} +% We get the argument, empty |\lst@arg| and begin a loop. +% \begin{macrocode} +\def\lst@MakeActive#1{% + \let\lst@temp\@empty \lst@MakeActive@#1% + \relax\relax\relax\relax\relax\relax\relax\relax\relax} +% \end{macrocode} +% There are nine |\relax|es since |\lst@MakeActive@| has nine parameters and we +% don't want any problems in the case that |#1| is empty. +% We need nine active characters now instead of a single |~|. +% We make these catcode changes local and define the coming macro |\global|. +% \begin{macrocode} +\begingroup +\catcode`\^^@=\active \catcode`\^^A=\active \catcode`\^^B=\active +\catcode`\^^C=\active \catcode`\^^D=\active \catcode`\^^E=\active +\catcode`\^^F=\active \catcode`\^^G=\active \catcode`\^^H=\active +% \end{macrocode} +% First we |\let| the next operation be |\relax|. +% This aborts our loop for processing all characters (default and possibly +% changed later). +% Then we look if we have at least one character. +% If this is not the case, the loop terminates and all is done. +% \begin{macrocode} +\gdef\lst@MakeActive@#1#2#3#4#5#6#7#8#9{\let\lst@next\relax + \ifx#1\relax + \else \lccode`\^^@=`#1% +% \end{macrocode} +% Otherwise we say that |^^@|=chr(0) is the lower case version of the first +% character. +% Then we test the second character. +% If there is none, we append the lower case |^^@| to |\lst@temp|. +% Otherwise we say that |^^A|=chr(1) is the lower case version of the second +% character and we test the next argument, and so on. +% \begin{macrocode} + \ifx#2\relax + \lowercase{\lst@lAddTo\lst@temp{^^@}}% + \else \lccode`\^^A=`#2% + \ifx#3\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A}}% + \else \lccode`\^^B=`#3% + \ifx#4\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B}}% + \else \lccode`\^^C=`#4% + \ifx#5\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C}}% + \else \lccode`\^^D=`#5% + \ifx#6\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D}}% + \else \lccode`\^^E=`#6% + \ifx#7\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E}}% + \else \lccode`\^^F=`#7% + \ifx#8\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F}}% + \else \lccode`\^^G=`#8% + \ifx#9\relax + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G}}% +% \end{macrocode} +% If nine characters are present, we append (lower case versions of) nine +% active characters and call this macro again via redefining |\lst@next|. +% \begin{macrocode} + \else \lccode`\^^H=`#9% + \lowercase{\lst@lAddTo\lst@temp{^^@^^A^^B^^C^^D^^E^^F^^G^^H}}% + \let\lst@next\lst@MakeActive@ + \fi \fi \fi \fi \fi \fi \fi \fi \fi + \lst@next} +\endgroup +% \end{macrocode} +% This |\endgroup| restores the catcodes of chr(0)--chr(8), but not the +% catcodes of the characters inside |\lst@MakeActive@| since they are already +% read. +% +% Note: A conversion from an arbitrary `catcode--character code' table back to +% \TeX's catcodes is possible if we test against the character codes (either +% via |\ifnum| or |\ifcase|). +% But control sequences and begin and end group characters definitely need +% some special treatment. +% However I haven't checked the details. +% So just ignore this and don't bother me for this note. :\,--\,) +% \end{macro} +% +% \begin{macro}{\lst@DefActive} +% An easy application of |\lst@MakeActive|. +% \begin{macrocode} +\def\lst@DefActive#1#2{\lst@MakeActive{#2}\let#1\lst@temp} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DefOther} +% We use the fact that |\meaning| produces catcode 12 characters except spaces +% stay spaces. |\escapechar| is modified locally to suppress the output of an +% escape character. Finally we remove spaces via \LaTeX's |\zap@space|, which +% was proposed by \lsthelper{Rolf~Niepraschk}{1997/04/24}{use \zap@space}---not +% in this context, but that doesn't matter. +% \begin{macrocode} +\def\lst@DefOther#1#2{% + \begingroup \def#1{#2}\escapechar\m@ne \expandafter\endgroup + \expandafter\lst@DefOther@\meaning#1\relax#1} +\def\lst@DefOther@#1>#2\relax#3{\edef#3{\zap@space#2 \@empty}} +% \end{macrocode} +% \end{macro} +% +% +%\ifhyper +% \subsection{Applications to \ref*{iCatcodeChanges}}\label{iApplicationsTo} +%\else +% \subsection{Applications to \ref{iCatcodeChanges}}\label{iApplicationsTo} +%\fi +% +% If an environment is used inside an argument, the listing is already read and +% we can do nothing to preserve the catcodes. +% However, under certain circumstances the environment can be used inside an +% argument---that's at least what I've said in the User's guide. +% And now I have to work for it coming true. +% Moreover we define an analogous conversion macro for the +% \packagename{fancyvrb} mode. +% \begin{syntax} +% \item[0.19] |\lst@InsideConvert{|\meta{\TeX\ material \textup(already read\textup)}|}| +% +% \emph{appends} a verbatim version of the argument to |\lst@arg|, but all +% appended characters are active. Since it's not a character to character +% conversion, `verbatim' needs to be explained. All characters can be +% typed in as they are except |\|, |{|, |}| and |%|. If you want one of +% these, you must write |\\|, |\{|, |\}| and |\%| instead. +% If two spaces should follow each other, the second (third, fourth, +% \ldots) space must be entered with a preceding backslash. +% +% \item[0.19] |\lst@XConvert{|\meta{\TeX\ material \textup(already read\textup)}|}| +% +% \emph{appends} a `verbatim' version of the argument to |\lst@arg|. +% Here \TeX\ material is allowed to be put inside argument braces like +% |{(*}{*)}|. The contents of these arguments are converted, the braces +% stay as curly braces. +% +% If |\lst@if| is true, each second argument is treated differently. +% Only the first character (of the delimiter) becomes active. +% \end{syntax} +% +% \begin{macro}{\lst@InsideConvert} +% If \texttt{mathescape} is not on, we call (near the end of this definition) a +% submacro similar to |\zap@space| to replaced single spaces by active spaces. +% Otherwise we check whether the code contains a pair |$...$| and call the +% appropriate macro. +% \begin{macrocode} +\def\lst@InsideConvert#1{% + \lst@ifmathescape + \lst@InsideConvert@e#1$\@nil + \lst@if + \lst@InsideConvert@ey#1\@nil + \else + \lst@InsideConvert@#1 \@empty + \expandafter\@gobbletwo + \fi + \expandafter\lst@next + \else + \lst@InsideConvert@#1 \@empty + \fi} +\begingroup \lccode`\~=`\ \relax \lowercase{% +% \end{macrocode} +% We make |#1| active and append these characters (plus an active space) to +% |\lst@arg|. +% If we haven't found the end |\@empty| of the input, we continue the process. +% \begin{macrocode} +\gdef\lst@InsideConvert@#1 #2{% + \lst@MakeActive{#1}% + \ifx\@empty#2% + \lst@lExtend\lst@arg{\lst@temp}% + \else + \lst@lExtend\lst@arg{\lst@temp~}% + \expandafter\lst@InsideConvert@ + \fi #2} +% \end{macrocode} +% Finally we end the |\lowercase| and close a group. +% \begin{macrocode} +}\endgroup +% \end{macrocode} +% The next definition has been used above to check for |$...$| and the following +% one keeps the math contents from being converted. This feature was requested by +% \lsthelper{Dr.~Jobst~Hoffmann}{}{}. +% \begin{macrocode} +\def\lst@InsideConvert@e#1$#2\@nil{% + \ifx\@empty#2\@empty \lst@false \else \lst@true \fi} +\def\lst@InsideConvert@ey#1$#2$#3\@nil{% + \lst@InsideConvert@#1 \@empty + \lst@lAddTo\lst@arg{% + \lst@ifdropinput\else + \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken + \setbox\@tempboxa=\hbox\bgroup$\lst@escapebegin + #2% + \lst@escapeend$\egroup \lst@CalcLostSpaceAndOutput + \lst@whitespacefalse + \fi}% + \def\lst@next{\lst@InsideConvert{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@XConvert} +% Check for an argument \ldots +% \begin{macrocode} +\def\lst@XConvert{\@ifnextchar\bgroup \lst@XConvertArg\lst@XConvert@} +% \end{macrocode} +% \ldots, convert the argument, add it together with group delimiters to +% |\lst@arg|, and we continue the conversion. +% \begin{macrocode} +\def\lst@XConvertArg#1{% + {\lst@false \let\lst@arg\@empty + \lst@XConvert#1\@nil + \global\let\@gtempa\lst@arg}% + \lst@lExtend\lst@arg{\expandafter{\@gtempa}}% + \lst@XConvertNext} +% \end{macrocode} +% Having no |\bgroup|, we look whether we've found the end of the input, and +% convert one token ((non)active character or control sequence) and continue. +% \begin{macrocode} +\def\lst@XConvert@#1{% + \ifx\@nil#1\else + \begingroup\lccode`\~=`#1\lowercase{\endgroup + \lst@lAddTo\lst@arg~}% + \expandafter\lst@XConvertNext + \fi} +\def\lst@XConvertNext{% + \lst@if \expandafter\lst@XConvertX + \else \expandafter\lst@XConvert \fi} +% \end{macrocode} +% Now we make only the first character active. +% \begin{macrocode} +\def\lst@XConvertX#1{% + \ifx\@nil#1\else + \lst@XConvertX@#1\relax + \expandafter\lst@XConvert + \fi} +\def\lst@XConvertX@#1#2\relax{% + \begingroup\lccode`\~=`#1\lowercase{\endgroup + \lst@XCConvertX@@~}{#2}} +\def\lst@XCConvertX@@#1#2{\lst@lAddTo\lst@arg{{#1#2}}} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Driver file handling*} +% +% The \packagename{listings} package is split into several driver files, +% miscellaneous (= aspect) files, and one kernel file. +% All these files can be loaded partially and on demand---except the kernel +% which provides this functionality. +% \begin{syntax} +% \item[0.21] |\lst@Require|\marg{name}\marg{prefix}\marg{feature list}\meta{alias}\meta{file list macro} +% +% tries to load all items of \meta{feature list} from the files +% listed in \meta{file list macro}. +% Each item has the form [\oarg{sub}]\meta{feature}. +% |\lst@if| equals |\iftrue| if and only if all items were loadable. +% +% The macro \meta{alias} gets an item as argument and must define +% appropriate versions of |\lst@oalias| and |\lst@malias|. In fact +% the feature associated with these definitions is loaded. You can +% use \meta{alias}=|\lst@NoAlias| for no substitution. +% +% \meta{prefix} identifies the type internally and \meta{name} is used +% for messages. +% +% For example, |\lstloadaspects| uses the following arguments where |#1| +% is the list of aspects: |{aspects}|\allowbreak|a|\allowbreak +% |{#1}|\allowbreak|\lst@NoAlias|\allowbreak|\lstaspectfiles|. +% +% \item[0.20] |\lst@DefDriver|\marg{name}\marg{prefix}\meta{interface macro}|\if|\alternative{true,false} +% +% +% +% \item[0.21] |\lst@IfRequired|\oarg{sub}\marg{feature}\marg{then}\marg{else} +% +% is used inside a driver file by the aspect, language, or whatever +% else defining commands. \meta{then} is executed if and only if +% \oarg{sub}\marg{feature} has been requested via |\lst@Require|. +% Otherwise \meta{else} is executed---which is also the case for +% subsequent calls with the same \oarg{sub}\marg{feature}. +% +% \meta{then} and \meta{else} may use |\lst@prefix| (read access only). +% +% |\lst@BeginAspect| in section \ref{iAspectCommands} and |\lst@DefDriver| +% serve as examples. +% \end{syntax} +% +% \begin{macro}{\lst@Require} +% Initialize variables (if required items aren't empty), \ldots +% \begin{macrocode} +\def\lst@Require#1#2#3#4#5{% + \begingroup + \aftergroup\lst@true + \ifx\@empty#3\@empty\else + \def\lst@prefix{#2}\let\lst@require\@empty +% \end{macrocode} +% \ldots\space and for each nonempty item: determine alias and add it to +% |\lst@require| if it isn't loaded. +% \begin{macrocode} + \edef\lst@temp{\expandafter\zap@space#3 \@empty}% + \lst@for\lst@temp\do{% + \ifx\@empty##1\@empty\else \lstKV@OptArg[]{##1}{% + #4[####1]{####2}% + \@ifundefined{\@lst\lst@prefix @\lst@malias $\lst@oalias}% + {\edef\lst@require{\lst@require,\lst@malias $\lst@oalias}}% + {}}% + \fi}% +% \end{macrocode} +% Init things and input files if and as long as it is necessary. +% \begin{macrocode} + \global\let\lst@loadaspects\@empty + \lst@InputCatcodes + \ifx\lst@require\@empty\else + \lst@for{#5}\do{% + \ifx\lst@require\@empty\else + \InputIfFileExists{##1}{}{}% + \fi}% + \fi +% \end{macrocode} +% Issue error and call |\lst@false| (after closing the local group) if some +% items weren't loadable. +% \begin{macrocode} + \ifx\lst@require\@empty\else + \PackageError{Listings}{Couldn't load requested #1}% + {The following #1s weren't loadable:^^J\@spaces + \lst@require^^JThis may cause errors in the sequel.}% + \aftergroup\lst@false + \fi +% \end{macrocode} +% Request aspects. +% \begin{macrocode} + \ifx\lst@loadaspects\@empty\else + \lst@RequireAspects\lst@loadaspects + \fi + \fi + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@IfRequired} +% uses |\lst@IfOneOf| and adds some code to \meta{then} part: +% delete the now loaded item from the list and define +% |\lst|\meta{prefix}|@|\meta{feature}|$|\meta{sub}. +% \begin{macrocode} +\def\lst@IfRequired[#1]#2{% + \lst@NormedDef\lst@temp{[#1]#2}% + \expandafter\lst@IfRequired@\lst@temp\relax} +\def\lst@IfRequired@[#1]#2\relax#3{% + \lst@IfOneOf #2$#1\relax\lst@require + {\lst@DeleteKeysIn@\lst@require#2$#1,\relax,% + \global\expandafter\let + \csname\@lst\lst@prefix @#2$#1\endcsname\@empty + #3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@require} +% \begin{macrocode} +\let\lst@require\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@NoAlias} +% just defines |\lst@oalias| and |\lst@malias|. +% \begin{macrocode} +\def\lst@NoAlias[#1]#2{% + \lst@NormedDef\lst@oalias{#1}\lst@NormedDef\lst@malias{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@LAS} +% \begin{macrocode} +\gdef\lst@LAS#1#2#3#4#5#6#7{% + \lst@Require{#1}{#2}{#3}#4#5% + #4#3% + \@ifundefined{lst#2@\lst@malias$\lst@oalias}% + {\PackageError{Listings}% + {#1 \ifx\@empty\lst@oalias\else \lst@oalias\space of \fi + \lst@malias\space undefined}% + {The #1 is not loadable. \@ehc}}% + {#6\csname\@lst#2@\lst@malias $\lst@oalias\endcsname #7}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@RequireAspects} +% \begin{macro}{\lstloadaspects} +% make use of the just developped definitions. +% \begin{macrocode} +\def\lst@RequireAspects#1{% + \lst@Require{aspect}{asp}{#1}\lst@NoAlias\lstaspectfiles} +\let\lstloadaspects\lst@RequireAspects +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lstaspectfiles} +% This macro is defined if and only if it's undefined yet. +% \begin{macrocode} +\@ifundefined{lstaspectfiles} + {\newcommand\lstaspectfiles{lstmisc0.sty,lstmisc.sty}}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DefDriver} +% Test the next character and reinsert the arguments. +% \begin{macrocode} +\gdef\lst@DefDriver#1#2#3#4{% + \@ifnextchar[{\lst@DefDriver@{#1}{#2}#3#4}% + {\lst@DefDriver@{#1}{#2}#3#4[]}} +% \end{macrocode} +% We set |\lst@if| locally true if the item has been requested. +% \begin{macrocode} +\gdef\lst@DefDriver@#1#2#3#4[#5]#6{% + \def\lst@name{#1}\let\lst@if#4% + \lst@NormedDef\lst@driver{\@lst#2@#6$#5}% + \lst@IfRequired[#5]{#6}{\begingroup \lst@true}% + {\begingroup}% + \lst@setcatcodes + \@ifnextchar[{\lst@XDefDriver{#1}#3}{\lst@DefDriver@@#3}} +% \end{macrocode} +% Note that |\lst@XDefDriver| takes optional `base' arguments, but eventually +% calls |\lst@DefDriver@@|. We define the item (in case of need), and +% |\endgroup| resets some catcodes and |\lst@if|, i.e.~|\lst@XXDefDriver| knows +% whether called by a public or internal command. +% \begin{macrocode} +\gdef\lst@DefDriver@@#1#2{% + \lst@if + \global\@namedef{\lst@driver}{#1{#2}}% + \fi + \endgroup + \@ifnextchar[\lst@XXDefDriver\@empty} +% \end{macrocode} +% We get the aspect argument, and (if not empty) load the aspects immediately +% if called by a public command or extend the list of required aspects or +% simply ignore the argument if the item leaves undefined. +% \begin{macrocode} +\gdef\lst@XXDefDriver[#1]{% + \ifx\@empty#1\@empty\else + \lst@if + \lstloadaspects{#1}% + \else + \@ifundefined{\lst@driver}{}% + {\xdef\lst@loadaspects{\lst@loadaspects,#1}}% + \fi + \fi} +% \end{macrocode} +% We insert an additional `also'key=value pair. +% \begin{macrocode} +\gdef\lst@XDefDriver#1#2[#3]#4#5{\lst@DefDriver@@#2{also#1=[#3]#4,#5}} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Aspect commands}\label{iAspectCommands} +% +% This section contains commands used in defining `\lst-aspects'. +% \begin{macro}{\lst@UserCommand} +% is mainly equivalent to |\gdef|. +% \begin{macrocode} +%\let\lst@UserCommand\gdef +%\def\lst@UserCommand#1{\message{\string#1,}\gdef#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@BeginAspect} +% A straight-forward implementation: +% \begin{macrocode} +\newcommand*\lst@BeginAspect[2][]{% + \def\lst@curraspect{#2}% + \ifx \lst@curraspect\@empty + \expandafter\lst@GobbleAspect + \else +% \end{macrocode} +% If \meta{aspect name} is not empty, there are certain other conditions not to +% define the aspect (as described in section \ref{dHowToDefineLstAspects}). +% \begin{macrocode} +% \let\lst@next\@empty +% \def\lst@next{% +% \message{^^JDefine lst-aspect `#2':}\lst@GetAllocs}% + \lst@IfRequired[]{#2}% + {\lst@RequireAspects{#1}% + \lst@if\else \let\lst@next\lst@GobbleAspect \fi}% + {\let\lst@next\lst@GobbleAspect}% + \expandafter\lst@next + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@EndAspect} +% finishes an aspect definition. +% \begin{macrocode} +\def\lst@EndAspect{% + \csname\@lst patch@\lst@curraspect\endcsname +% \lst@ReportAllocs + \let\lst@curraspect\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@GobbleAspect} +% drops all code up to the next |\lst@EndAspect|. +% \begin{macrocode} +\long\def\lst@GobbleAspect#1\lst@EndAspect{\let\lst@curraspect\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Key} +% The command simply defines the key. But we must take care of an optional +% parameter and the initialization argument |#2|. +% \begin{macrocode} +\def\lst@Key#1#2{% +% \message{#1,}% + \@ifnextchar[{\lstKV@def{#1}{#2}}% + {\def\lst@temp{\lst@Key@{#1}{#2}} + \afterassignment\lst@temp + \global\@namedef{KV@\@lst @#1}####1}} +% \end{macrocode} +% Now comes a renamed and modified copy from a \packagename{keyval} macro: +% We need global key definitions. +% \begin{macrocode} +\def\lstKV@def#1#2[#3]{% + \global\@namedef{KV@\@lst @#1@default\expandafter}\expandafter + {\csname KV@\@lst @#1\endcsname{#3}}% + \def\lst@temp{\lst@Key@{#1}{#2}}\afterassignment\lst@temp + \global\@namedef{KV@\@lst @#1}##1} +% \end{macrocode} +% We initialize the key if the first token of |#2| is not |\relax|. +% \begin{macrocode} +\def\lst@Key@#1#2{% + \ifx\relax#2\@empty\else + \begingroup \globaldefs\@ne + \csname KV@\@lst @#1\endcsname{#2}% + \endgroup + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@UseHook} +% is very, very, \ldots, very (hundreds of times) easy. +% \begin{macrocode} +\def\lst@UseHook#1{\csname\@lst hk@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@AddToHook} +% \begin{macro}{\lst@AddToHookExe} +% \begin{macro}{\lst@AddToHookAtTop} +% All use the same submacro. +% \begin{macrocode} +\def\lst@AddToHook{\lst@ATH@\iffalse\lst@AddTo} +\def\lst@AddToHookExe{\lst@ATH@\iftrue\lst@AddTo} +\def\lst@AddToHookAtTop{\lst@ATH@\iffalse\lst@AddToAtTop} +% \end{macrocode} +% If and only if the boolean value is true, the hook material is executed +% globally. +% \begin{macrocode} +\long\def\lst@ATH@#1#2#3#4{% + \@ifundefined{\@lst hk@#3}{% +% \message{^^Jnew hook `#3',^^J}% + \expandafter\gdef\csname\@lst hk@#3\endcsname{}}{}% + \expandafter#2\csname\@lst hk@#3\endcsname{#4}% + \def\lst@temp{#4}% + #1% \iftrue|false + \begingroup \globaldefs\@ne \lst@temp \endgroup + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@AddTo} +% Note that the definition is global! +% \begin{macrocode} +\long\def\lst@AddTo#1#2{% + \expandafter\gdef\expandafter#1\expandafter{#1#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@AddToAtTop} +% We need a couple of |\expandafter|s now. Simply note that we have\\ +% {\small\hspace*{2em}|\expandafter\gdef\expandafter#1\expandafter{\lst@temp| +% $\langle$\textit{contents of }|#1|$\rangle$|}|}\\ +% after the `first phase' of expansion. +% \begin{macrocode} +\def\lst@AddToAtTop#1#2{\def\lst@temp{#2}% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter#1% + \expandafter\expandafter\expandafter{\expandafter\lst@temp#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@lAddTo} +% A local version of |\lst@AddTo| \ldots +% \begin{macrocode} +\def\lst@lAddTo#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Extend} +% \begin{macro}{\lst@lExtend} +% \ldots\space and here we expand the first token of the second argument first. +% \begin{macrocode} +\def\lst@Extend#1#2{% + \expandafter\lst@AddTo\expandafter#1\expandafter{#2}} +\def\lst@lExtend#1#2{% + \expandafter\lst@lAddTo\expandafter#1\expandafter{#2}} +% \end{macrocode} +% \begin{TODO} +% This should never be changed to +% \begin{verbatim} +% \def\lst@Extend#1{% +% \expandafter\lst@AddTo\expandafter#1\expandafter} +% \def\lst@lExtend#1{% +% \expandafter\lst@lAddTo\expandafter#1}\end{verbatim} +% The first is not equivalent in case that the second argument is a single +% (= non-braced) control sequence, and the second isn't in case of a braced +% second argument. +% \end{TODO} +% \end{macro} +% \end{macro} +% +% +% \subsection{Interfacing with \textsf{keyval}} +% +% The \packagename{keyval} package passes the value via the one and only +% paramater |#1| to the definition part of the key macro. The following +% commands may be used to analyse the value. Note that we need at least version +% 1.10 of the \packagename{keyval} package. Note also that the package removes +% a naming conflict with AMS classes---reported by \lsthelper{Ralf~Quast} +% {1998/01/08}{\keywords conflicts with AMS classes}. +% \begingroup +% \begin{macrocode} +\RequirePackage{keyval}[1997/11/10] +% \end{macrocode} +% \endgroup +% +% \begin{macro}{\lstKV@TwoArg} +% \begin{macro}{\lstKV@ThreeArg} +% \begin{macro}{\lstKV@FourArg} +% Define temporary macros and call with given arguments |#1|. We add empty +% arguments for the case that the user doesn't provide enough. +% \begin{macrocode} +\def\lstKV@TwoArg#1#2{\gdef\@gtempa##1##2{#2}\@gtempa#1{}{}} +\def\lstKV@ThreeArg#1#2{\gdef\@gtempa##1##2##3{#2}\@gtempa#1{}{}{}} +\def\lstKV@FourArg#1#2{\gdef\@gtempa##1##2##3##4{#2}\@gtempa#1{}{}{}{}} +% \end{macrocode} +% There's one question: What are the global definitions good for? |\lst@Key| +% might set |\globaldefs| to one and possibly calls this macro. That's the +% reason why we use global definitions here and below. +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lstKV@OptArg} +% We define the temporary macro |\@gtempa| and insert default argument if +% necessary. +% \begin{macrocode} +\def\lstKV@OptArg[#1]#2#3{% + \gdef\@gtempa[##1]##2{#3}\lstKV@OptArg@{#1}#2\@} +\def\lstKV@OptArg@#1{\@ifnextchar[\lstKV@OptArg@@{\lstKV@OptArg@@[#1]}} +\def\lstKV@OptArg@@[#1]#2\@{\@gtempa[#1]{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstKV@XOptArg} +% Here |#3| is already a definition with at least two parameters whose first +% is enclosed in brackets. +% \begin{macrocode} +\def\lstKV@XOptArg[#1]#2#3{% + \global\let\@gtempa#3\lstKV@OptArg@{#1}#2\@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstKV@CSTwoArg} +% Just define temporary macro and call it. +% \begin{macrocode} +\def\lstKV@CSTwoArg#1#2{% + \gdef\@gtempa##1,##2,##3\relax{#2}% + \@gtempa#1,,\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstKV@SetIf} +% We simply test the lower case first character of |#1|. +% \begin{macrocode} +\def\lstKV@SetIf#1{\lstKV@SetIf@#1\relax} +\def\lstKV@SetIf@#1#2\relax#3{\lowercase{% + \expandafter\let\expandafter#3% + \csname if\ifx #1t}true\else false\fi\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstKV@SwitchCases} +% is implemented as a substring test. +% \begin{macrocode} +\def\lstKV@SwitchCases#1#2#3{% + \def\lst@temp##1\\#1&##2\\##3##4\@nil{% + \ifx\@empty##3% + #3% + \else + ##2% + \fi + }% + \lst@temp\\#2\\#1&\\\@empty\@nil} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstset} +% Finally this main user interface macro. +% We change catcodes for reading the argument. +% \begin{macrocode} +\lst@UserCommand\lstset{\begingroup \lst@setcatcodes \lstset@} +\def\lstset@#1{\endgroup \ifx\@empty#1\@empty\else\setkeys{lst}{#1}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@setcatcodes} +% contains all catcode changes for |\lstset|. The equal-sign has been added +% after a bug report by \lsthelper{Bekir~Karaoglu}{2003/09/16}{keyval problems +% with [turkish]{babel}}---babel's active equal sign clashes with keyval's +% usage. |\catcode`\"=12\relax| has been removed after a bug report by +% \lsthelper{Heiko~Bauke}{2004/06/27}{listings und ngerman}\,---\,hopefully +% this introduces no other bugs. +% \begin{macrocode} +\def\lst@setcatcodes{\makeatletter \catcode`\==12\relax} +% \end{macrocode} +% \begin{TODO} +% Change more catcodes? +% \end{TODO} +% \end{macro} +% +% +% \subsection{Internal modes} +% +% \begin{macro}{\lst@NewMode} +% We simply use |\chardef| for a mode definition. The counter |\lst@mode| +% mainly keeps the current mode number. But it is also used to advance the +% number in the macro |\lst@newmode|---we don't waste another counter. +% \begin{macrocode} +\def\lst@NewMode#1{% + \ifx\@undefined#1% + \lst@mode\lst@newmode\relax \advance\lst@mode\@ne + \xdef\lst@newmode{\the\lst@mode}% + \global\chardef#1=\lst@mode + \lst@mode\lst@nomode + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@mode} +% \begin{macro}{\lst@nomode} +% We allocate the counter and the first mode. +% \begin{macrocode} +\newcount\lst@mode +\def\lst@newmode{\m@ne}% init +\lst@NewMode\lst@nomode % init (of \lst@mode :-) +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@UseDynamicMode} +% For dynamic modes we must not use the counter |\lst@mode| (since possibly +% already valued). |\lst@dynamicmode| substitutes |\lst@newmode| and is a local +% definition here, \ldots +% \begin{macrocode} +\def\lst@UseDynamicMode{% + \@tempcnta\lst@dynamicmode\relax \advance\@tempcnta\@ne + \edef\lst@dynamicmode{\the\@tempcnta}% + \expandafter\lst@Swap\expandafter{\expandafter{\lst@dynamicmode}}} +% \end{macrocode} +% \ldots\ initialized each listing with the current `value' of |\lst@newmode|. +% \begin{macrocode} +\lst@AddToHook{InitVars}{\let\lst@dynamicmode\lst@newmode} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@EnterMode} +% Each mode opens a group level, stores the mode number and execute mode +% specific tokens. Moreover we keep all these changes in mind (locally) and +% adjust internal variables if the user wants it. +% \begin{macrocode} +\def\lst@EnterMode#1#2{% + \bgroup \lst@mode=#1\relax #2% + \lst@FontAdjust + \lst@lAddTo\lst@entermodes{\lst@EnterMode{#1}{#2}}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{InitVars}{\let\lst@entermodes\@empty} +\let\lst@entermodes\@empty % init +% \end{macrocode} +% The initialization has been added after a bug report from +% \lsthelper{Herfried~Karl~Wagner}{2002/05/11}{undefined control sequence +% \lst@entermodes}. +% \end{macro} +% +% \begin{macro}{\lst@LeaveMode} +% We simply close the group and call |\lsthk@EndGroup| if and only if the +% current mode is not |\lst@nomode|. +% \begin{macrocode} +\def\lst@LeaveMode{% + \ifnum\lst@mode=\lst@nomode\else + \egroup \expandafter\lsthk@EndGroup + \fi} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{EndGroup}{}% init +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@InterruptModes} +% We put the current mode sequence on a stack and leave all modes. +% \begin{macrocode} +\def\lst@InterruptModes{% + \lst@Extend\lst@modestack{\expandafter{\lst@entermodes}}% + \lst@LeaveAllModes} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{InitVars}{\global\let\lst@modestack\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ReenterModes} +% If the stack is not empty, we leave all modes and pop the topmost element +% (which is the last element of |\lst@modestack|). +% \begin{macrocode} +\def\lst@ReenterModes{% + \ifx\lst@modestack\@empty\else + \lst@LeaveAllModes + \global\let\@gtempa\lst@modestack + \global\let\lst@modestack\@empty + \expandafter\lst@ReenterModes@\@gtempa\relax + \fi} +\def\lst@ReenterModes@#1#2{% + \ifx\relax#2\@empty +% \end{macrocode} +% If we've reached |\relax|, we've also found the last element: we execute |#1| +% and gobble |{#2}|=|{\relax}| after |\fi|. +% \begin{macrocode} + \gdef\@gtempa##1{#1}% + \expandafter\@gtempa + \else +% \end{macrocode} +% Otherwise we just add the element to |\lst@modestack| and continue the loop. +% \begin{macrocode} + \lst@AddTo\lst@modestack{{#1}}% + \expandafter\lst@ReenterModes@ + \fi + {#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@LeaveAllModes} +% Leaving all modes means closing groups until the mode equals |\lst@nomode|. +% \begin{macrocode} +\def\lst@LeaveAllModes{% + \ifnum\lst@mode=\lst@nomode + \expandafter\lsthk@EndGroup + \else + \expandafter\egroup\expandafter\lst@LeaveAllModes + \fi} +% \end{macrocode} +% We need that macro to end a listing correctly. +% \begin{macrocode} +\lst@AddToHook{ExitVars}{\lst@LeaveAllModes} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Pmode} +% \begin{macro}{\lst@GPmode} +% The `processing' and the general purpose mode. +% \begin{macrocode} +\lst@NewMode\lst@Pmode +\lst@NewMode\lst@GPmode +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@modetrue} +% The usual macro to value a boolean except that we also execute a hook. +% \begin{macrocode} +\def\lst@modetrue{\let\lst@ifmode\iftrue \lsthk@ModeTrue} +\let\lst@ifmode\iffalse % init +\lst@AddToHook{ModeTrue}{}% init +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ifLmode} +% Comment lines use a static mode. It terminates at end of line. +% \begin{macrocode} +\def\lst@Lmodetrue{\let\lst@ifLmode\iftrue} +\let\lst@ifLmode\iffalse % init +\lst@AddToHook{EOL}{\@whilesw \lst@ifLmode\fi \lst@LeaveMode} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Divers helpers} +% +% \begin{macro}{\lst@NormedDef} +% works like |\def| (without any parameters!) but normalizes the replacement +% text by making all characters lower case and stripping off spaces. +% \begin{macrocode} +\def\lst@NormedDef#1#2{\lowercase{\edef#1{\zap@space#2 \@empty}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@NormedNameDef} +% works like |\global\@namedef| (again without any parameters!) but normalizes +% both the macro name and the replacement text. +% \begin{macrocode} +\def\lst@NormedNameDef#1#2{% + \lowercase{\edef\lst@temp{\zap@space#1 \@empty}% + \expandafter\xdef\csname\lst@temp\endcsname{\zap@space#2 \@empty}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@GetFreeMacro} +% Initialize |\@tempcnta| and |\lst@freemacro|, \ldots +% \begin{macrocode} +\def\lst@GetFreeMacro#1{% + \@tempcnta\z@ \def\lst@freemacro{#1\the\@tempcnta}% + \lst@GFM@} +% \end{macrocode} +% \ldots\space and either build the control sequence or advance the counter and +% continue. +% \begin{macrocode} +\def\lst@GFM@{% + \expandafter\ifx \csname\lst@freemacro\endcsname \relax + \edef\lst@freemacro{\csname\lst@freemacro\endcsname}% + \else + \advance\@tempcnta\@ne + \expandafter\lst@GFM@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@gtempboxa} +% \begin{macrocode} +\newbox\lst@gtempboxa +% \end{macrocode} +% \begin{macrocode} +% +% \end{macrocode} +% \end{macro} +% +% +% \section{Doing output} +% +% +% \subsection{Basic registers and keys} +% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \paragraph{The current character string} +% is kept in a token register and a counter holds its length. +% Here we define the macros to put characters into the output queue. +% +% \begin{macro}{\lst@token} +% \begin{macro}{\lst@length} +% are allocated here. Quite a useful comment, isn't it? +% \begin{macrocode} +\newtoks\lst@token \newcount\lst@length +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@ResetToken} +% \begin{macro}{\lst@lastother} +% The two registers get empty respectively zero at the beginning of each line. +% After receiving a report from \lsthelper{Claus~Atzenbeck}{1999/11/24}{HTML: +% output unit repeated after >}---I removed such a bug many times---I decided +% to reset these registers in the \hookname{EndGroup} hook, too. +% \begin{macrocode} +\def\lst@ResetToken{\lst@token{}\lst@length\z@} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{InitVarsBOL}{\lst@ResetToken \let\lst@lastother\@empty} +\lst@AddToHook{EndGroup}{\lst@ResetToken \let\lst@lastother\@empty} +% \end{macrocode} +% The macro |\lst@lastother| will be equivalent to the last `other' character, +% which leads us to |\lst@ifletter|. +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@ifletter} +% indicates whether the token contains an identifier or other characters. +% \begin{macrocode} +\def\lst@lettertrue{\let\lst@ifletter\iftrue} +\def\lst@letterfalse{\let\lst@ifletter\iffalse} +\lst@AddToHook{InitVars}{\lst@letterfalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Append} +% puts the argument into the output queue. +% \begin{macrocode} +\def\lst@Append#1{\advance\lst@length\@ne + \lst@token=\expandafter{\the\lst@token#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@AppendOther} +% Depending on the current state, we first output the character string as an +% identifier. Then we save the `argument' via |\futurelet| and call the macro +% |\lst@Append| to do the rest. +% \begin{macrocode} +\def\lst@AppendOther{% + \lst@ifletter \lst@Output\lst@letterfalse \fi + \futurelet\lst@lastother\lst@Append} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@AppendLetter} +% We output a non-identifier string if necessary and call |\lst@Append|. +% \begin{macrocode} +\def\lst@AppendLetter{% + \lst@ifletter\else \lst@OutputOther\lst@lettertrue \fi + \lst@Append} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@SaveToken} +% \begin{macro}{\lst@RestoreToken} +% If a group end appears and ruins the character string, we can use these +% macros to save and restore the contents. |\lst@thestyle| is the current +% printing style and must be saved and restored, too. +% \begin{macrocode} +\def\lst@SaveToken{% + \global\let\lst@gthestyle\lst@thestyle + \global\let\lst@glastother\lst@lastother + \xdef\lst@RestoreToken{\noexpand\lst@token{\the\lst@token}% + \noexpand\lst@length\the\lst@length\relax + \noexpand\let\noexpand\lst@thestyle + \noexpand\lst@gthestyle + \noexpand\let\noexpand\lst@lastother + \noexpand\lst@glastother}} +% \end{macrocode} +% Now -- that means after a bug report by \lsthelper{Rolf~Niepraschk} +% {2002/04/12}{\RequirePackage is missing keywordstyle when near the top of +% a page} -- |\lst@lastother| is also saved and restored. +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@IfLastOtherOneOf} +% Finally, this obvious implementation. +% \begin{macrocode} +\def\lst@IfLastOtherOneOf#1{\lst@IfLastOtherOneOf@ #1\relax} +\def\lst@IfLastOtherOneOf@#1{% + \ifx #1\relax + \expandafter\@secondoftwo + \else + \ifx\lst@lastother#1% + \lst@IfLastOtherOneOf@t + \else + \expandafter\expandafter\expandafter\lst@IfLastOtherOneOf@ + \fi + \fi} +\def\lst@IfLastOtherOneOf@t#1\fi\fi#2\relax{\fi\fi\@firstoftwo} +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{The current position} +% is either the dimension |\lst@currlwidth|, which is the horizontal position +% without taking the current character string into account, or it's the current +% column starting with number 0. This is |\lst@column| $-$ |\lst@pos| $+$ +% |\lst@length|. Moreover we have |\lst@lostspace| which is the difference +% between the current and the desired line width. We define macros to insert +% this lost space. +% +% \begin{macro}{\lst@currlwidth} +% \begin{macro}{\lst@column} +% \begin{macro}{\lst@pos} +% the current line width and two counters. +% \begin{macrocode} +\newdimen\lst@currlwidth % \global +\newcount\lst@column \newcount\lst@pos % \global +\lst@AddToHook{InitVarsBOL} + {\global\lst@currlwidth\z@ \global\lst@pos\z@ \global\lst@column\z@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@CalcColumn} +% sets |\@tempcnta| to the current column. +% Note that |\lst@pos| will be nonpositive. +% \begin{macrocode} +\def\lst@CalcColumn{% + \@tempcnta\lst@column + \advance\@tempcnta\lst@length + \advance\@tempcnta-\lst@pos} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@lostspace} +% Whenever this dimension is positive we can insert space. A negative `lost +% space' means that the printed line is wider than expected. +% \begin{macrocode} +\newdimen\lst@lostspace % \global +\lst@AddToHook{InitVarsBOL}{\global\lst@lostspace\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@UseLostSpace} +% We insert space and reset it if and only if |\lst@lostspace| is positive. +% \begin{macrocode} +\def\lst@UseLostSpace{\ifdim\lst@lostspace>\z@ \lst@InsertLostSpace \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@InsertLostSpace} +% \begin{macro}{\lst@InsertHalfLostSpace} +% Ditto, but insert even if negative. |\lst@Kern| will be defined very soon. +% \begin{macrocode} +\def\lst@InsertLostSpace{% + \lst@Kern\lst@lostspace \global\lst@lostspace\z@} +\def\lst@InsertHalfLostSpace{% + \global\lst@lostspace.5\lst@lostspace \lst@Kern\lst@lostspace} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \paragraph{Column widths} +% Here we deal with the width of a single column, which equals the width of a +% single character box. Keep in mind that there are fixed and flexible column +% formats. +% +% \begin{macro}{\lst@width} +% \begin{lstkey}{basewidth} +% \keyname{basewidth} assigns the values to macros and tests whether they are +% negative. +% \begin{macrocode} +\newdimen\lst@width +\lst@Key{basewidth}{0.6em,0.45em}{\lstKV@CSTwoArg{#1}% + {\def\lst@widthfixed{##1}\def\lst@widthflexible{##2}% + \ifx\lst@widthflexible\@empty + \let\lst@widthflexible\lst@widthfixed + \fi + \def\lst@temp{\PackageError{Listings}% + {Negative value(s) treated as zero}% + \@ehc}% + \let\lst@error\@empty + \ifdim \lst@widthfixed<\z@ + \let\lst@error\lst@temp \let\lst@widthfixed\z@ + \fi + \ifdim \lst@widthflexible<\z@ + \let\lst@error\lst@temp \let\lst@widthflexible\z@ + \fi + \lst@error}} +% \end{macrocode} +% We set the dimension in a special hook. +% \begin{macrocode} +\lst@AddToHook{FontAdjust} + {\lst@width=\lst@ifflexible\lst@widthflexible + \else\lst@widthfixed\fi \relax} +% \end{macrocode} +% \end{lstkey} +% \end{macro} +% +% \begin{lstkey}{fontadjust} +% \begin{macro}{\lst@FontAdjust} +% This hook is controlled by a switch and is always executed at +% \hookname{InitVars}. +% \begin{macrocode} +\lst@Key{fontadjust}{false}[t]{\lstKV@SetIf{#1}\lst@iffontadjust} +\def\lst@FontAdjust{\lst@iffontadjust \lsthk@FontAdjust \fi} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{InitVars}{\lsthk@FontAdjust} +% \end{macrocode} +% \end{macro} +% \end{lstkey} +% +% +% \subsection{Low- and mid-level output} +% +% \paragraph{Doing the output} +% means putting the character string into a box register, updating all internal +% data, and eventually giving the box to \TeX. +% +% \begin{macro}{\lst@OutputBox} +% \begin{macro}{\lst@alloverstyle} +% The lowest level is the output of a box register. +% Here we use |\box#1| as argument to |\lst@alloverstyle|. +% \begin{macrocode} +\def\lst@OutputBox#1{\lst@alloverstyle{\box#1}} +% \end{macrocode} +% \begin{ALTERNATIVE} +% Instead of |\global\advance\lst@currlwidth| |\wd|\meta{box number} in +% both definitions |\lst@Kern| and |\lst@CalcLostSpaceAndOutput|, we could +% also advance the dimension here. But I decided not to do so since it +% simplifies possible redefinitions of |\lst@OutputBox|: we need not to care +% about |\lst@currlwidth|. +% \end{ALTERNATIVE} +% \begin{macrocode} +\def\lst@alloverstyle#1{#1}% init +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@Kern} +% has been used to insert `lost space'. +% It must not use |\@tempboxa| since that \ldots +% \begin{macrocode} +\def\lst@Kern#1{% + \setbox\z@\hbox{{\lst@currstyle{\kern#1}}}% + \global\advance\lst@currlwidth \wd\z@ + \lst@OutputBox\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CalcLostSpaceAndOutput} +% \ldots\space is used here. +% We keep track of |\lst@lostspace|, |\lst@currlwidth| and |\lst@pos|. +% \begin{macrocode} +\def\lst@CalcLostSpaceAndOutput{% + \global\advance\lst@lostspace \lst@length\lst@width + \global\advance\lst@lostspace-\wd\@tempboxa + \global\advance\lst@currlwidth \wd\@tempboxa + \global\advance\lst@pos -\lst@length +% \end{macrocode} +% Before |\@tempboxa| is output, we insert space if there is enough lost space. +% This possibly invokes |\lst@Kern| via `insert half lost space', which is the +% reason for why we mustn't use |\@tempboxa| above. By redefinition we prevent +% |\lst@OutputBox| from using any special style in |\lst@Kern|. +% \begin{macrocode} + \setbox\@tempboxa\hbox{\let\lst@OutputBox\box + \ifdim\lst@lostspace>\z@ \lst@leftinsert \fi + \box\@tempboxa + \ifdim\lst@lostspace>\z@ \lst@rightinsert \fi}% +% \end{macrocode} +% Finally we can output the new box. +% \begin{macrocode} + \lst@OutputBox\@tempboxa \lsthk@PostOutput} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{PostOutput}{}% init +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@OutputToken} +% Now comes a mid-level definition. +% Here we use |\lst@token| to set |\@tempboxa| and eventually output the box. +% We take care of font adjustment and special output styles. +% Yet unknown macros are defined in the following subsections. +% \begin{macrocode} +\def\lst@OutputToken{% + \lst@TrackNewLines \lst@OutputLostSpace + \lst@ifgobbledws + \lst@gobbledwhitespacefalse + \lst@@discretionary + \fi + \lst@CheckMerge + {\lst@thestyle{\lst@FontAdjust + \setbox\@tempboxa\lst@hbox + {\lsthk@OutputBox + \lst@lefthss + \expandafter\lst@FillOutputBox\the\lst@token\@empty + \lst@righthss}% + \lst@CalcLostSpaceAndOutput}}% + \lst@ResetToken} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{OutputBox}{}% init +% \end{macrocode} +% \begin{macrocode} +\def\lst@gobbledwhitespacetrue{\global\let\lst@ifgobbledws\iftrue} +\def\lst@gobbledwhitespacefalse{\global\let\lst@ifgobbledws\iffalse} +\lst@AddToHookExe{InitBOL}{\lst@gobbledwhitespacefalse}% init +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{Delaying the output} +% means saving the character string somewhere and pushing it back when +% neccessary. We may also attach the string to the next output box without +% affecting style detection: both will be printed in the style of the upcoming +% output. We will call this `merging'. +% +% \begin{macro}{\lst@Delay} +% \begin{macro}{\lst@Merge} +% To delay or merge |#1|, we process it as usual and simply save the state +% in macros. For delayed characters we also need the currently `active' +% output routine. Both definitions first check whether there are already +% delayed or `merged' characters. +% \begin{macrocode} +\def\lst@Delay#1{% + \lst@CheckDelay + #1% + \lst@GetOutputMacro\lst@delayedoutput + \edef\lst@delayed{\the\lst@token}% + \edef\lst@delayedlength{\the\lst@length}% + \lst@ResetToken} +% \end{macrocode} +% \begin{macrocode} +\def\lst@Merge#1{% + \lst@CheckMerge + #1% + \edef\lst@merged{\the\lst@token}% + \edef\lst@mergedlength{\the\lst@length}% + \lst@ResetToken} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@MergeToken} +% Here we put the things together again. +% \begin{macrocode} +\def\lst@MergeToken#1#2{% + \advance\lst@length#2% + \lst@lExtend#1{\the\lst@token}% + \expandafter\lst@token\expandafter{#1}% + \let#1\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CheckDelay} +% We need to print delayed characters. The mode depends on the current output +% macro. If it equals the saved definition, we put the delayed characters in +% front of the character string (we merge them) since there has been no +% letter-to-other or other-to-letter leap. Otherwise we locally reset the +% current character string, merge this empty string with the delayed one, +% and output it. +% \begin{macrocode} +\def\lst@CheckDelay{% + \ifx\lst@delayed\@empty\else + \lst@GetOutputMacro\@gtempa + \ifx\lst@delayedoutput\@gtempa + \lst@MergeToken\lst@delayed\lst@delayedlength + \else + {\lst@ResetToken + \lst@MergeToken\lst@delayed\lst@delayedlength + \lst@delayedoutput}% + \let\lst@delayed\@empty + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CheckMerge} +% All this is easier for |\lst@merged|. +% \begin{macrocode} +\def\lst@CheckMerge{% + \ifx\lst@merged\@empty\else + \lst@MergeToken\lst@merged\lst@mergedlength + \fi} +% \end{macrocode} +% \begin{macrocode} +\let\lst@delayed\@empty % init +\let\lst@merged\@empty % init +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Column formats} +% +% It's time to deal with fixed and flexible column modes. +% A couple of open definitions are now filled in. +% +% \begin{macro}{\lst@column@fixed} +% switches to the fixed column format. The definitions here control how the +% output of the above definitions looks like. +% \begin{macrocode} +\def\lst@column@fixed{% + \lst@flexiblefalse + \lst@width\lst@widthfixed\relax + \let\lst@OutputLostSpace\lst@UseLostSpace + \let\lst@FillOutputBox\lst@FillFixed + \let\lst@hss\hss + \def\lst@hbox{\hbox to\lst@length\lst@width}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@FillFixed} +% Filling up a fixed mode box is easy. +% \begin{macrocode} +\def\lst@FillFixed#1{#1\lst@FillFixed@} +% \end{macrocode} +% While not reaching the end (|\@empty| from above), we insert dynamic space, +% output the argument and call the submacro again. +% \begin{macrocode} +\def\lst@FillFixed@#1{% + \ifx\@empty#1\else \lst@hss#1\expandafter\lst@FillFixed@ \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@column@flexible} +% The first flexible format. +% \begin{macrocode} +\def\lst@column@flexible{% + \lst@flexibletrue + \lst@width\lst@widthflexible\relax + \let\lst@OutputLostSpace\lst@UseLostSpace + \let\lst@FillOutputBox\@empty + \let\lst@hss\@empty + \let\lst@hbox\hbox} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@column@fullflexible} +% This column format inserts no lost space except at the beginning of a line. +% \begin{macrocode} +\def\lst@column@fullflexible{% + \lst@column@flexible + \def\lst@OutputLostSpace{\lst@ifnewline \lst@UseLostSpace\fi}% + \let\lst@leftinsert\@empty + \let\lst@rightinsert\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@column@spaceflexible} +% This column format only inserts lost space by stretching (invisible) +% existing spaces; it does not insert lost space between identifiers +% and other characters where the original does not have a space. It +% was suggested by \lsthelper{Andrei~Alexandrescu}{-}{2007-02-26}. +% \begin{macrocode} +\def\lst@column@spaceflexible{% + \lst@column@flexible + \def\lst@OutputLostSpace{% + \lst@ifwhitespace + \ifx\lst@outputspace\lst@visiblespace + \else + \lst@UseLostSpace + \fi + \else + \lst@ifnewline \lst@UseLostSpace\fi + \fi}% + \let\lst@leftinsert\@empty + \let\lst@rightinsert\@empty} +% \end{macrocode} +% \end{macro} +% +% Thus, we have the column formats. Now we define macros to use them. +% +% \begin{macro}{\lst@outputpos} +% This macro sets the `output-box-positioning' parameter (the old key +% \keyname{outputpos}). We test for |l|, |c| and |r|. +% The fixed formats use |\lst@lefthss| and |\lst@righthss|, whereas the +% flexibles need |\lst@leftinsert| and |\lst@rightinsert|. +% \begin{macrocode} +\def\lst@outputpos#1#2\relax{% + \def\lst@lefthss{\lst@hss}\let\lst@righthss\lst@lefthss + \let\lst@rightinsert\lst@InsertLostSpace + \ifx #1c% + \let\lst@leftinsert\lst@InsertHalfLostSpace + \else\ifx #1r% + \let\lst@righthss\@empty + \let\lst@leftinsert\lst@InsertLostSpace + \let\lst@rightinsert\@empty + \else + \let\lst@lefthss\@empty + \let\lst@leftinsert\@empty + \ifx #1l\else \PackageWarning{Listings}% + {Unknown positioning for output boxes}% + \fi + \fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ifflexible} +% indicates the column mode but does not distinguish between different fixed +% or flexible modes. +% \begin{macrocode} +\def\lst@flexibletrue{\let\lst@ifflexible\iftrue} +\def\lst@flexiblefalse{\let\lst@ifflexible\iffalse} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{columns} +% This is done here: check optional parameter and then build the control +% sequence of the column format. +% \begin{macrocode} +\lst@Key{columns}{[c]fixed}{\lstKV@OptArg[]{#1}{% + \ifx\@empty##1\@empty\else \lst@outputpos##1\relax\relax \fi + \expandafter\let\expandafter\lst@arg + \csname\@lst @column@##2\endcsname +% \end{macrocode} +% We issue a warning or save the definition for later. +% \begin{macrocode} + \lst@arg + \ifx\lst@arg\relax + \PackageWarning{Listings}{Unknown column format `##2'}% + \else + \lst@ifflexible + \let\lst@columnsflexible\lst@arg + \else + \let\lst@columnsfixed\lst@arg + \fi + \fi}} +% \end{macrocode} +% \begin{macrocode} +\let\lst@columnsfixed\lst@column@fixed % init +\let\lst@columnsflexible\lst@column@flexible % init +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{flexiblecolumns} +% Nothing else but a key to switch between the last flexible and fixed mode. +% \begin{macrocode} +\lst@Key{flexiblecolumns}\relax[t]{% + \lstKV@SetIf{#1}\lst@ifflexible + \lst@ifflexible \lst@columnsflexible + \else \lst@columnsfixed \fi} +% \end{macrocode} +% \end{lstkey} +% +% +% \subsection{New lines} +% +% \begin{macro}{\lst@newlines} +% This counter holds the number of `new lines' (cr+lf) we have to perform. +% \begin{macrocode} +\newcount\lst@newlines +\lst@AddToHook{InitVars}{\global\lst@newlines\z@} +\lst@AddToHook{InitVarsBOL}{\global\advance\lst@newlines\@ne} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@NewLine} +% This is how we start a new line: begin new paragraph and output an empty +% box. If low-level definition |\lst@OutputBox| just gobbles the box , we +% don't start a new line. This is used to drop the whole output. +% \begin{macrocode} +\def\lst@NewLine{% + \ifx\lst@OutputBox\@gobble\else + \par\noindent \hbox{}% + \fi + \global\advance\lst@newlines\m@ne + \lst@newlinetrue} +% \end{macrocode} +% Define |\lst@newlinetrue| and reset if after output. +% \begin{macrocode} +\def\lst@newlinetrue{\global\let\lst@ifnewline\iftrue} +\lst@AddToHookExe{PostOutput}{\global\let\lst@ifnewline\iffalse}% init +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@TrackNewLines} +% If |\lst@newlines| is positive, we execute the hook and insert the +% new lines. +% \begin{macrocode} +\def\lst@TrackNewLines{% + \ifnum\lst@newlines>\z@ + \lsthk@OnNewLine + \lst@DoNewLines + \fi} +\lst@AddToHook{OnNewLine}{}% init +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{emptylines} +% \lsthelper{Adam~Prugel-Bennett}{2001/02/19}{spacing of empty lines} asked for +% such a key---if I didn't misunderstood him. We check for the optional star +% and set |\lst@maxempty| and switch. +% \begin{macrocode} +\lst@Key{emptylines}\maxdimen{% + \@ifstar{\lst@true\@tempcnta\@gobble#1\relax\lst@GobbleNil}% + {\lst@false\@tempcnta#1\relax\lst@GobbleNil}#1\@nil + \advance\@tempcnta\@ne + \edef\lst@maxempty{\the\@tempcnta\relax}% + \let\lst@ifpreservenumber\lst@if} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@DoNewLines} +% First we take care of |\lst@maxempty| and then of the remaining empty lines. +% \begin{macrocode} +\def\lst@DoNewLines{ + \@whilenum\lst@newlines>\lst@maxempty \do + {\lst@ifpreservenumber + \lsthk@OnEmptyLine + \global\advance\c@lstnumber\lst@advancelstnum + \fi + \global\advance\lst@newlines\m@ne}% + \@whilenum \lst@newlines>\@ne \do + {\lsthk@OnEmptyLine \lst@NewLine}% + \ifnum\lst@newlines>\z@ \lst@NewLine \fi} +\lst@AddToHook{OnEmptyLine}{}% init +% \end{macrocode} +% \end{macro} +% +% +% \subsection{High-level output} +% +% \begin{lstkey}{identifierstyle} +% A simple key. +% \begin{macrocode} +\lst@Key{identifierstyle}{}{\def\lst@identifierstyle{#1}} +\lst@AddToHook{EmptyStyle}{\let\lst@identifierstyle\@empty} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@GotoTabStop} +% Here we look whether the line already contains printed characters. +% If true, we output a box with the width of a blank space. +% \begin{macrocode} +\def\lst@GotoTabStop{% + \ifnum\lst@newlines=\z@ + \setbox\@tempboxa\hbox{\lst@outputspace}% + \setbox\@tempboxa\hbox to\wd\@tempboxa{{\lst@currstyle{\hss}}}% + \lst@CalcLostSpaceAndOutput +% \end{macrocode} +% It's probably not clear why it is sufficient to output a single space to go +% to the next tabulator stop. Just note that the space lost by this process is +% `lost space' in the sense above and therefore will be inserted before the +% next characters are output. +% \begin{macrocode} + \else +% \end{macrocode} +% Otherwise (no printed characters) we only need to advance |\lst@lostspace|, +% which is inserted by |\lst@OutputToken| above, and update the column. +% \begin{macrocode} + \global\advance\lst@lostspace \lst@length\lst@width + \global\advance\lst@column\lst@length \lst@length\z@ + \fi} +% \end{macrocode} +% Note that this version works also in flexible column mode. +% In fact, it's mainly the flexible version of \packagename{listings} 0.20. +% \begin{TODO} +% Use |\lst@ifnewline| instead of |\ifnum\lst@newlines=\z@|? +% \end{TODO} +% \end{macro} +% +% \begin{macro}{\lst@OutputOther} +% becomes easy with the previous definitions. +% \begin{macrocode} +\def\lst@OutputOther{% + \lst@CheckDelay + \ifnum\lst@length=\z@\else + \let\lst@thestyle\lst@currstyle + \lsthk@OutputOther + \lst@OutputToken + \fi} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{OutputOther}{}% init +\let\lst@currstyle\relax % init +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Output} +% We might use identifier style as default. +% \begin{macrocode} +\def\lst@Output{% + \lst@CheckDelay + \ifnum\lst@length=\z@\else + \ifx\lst@currstyle\relax + \let\lst@thestyle\lst@identifierstyle + \else + \let\lst@thestyle\lst@currstyle + \fi + \lsthk@Output + \lst@OutputToken + \fi + \let\lst@lastother\relax} +% \end{macrocode} +% Note that |\lst@lastother| becomes equivalent to |\relax| and not equivalent +% to |\@empty| as everywhere else. I don't know whether this will be important +% in the future or not. +% \begin{macrocode} +\lst@AddToHook{Output}{}% init +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@GetOutputMacro} +% Just saves the output macro to be used. +% \begin{macrocode} +\def\lst@GetOutputMacro#1{% + \lst@ifletter \global\let#1\lst@Output + \else \global\let#1\lst@OutputOther\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@PrintToken} +% outputs the current character string in letter or nonletter mode. +% \begin{macrocode} +\def\lst@PrintToken{% + \lst@ifletter \lst@Output \lst@letterfalse + \else \lst@OutputOther \let\lst@lastother\@empty \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@XPrintToken} +% is a special definition to print also merged characters. +% \begin{macrocode} +\def\lst@XPrintToken{% + \lst@PrintToken \lst@CheckMerge + \ifnum\lst@length=\z@\else \lst@PrintToken \fi} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Dropping the whole output} +% +% \begin{macro}{\lst@BeginDropOutput} +% It's sometimes useful to process a part of a listing as usual, but to drop +% the output. This macro does the main work and gets one argument, namely the +% internal mode it enters. We save |\lst@newlines|, restore it |\aftergroup| +% and redefine one macro, namely |\lst@OutputBox|. After a bug report from +% \lsthelper{Gunther~Schmidl}{2002/02/27}{collapsing empty lines don't work +% with printpod=false} +% \begin{macrocode} +\def\lst@BeginDropOutput#1{% + \xdef\lst@BDOnewlines{\the\lst@newlines}% + \global\let\lst@BDOifnewline\lst@ifnewline + \lst@EnterMode{#1}% + {\lst@modetrue + \let\lst@OutputBox\@gobble + \aftergroup\lst@BDORestore}} +% \end{macrocode} +% Restoring the date is quite easy: +% \begin{macrocode} +\def\lst@BDORestore{% + \global\lst@newlines\lst@BDOnewlines + \global\let\lst@ifnewline\lst@BDOifnewline} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@EndDropOutput} +% is equivalent to |\lst@LeaveMode|. +% \begin{macrocode} +\let\lst@EndDropOutput\lst@LeaveMode +% \end{macrocode} +% \begin{macrocode} +% +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Writing to an external file} +% +% \begin{aspect}{writefile} +% Now it would be good to know something about character classes since we need +% to access the true input characters, for example a tabulator and not the +% spaces it `expands' to. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{writefile} +% \end{macrocode} +% +% \begin{macro}{\lst@WF} +% \begin{macro}{\lst@WFtoken} +% The contents of the token will be written to file. +% \begin{macrocode} +\newtoks\lst@WFtoken % global +\lst@AddToHook{InitVarsBOL}{\global\lst@WFtoken{}} +% \end{macrocode} +% \begin{macrocode} +\newwrite\lst@WF +\global\let\lst@WFifopen\iffalse % init +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@WFWriteToFile} +% To do this, we have to expand the contents and then expand this via |\edef|. +% Empty |\lst@UM| ensures that special characters (underscore, dollar, etc.) +% are written correctly. +% \begin{macrocode} +\gdef\lst@WFWriteToFile{% + \begingroup + \let\lst@UM\@empty + \expandafter\edef\expandafter\lst@temp\expandafter{\the\lst@WFtoken}% + \immediate\write\lst@WF{\lst@temp}% + \endgroup + \global\lst@WFtoken{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@WFAppend} +% Similar to |\lst@Append| but uses |\lst@WFtoken|. +% \begin{macrocode} +\gdef\lst@WFAppend#1{% + \global\lst@WFtoken=\expandafter{\the\lst@WFtoken#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@BeginWriteFile} +% \begin{macro}{\lst@BeginAlsoWriteFile} +% use different macros for |\lst@OutputBox| (not) to drop the output. +% \begin{macrocode} +\gdef\lst@BeginWriteFile{\lst@WFBegin\@gobble} +\gdef\lst@BeginAlsoWriteFile{\lst@WFBegin\lst@OutputBox} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@WFBegin} +% Here \ldots +% \begin{macrocode} +\begingroup \catcode`\^^I=11 +\gdef\lst@WFBegin#1#2{% + \begingroup + \let\lst@OutputBox#1% +% \end{macrocode} +% \ldots\space we have to update |\lst@WFtoken| and \ldots +% \begin{macrocode} + \def\lst@Append##1{% + \advance\lst@length\@ne + \expandafter\lst@token\expandafter{\the\lst@token##1}% + \ifx ##1\lst@outputspace \else + \lst@WFAppend##1% + \fi}% + \lst@lAddTo\lst@PreGotoTabStop{\lst@WFAppend{^^I}}% + \lst@lAddTo\lst@ProcessSpace{\lst@WFAppend{ }}% +% \end{macrocode} +% \ldots\space need different `EOL' and `DeInit' definitions to write the +% token register to file. +% \begin{macrocode} + \let\lst@DeInit\lst@WFDeInit + \let\lst@MProcessListing\lst@WFMProcessListing +% \end{macrocode} +% Finally we open the file if necessary. +% \begin{macrocode} + \lst@WFifopen\else + \immediate\openout\lst@WF=#2\relax + \global\let\lst@WFifopen\iftrue + \@gobbletwo\fi\fi + \fi} +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@EndWriteFile} +% closes the file and restores original definitions. +% \begin{macrocode} +\gdef\lst@EndWriteFile{% + \immediate\closeout\lst@WF \endgroup + \global\let\lst@WFifopen\iffalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@WFMProcessListing} +% \begin{macro}{\lst@WFDeInit} +% write additionally |\lst@WFtoken| to external file. +% \begin{macrocode} +\global\let\lst@WFMProcessListing\lst@MProcessListing +\global\let\lst@WFDeInit\lst@DeInit +\lst@AddToAtTop\lst@WFMProcessListing{\lst@WFWriteToFile} +\lst@AddToAtTop\lst@WFDeInit{% + \ifnum\lst@length=\z@\else \lst@WFWriteToFile \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \section{Character classes}\label{iCharacterClasses} +% +% In this section, we define how the basic character classes do behave, before +% turning over to the selection of character tables and how to specialize +% characters. +% +% +% \subsection{Letters, digits and others} +% +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% +% \begin{macro}{\lst@ProcessLetter} +% We put the letter, which is not a whitespace, into the output queue. +% \begin{macrocode} +\def\lst@ProcessLetter{\lst@whitespacefalse \lst@AppendLetter} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ProcessOther} +% Ditto. +% \begin{macrocode} +\def\lst@ProcessOther{\lst@whitespacefalse \lst@AppendOther} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ProcessDigit} +% A digit appends the character to the current character string. But we must +% use the right macro. This allows digits to be part of an identifier or +% a numerical constant. +% \begin{macrocode} +\def\lst@ProcessDigit{% + \lst@whitespacefalse + \lst@ifletter \expandafter\lst@AppendLetter + \else \expandafter\lst@AppendOther\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ifwhitespace} +% indicates whether the last processed character has been white space. +% \begin{macrocode} +\def\lst@whitespacetrue{\global\let\lst@ifwhitespace\iftrue} +\def\lst@whitespacefalse{\global\let\lst@ifwhitespace\iffalse} +\lst@AddToHook{InitVarsBOL}{\lst@whitespacetrue} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Whitespaces} +% +% Here we have to take care of two things: dropping empty lines at the end of +% a listing and the different column formats. Both use |\lst@lostspace|. Lines +% containing only tabulators and spaces should be viewed as empty. In order to +% achieve this, tabulators and spaces at the beginning of a line don't output +% any characters but advance |\lst@lostspace|. Whenever this dimension is +% positive we insert that space before the character string is output. Thus, +% if there are only tabulators and spaces, the line is `empty' since we +% haven't done any output. +% +% We have to do more for flexible columns. Whitespaces can fix the column +% alignment: if the real line is wider than expected, a tabulator is at least +% one space wide; all remaining space fixes the alignment. If there are two or +% more space characters, at least one is printed; the others fix the column +% alignment. +% +% +% \paragraph{Tabulators} +% are processed in three stages. You have already seen the last stage +% |\lst@GotoTabStop|. The other two calculate the necessary width and take care +% of visible tabulators and spaces. +% +% \begin{lstkey}{tabsize} +% We check for a legal argument before saving it. Default tabsize is 8 as +% proposed by \lsthelper{Rolf~Niepraschk}{1997/04/24}{tabsize=8}. +% \begin{macrocode} +\lst@Key{tabsize}{8} + {\ifnum#1>\z@ \def\lst@tabsize{#1}\else + \PackageError{Listings}{Strict positive integer expected}% + {You can't use `#1' as tabsize. \@ehc}% + \fi} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{showtabs} +% \begin{lstkey}{tab} +% Two more user keys for tab control. +% \begin{macrocode} +\lst@Key{showtabs}f[t]{\lstKV@SetIf{#1}\lst@ifshowtabs} +\lst@Key{tab}{\kern.06em\hbox{\vrule\@height.3ex}% + \hrulefill\hbox{\vrule\@height.3ex}} + {\def\lst@tab{#1}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@ProcessTabulator} +% A tabulator outputs the preceding characters, which decrements |\lst@pos| by +% the number of printed characters. +% \begin{macrocode} +\def\lst@ProcessTabulator{% + \lst@XPrintToken \lst@whitespacetrue +% \end{macrocode} +% Then we calculate how many columns we need to reach the next tabulator stop: +% we add |\lst@tabsize| until |\lst@pos| is strict positive. In other words, +% |\lst@pos| is the column modulo |tabsize| and we're looking for a positive +% representative. We assign it to |\lst@length| and reset |\lst@pos| in the +% submacro. +% \begin{macrocode} + \global\advance\lst@column -\lst@pos + \@whilenum \lst@pos<\@ne \do + {\global\advance\lst@pos\lst@tabsize}% + \lst@length\lst@pos + \lst@PreGotoTabStop} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@PreGotoTabStop} +% Visible tabs print |\lst@tab|. +% \begin{macrocode} +\def\lst@PreGotoTabStop{% + \lst@ifshowtabs + \lst@TrackNewLines + \setbox\@tempboxa\hbox to\lst@length\lst@width + {{\lst@currstyle{\hss\lst@tab}}}% + \lst@CalcLostSpaceAndOutput + \else +% \end{macrocode} +% If we are advised to keep spaces, we insert the correct number of them. +% \begin{macrocode} + \lst@ifkeepspaces + \@tempcnta\lst@length \lst@length\z@ + \@whilenum \@tempcnta>\z@ \do + {\lst@AppendOther\lst@outputspace + \advance\@tempcnta\m@ne}% + \lst@OutputOther + \else + \lst@GotoTabStop + \fi + \fi + \lst@length\z@ \global\lst@pos\z@} +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{Spaces} +% are implemented as described at the beginning of this subsection. But first +% we define some user keys. +% +% \begin{macro}{\lst@outputspace} +% \begin{macro}{\lst@visiblespace} +% The first macro is a default definition, \ldots +% \begin{macrocode} +\def\lst@outputspace{\ } +\def\lst@visiblespace{\lst@ttfamily{\char32}\textvisiblespace} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{lstkey}{showspaces} +% \begin{lstkey}{keepspaces} +% \ldots\space which is modified on user's request. +% \begin{macrocode} +\lst@Key{showspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifshowspaces} +\lst@Key{keepspaces}{false}[t]{\lstKV@SetIf{#1}\lst@ifkeepspaces} +\lst@AddToHook{Init} + {\lst@ifshowspaces + \let\lst@outputspace\lst@visiblespace + \lst@keepspacestrue + \fi} +\def\lst@keepspacestrue{\let\lst@ifkeepspaces\iftrue} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@ProcessSpace} +% We look whether spaces fix the column alignment or not. In the latter case +% we append a space; otherwise \ldots +% \lsthelper{Andrei~Alexandrescu}{-}{2007/02/27} tested the |spaceflexible| +% column setting and found a bug that resulted from |\lst@PrintToken| and +% |\lst@whitespacetrue| being out of order here. +% \begin{macrocode} +\def\lst@ProcessSpace{% + \lst@ifkeepspaces + \lst@PrintToken + \lst@whitespacetrue + \lst@AppendOther\lst@outputspace + \lst@PrintToken + \else \ifnum\lst@newlines=\z@ +% \end{macrocode} +% \ldots\space we append a `special space' if the line isn't empty. +% \begin{macrocode} + \lst@AppendSpecialSpace + \else \ifnum\lst@length=\z@ +% \end{macrocode} +% If the line is empty, we check whether there are characters in the output +% queue. If there are no characters we just advance |\lst@lostspace|. +% Otherwise we append the space. +% \begin{macrocode} + \global\advance\lst@lostspace\lst@width + \global\advance\lst@pos\m@ne + \lst@whitespacetrue + \else + \lst@AppendSpecialSpace + \fi + \fi \fi} +% \end{macrocode} +% Note that this version works for fixed and flexible column output. +% \end{macro} +% +% \begin{macro}{\lst@AppendSpecialSpace} +% If there are at least two white spaces, we output preceding characters and +% advance |\lst@lostspace| to avoid alignment problems. Otherwise we append +% a space to the current character string. Also, |\lst@whitespacetrue| has +% been moved after |\lst@PrintToken| so that the token-printer can correctly +% check whether it is printing whitespace or not; this was preventing the +% |spaceflexible| column setting from working correctly. +% \begin{macrocode} +\def\lst@AppendSpecialSpace{% + \lst@ifwhitespace + \lst@PrintToken + \global\advance\lst@lostspace\lst@width + \global\advance\lst@pos\m@ne + \lst@gobbledwhitespacetrue + \else + \lst@PrintToken + \lst@whitespacetrue + \lst@AppendOther\lst@outputspace + \lst@PrintToken + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{Form feeds} +% has been introduced after communication with +% \lsthelper{Jan~Braun}{1998/04/27}{formfeed}. +% +% \begin{lstkey}{formfeed} +% let the user make adjustments. +% \begin{macrocode} +\lst@Key{formfeed}{\bigbreak}{\def\lst@formfeed{#1}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@ProcessFormFeed} +% Here we execute some macros according to whether a new line has already +% begun or not. No |\lst@EOLUpdate| is used in the else branch +% anymore---\lsthelper{Kalle~Tuulos}{2001/01/14}{form feed gobbles following +% output unit} sent the bug report. +% \begin{macrocode} +\def\lst@ProcessFormFeed{% + \lst@XPrintToken + \ifnum\lst@newlines=\z@ + \lst@EOLUpdate \lsthk@InitVarsBOL + \fi + \lst@formfeed + \lst@whitespacetrue} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Character tables}\label{iCharacterTables} +% +% +% \subsubsection{The standard table} +% +% The standard character table is selected by |\lst@SelectStdCharTable|, which +% expands to a token sequence +% \ldots|\def| |A{\lst@ProcessLetter| |A}|\ldots\space +% where the first A is active and the second has catcode 12. We use the +% following macros to build the character table. +% \begin{syntax} +% \item[0.19] |\lst@CCPut|\meta{class macro}\meta{$c_1$}\ldots\meta{$c_k$}|\z@| +% +% extends the standard character table by the characters with codes +% \meta{$c_1$}\ldots\meta{$c_k$} making each character use +% \meta{class macro}. All these characters must be printable via +% |\char|\meta{$c_i$}. +% +% \item[0.20] |\lst@CCPutMacro|\meta{class$_1$}\meta{$c_1$}\meta{definition$_1$}\ldots|\@empty\z@\@empty| +% +% also extends the standard character table: the character \meta{$c_i$} +% will use \meta{class$_i$} and is printed via \meta{definition$_i$}. +% These definitions must be \meta{spec. token}s in the sense of section +% \ref{dCharacterTables}. +% \end{syntax} +% +% \begin{macro}{\lst@Def} +% \begin{macro}{\lst@Let} +% For speed we won't use these helpers too often. +% \begin{macrocode} +\def\lst@Def#1{\lccode`\~=#1\lowercase{\def~}} +\def\lst@Let#1{\lccode`\~=#1\lowercase{\let~}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begingroup +% The definition of the space below doesn't hurt anything. But other aspects, +% for example \aspectname{lineshape} and \aspectname{formats}, redefine also +% the macro |\space|. Now, if \LaTeX\ calls |\try@load@fontshape|, the |.log| +% messages would show some strange things since \LaTeX\ uses |\space| in these +% messages. The following addition ensures that |\space| expands to a space +% and not to something different. This was one more bug reported by +% \lsthelper{Denis~Girou}{1999/09/16}{bad font info message with breaklines}. +% \begin{macrocode} +\lst@AddToAtTop{\try@load@fontshape}{\def\space{ }} +% \end{macrocode} +% \endgroup +% +% \begin{macro}{\lst@SelectStdCharTable} +% The first three standard characters. |\lst@Let| has been replaced by +% |\lst@Def| after a bug report from \lsthelper{Chris~Edwards}{2002/02/15} +% {tabulators show up with firstline>1}. +% \begin{macrocode} +\def\lst@SelectStdCharTable{% + \lst@Def{9}{\lst@ProcessTabulator}% + \lst@Def{12}{\lst@ProcessFormFeed}% + \lst@Def{32}{\lst@ProcessSpace}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CCPut} +% The first argument gives the character class, then follow the codes. +% \begin{macrocode} +\def\lst@CCPut#1#2{% + \ifnum#2=\z@ + \expandafter\@gobbletwo + \else + \lccode`\~=#2\lccode`\/=#2\lowercase{\lst@CCPut@~{#1/}}% + \fi + \lst@CCPut#1} +\def\lst@CCPut@#1#2{\lst@lAddTo\lst@SelectStdCharTable{\def#1{#2}}} +% \end{macrocode} +% Now we insert more standard characters. +% \begin{macrocode} +\lst@CCPut \lst@ProcessOther + {"21}{"22}{"28}{"29}{"2B}{"2C}{"2E}{"2F} + {"3A}{"3B}{"3D}{"3F}{"5B}{"5D} + \z@ +\lst@CCPut \lst@ProcessDigit + {"30}{"31}{"32}{"33}{"34}{"35}{"36}{"37}{"38}{"39} + \z@ +\lst@CCPut \lst@ProcessLetter + {"40}{"41}{"42}{"43}{"44}{"45}{"46}{"47} + {"48}{"49}{"4A}{"4B}{"4C}{"4D}{"4E}{"4F} + {"50}{"51}{"52}{"53}{"54}{"55}{"56}{"57} + {"58}{"59}{"5A} + {"61}{"62}{"63}{"64}{"65}{"66}{"67} + {"68}{"69}{"6A}{"6B}{"6C}{"6D}{"6E}{"6F} + {"70}{"71}{"72}{"73}{"74}{"75}{"76}{"77} + {"78}{"79}{"7A} + \z@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CCPutMacro} +% Now we come to a delicate point. The characters not inserted yet aren't +% printable (|_|, |$|, \ldots) or aren't printed well (|*|, |-|, \ldots) if we +% enter these characters. Thus we use proper macros to print the characters. +% Works perfectly. The problem is that the current character string is +% printable for speed, for example |_| is already replaced by a macro version, +% but the new keyword tests need the original characters. +% +% The solution: We define |\def _{\lst@ProcessLetter\lst@um_}| where the first +% underscore is active and the second belongs to the control sequence. +% Moreover we have |\def\lst@um_{\lst@UM _}| where the second underscore has +% the usual meaning. Now the keyword tests can access the original character +% simply by making |\lst@UM| empty. The default definition gets the following +% token and builds the control sequence |\lst@um_@|, which we'll define to +% print the character. Easy, isn't it?^^A ;-) +% +% The following definition does all this for us. The first parameter gives the +% character class, the second the character code, and the last the definition +% which actually prints the character. We build the names |\lst@um_| and +% |\lst@um_@| and give them to a submacro. +% \begin{macrocode} +\def\lst@CCPutMacro#1#2#3{% + \ifnum#2=\z@ \else + \begingroup\lccode`\~=#2\relax \lccode`\/=#2\relax + \lowercase{\endgroup\expandafter\lst@CCPutMacro@ + \csname\@lst @um/\expandafter\endcsname + \csname\@lst @um/@\endcsname /~}#1{#3}% + \expandafter\lst@CCPutMacro + \fi} +% \end{macrocode} +% The arguments are now |\lst@um_|, |\lst@um_@|, nonactive character, active +% character, character class and printing definition. We add |\def _{| +% |\lst@ProcessLetter| |\lst@um_}| to |\lst@SelectStdCharTable| (and similarly +% other special characters), define |\def\lst@um_{\lst@UM _}| and |\lst@um_@|. +% \begin{macrocode} +\def\lst@CCPutMacro@#1#2#3#4#5#6{% + \lst@lAddTo\lst@SelectStdCharTable{\def#4{#5#1}}% + \def#1{\lst@UM#3}% + \def#2{#6}} +% \end{macrocode} +% The default definition of |\lst@UM|: +% \begin{macrocode} +\def\lst@UM#1{\csname\@lst @um#1@\endcsname} +% \end{macrocode} +% And all remaining standard characters. +% \begin{macrocode} +\lst@CCPutMacro + \lst@ProcessOther {"23}\# + \lst@ProcessLetter{"24}\textdollar + \lst@ProcessOther {"25}\% + \lst@ProcessOther {"26}\& + \lst@ProcessOther {"27}{\lst@ifupquote \textquotesingle + \else \char39\relax \fi} + \lst@ProcessOther {"2A}{\lst@ttfamily*\textasteriskcentered} + \lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{$-$}} + \lst@ProcessOther {"3C}{\lst@ttfamily<\textless} + \lst@ProcessOther {"3E}{\lst@ttfamily>\textgreater} + \lst@ProcessOther {"5C}{\lst@ttfamily{\char92}\textbackslash} + \lst@ProcessOther {"5E}\textasciicircum + \lst@ProcessLetter{"5F}{\lst@ttfamily{\char95}\textunderscore} + \lst@ProcessOther {"60}{\lst@ifupquote \textasciigrave + \else \char96\relax \fi} + \lst@ProcessOther {"7B}{\lst@ttfamily{\char123}\textbraceleft} + \lst@ProcessOther {"7C}{\lst@ttfamily|\textbar} + \lst@ProcessOther {"7D}{\lst@ttfamily{\char125}\textbraceright} + \lst@ProcessOther {"7E}\textasciitilde + \lst@ProcessOther {"7F}- + \@empty\z@\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ttfamily} +% What is this ominous macro? It prints either the first or the second +% argument. In |\ttfamily| it ensures that |----| is typeset |----| and not +% $-$$-$$-$$-$ as in version 0.17. Bug encountered by +% \lsthelper{Dr.~Jobst~Hoffmann}{1998/03/30}{|\lst@minus| and |\ttfamily|}. +% Furthermore I added |\relax| after receiving an error report from +% \lsthelper{Magnus~Lewis-Smith}{1999/08/06}{! Bad character code (920).} +% \begin{macrocode} +\def\lst@ttfamily#1#2{\ifx\f@family\ttdefault#1\relax\else#2\fi} +% \end{macrocode} +% |\ttdefault| is defined |\long|, so the |\ifx| doesn't work since |\f@family| +% isn't |\long|! We go around this problem by redefining |\ttdefault| locally: +% \begin{macrocode} +\lst@AddToHook{Init}{\edef\ttdefault{\ttdefault}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{upquote} +% is used above to decide which quote to print. We print an error message if +% the necessary \packagename{textcomp} commands are not available. This key +% has been added after an email from \lsthelper{Frank~Mittelbach}{2003/06/18} +% {listings and upquote}. +% \begin{macrocode} +\lst@Key{upquote}{false}[t]{\lstKV@SetIf{#1}\lst@ifupquote + \lst@ifupquote + \@ifundefined{textasciigrave}% + {\let\KV@lst@upquote\@gobble + \lstKV@SetIf f\lst@ifupquote \@gobble\fi + \PackageError{Listings}{Option `upquote' requires `textcomp' + package.\MessageBreak The option has been disabled}% + {Add \string\usepackage{textcomp} to your preamble.}}% + {}% + \fi} +% \end{macrocode} +% If an \packagename{upquote} package is loaded, the \keyname{upquote} option +% is enabled by default. +% \begin{macrocode} +\AtBeginDocument{% + \@ifpackageloaded{upquote}{\RequirePackage{textcomp}% + \lstset{upquote}}{}% + \@ifpackageloaded{upquote2}{\lstset{upquote}}{}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@ifactivechars} +% A simple switch. +% \begin{macrocode} +\def\lst@activecharstrue{\let\lst@ifactivechars\iftrue} +\def\lst@activecharsfalse{\let\lst@ifactivechars\iffalse} +\lst@activecharstrue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@SelectCharTable} +% We select the standard character table and switch to active catcodes. +% \begin{macrocode} +\def\lst@SelectCharTable{% + \lst@SelectStdCharTable + \lst@ifactivechars + \catcode9\active \catcode12\active \catcode13\active + \@tempcnta=32\relax + \@whilenum\@tempcnta<128\do + {\catcode\@tempcnta\active\advance\@tempcnta\@ne}% + \fi + \lst@ifec \lst@DefEC \fi +% \end{macrocode} +% The following line and the according macros below have been added after a +% bug report from \lsthelper{Fr\'ed\'eric~Boulanger}{2001/02/27}{ligatures}. +% The assignment to |\do@noligs| was changed to |\do| after a bug report from +% \lsthelper{Peter~Ruckdeschel}{2002/04/12}{problems with simultanous use of +% seminar.sty and listings.sty}. This bugfix was kindly provided by +% \lsthelper{Timothy~Van~Zandt}{2002/04/13}{Re: ...}. +% \begin{macrocode} + \let\do\lst@do@noligs \verbatim@nolig@list +% \end{macrocode} +% There are two ways to adjust the standard table: inside the hook or with +% |\lst@DeveloperSCT|. We use these macros and initialize the backslash if +% necessary. |\lst@DefRange| has been moved outside the hook after a bug report +% by \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung +% m\"oglich...}. +% \begin{macrocode} + \lsthk@SelectCharTable + \lst@DeveloperSCT + \lst@DefRange + \ifx\lst@Backslash\relax\else + \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{SelectCharTable} +% \begin{lstkey}{MoreSelectCharTable} +% The keys to adjust |\lst@DeveloperSCT|. +% \begin{macrocode} +\lst@Key{SelectCharTable}{}{\def\lst@DeveloperSCT{#1}} +\lst@Key{MoreSelectCharTable}\relax{\lst@lAddTo\lst@DeveloperSCT{#1}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{SetLanguage}{\let\lst@DeveloperSCT\@empty} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@do@noligs} +% To prevent ligatures, this macro inserts the token |\lst@NoLig| in front of +% |\lst@Process|\meta{whatever}\meta{spec.~token}. This is done by +% |\verbatim@nolig@list| for certain characters. Note that the submacro is +% a special kind of a local |\lst@AddToAtTop|. The submacro definition was +% fixed thanks to \lsthelper{Peter~Bartke}{2002/04/10}{bad `noligs' handling}. +% \begin{macrocode} +\def\lst@do@noligs#1{% + \begingroup \lccode`\~=`#1\lowercase{\endgroup + \lst@do@noligs@~}} +\def\lst@do@noligs@#1{% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter#1% + \expandafter\expandafter\expandafter{\expandafter\lst@NoLig#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@NoLig} +% When this extra macro is processed, it adds |\lst@nolig| to the output queue +% without increasing its length. For keyword detection this must expand to +% nothing if |\lst@UM| is empty. +% \begin{macrocode} +\def\lst@NoLig{\advance\lst@length\m@ne \lst@Append\lst@nolig} +\def\lst@nolig{\lst@UM\@empty}% +% \end{macrocode} +% But the usual meaning of |\lst@UM| builds the following control sequence, +% which prevents ligatures in the manner of \LaTeX's |\do@noligs|. +% \begin{macrocode} +\@namedef{\@lst @um@}{\leavevmode\kern\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@SaveOutputDef} +% To get the \meta{spec.~token} meaning of character |#1|, we look for |\def| +% `active character |#1|' in |\lst@SelectStdCharTable|, get the replacement +% text, strip off the character class via |\@gobble|, and assign the meaning. +% Note that you get a ``runaway argument'' error if an illegal \meta{character +% code}=|#1| is used. +% \begin{macrocode} +\def\lst@SaveOutputDef#1#2{% + \begingroup \lccode`\~=#1\relax \lowercase{\endgroup + \def\lst@temp##1\def~##2##3\relax}{% + \global\expandafter\let\expandafter#2\@gobble##2\relax}% + \expandafter\lst@temp\lst@SelectStdCharTable\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstum@backslash} +% A commonly used character. +% \begin{macrocode} +\lst@SaveOutputDef{"5C}\lstum@backslash +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{National characters} +% +% \begin{lstkey}{extendedchars} +% The user key to activate extended characters 128--255. +% \begin{macrocode} +\lst@Key{extendedchars}{true}[t]{\lstKV@SetIf{#1}\lst@ifec} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@DefEC} +% Currently each character in the range 128--255 is treated as a letter. +% \begin{macrocode} +\def\lst@DefEC{% + \lst@CCECUse \lst@ProcessLetter + ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f% + ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f% + ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af% + ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf% + ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf% + ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df% + ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef% + ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff% + ^^00} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CCECUse} +% Reaching end of list (|^^00|) we terminate the loop. +% Otherwise we do the same as in |\lst@CCPut| if the character is not active. +% But if the character is active, we save the meaning before redefinition. +% \begin{macrocode} +\def\lst@CCECUse#1#2{% + \ifnum`#2=\z@ + \expandafter\@gobbletwo + \else + \ifnum\catcode`#2=\active + \lccode`\~=`#2\lccode`\/=`#2\lowercase{\lst@CCECUse@#1~/}% + \else + \lst@ifactivechars \catcode`#2=\active \fi + \lccode`\~=`#2\lccode`\/=`#2\lowercase{\def~{#1/}}% + \fi + \fi + \lst@CCECUse#1} +% \end{macrocode} +% We save the meaning as mentioned. Here we must also use the `|\lst@UM| +% construction' since extended characters could often appear in words = +% identifiers. Bug reported by \lsthelper{Denis~Girou}{1999/07/26} +% {incompatibility with inputenc}. +% \begin{macrocode} +\def\lst@CCECUse@#1#2#3{% + \expandafter\def\csname\@lst @EC#3\endcsname{\lst@UM#3}% + \expandafter\let\csname\@lst @um#3@\endcsname #2% + \edef#2{\noexpand#1% + \expandafter\noexpand\csname\@lst @EC#3\endcsname}} +% \end{macrocode} +% \lsthelper{Daniel~Gerigk}{2001/10/25}{extendedchars do not work} and +% \lsthelper{Heiko~Oberdiek}{2001/10/26}{extendedchars do not work: um@\#3@ +% must be @um\#3@} reported an error and a solution, respectively. +% \end{macro} +% +% +% \subsubsection{Catcode problems} +% +% \begin{macro}{\lst@nfss@catcodes} +% \lsthelper{Anders~Edenbrandt}{1997/04/22}{preload of .fd files} found a bug +% with \texttt{.fd}-files. Since we change catcodes and these files are read +% on demand, we must reset the catcodes before the files are input. We use a +% local redefinition of |\nfss@catcodes|. +% \begin{macrocode} +\lst@AddToHook{Init} + {\let\lsts@nfss@catcodes\nfss@catcodes + \let\nfss@catcodes\lst@nfss@catcodes} +% \end{macrocode} +% The |&|-character had turned into |\&| after a bug report by \lsthelper +% {David~Aspinall}{2003/07/17}{loading of .fd file inside tabular produces +% error}. +% \begin{macrocode} +\def\lst@nfss@catcodes{% + \lst@makeletter + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\relax + \@makeother (\@makeother )\@makeother ,\@makeother :\@makeother\&% + \@makeother 0\@makeother 1\@makeother 2\@makeother 3\@makeother 4% + \@makeother 5\@makeother 6\@makeother 7\@makeother 8\@makeother 9% + \@makeother =\lsts@nfss@catcodes} +% \end{macrocode} +% The investigation of a bug reported by \lsthelper{Christian~Gudrian} +% {2000/11/16}{problems with mathpple} showed that the equal sign needs +% to have `other' catcode, as assigned above. +% \lsthelper{Svend~Tollak~Munkejord}{2002/04/17}{package incompatible with +% Lucida .fd files} reported problems with Lucida .fd-files, while +% \lsthelper{Heiko~Oberdiek}{2002/04/17}{Re: listings fails with Lucida +% font} analysed the bug, which above led to the line starting with +% |\@makeaother (|. +% +% The name of |\lst@makeletter| is an imitation of \LaTeX's |\@makeother|. +% \begin{macrocode} +\def\lst@makeletter#1{% + \ifx\relax#1\else\catcode`#111\relax \expandafter\lst@makeletter\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{useoutput} +% \begin{macro}{\output} +% Another problem was first reported by \lsthelper{Marcin~Kasperski} +% {1999/04/28}{listings spoil toc}. It is also catcode related and +% \lsthelper{Donald~Arseneau}{1999/05/13}{comp.text.tex Re: delayed write and +% catcode changes} let me understand it. The point is that \TeX\ seems to use +% the \emph{currently} active catcode table when it writes non-|\immediate| +% |\write|s to file and not the catcodes involved when \emph{reading} the +% characters. +% So a section heading |\L a| was written |\La| if a listing was split on two +% pages since a non-standard catcode table was in use when writing |\La| to +% file, the previously attached catcodes do not matter. One more bug was that +% accents in page headings or footers were lost when a listing was split on +% two pages. \lsthelper{Denis~Girou}{1999/08/03}{Accents lost in heading if +% listing split on two pages} found this latter bug. A similar problem with +% the tilde was reported by \lsthelper{Thorsten~Vitt}{2001/06/25}{fancyhdr + +% listings crossing pages ==> ~ in header, not space}. +% +% We can choose between three possibilities. +% \lsthelper{Donald~Arseneau}{2006/09/14}{cannot select output routine 1} +% noted a bug here in the |\ifcase| argument. +% \begin{macrocode} +\lst@Key{useoutput}{2}{\edef\lst@useoutput{\ifcase0#1 0\or 1\else 2\fi}} +% \end{macrocode} +% The first does not modify the existing output routine. +% \begin{macrocode} +\lst@AddToHook{Init} +{\edef\lst@OrgOutput{\the\output}% +\ifcase\lst@useoutput\relax +\or +% \end{macrocode} +% The second possibility is as follows: We interrupt the current modes---in +% particular |\lst@Pmode| with modified catcode table---, call the original +% output routine and reenter the mode. This must be done with a little care. +% First we have to close the group which \TeX\ opens at the beginning of the +% output routine. A single |\egroup| gives an `unbalanced output routine' +% error. But |\expandafter\egroup| works. Again it was +% \lsthelper{Donald~Arseneau}{2001/01/10}{comp.text.tex Re: \output puzzle} +% who gave the explaination: The |\expandafter| set the token type of |\bgroup| +% to |backed_up|, which prevents \TeX's from recovering from an unbalanced +% output routine. \lsthelper{Heiko~Oberdiek}{2001/01/05}{comp.text.tex Re: +% \output puzzle} reported that |\csname| |egroup||\endcsname| does the trick, +% too. +% +% However, since \TeX\ checks the contents of |\box| 255 when we close the +% group (`output routine didn't use all of |\box| 255'), we have to save it +% temporaryly. +% \begin{macrocode} + \output{\global\setbox\lst@gtempboxa\box\@cclv + \expandafter\egroup +% \end{macrocode} +% Now we can interrupt the mode, but we have to save the current character +% string and the current style. +% \begin{macrocode} + \lst@SaveToken + \lst@InterruptModes +% \end{macrocode} +% We restore the contents, use the original output routine, and \ldots +% \begin{macrocode} + \setbox\@cclv\box\lst@gtempboxa + \bgroup\lst@OrgOutput\egroup +% \end{macrocode} +% \ldots\space open a group matching the |}| which \TeX\ inserts at the end of +% the output routine. We reenter modes and restore the character string and +% style |\aftergroup|. Moreover we need to reset |\pagegoal|---added after a +% bug report by \lsthelper{Jochen~Schneider}{2002/03/09}{de.comp.text.tex: +% Problem mit Listings-Paket 1.0-Beta; unmotivated pagebreak with preceding +% float}. +% \begin{macrocode} + \bgroup + \aftergroup\pagegoal\aftergroup\vsize + \aftergroup\lst@ReenterModes\aftergroup\lst@RestoreToken}% +\else +% \end{macrocode} +% The third option is to restore all catcodes and meanings inside a modified +% output routine and to call the original routine afterwards. +% \begin{macrocode} + \output{\lst@RestoreOrigCatcodes + \lst@ifec \lst@RestoreOrigExtendedCatcodes \fi + \lst@OrgOutput}% +\fi} +% \end{macrocode} +% Note that this output routine isn't used too often. It is executed only if +% it's possible that a listing is split on two pages: if a listing ends at +% the bottom or begins at the top of a page, or if a listing is really split. +% \end{macro} +% \end{lstkey} +% +% \begin{macro}{\lst@GetChars} +% \begin{macro}{\lst@ScanChars} +% \begin{lstkey}{rescanchars} +% To make the third |\output|-option work, we have to scan the catcodes and +% also the meanings of active characters: +% \begin{macrocode} +\def\lst@GetChars#1#2#3{% + \let#1\@empty + \@tempcnta#2\relax \@tempcntb#3\relax + \loop \ifnum\@tempcnta<\@tempcntb\relax + \lst@lExtend#1{\expandafter\catcode\the\@tempcnta=}% + \lst@lExtend#1{\the\catcode\@tempcnta\relax}% + \ifnum\the\catcode\@tempcnta=\active + \begingroup\lccode`\~=\@tempcnta + \lowercase{\endgroup + \lst@lExtend#1{\expandafter\let\expandafter~\csname + lstecs@\the\@tempcnta\endcsname}% + \expandafter\let\csname lstecs@\the\@tempcnta\endcsname~}% + \fi + \advance\@tempcnta\@ne + \repeat} +% \end{macrocode} +% As per a bug report by \lsthelper{Benjamin~Lings}{2004/10/15}% +% {\usepackage{xy,listings} yields: "Forbidden control sequence...."}, we +% deactivate |\outer| definition of |^^L| temporarily (inside and outside +% of |\lst@ScanChars|) and restore the catcode at end of package via the +% |\lst@RestoreCatcodes| command. +% \begin{macrocode} +\begingroup \catcode12=\active\let^^L\@empty +\gdef\lst@ScanChars{% + \let\lsts@ssL^^L% + \def^^L{\par}% + \lst@GetChars\lst@RestoreOrigCatcodes\@ne {128}% + \let^^L\lsts@ssL + \lst@GetChars\lst@RestoreOrigExtendedCatcodes{128}{256}} +\endgroup +% \end{macrocode} +% The scan can be issued by hand and at the beginning of a document. +% \begin{macrocode} +\lst@Key{rescanchars}\relax{\lst@ScanChars} +\AtBeginDocument{\lst@ScanChars} +% \end{macrocode} +% \end{lstkey} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Adjusting the table} +% +% We begin with modifiers for the basic character classes. +% +% \begin{lstkey}{alsoletter} +% \begin{lstkey}{alsodigit} +% \begin{lstkey}{alsoother} +% The macros |\lst@also|\ldots\space will hold |\def|\meta{char}|{|\ldots|}| +% sequences, which adjusts the standard character table. +% \begin{macrocode} +\lst@Key{alsoletter}\relax{% + \lst@DoAlso{#1}\lst@alsoletter\lst@ProcessLetter} +\lst@Key{alsodigit}\relax{% + \lst@DoAlso{#1}\lst@alsodigit\lst@ProcessDigit} +\lst@Key{alsoother}\relax{% + \lst@DoAlso{#1}\lst@alsoother\lst@ProcessOther} +% \end{macrocode} +% This is done at \hookname{SelectCharTable} and every language selection +% the macros get empty. +% \begin{macrocode} +\lst@AddToHook{SelectCharTable} + {\lst@alsoother \lst@alsodigit \lst@alsoletter} +\lst@AddToHookExe{SetLanguage}% init + {\let\lst@alsoletter\@empty + \let\lst@alsodigit\@empty + \let\lst@alsoother\@empty} +% \end{macrocode} +% The service macro starts a loop and \ldots +% \begin{macrocode} +\def\lst@DoAlso#1#2#3{% + \lst@DefOther\lst@arg{#1}\let#2\@empty + \expandafter\lst@DoAlso@\expandafter#2\expandafter#3\lst@arg\relax} +\def\lst@DoAlso@#1#2#3{% + \ifx\relax#3\expandafter\@gobblethree \else +% \end{macrocode} +% \ldots\space while not reaching |\relax| we use the \TeX nique from +% |\lst@SaveOutputDef| to replace the class by |#2|. Eventually we append +% the new definition to |#1|. +% \begin{macrocode} + \begingroup \lccode`\~=`#3\relax \lowercase{\endgroup + \def\lst@temp##1\def~##2##3\relax{% + \edef\lst@arg{\def\noexpand~{\noexpand#2\expandafter + \noexpand\@gobble##2}}}}% + \expandafter\lst@temp\lst@SelectStdCharTable\relax + \lst@lExtend#1{\lst@arg}% + \fi + \lst@DoAlso@#1#2} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@SaveDef} +% \begin{macro}{\lst@DefSaveDef} +% \begin{macro}{\lst@LetSaveDef} +% These macros can be used in language definitions to make special changes. +% They save the definition and define or assign a new one. +% \begin{macrocode} +\def\lst@SaveDef#1#2{% + \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~}} +\def\lst@DefSaveDef#1#2{% + \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\def~}} +\def\lst@LetSaveDef#1#2{% + \begingroup \lccode`\~=#1\relax \lowercase{\endgroup\let#2~\let~}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Now we get to the more powerful definitions. +% +% \begin{macro}{\lst@CDef} +% Here we unfold the first parameter \meta{1st}\marg{2nd}\marg{rest} and say +% that this input string is `replaced' by \meta{save 1st}\marg{2nd}^^A +% \marg{rest}---plus \meta{execute}, \meta{pre}, and \meta{post}. This main +% work is done by |\lst@CDefIt|. +% \begin{macrocode} +\def\lst@CDef#1{\lst@CDef@#1} +\def\lst@CDef@#1#2#3#4{\lst@CDefIt#1{#2}{#3}{#4#2#3}#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CDefX} +% drops the input string. +% \begin{macrocode} +\def\lst@CDefX#1{\lst@CDefX@#1} +\def\lst@CDefX@#1#2#3{\lst@CDefIt#1{#2}{#3}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CDefIt} +% is the main working procedure for the previous macros. It redefines the +% sequence |#1#2#3| of characters. At least |#1| must be active; the other two +% arguments might be empty, not equivalent to empty! +% \begin{macrocode} +\def\lst@CDefIt#1#2#3#4#5#6#7#8{% + \ifx\@empty#2\@empty +% \end{macrocode} +% For a single character we just execute the arguments in the correct order. +% You might want to go back to section \ref{dCharacterTablesManipulated} to +% look them up. +% \begin{macrocode} + \def#1{#6\def\lst@next{#7#4#8}\lst@next}% + \else \ifx\@empty#3\@empty +% \end{macrocode} +% For a two character sequence we test whether \meta{pre} and \meta{post} +% must be executed. +% \begin{macrocode} + \def#1##1{% + #6% + \ifx##1#2\def\lst@next{#7#4#8}\else + \def\lst@next{#5##1}\fi + \lst@next}% + \else +% \end{macrocode} +% We do the same for an arbitrary character sequence---except that we have to +% use |\lst@IfNextCharsArg| instead of |\ifx|\ldots|\fi|. +% \begin{macrocode} + \def#1{% + #6% + \lst@IfNextCharsArg{#2#3}{#7#4#8}% + {\expandafter#5\lst@eaten}}% + \fi \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CArgX} +% We make |#1#2| active and call |\lst@CArg|. +% \begin{macrocode} +\def\lst@CArgX#1#2\relax{% + \lst@DefActive\lst@arg{#1#2}% + \expandafter\lst@CArg\lst@arg\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CArg} +% arranges the first two arguments for |\lst@CDef|[|X|]. We get an undefined +% macro and use |\@empty\@empty\relax| as delimiter for the submacro. +% \begin{macrocode} +\def\lst@CArg#1#2\relax{% + \lccode`\/=`#1\lowercase{\def\lst@temp{/}}% + \lst@GetFreeMacro{lst@c\lst@temp}% + \expandafter\lst@CArg@\lst@freemacro#1#2\@empty\@empty\relax} +% \end{macrocode} +% Save meaning of \meta{1st}=|#2| in \meta{save 1st}=|#1| and call the macro +% |#6| with correct arguments. From version 1.0 on, |#2|, |#3| and |#4| +% (respectively empty arguments) are tied together with group braces. +% This allows us to save two arguments in other definitions, for example in +% |\lst@DefDelimB|. +% \begin{macrocode} +\def\lst@CArg@#1#2#3#4\@empty#5\relax#6{% + \let#1#2% + \ifx\@empty#3\@empty + \def\lst@next{#6{#2{}{}}}% + \else + \def\lst@next{#6{#2#3{#4}}}% + \fi + \lst@next #1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CArgEmpty} +% `executes' an |\@empty|-delimited argument. We will use it for the delimiters. +% \begin{macrocode} +\def\lst@CArgEmpty#1\@empty{#1} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Delimiters} +% +% Here we start with general definitions common to all delimiters. +% +% \begin{lstkey}{excludedelims} +% controls which delimiters are not printed in \meta{whatever}style. We just +% define |\lst@ifex|\meta{whatever} to be true. Such switches are set false +% in the \hookname{ExcludeDelims} hook and are handled by the individual +% delimiters. +% \begin{macrocode} +\lst@Key{excludedelims}\relax + {\lsthk@ExcludeDelims \lst@NormedDef\lst@temp{#1}% + \expandafter\lst@for\lst@temp\do + {\expandafter\let\csname\@lst @ifex##1\endcsname\iftrue}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@DelimPrint} +% And this macro might help in doing so. |#1| is |\lst@ifex|\meta{whatever} +% (plus |\else|) or just |\iffalse|, and |#2| will be the delimiter. The +% temporary mode change ensures that the characters can't end the current +% delimiter or start a new one. +% \begin{macrocode} +\def\lst@DelimPrint#1#2{% + #1% + \begingroup + \lst@mode\lst@nomode \lst@modetrue + #2\lst@XPrintToken + \endgroup + \lst@ResetToken + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DelimOpen} +% We print preceding characters and the delimiter, enter the appropriate mode, +% print the delimiter again, and execute |#3|. In fact, the arguments |#1| and +% |#2| will ensure that the delimiter is printed only once. +% \begin{macrocode} +\def\lst@DelimOpen#1#2#3#4#5#6\@empty{% + \lst@TrackNewLines \lst@XPrintToken + \lst@DelimPrint#1{#6}% + \lst@EnterMode{#4}{\def\lst@currstyle#5}% + \lst@DelimPrint{#1#2}{#6}% + #3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DelimClose} +% is the same in reverse order. +% \begin{macrocode} +\def\lst@DelimClose#1#2#3\@empty{% + \lst@TrackNewLines \lst@XPrintToken + \lst@DelimPrint{#1#2}{#3}% + \lst@LeaveMode + \lst@DelimPrint{#1}{#3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@BeginDelim} +% \begin{macro}{\lst@EndDelim} +% These definitions are applications of |\lst@DelimOpen| and |\lst@DelimClose|: +% the delimiters have the same style as the delimited text. +% \begin{macrocode} +\def\lst@BeginDelim{\lst@DelimOpen\iffalse\else{}} +\def\lst@EndDelim{\lst@DelimClose\iffalse\else} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@BeginIDelim} +% \begin{macro}{\lst@EndIDelim} +% Another application: no delimiter is printed. +% \begin{macrocode} +\def\lst@BeginIDelim{\lst@DelimOpen\iffalse{}{}} +\def\lst@EndIDelim{\lst@DelimClose\iffalse{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@DefDelims} +% This macro defines all delimiters and is therefore reset every language +% selection. +% \begin{macrocode} +\lst@AddToHook{SelectCharTable}{\lst@DefDelims} +\lst@AddToHookExe{SetLanguage}{\let\lst@DefDelims\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Delim} +% First we set default values: no |\lst@modetrue|, cumulative style, and no +% argument to |\lst@Delim|[|DM|]|@|\meta{type}. +% \begin{macrocode} +\def\lst@Delim#1{% + \lst@false \let\lst@cumulative\@empty \let\lst@arg\@empty +% \end{macrocode} +% These are the correct settings for the double-star-form, so we immediately +% call the submacro in this case. Otherwise we either just suppress cumulative +% style, or even indicate the usage of |\lst@modetrue| with |\lst@true|. +% \begin{macrocode} + \@ifstar{\@ifstar{\lst@Delim@{#1}}% + {\let\lst@cumulative\relax + \lst@Delim@{#1}}}% + {\lst@true\lst@Delim@{#1}}} +% \end{macrocode} +% The type argument is saved for later use. We check against the optional +% \meta{style} argument using |#1| as default, define |\lst@delimstyle| and +% look for the optional \meta{type option}, which is just saved in |\lst@arg|. +% \begin{macrocode} +\def\lst@Delim@#1[#2]{% + \gdef\lst@delimtype{#2}% + \@ifnextchar[\lst@Delim@sty + {\lst@Delim@sty[#1]}} +\def\lst@Delim@sty[#1]{% + \def\lst@delimstyle{#1}% + \ifx\@empty#1\@empty\else + \lst@Delim@sty@ #1\@nil + \fi + \@ifnextchar[\lst@Delim@option + \lst@Delim@delim} +\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim} +% \end{macrocode} +% |[| and |]| in the replacement text above have been added after a bug report +% by \lsthelper{Stephen~Reindl}{2002/05/28}{\inaccessible using Cobol}. +% +% The definition of |\lst@delimstyle| depends on whether the first token is a +% control sequence. Here we possibly build |\lst@|\meta{style}. +% \begin{macrocode} +\def\lst@Delim@sty@#1#2\@nil{% + \if\relax\noexpand#1\else + \edef\lst@delimstyle{\expandafter\noexpand + \csname\@lst @\lst@delimstyle\endcsname}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Delim@delim} +% Eventually this macro is called. First we might need to delete a bunch of +% delimiters. If there is no delimiter, we might delete a subclass. +% \begin{macrocode} +\def\lst@Delim@delim#1\relax#2#3#4#5#6#7#8{% + \ifx #4\@empty \lst@Delim@delall{#2}\fi + \ifx\@empty#1\@empty + \ifx #4\@nil + \@ifundefined{\@lst @#2DM@\lst@delimtype}% + {\lst@Delim@delall{#2@\lst@delimtype}}% + {\lst@Delim@delall{#2DM@\lst@delimtype}}% + \fi + \else +% \end{macrocode} +% If the delimiter is not empty, we convert the delimiter and append it to +% |\lst@arg|. Ditto |\lst@Begin|\ldots, |\lst@End|\ldots, and the style and +% mode selection. +% \begin{macrocode} + \expandafter\lst@Delim@args\expandafter + {\lst@delimtype}{#1}{#5}#6{#7}{#8}#4% +% \end{macrocode} +% If the type is known, we either choose dynamic or static mode and use the +% contents of |\lst@arg| as arguments. All this is put into |\lst@delim|. +% \begin{macrocode} + \let\lst@delim\@empty + \expandafter\lst@IfOneOf\lst@delimtype\relax#3% + {\@ifundefined{\@lst @#2DM@\lst@delimtype}% + {\lst@lExtend\lst@delim{\csname\@lst @#2@\lst@delimtype + \expandafter\endcsname\lst@arg}}% + {\lst@lExtend\lst@delim{\expandafter\lst@UseDynamicMode + \csname\@lst @#2DM@\lst@delimtype + \expandafter\endcsname\lst@arg}}% +% \end{macrocode} +% Now, depending on the mode |#4| we either remove this particular delimiter or +% append it to all current ones. +% \begin{macrocode} + \ifx #4\@nil + \let\lst@temp\lst@DefDelims \let\lst@DefDelims\@empty + \expandafter\lst@Delim@del\lst@temp\@empty\@nil\@nil\@nil + \else + \lst@lExtend\lst@DefDelims\lst@delim + \fi}% +% \end{macrocode} +% An unknown type issues an error. +% \begin{macrocode} + {\PackageError{Listings}{Illegal type `\lst@delimtype'}% + {#2 types are #3.}}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Delim@args} +% Now let's look how we add the arguments to |\lst@arg|. First we initialize +% the conversion just to make all characters active. But if the first character +% of the type equals |#4|, \ldots +% \begin{macrocode} +\def\lst@Delim@args#1#2#3#4#5#6#7{% + \begingroup + \lst@false \let\lst@next\lst@XConvert +% \end{macrocode} +% \ldots\ we remove that character from |\lst@delimtype|, and |#5| might select +% a different conversion setting or macro. +% \begin{macrocode} + \@ifnextchar #4{\xdef\lst@delimtype{\expandafter\@gobble + \lst@delimtype}% + #5\lst@next#2\@nil + \lst@lAddTo\lst@arg{\@empty#6}% + \lst@GobbleNil}% +% \end{macrocode} +% Since we are in the `special' case above, we've also added the special +% |\lst@Begin|\ldots\space and |\lst@End|\ldots\space macros to |\lst@arg| +% (and |\@empty| as a brake for the delimiter). No special task must be done +% if the characters are not equal. +% \begin{macrocode} + {\lst@next#2\@nil + \lst@lAddTo\lst@arg{\@empty#3}% + \lst@GobbleNil}% + #1\@nil +% \end{macrocode} +% We always transfer the arguments to the outside of the group and append the +% style and mode selection if and only if we're not deleting a delimiter. +% Therefor we expand the delimiter style. +% \begin{macrocode} + \global\let\@gtempa\lst@arg + \endgroup + \let\lst@arg\@gtempa + \ifx #7\@nil\else + \expandafter\lst@Delim@args@\expandafter{\lst@delimstyle}% + \fi} +% \end{macrocode} +% Recall that the style is `selected' by |\def\lst@currstyle#5|, and this +% `argument' |#5| is to be added now. Depending on the settings at the very +% beginning, we use either |{\meta{style}}\lst@modetrue|---which selects the +% style and deactivates keyword detection---, or |{}\meta{style}|---which +% defines an empty style macro and executes the style for cumulative styles---, +% or |{\meta{style}|---which just defines the style macro. Note that we have to +% use two extra group levels below: one is discarded directly by |\lst@lAddTo| +% and the other by |\lst@Delim|[|DM|]|@|\meta{type}. +% \begin{macrocode} +\def\lst@Delim@args@#1{% + \lst@if + \lst@lAddTo\lst@arg{{{#1}\lst@modetrue}}% + \else + \ifx\lst@cumulative\@empty + \lst@lAddTo\lst@arg{{{}#1}}% + \else + \lst@lAddTo\lst@arg{{{#1}}}% + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Delim@del} +% To delete a particular delimiter, we iterate down the list of delimiters and +% compare the current item with the user supplied. +% \begin{macrocode} +\def\lst@Delim@del#1\@empty#2#3#4{% + \ifx #2\@nil\else + \def\lst@temp{#1\@empty#2#3}% + \ifx\lst@temp\lst@delim\else + \lst@lAddTo\lst@DefDelims{#1\@empty#2#3{#4}}% + \fi + \expandafter\lst@Delim@del + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Delim@delall} +% To delete a whole class of delimiters, we first expand the control sequence +% name, init some other data, and call a submacro to do the work. +% \begin{macrocode} +\def\lst@Delim@delall#1{% + \begingroup + \edef\lst@delim{\expandafter\string\csname\@lst @#1\endcsname}% + \lst@false \global\let\@gtempa\@empty + \expandafter\lst@Delim@delall@\lst@DefDelims\@empty + \endgroup + \let\lst@DefDelims\@gtempa} +% \end{macrocode} +% We first discard a preceding |\lst@UseDynamicMode|. +% \begin{macrocode} +\def\lst@Delim@delall@#1{% + \ifx #1\@empty\else + \ifx #1\lst@UseDynamicMode + \lst@true + \let\lst@next\lst@Delim@delall@do + \else + \def\lst@next{\lst@Delim@delall@do#1}% + \fi + \expandafter\lst@next + \fi} +% \end{macrocode} +% Then we can check whether (the following) |\lst@|\meta{delimiter name}\ldots\ +% matches the delimiter class given by |\lst@delim|. +% \begin{macrocode} +\def\lst@Delim@delall@do#1#2\@empty#3#4#5{% + \expandafter\lst@IfSubstring\expandafter{\lst@delim}{\string#1}% + {}% + {\lst@if \lst@AddTo\@gtempa\lst@UseDynamicMode \fi + \lst@AddTo\@gtempa{#1#2\@empty#3#4{#5}}}% + \lst@false \lst@Delim@delall@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DefDelimB} +% Here we put the arguments together to fit |\lst@CDef|. Note that the very +% last argument |\@empty| to |\lst@CDef| is a brake for |\lst@CArgEmpty| +% and |\lst@DelimOpen|. +% \begin{macrocode} +\gdef\lst@DefDelimB#1#2#3#4#5#6#7#8{% + \lst@CDef{#1}#2% + {#3}% + {\let\lst@bnext\lst@CArgEmpty + \lst@ifmode #4\else + #5% + \def\lst@bnext{#6{#7}{#8}}% + \fi + \lst@bnext}% + \@empty} +% \end{macrocode} +% After a bug report from \lsthelper{Vespe~Savikko}{2000/11/06}{bad output of +% doc-strings if HTML and Python are loaded} I added braces around |#7|. +% \end{macro} +% +% \begin{macro}{\lst@DefDelimE} +% The |\ifnum #7=\lst@mode| in the 5th line ensures that the delimiters +% match each other. +% \begin{macrocode} +\gdef\lst@DefDelimE#1#2#3#4#5#6#7{% + \lst@CDef{#1}#2% + {#3}% + {\let\lst@enext\lst@CArgEmpty + \ifnum #7=\lst@mode% + #4% + \let\lst@enext#6% + \else + #5% + \fi + \lst@enext}% + \@empty} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{Init}{\let\lst@bnext\relax \let\lst@enext\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DefDelimBE} +% This service macro will actually define all string delimiters. +% \begin{macrocode} +\gdef\lst@DefDelimBE#1#2#3#4#5#6#7#8#9{% + \lst@CDef{#1}#2% + {#3}% + {\let\lst@bnext\lst@CArgEmpty + \ifnum #7=\lst@mode + #4% + \let\lst@bnext#9% + \else + \lst@ifmode\else + #5% + \def\lst@bnext{#6{#7}{#8}}% + \fi + \fi + \lst@bnext}% + \@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@delimtypes} +% is the list of general delimiter types. +% \begin{macrocode} +\gdef\lst@delimtypes{s,l} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DelimKey} +% We just put together the arguments for |\lst@Delim|. +% \begin{macrocode} +\gdef\lst@DelimKey#1#2{% + \lst@Delim{}#2\relax + {Delim}\lst@delimtypes #1% + {\lst@BeginDelim\lst@EndDelim} + i\@empty{\lst@BeginIDelim\lst@EndIDelim}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{delim} +% \begin{lstkey}{moredelim} +% \begin{lstkey}{deletedelim} +% all use |\lst@DelimKey|. +% \begin{macrocode} +\lst@Key{delim}\relax{\lst@DelimKey\@empty{#1}} +\lst@Key{moredelim}\relax{\lst@DelimKey\relax{#1}} +\lst@Key{deletedelim}\relax{\lst@DelimKey\@nil{#1}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@DelimDM@l} +% \begin{macro}{\lst@DelimDM@s} +% Nohting special here. +% \begin{macrocode} +\gdef\lst@DelimDM@l#1#2\@empty#3#4#5{% + \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} +% \end{macrocode} +% \begin{macrocode} +\gdef\lst@DelimDM@s#1#2#3\@empty#4#5#6{% + \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% + \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} +% \end{macrocode} +% \begin{macrocode} +% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Strings} +% +% \begin{aspect}{strings} +% Just starting a new aspect. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{strings} +% \end{macrocode} +% +% \begin{macro}{\lst@stringtypes} +% is the list of \ldots\space string types? +% \begin{macrocode} +\gdef\lst@stringtypes{d,b,m,bd,db,s} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@StringKey} +% We just put together the arguments for |\lst@Delim|. +% \begin{macrocode} +\gdef\lst@StringKey#1#2{% + \lst@Delim\lst@stringstyle #2\relax + {String}\lst@stringtypes #1% + {\lst@BeginString\lst@EndString}% + \@@end\@empty{}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{string} +% \begin{lstkey}{morestring} +% \begin{lstkey}{deletestring} +% all use |\lst@StringKey|. +% \begin{macrocode} +\lst@Key{string}\relax{\lst@StringKey\@empty{#1}} +\lst@Key{morestring}\relax{\lst@StringKey\relax{#1}} +\lst@Key{deletestring}\relax{\lst@StringKey\@nil{#1}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{lstkey}{stringstyle} +% You shouldn't need comments on the following two lines, do you? +% \begin{macrocode} +\lst@Key{stringstyle}{}{\def\lst@stringstyle{#1}} +\lst@AddToHook{EmptyStyle}{\let\lst@stringstyle\@empty} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{showstringspaces} +% Thanks to \lsthelper{Knut~M\"uller}{1997/04/28}{\blankstringtrue} for +% reporting problems with |\blankstringtrue| (now |showstringspaces=false|). +% The problem has gone. +% \begin{macrocode} +\lst@Key{showstringspaces}t[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@BeginString} +% Note that the tokens after |\lst@DelimOpen| are arguments! The only special +% here is that we switch to `keepspaces' after starting a string, if necessary. +% A bug reported by \lsthelper{Vespe~Savikko}{2000/09/27}{stringstyle used also +% on previous other characters} has gone due to the use of |\lst@DelimOpen|. +% \begin{macrocode} +\gdef\lst@BeginString{% + \lst@DelimOpen + \lst@ifexstrings\else + {\lst@ifshowstringspaces + \lst@keepspacestrue + \let\lst@outputspace\lst@visiblespace + \fi}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexstrings\iffalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@EndString} +% Again the two tokens following |\lst@DelimClose| are arguments. +% \begin{macrocode} +\gdef\lst@EndString{\lst@DelimClose\lst@ifexstrings\else} +% \end{macrocode} +% \end{macro} +% +% And now all the |\lst@StringDM@|\meta{type} definitions. +% +% \begin{macro}{\lst@StringDM@d} +% `d' means no extra work.; the first three arguments after |\lst@DefDelimBE| +% are left empty. The others are used to start and end the string. +% \begin{macrocode} +\gdef\lst@StringDM@d#1#2\@empty#3#4#5{% + \lst@CArg #2\relax\lst@DefDelimBE{}{}{}#3{#1}{#5}#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@StringDM@b} +% The |\lst@ifletter|\ldots|\fi| has been inserted after bug reports by +% \lsthelper{Daniel~Gerigk}{2001/10/25}{improper strings in C++} and +% \lsthelper{Peter~Bartke}{2001/11/01}{improper strings in C++}. If the last +% other character is a backslash (4th line), we gobble the `end string' token +% sequence. +% \begin{macrocode} +\gdef\lst@StringDM@b#1#2\@empty#3#4#5{% + \let\lst@ifbstring\iftrue + \lst@CArg #2\relax\lst@DefDelimBE + {\lst@ifletter \lst@Output \lst@letterfalse \fi}% + {\ifx\lst@lastother\lstum@backslash + \expandafter\@gobblethree + \fi}{}#3{#1}{#5}#4} +% \end{macrocode} +% \begin{macrocode} +\global\let\lst@ifbstring\iffalse % init +% \end{macrocode} +% \lsthelper{Heiko~Heil}{2002/02/08}{string '\\' does not finish after the +% delimiter} reported problems with double backslashes. So: +% \begin{macrocode} +\lst@AddToHook{SelectCharTable}{% + \lst@ifbstring + \lst@CArgX \\\\\relax \lst@CDefX{}% + {\lst@ProcessOther\lstum@backslash + \lst@ProcessOther\lstum@backslash + \let\lst@lastother\relax}% + {}% + \fi} +% \end{macrocode} +% The reset of |\lst@lastother| has been added after a bug reports by +% \lsthelper{Hermann~H\"uttler}{2002/10/05}{C++-string "... \\" does not +% end with second double quote} and \lsthelper{Dan~Luecking}{2003/01/15} +% {string "\\" doesn't end after the second quote}. +% \end{macro} +% +% \begin{macro}{\lst@StringDM@bd} +% \begin{macro}{\lst@StringDM@db} +% are just the same and the same as |\lst@StringDM@b|. +% \begin{macrocode} +\global\let\lst@StringDM@bd\lst@StringDM@b +\global\let\lst@StringDM@db\lst@StringDM@bd +% \end{macrocode} +% \end{macro}\end{macro} +% +% \begin{macro}{\lst@StringDM@m} +% is for Matlab. We enter string mode only if the last character is not in +% the following list of exceptional characters: letters, digits, period, +% quote, right parenthesis, right bracket, and right brace. The first list +% has been extended after bug reports from \lsthelper{Christian~Kindinger} +% {2002/03/??}{]' starts a string in Matlab}, \lsthelper{Benjamin~Schubert} +% {2003/02/05}{.' starts a string in Matlab}, and \lsthelper{Stefan~Stoll} +% {2003/02/18}{any of 0123456789\}' plus quote start a string in Matlab}. +% \begin{macrocode} +\gdef\lst@StringDM@m#1#2\@empty#3#4#5{% + \lst@CArg #2\relax\lst@DefDelimBE{}{}% + {\let\lst@next\@gobblethree + \lst@ifletter\else + \lst@IfLastOtherOneOf{)].0123456789\lstum@rbrace'}% + {}% + {\let\lst@next\@empty}% + \fi + \lst@next}#3{#1}{#5}#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@StringDM@s} +% is for string-delimited strings, just as for comments. This is needed +% for Ruby, and possibly other languages. +% \begin{macrocode} +\gdef\lst@StringDM@s#1#2#3\@empty#4#5#6{% + \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% + \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstum@rbrace} +% This has been used above. +% \begin{macrocode} +\lst@SaveOutputDef{"7D}\lstum@rbrace +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \begin{aspect}{mf} +% For MetaFont and MetaPost we now define macros to print the input-filenames +% in stringstyle. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{mf} +% \end{macrocode} +% +% \begin{macro}{\lst@mfinputmode} +% \begin{macro}{\lst@String@mf} +% \begin{macrocode} +\lst@AddTo\lst@stringtypes{,mf} +\lst@NewMode\lst@mfinputmode +% \end{macrocode} +% \begin{macrocode} +\gdef\lst@String@mf#1\@empty#2#3#4{% + \lst@CArg #1\relax\lst@DefDelimB + {}{}{\lst@ifletter \expandafter\@gobblethree \fi}% + \lst@BeginStringMFinput\lst@mfinputmode{#4\lst@Lmodetrue}% + \@ifundefined{lsts@semicolon}% + {\lst@DefSaveDef{`\;}\lsts@semicolon{% ; and space end the filename + \ifnum\lst@mode=\lst@mfinputmode + \lst@XPrintToken + \expandafter\lst@LeaveMode + \fi + \lsts@semicolon}% + \lst@DefSaveDef{`\ }\lsts@space{% + \ifnum\lst@mode=\lst@mfinputmode + \lst@XPrintToken + \expandafter\lst@LeaveMode + \fi + \lsts@space}% + }{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@BeginStringMFinput} +% It remains to define this macro. In contrast to |\lst@PrintDelim|, we don't +% use |\lst@modetrue| to allow keyword detection here. +% \begin{macrocode} +\gdef\lst@BeginStringMFinput#1#2#3\@empty{% + \lst@TrackNewLines \lst@XPrintToken + \begingroup + \lst@mode\lst@nomode + #3\lst@XPrintToken + \endgroup + \lst@ResetToken + \lst@EnterMode{#1}{\def\lst@currstyle#2}% + \lst@ifshowstringspaces + \lst@keepspacestrue + \let\lst@outputspace\lst@visiblespace + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsubsection{Comments} +% +% \begin{aspect}{comments} +% That's what we are working on. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{comments} +% \end{macrocode} +% +% \begin{macro}{\lst@commentmode} +% is a general purpose mode for comments. +% \begin{macrocode} +\lst@NewMode\lst@commentmode +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@commenttypes} +% Via \keyname{comment} available comment types: \textbf line, \textbf fixed +% column, \textbf single, and \textbf nested and all with +% preceding \textbf i for invisible comments. +% \begin{macrocode} +\gdef\lst@commenttypes{l,f,s,n} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CommentKey} +% We just put together the arguments for |\lst@Delim|. +% \begin{macrocode} +\gdef\lst@CommentKey#1#2{% + \lst@Delim\lst@commentstyle #2\relax + {Comment}\lst@commenttypes #1% + {\lst@BeginComment\lst@EndComment}% + i\@empty{\lst@BeginInvisible\lst@EndInvisible}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{comment} +% \begin{lstkey}{morecomment} +% \begin{lstkey}{deletecomment} +% The keys are easy since defined in terms of |\lst@CommentKey|. +% \begin{macrocode} +\lst@Key{comment}\relax{\lst@CommentKey\@empty{#1}} +\lst@Key{morecomment}\relax{\lst@CommentKey\relax{#1}} +\lst@Key{deletecomment}\relax{\lst@CommentKey\@nil{#1}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{lstkey}{commentstyle} +% Any hints necessary? +% \begin{macrocode} +\lst@Key{commentstyle}{}{\def\lst@commentstyle{#1}} +\lst@AddToHook{EmptyStyle}{\let\lst@commentstyle\itshape} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@BeginComment} +% \begin{macro}{\lst@EndComment} +% Once more the three tokens following |\lst@DelimOpen| are arguments. +% \begin{macrocode} +\gdef\lst@BeginComment{% + \lst@DelimOpen + \lst@ifexcomments\else + \lsthk@AfterBeginComment} +% \end{macrocode} +% Ditto. +% \begin{macrocode} +\gdef\lst@EndComment{\lst@DelimClose\lst@ifexcomments\else} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{AfterBeginComment}{} +\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifexcomments\iffalse} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@BeginInvisible} +% \begin{macro}{\lst@EndInvisible} +% Print preceding characters and begin dropping the output. +% \begin{macrocode} +\gdef\lst@BeginInvisible#1#2#3\@empty{% + \lst@TrackNewLines \lst@XPrintToken + \lst@BeginDropOutput{#1}} +% \end{macrocode} +% Don't print the delimiter and end dropping the output. +% \begin{macrocode} +\gdef\lst@EndInvisible#1\@empty{\lst@EndDropOutput} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Now we provide all |\lst@Comment|[|DM|]|@|\meta{type} macros. +% +% \begin{macro}{\lst@CommentDM@l} +% is easy---thanks to |\lst@CArg| and |\lst@DefDelimB|. Note that the +% `end comment' argument |#4| is not used here. +% \begin{macrocode} +\gdef\lst@CommentDM@l#1#2\@empty#3#4#5{% + \lst@CArg #2\relax\lst@DefDelimB{}{}{}#3{#1}{#5\lst@Lmodetrue}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CommentDM@f} +% is slightly more work. First we provide the number of preceding columns. +% \begin{macrocode} +\gdef\lst@CommentDM@f#1{% + \@ifnextchar[{\lst@Comment@@f{#1}}% + {\lst@Comment@@f{#1}[0]}} +% \end{macrocode} +% We define the comment in the same way as above, but we enter comment mode +% if and only if the character is in column |#2| (counting from zero). +% \begin{macrocode} +\gdef\lst@Comment@@f#1[#2]#3\@empty#4#5#6{% + \lst@CArg #3\relax\lst@DefDelimB{}{}% + {\lst@CalcColumn + \ifnum #2=\@tempcnta\else + \expandafter\@gobblethree + \fi}% + #4{#1}{#6\lst@Lmodetrue}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CommentDM@s} +% Nothing special here. +% \begin{macrocode} +\gdef\lst@CommentDM@s#1#2#3\@empty#4#5#6{% + \lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6}% + \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@CommentDM@n} +% We either give an error message or define the nested comment. +% \begin{macrocode} +\gdef\lst@CommentDM@n#1#2#3\@empty#4#5#6{% + \ifx\@empty#3\@empty\else + \def\@tempa{#2}\def\@tempb{#3}% + \ifx\@tempa\@tempb + \PackageError{Listings}{Identical delimiters}% + {These delimiters make no sense with nested comments.}% + \else + \lst@CArg #2\relax\lst@DefDelimB + {}% +% \end{macrocode} +% Note that the following |\@gobble| eats an |\else| from |\lst@DefDelimB|. +% \begin{macrocode} + {\ifnum\lst@mode=#1\relax \expandafter\@gobble \fi}% + {}#4{#1}{#6}% + \lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}% + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsubsection{PODs} +% +% \begin{aspect}{pod} +% PODs are defined as a separate aspect. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{pod} +% \end{macrocode} +% +% \begin{lstkey}{printpod} +% \begin{lstkey}{podcomment} +% We begin with the user keys, which I introduced after communication with +% \lsthelper{Michael~Piotrowski}{1997/11/11}{printpod}. +% \begin{macrocode} +\lst@Key{printpod}{false}[t]{\lstKV@SetIf{#1}\lst@ifprintpod} +\lst@Key{podcomment}{false}[t]{\lstKV@SetIf{#1}\lst@ifpodcomment} +\lst@AddToHookExe{SetLanguage}{\let\lst@ifpodcomment\iffalse} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@PODmode} +% is the static mode for PODs. +% \begin{macrocode} +\lst@NewMode\lst@PODmode +% \end{macrocode} +% \end{macro} +% +% We adjust some characters if the user has selected |podcomment=true|. +% \begin{macrocode} +\lst@AddToHook{SelectCharTable} + {\lst@ifpodcomment + \lst@CArgX =\relax\lst@DefDelimB{}{}% +% \end{macrocode} +% The following code is executed if we've found an equality sign and haven't +% entered a mode (in fact if mode changes are allowed): We `begin drop output' +% and gobble the usual begin of comment sequence (via |\@gobblethree|) if PODs +% aren't be printed. Moreover we gobble it if the current column number is not +% zero---|\@tempcnta| is valued below. +% \begin{macrocode} + {\ifnum\@tempcnta=\z@ + \lst@ifprintpod\else + \def\lst@bnext{\lst@BeginDropOutput\lst@PODmode}% + \expandafter\expandafter\expandafter\@gobblethree + \fi + \else + \expandafter\@gobblethree + \fi}% + \lst@BeginComment\lst@PODmode{{\lst@commentstyle}}% +% \end{macrocode} +% If we come to |=|, we calculate the current column number (zero based). +% \begin{macrocode} + \lst@CArgX =cut\^^M\relax\lst@DefDelimE + {\lst@CalcColumn}% +% \end{macrocode} +% If there is additionally |cut|+EOL and if we are in |\lst@PODmode| but not in +% column one, we must gobble the `end comment sequence'. +% \begin{macrocode} + {\ifnum\@tempcnta=\z@\else + \expandafter\@gobblethree + \fi}% + {}% + \lst@EndComment\lst@PODmode + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsubsection{Tags} +% +% \begin{aspect}{html} +% Support for HTML and other `markup languages'. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{html} +% \end{macrocode} +% +% \begin{macro}{\lst@tagtypes} +% Again we begin with the list of tag types. It's rather short. +% \begin{macrocode} +\gdef\lst@tagtypes{s} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@TagKey} +% Again we just put together the arguments for |\lst@Delim| and \ldots +% \begin{macrocode} +\gdef\lst@TagKey#1#2{% + \lst@Delim\lst@tagstyle #2\relax + {Tag}\lst@tagtypes #1% + {\lst@BeginTag\lst@EndTag}% + \@@end\@empty{}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{tag} +% \ldots\ we use the definition here. +% \begin{macrocode} +\lst@Key{tag}\relax{\lst@TagKey\@empty{#1}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{tagstyle} +% You shouldn't need comments on the following two lines, do you? +% \begin{macrocode} +\lst@Key{tagstyle}{}{\def\lst@tagstyle{#1}} +\lst@AddToHook{EmptyStyle}{\let\lst@tagstyle\@empty} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@BeginTag} +% The special things here are: (1) We activate keyword detection inside tags +% and (2) we initialize the switch |\lst@iffirstintag| if necessary. +% \begin{macrocode} +\gdef\lst@BeginTag{% + \lst@DelimOpen + \lst@ifextags\else + {\let\lst@ifkeywords\iftrue + \lst@ifmarkfirstintag \lst@firstintagtrue \fi}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHookExe{ExcludeDelims}{\let\lst@ifextags\iffalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@EndTag} +% is just like the other |\lst@End|\meta{whatever} definitions. +% \begin{macrocode} +\gdef\lst@EndTag{\lst@DelimClose\lst@ifextags\else} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{usekeywordsintag} +% \begin{lstkey}{markfirstintag} +% The second key has already been `used'. +% \begin{macrocode} +\lst@Key{usekeywordsintag}t[t]{\lstKV@SetIf{#1}\lst@ifusekeysintag} +\lst@Key{markfirstintag}f[t]{\lstKV@SetIf{#1}\lst@ifmarkfirstintag} +% \end{macrocode} +% For this, we install a (global) switch, \ldots +% \begin{macrocode} +\gdef\lst@firstintagtrue{\global\let\lst@iffirstintag\iftrue} +\global\let\lst@iffirstintag\iffalse +% \end{macrocode} +% \ldots\ which is reset by the output of an identifier but not by other +% output. +% \begin{macrocode} +\lst@AddToHook{PostOutput}{\lst@tagresetfirst} +\lst@AddToHook{Output} + {\gdef\lst@tagresetfirst{\global\let\lst@iffirstintag\iffalse}} +\lst@AddToHook{OutputOther}{\gdef\lst@tagresetfirst{}} +% \end{macrocode} +% Now we only need to test against this switch in the \hookname{Output} hook. +% \begin{macrocode} +\lst@AddToHook{Output} + {\ifnum\lst@mode=\lst@tagmode + \lst@iffirstintag \let\lst@thestyle\lst@gkeywords@sty \fi +% \end{macrocode} +% Moreover we check here, whether the keyword style is always to be used. +% \begin{macrocode} + \lst@ifusekeysintag\else \let\lst@thestyle\lst@gkeywords@sty\fi + \fi} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@tagmode} +% We allocate the mode and \ldots +% \begin{macrocode} +\lst@NewMode\lst@tagmode +% \end{macrocode} +% deactivate keyword detection if any tag delimiter is defined (see below). +% \begin{macrocode} +\lst@AddToHook{Init}{\global\let\lst@ifnotag\iftrue} +\lst@AddToHook{SelectCharTable}{\let\lst@ifkeywords\lst@ifnotag} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Tag@s} +% The definition of the one and only delimiter type is not that interesting. +% Compared with the others we set |\lst@ifnotag| and enter tag mode only if +% we aren't in tag mode. +% \begin{macrocode} +\gdef\lst@Tag@s#1#2\@empty#3#4#5{% + \global\let\lst@ifnotag\iffalse + \lst@CArg #1\relax\lst@DefDelimB {}{}% + {\ifnum\lst@mode=\lst@tagmode \expandafter\@gobblethree \fi}% + #3\lst@tagmode{#5}% + \lst@CArg #2\relax\lst@DefDelimE {}{}{}#4\lst@tagmode}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@BeginCDATA} +% This macro is used by the XML language definition. +% \begin{macrocode} +\gdef\lst@BeginCDATA#1\@empty{% + \lst@TrackNewLines \lst@PrintToken + \lst@EnterMode\lst@GPmode{}\let\lst@ifmode\iffalse + \lst@mode\lst@tagmode #1\lst@mode\lst@GPmode\relax\lst@modetrue} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Replacing input} +% +% \begingroup +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% \endgroup +% +% \begin{macro}{\lst@ReplaceInput} +% is defined in terms of |\lst@CArgX| and |\lst@CDefX|. +% \begin{macrocode} +\def\lst@ReplaceInput#1{\lst@CArgX #1\relax\lst@CDefX{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{literate} +% \lsthelper{Jason~Alexander}{1999/03/10}{literate programming} asked for +% something like that. The key looks for a star and saves the argument. +% \begin{macrocode} +\def\lst@Literatekey#1\@nil@{\let\lst@ifxliterate\lst@if + \def\lst@literate{#1}} +\lst@Key{literate}{}{\@ifstar{\lst@true \lst@Literatekey} + {\lst@false\lst@Literatekey}#1\@nil@} +\lst@AddToHook{SelectCharTable} + {\ifx\lst@literate\@empty\else + \expandafter\lst@Literate\lst@literate{}\relax\z@ + \fi} +% \end{macrocode} +% Internally we don't make use of the `replace input' feature any more. +%^^A We print the preceding text, assign token and length, and output it. +% \begin{macrocode} +\def\lst@Literate#1#2#3{% + \ifx\relax#2\@empty\else + \lst@CArgX #1\relax\lst@CDef + {} + {\let\lst@next\@empty + \lst@ifxliterate + \lst@ifmode \let\lst@next\lst@CArgEmpty \fi + \fi + \ifx\lst@next\@empty + \ifx\lst@OutputBox\@gobble\else + \lst@XPrintToken \let\lst@scanmode\lst@scan@m + \lst@token{#2}\lst@length#3\relax + \lst@XPrintToken + \fi + \let\lst@next\lst@CArgEmptyGobble + \fi + \lst@next}% + \@empty + \expandafter\lst@Literate + \fi} +\def\lst@CArgEmptyGobble#1\@empty{} +% \end{macrocode} +% Note that we check |\lst@OutputBox| for being |\@gobble|. This is due to +% a bug report by \lsthelper{Jared~Warren}{2003/07/10}{literate replacement +% produces "ghosts"}. +% \end{lstkey} +% +% \begin{macro}{\lst@BeginDropInput} +% We deactivate all `process' macros. |\lst@modetrue| does this for all +% up-coming string delimiters, comments, and so on. +% \begin{macrocode} +\def\lst@BeginDropInput#1{% + \lst@EnterMode{#1}% + {\lst@modetrue + \let\lst@OutputBox\@gobble + \let\lst@ifdropinput\iftrue + \let\lst@ProcessLetter\@gobble + \let\lst@ProcessDigit\@gobble + \let\lst@ProcessOther\@gobble + \let\lst@ProcessSpace\@empty + \let\lst@ProcessTabulator\@empty + \let\lst@ProcessFormFeed\@empty}} +\let\lst@ifdropinput\iffalse % init +% \end{macrocode} +% \end{macro} +% +% \begingroup +% \begin{macrocode} +% +% \end{macrocode} +% \endgroup +% +% +% \subsection{Escaping to \LaTeX} +% +% \begin{aspect}{escape} +% We now define the \ldots\ damned \ldots\ the aspect has escaped! +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{escape} +% \end{macrocode} +% +% \begin{lstkey}{texcl} +% Communication with \lsthelper{J\"orn~Wilms}{1997/07/07}{\TeX\ comments} is +% responsible for this key. The definition and the first hooks are easy. +% \begin{macrocode} +\lst@Key{texcl}{false}[t]{\lstKV@SetIf{#1}\lst@iftexcl} +\lst@AddToHook{TextStyle}{\let\lst@iftexcl\iffalse} +\lst@AddToHook{EOL} + {\ifnum\lst@mode=\lst@TeXLmode + \expandafter\lst@escapeend + \expandafter\lst@LeaveAllModes + \expandafter\lst@ReenterModes + \fi} +% \end{macrocode} +% If the user wants \TeX\ comment lines, we print the comment separator and +% interrupt the normal processing. +% \begin{macrocode} +\lst@AddToHook{AfterBeginComment} + {\lst@iftexcl \lst@ifLmode \lst@ifdropinput\else + \lst@PrintToken + \lst@LeaveMode \lst@InterruptModes + \lst@EnterMode{\lst@TeXLmode}{\lst@modetrue\lst@commentstyle}% + \expandafter\expandafter\expandafter\lst@escapebegin + \fi \fi \fi} +% \end{macrocode} +% \begin{macrocode} +\lst@NewMode\lst@TeXLmode +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@ActiveCDefX} +% Same as |\lst@CDefX| but we both make |#1| active and assign a new catcode. +% \begin{macrocode} +\gdef\lst@ActiveCDefX#1{\lst@ActiveCDefX@#1} +\gdef\lst@ActiveCDefX@#1#2#3{ + \catcode`#1\active\lccode`\~=`#1% + \lowercase{\lst@CDefIt~}{#2}{#3}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@Escape} +% gets four arguments all in all. The first and second are the `begin' and +% `end' escape sequences, the third is executed when the escape starts, and the +% fourth right before ending it. We use the same mechanism as for \TeX\ comment +% lines. The |\lst@ifdropinput| test has been added after a bug report by +% \lsthelper{Michael~Weber}{2002/03/26}{escape on lines < firstline corrupts +% output}. The |\lst@newlines\z@| was added due to a bug report by +% \lsthelper{Frank~Atanassow}{2004/10/07}{space after mathescape is not +% preserved}. +% \begin{macrocode} +\gdef\lst@Escape#1#2#3#4{% + \lst@CArgX #1\relax\lst@CDefX + {}% + {\lst@ifdropinput\else + \lst@TrackNewLines\lst@OutputLostSpace \lst@XPrintToken + \lst@InterruptModes + \lst@EnterMode{\lst@TeXmode}{\lst@modetrue}% +% \end{macrocode} +% Now we must define the character sequence to end the escape. +% \begin{macrocode} + \ifx\^^M#2% + \lst@CArg #2\relax\lst@ActiveCDefX + {}% + {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes}% + {\lst@MProcessListing}% + \else + \lst@CArg #2\relax\lst@ActiveCDefX + {}% + {\lst@escapeend #4\lst@LeaveAllModes\lst@ReenterModes + \lst@newlines\z@ \lst@whitespacefalse}% + {}% + \fi + #3\lst@escapebegin + \fi}% + {}} +% \end{macrocode} +% The |\lst@whitespacefalse| above was added after a bug report from +% \lsthelper{Martin~Steffen}{2001/04/07}{mathescape drops subsequent space}. +% \begin{macrocode} +\lst@NewMode\lst@TeXmode +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{escapebegin} +% \begin{lstkey}{escapeend} +% The keys simply store the arguments. +% \begin{macrocode} +\lst@Key{escapebegin}{}{\def\lst@escapebegin{#1}} +\lst@Key{escapeend}{}{\def\lst@escapeend{#1}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{lstkey}{escapechar} +% The introduction of this key is due to a communication with \lsthelper +% {Rui~Oliveira}{1998/06/05}{escape characters}. We define |\lst@DefEsc| and +% execute it after selecting the standard character table. +% \begin{macrocode} +\lst@Key{escapechar}{} + {\ifx\@empty#1\@empty + \let\lst@DefEsc\relax + \else + \def\lst@DefEsc{\lst@Escape{#1}{#1}{}{}}% + \fi} +\lst@AddToHook{TextStyle}{\let\lst@DefEsc\@empty} +\lst@AddToHook{SelectCharTable}{\lst@DefEsc} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{escapeinside} +% Nearly the same. +% \begin{macrocode} +\lst@Key{escapeinside}{}{\lstKV@TwoArg{#1}% + {\let\lst@DefEsc\@empty + \ifx\@empty##1@empty\else \ifx\@empty##2\@empty\else + \def\lst@DefEsc{\lst@Escape{##1}{##2}{}{}}% + \fi\fi}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{mathescape} +% This is a switch and checked after character table selection. We use +% |\lst@Escape| with math shifts as arguments, but all inside |\hbox| +% to determine the correct width. +% \begin{macrocode} +\lst@Key{mathescape}{false}[t]{\lstKV@SetIf{#1}\lst@ifmathescape} +\lst@AddToHook{SelectCharTable} + {\lst@ifmathescape \lst@Escape{\$}{\$}% + {\setbox\@tempboxa=\hbox\bgroup$}% + {$\egroup \lst@CalcLostSpaceAndOutput}\fi} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \section{Keywords} +% +% +% \subsection{Making tests}\label{iMakingTests} +% +% \begin{aspect}{keywords} +% We begin a new and very important aspect. +% First of all we need to initialize some variables in order to work around a +% bug reported by \lsthelper{Beat~Birkhofer}{2001/06/15}{savemem doesn't work}. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{keywords} +% \end{macrocode} +% \begin{macrocode} +\global\let\lst@ifsensitive\iftrue % init +\global\let\lst@ifsensitivedefed\iffalse % init % \global +% \end{macrocode} +% All keyword tests take the following three arguments. +% \begin{macroargs} +% \item \meta{prefix} +% \item |\lst@|\meta{name}|@list| (a list of macros which contain the keywords) +% \item |\lst@g|\meta{name}|@sty| (global style macro) +% \end{macroargs} +% We begin with non memory-saving tests. +% \begingroup +% \begin{macrocode} +\lst@ifsavemem\else +% \end{macrocode} +% \endgroup +% +% \begin{macro}{\lst@KeywordTest} +% Fast keyword tests take advance of the |\lst@UM| construction in section +% \ref{iCharacterTables}. If |\lst@UM| is empty, all `use macro' characters +% expand to their original characters. Since |\lst|\meta{prefix}|@|\meta{keyword} +% will be equivalent to the appropriate style, we only need to build the control +% sequence |\lst|\meta{prefix}|@|\meta{current token} and assign it to +% |\lst@thestyle|. +% \begin{macrocode} +\gdef\lst@KeywordTest#1#2#3{% + \begingroup \let\lst@UM\@empty + \global\expandafter\let\expandafter\@gtempa + \csname\@lst#1@\the\lst@token\endcsname + \endgroup + \ifx\@gtempa\relax\else + \let\lst@thestyle\@gtempa + \fi} +% \end{macrocode} +% Note that we need neither |#2| nor |#3| here. +% \end{macro} +% +% \begin{macro}{\lst@KEYWORDTEST} +% Case insensitive tests make the current character string upper case and give +% it to a submacro similar to |\lst@KeywordTest|. +% \begin{macrocode} +\gdef\lst@KEYWORDTEST{% + \uppercase\expandafter{\expandafter + \lst@KEYWORDTEST@\the\lst@token}\relax} +\gdef\lst@KEYWORDTEST@#1\relax#2#3#4{% + \begingroup \let\lst@UM\@empty + \global\expandafter\let\expandafter\@gtempa + \csname\@lst#2@#1\endcsname + \endgroup + \ifx\@gtempa\relax\else + \let\lst@thestyle\@gtempa + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@WorkingTest} +% \begin{macro}{\lst@WORKINGTEST} +% The same except that |\lst|\meta{prefix}|@|\meta{current token} might be +% a working procedure; it is executed. +% \begin{macrocode} +\gdef\lst@WorkingTest#1#2#3{% + \begingroup \let\lst@UM\@empty + \global\expandafter\let\expandafter\@gtempa + \csname\@lst#1@\the\lst@token\endcsname + \endgroup + \@gtempa} +% \end{macrocode} +% \begin{macrocode} +\gdef\lst@WORKINGTEST{% + \uppercase\expandafter{\expandafter + \lst@WORKINGTEST@\the\lst@token}\relax} +\gdef\lst@WORKINGTEST@#1\relax#2#3#4{% + \begingroup \let\lst@UM\@empty + \global\expandafter\let\expandafter\@gtempa + \csname\@lst#2@#1\endcsname + \endgroup + \@gtempa} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@DefineKeywords} +% Eventually we need macros which define and undefine +% |\lst|\meta{prefix}|@|\meta{keyword}. Here the arguments are +% \begin{macroargs} +% \item \meta{prefix} +% \item |\lst@|\meta{name} (a keyword list) +% \item |\lst@g|\meta{name}|@sty| +% \end{macroargs} +% We make the keywords upper case if necessary, \ldots +% \begin{macrocode} +\gdef\lst@DefineKeywords#1#2#3{% + \lst@ifsensitive + \def\lst@next{\lst@for#2}% + \else + \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}% + \fi + \lst@next\do +% \end{macrocode} +% \ldots\space iterate through the list, and make +% |\lst|\meta{prefix}|@|\meta{keyword} (if undefined) equivalent to +% |\lst@g|\meta{name}|@sty| which is possibly a working macro. +% \begin{macrocode} + {\expandafter\ifx\csname\@lst#1@##1\endcsname\relax + \global\expandafter\let\csname\@lst#1@##1\endcsname#3% + \fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@UndefineKeywords} +% We make the keywords upper case if necessary, \ldots +% \begin{macrocode} +\gdef\lst@UndefineKeywords#1#2#3{% + \lst@ifsensitivedefed + \def\lst@next{\lst@for#2}% + \else + \def\lst@next{\uppercase\expandafter{\expandafter\lst@for#2}}% + \fi + \lst@next\do +% \end{macrocode} +% \ldots\space iterate through the list, and `undefine' +% |\lst|\meta{prefix}|@|\meta{keyword} if it's equivalent to +% |\lst@g|\meta{name}|@sty|. +% \begin{macrocode} + {\expandafter\ifx\csname\@lst#1@##1\endcsname#3% + \global\expandafter\let\csname\@lst#1@##1\endcsname\relax + \fi}} +% \end{macrocode} +% Thanks to \lsthelper{Magnus~Lewis-Smith}{1999/09/08}{keywords do not +% undefine} a wrong |#2| in the replacement text could be changed to |#3|. +% \end{macro} +% +% \begingroup +% And now memory-saving tests. +% \begin{macrocode} +\fi +\lst@ifsavemem +% \end{macrocode} +% \endgroup +% +% \begin{macro}{\lst@IfOneOutOf} +% The definition here is similar to |\lst@IfOneOf|, but its second argument +% is a |\lst@|\meta{name}|@list|. Therefore we test a list of macros here. +% \begin{macrocode} +\gdef\lst@IfOneOutOf#1\relax#2{% + \def\lst@temp##1,#1,##2##3\relax{% + \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}% + \def\lst@next{\lst@IfOneOutOf@#1\relax}% + \expandafter\lst@next#2\relax\relax} +% \end{macrocode} +% We either execute the \meta{else} part or make the next test. +% \begin{macrocode} +\gdef\lst@IfOneOutOf@#1\relax#2#3{% + \ifx#2\relax + \expandafter\@secondoftwo + \else + \expandafter\lst@temp\expandafter,#2,#1,\@empty\relax + \expandafter\lst@next + \fi} +\ifx\iffalse\else\fi +\gdef\lst@IOOOfirst#1\relax#2#3{\fi#2} +% \end{macrocode} +% The line |\ifx\iffalse\else\fi| balances the |\fi| inside |\lst@IOOOfirst|. +% \end{macro} +% +% \begin{macro}{\lst@IFONEOUTOF} +% As in |\lst@IFONEOF| we need two |\uppercase|s here. +% \begin{macrocode} +\gdef\lst@IFONEOUTOF#1\relax#2{% + \uppercase{\def\lst@temp##1,#1},##2##3\relax{% + \ifx\@empty##2\else \expandafter\lst@IOOOfirst \fi}% + \def\lst@next{\lst@IFONEOUTOF@#1\relax}% + \expandafter\lst@next#2\relax} +\gdef\lst@IFONEOUTOF@#1\relax#2#3{% + \ifx#2\relax + \expandafter\@secondoftwo + \else + \uppercase + {\expandafter\lst@temp\expandafter,#2,#1,\@empty\relax}% + \expandafter\lst@next + \fi} +% \end{macrocode} +% Note: The third last line uses the fact that keyword lists (not the list +% of keyword lists) are already made upper case if keywords are insensitive. +% \end{macro} +% +% \begin{macro}{\lst@KWTest} +% is a helper for the keyword and working identifier tests. We expand the +% token and call |\lst@IfOneOf|. The tests below will append appropriate +% \meta{then} and \meta{else} arguments. +% \begin{macrocode} +\gdef\lst@KWTest{% + \begingroup \let\lst@UM\@empty + \expandafter\xdef\expandafter\@gtempa\expandafter{\the\lst@token}% + \endgroup + \expandafter\lst@IfOneOutOf\@gtempa\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@KeywordTest} +% \begin{macro}{\lst@KEYWORDTEST} +% are fairly easy now. Note that we don't need |#1|=\meta{prefix} here. +% \begin{macrocode} +\gdef\lst@KeywordTest#1#2#3{\lst@KWTest #2{\let\lst@thestyle#3}{}} +\global\let\lst@KEYWORDTEST\lst@KeywordTest +% \end{macrocode} +% For case insensitive tests we assign the insensitive version to +% |\lst@IfOneOutOf|. Thus we need no extra definition here. +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@WorkingTest} +% \begin{macro}{\lst@WORKINGTEST} +% Ditto. +% \begin{macrocode} +\gdef\lst@WorkingTest#1#2#3{\lst@KWTest #2#3{}} +\global\let\lst@WORKINGTEST\lst@WorkingTest +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begingroup +% \begin{macrocode} +\fi +% \end{macrocode} +% \endgroup +% +% \begin{lstkey}{sensitive} +% is a switch, preset \texttt{true} every language selection. +% \begin{macrocode} +\lst@Key{sensitive}\relax[t]{\lstKV@SetIf{#1}\lst@ifsensitive} +\lst@AddToHook{SetLanguage}{\let\lst@ifsensitive\iftrue} +% \end{macrocode} +% We select case insensitive definitions if necessary. +% \begin{macrocode} +\lst@AddToHook{Init} + {\lst@ifsensitive\else + \let\lst@KeywordTest\lst@KEYWORDTEST + \let\lst@WorkingTest\lst@WORKINGTEST + \let\lst@IfOneOutOf\lst@IFONEOUTOF + \fi} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@MakeMacroUppercase} +% makes the contents of |#1| (if defined) upper case. +% \begin{macrocode} +\gdef\lst@MakeMacroUppercase#1{% + \ifx\@undefined#1\else \uppercase\expandafter + {\expandafter\def\expandafter#1\expandafter{#1}}% + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Installing tests} +% +% \begin{macro}{\lst@InstallTest} +% The arguments are +% \begin{macroargs} +% \item \meta{prefix} +% \item |\lst@|\meta{name}|@list| +% \item |\lst@|\meta{name} +% \item |\lst@g|\meta{name}|@list| +% \item |\lst@g|\meta{name} +% \item |\lst@g|\meta{name}|@sty| +% \item \alternative{w,s} (working procedure or style) +% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) +% \end{macroargs} +% We just insert hook material. The tests will be inserted on demand. +% \begin{macrocode} +\gdef\lst@InstallTest#1#2#3#4#5#6#7#8{% + \lst@AddToHook{TrackKeywords}{\lst@TrackKeywords{#1}#2#4#6#7#8}% + \lst@AddToHook{PostTrackKeywords}{\lst@PostTrackKeywords#2#3#4#5}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{Init}{\lsthk@TrackKeywords\lsthk@PostTrackKeywords} +\lst@AddToHook{TrackKeywords} + {\global\let\lst@DoDefineKeywords\@empty}% init +\lst@AddToHook{PostTrackKeywords} + {\lst@DoDefineKeywords + \global\let\lst@DoDefineKeywords\@empty}% init +% \end{macrocode} +% We have to detect the keywords somewhere. +% \begin{macrocode} +\lst@AddToHook{Output}{\lst@ifkeywords \lsthk@DetectKeywords \fi} +\lst@AddToHook{DetectKeywords}{}% init +\lst@AddToHook{ModeTrue}{\let\lst@ifkeywords\iffalse} +\lst@AddToHookExe{Init}{\let\lst@ifkeywords\iftrue} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@InstallTestNow} +% actually inserts a test. +% \begin{macroargs} +% \item \meta{prefix} +% \item |\lst@|\meta{name}|@list| +% \item |\lst@g|\meta{name}|@sty| +% \item \alternative{w,s} (working procedure or style) +% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) +% \end{macroargs} +% For example, |#4#5|=|sd| will add +% |\lst@KeywordTest{|\meta{prefix}|}| +% |\lst@|\meta{name}|@list| |\lst@g|\meta{name}|@sty| +% to the \hookname{DetectKeywords} hook. +% \begin{macrocode} +\gdef\lst@InstallTestNow#1#2#3#4#5{% + \@ifundefined{\string#2#1}% + {\global\@namedef{\string#2#1}{}% + \edef\@tempa{% + \noexpand\lst@AddToHook{\ifx#5dDetectKeywords\else Output\fi}% + {\ifx #4w\noexpand\lst@WorkingTest + \else\noexpand\lst@KeywordTest \fi + {#1}\noexpand#2\noexpand#3}}% +% \end{macrocode} +% If we are advised to save memory, we insert a test for each \meta{name}. +% Otherwise we install the tests according to \meta{prefix}. +% \begin{macrocode} + \lst@ifsavemem + \@tempa + \else + \@ifundefined{\@lst#1@if@ins}% + {\@tempa \global\@namedef{\@lst#1@if@ins}{}}% + {}% + \fi} + {}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@TrackKeywords} +% Now it gets a bit tricky. We expand the class list |\lst@|\meta{name}|@list| +% behind |\lst@TK@{|\meta{prefix}|}||\lst@g|\meta{name}|@sty| and use two +% |\relax|es as terminators. This will define the keywords of all the classes +% as keywords of type \meta{prefix}. More details come soon. +% \begin{macrocode} +\gdef\lst@TrackKeywords#1#2#3#4#5#6{% + \lst@false + \def\lst@arg{{#1}#4}% + \expandafter\expandafter\expandafter\lst@TK@ + \expandafter\lst@arg#2\relax\relax +% \end{macrocode} +% And nearly the same to undefine all out-dated keywords, which is necessary +% only if we don't save memory. +% \begin{macrocode} + \lst@ifsavemem\else + \def\lst@arg{{#1}#4#2}% + \expandafter\expandafter\expandafter\lst@TK@@ + \expandafter\lst@arg#3\relax\relax + \fi +% \end{macrocode} +% Finally we install the keyword test if keywords changed, in particular if +% they are defined the first time. Note that |\lst@InstallTestNow| inserts a +% test only once. +% \begin{macrocode} + \lst@if \lst@InstallTestNow{#1}#2#4#5#6\fi} +% \end{macrocode} +% Back to the current keywords. Global macros |\lst@g|\meta{id} contain +% globally defined keywords, whereas |\lst@|\meta{id} conatin the true +% keywords. This way we can keep track of the keywords: If keywords or +% \keyname{sensitive} changed, we undefine the old (= globally defined) +% keywords and define the true ones. The arguments of |\lst@TK@| are +% \begin{macroargs} +% \item \meta{prefix} +% \item |\lst@g|\meta{name}|@sty| +% \item |\lst@|\meta{id} +% \item |\lst@g|\meta{id} +% \end{macroargs} +% Thanks to \lsthelper{Holger~Arndt}{2004/05/27}{bad \lst@UndefineKeywords +% \lst@DefineKeywords sequence if keyword crosses orders in two languages} +% the definition of keywords is now delayed via |\lst@DoDefineKeywords|. +% \begin{macrocode} +\gdef\lst@TK@#1#2#3#4{% + \ifx\lst@ifsensitive\lst@ifsensitivedefed + \ifx#3#4\else + \lst@true + \lst@ifsavemem\else + \lst@UndefineKeywords{#1}#4#2% + \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}% + \fi + \fi + \else + \ifx#3\relax\else + \lst@true + \lst@ifsavemem\else + \lst@UndefineKeywords{#1}#4#2% + \lst@AddTo\lst@DoDefineKeywords{\lst@DefineKeywords{#1}#3#2}% + \fi + \fi + \fi +% \end{macrocode} +% We don't define and undefine keywords if we try to save memory. But we +% possibly need to make them upper case, which again wastes some memory. +% \begin{macrocode} + \lst@ifsavemem \ifx#3\relax\else + \lst@ifsensitive\else \lst@MakeMacroUppercase#3\fi + \fi \fi +% \end{macrocode} +% Reaching the end of the class list, we end the loop. +% \begin{macrocode} + \ifx#3\relax + \expandafter\@gobblethree + \fi + \lst@TK@{#1}#2} +% \end{macrocode} +% Here now we undefine the out-dated keywords. While not reaching the end of +% the global list, we look whether the keyword class |#4#5| is still in use or +% needs to be undefined. Our arguments are +% \begin{macroargs} +% \item \meta{prefix} +% \item |\lst@g|\meta{name}|@sty| +% \item |\lst@|\meta{name}|@list| +% \item |\lst@|\meta{id} +% \item |\lst@g|\meta{id} +% \end{macroargs} +% \begin{macrocode} +\gdef\lst@TK@@#1#2#3#4#5{% + \ifx#4\relax + \expandafter\@gobblefour + \else + \lst@IfSubstring{#4#5}#3{}{\lst@UndefineKeywords{#1}#5#2}% + \fi + \lst@TK@@{#1}#2#3} +% \end{macrocode} +% Keywords are up-to-date after \hookname{InitVars}. +% \begin{macrocode} +\lst@AddToHook{InitVars} + {\global\let\lst@ifsensitivedefed\lst@ifsensitive} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@PostTrackKeywords} +% After updating all the keywords, the global keywords and the global list +% become equivalent to the local ones. +% \begin{macrocode} +\gdef\lst@PostTrackKeywords#1#2#3#4{% + \lst@ifsavemem\else + \global\let#3#1% + \global\let#4#2% + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Classes and families} +% +% \begin{lstkey}{classoffset} +% just stores the argument in a macro. +% \begin{macrocode} +\lst@Key{classoffset}\z@{\def\lst@classoffset{#1}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@InstallFamily} +% Recall the parameters +% \begin{macroargs} +% \item \meta{prefix} +% \item \meta{name} +% \item \meta{style name} +% \item \meta{style init} +% \item \meta{default style name} +% \item \meta{working procedure} +% \item \alternative{l,o} (language or other key) +% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) +% \end{macroargs} +% First we define the keys and the style key \meta{style name} if and only if +% the name is not empty. +% \begin{macrocode} +\gdef\lst@InstallFamily#1#2#3#4#5{% + \lst@Key{#2}\relax{\lst@UseFamily{#2}##1\relax\lst@MakeKeywords}% + \lst@Key{more#2}\relax + {\lst@UseFamily{#2}##1\relax\lst@MakeMoreKeywords}% + \lst@Key{delete#2}\relax + {\lst@UseFamily{#2}##1\relax\lst@DeleteKeywords}% + \ifx\@empty#3\@empty\else + \lst@Key{#3}{#4}{\lstKV@OptArg[\@ne]{##1}% + {\@tempcnta\lst@classoffset \advance\@tempcnta####1\relax + \@namedef{lst@#3\ifnum\@tempcnta=\@ne\else \the\@tempcnta + \fi}{####2}}}% + \fi + \expandafter\lst@InstallFamily@ + \csname\@lst @#2@data\expandafter\endcsname + \csname\@lst @#5\endcsname {#1}{#2}{#3}} +% \end{macrocode} +% Now we check whether \meta{working procedure} is empty. Accordingly we use +% \texttt working procedure or \texttt style in the `data' definition. +% The working procedure is defined right here if necessary. +% \begin{macrocode} +\gdef\lst@InstallFamily@#1#2#3#4#5#6#7#8{% + \gdef#1{{#3}{#4}{#5}#2#7}% + \long\def\lst@temp##1{#6}% + \ifx\lst@temp\@gobble + \lst@AddTo#1{s#8}% + \else + \lst@AddTo#1{w#8}% + \global\@namedef{lst@g#4@wp}##1{#6}% + \fi} +% \end{macrocode} +% Nothing else is defined here, all the rest is done on demand. +% \end{macro} +% +% \begin{macro}{\lst@UseFamily} +% We look for the optional class number, provide this member, \ldots +% \begin{macrocode} +\gdef\lst@UseFamily#1{% + \def\lst@family{#1}% + \@ifnextchar[\lst@UseFamily@{\lst@UseFamily@[\@ne]}} +\gdef\lst@UseFamily@[#1]{% + \@tempcnta\lst@classoffset \advance\@tempcnta#1\relax + \lst@ProvideFamily\lst@family +% \end{macrocode} +% \ldots\space and build the control sequences \ldots +% \begin{macrocode} + \lst@UseFamily@a + {\lst@family\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}} +\gdef\lst@UseFamily@a#1{% + \expandafter\lst@UseFamily@b + \csname\@lst @#1@list\expandafter\endcsname + \csname\@lst @#1\expandafter\endcsname + \csname\@lst @#1@also\expandafter\endcsname + \csname\@lst @g#1\endcsname} +% \end{macrocode} +% \ldots\space required for |\lst@MakeKeywords| and |#6|. +% \begin{macrocode} +\gdef\lst@UseFamily@b#1#2#3#4#5\relax#6{\lstKV@XOptArg[]{#5}#6#1#2#3#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ProvideFamily} +% provides the member `|\the\@tempcnta|' of the family |#1|. We do nothing if +% the member already exists. Otherwise we expand the data macro defined above. +% Note that we don't use the counter if it equals one. Since a bug report by +% \lsthelper{Kris~Luyten}{2002/08/03}{Undefined control sequence \lst@thestyle} +% keyword families use the prefix |lstfam| instead of |lst|. The marker +% |\lstfam@#1|\oarg{number} is defined globally since a bug report by +% \lsthelper{Edsko~de~Vries}{2003/07/20}{bad keywords with language selections +% only in optional arguments}. +% \begin{macrocode} +\gdef\lst@ProvideFamily#1{% + \@ifundefined{lstfam@#1\ifnum\@tempcnta=\@ne\else\the\@tempcnta\fi}% + {\global\@namedef{lstfam@#1\ifnum\@tempcnta=\@ne\else + \the\@tempcnta\fi}{}% + \expandafter\expandafter\expandafter\lst@ProvideFamily@ + \csname\@lst @#1@data\endcsname + {\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi}}% + {}}% +% \end{macrocode} +% Now we have the following arguments +% \begin{macroargs} +% \item \meta{prefix} +% \item \meta{name} +% \item \meta{style name} +% \item \meta{default style name} +% \item \alternative{l,o} (language or other key) +% \item \alternative{w,s} (working procedure or style) +% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) +% \item |\ifnum\@tempcnta=\@ne\else \the\@tempcnta \fi| +% \end{macroargs} +% We define |\lst@g|\meta{name}\meta{number}|@sty| to call either +% |\lst@g|\meta{name}|@wp| with the number as argument or +% |\lst@|\meta{style name}\meta{number} where the number belongs to the control +% sequence. +% \begin{macrocode} +\gdef\lst@ProvideFamily@#1#2#3#4#5#6#7#8{% + \expandafter\xdef\csname\@lst @g#2#8@sty\endcsname + {\if #6w% + \expandafter\noexpand\csname\@lst @g#2@wp\endcsname{#8}% + \else + \expandafter\noexpand\csname\@lst @#3#8\endcsname + \fi}% +% \end{macrocode} +% We ensure the existence of the style macro. This is done in the +% \hookname{Init} hook by assigning the default style if necessary. +% \begin{macrocode} + \ifx\@empty#3\@empty\else + \edef\lst@temp{\noexpand\lst@AddToHook{Init}{% + \noexpand\lst@ProvideStyle\expandafter\noexpand + \csname\@lst @#3#8\endcsname\noexpand#4}}% + \lst@temp + \fi +% \end{macrocode} +% We call a submacro to do the rest. It requires some control sequences. +% \begin{macrocode} + \expandafter\lst@ProvideFamily@@ + \csname\@lst @#2#8@list\expandafter\endcsname + \csname\@lst @#2#8\expandafter\endcsname + \csname\@lst @#2#8@also\expandafter\endcsname + \csname\@lst @g#2#8@list\expandafter\endcsname + \csname\@lst @g#2#8\expandafter\endcsname + \csname\@lst @g#2#8@sty\expandafter\endcsname + {#1}#5#6#7} +% \end{macrocode} +% Now we have (except that \meta{number} is possibly always missing) +% \begin{macroargs} +% \item |\lst@|\meta{name}\meta{number}|@list| +% \item |\lst@|\meta{name}\meta{number} +% \item |\lst@|\meta{name}\meta{number}|@also| +% \item |\lst@g|\meta{name}\meta{number}|@list| +% \item |\lst@g|\meta{name}\meta{number} +% \item |\lst@g|\meta{name}\meta{number}|@sty| +% \item \meta{prefix} +% \item \alternative{l,o} (language or other key) +% \item \alternative{w,s} (working procedure or style) +% \item \alternative{d,o} (\hookname{DetectKeywords} or \hookname{Output} hook) +% \end{macroargs} +% Note that |#9| and `|#10|' are read by |\lst@InstallTest|. We initialize all +% required `variables' (at \hookname{SetLanguage}) and install the test (which +% definition is in fact also delayed). +% \begin{macrocode} +\gdef\lst@ProvideFamily@@#1#2#3#4#5#6#7#8{% + \gdef#1{#2#5}\global\let#2\@empty \global\let#3\@empty % init + \gdef#4{#2#5}\global\let#5\@empty % init + \if #8l\relax + \lst@AddToHook{SetLanguage}{\def#1{#2#5}\let#2\@empty}% + \fi + \lst@InstallTest{#7}#1#2#4#5#6} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@InstallKeywords} +% Now we take advance of the optional argument construction above. Thus, we +% just insert |[\@ne]| as \meta{number} in the definitions of the keys. +% \begin{macrocode} +\gdef\lst@InstallKeywords#1#2#3#4#5{% + \lst@Key{#2}\relax + {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeKeywords}% + \lst@Key{more#2}\relax + {\lst@UseFamily{#2}[\@ne]##1\relax\lst@MakeMoreKeywords}% + \lst@Key{delete#2}\relax + {\lst@UseFamily{#2}[\@ne]##1\relax\lst@DeleteKeywords}% + \ifx\@empty#3\@empty\else + \lst@Key{#3}{#4}{\@namedef{lst@#3}{##1}}% + \fi + \expandafter\lst@InstallFamily@ + \csname\@lst @#2@data\expandafter\endcsname + \csname\@lst @#5\endcsname {#1}{#2}{#3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@ProvideStyle} +% If the style macro |#1| is not defined, it becomes equivalent to |#2|. +% \begin{macrocode} +\gdef\lst@ProvideStyle#1#2{% + \ifx#1\@undefined \let#1#2% + \else\ifx#1\relax \let#1#2\fi\fi} +% \end{macrocode} +% \end{macro} +% +% Finally we define |\lst@MakeKeywords|, \ldots, |\lst@DeleteKeywords|. +% We begin with two helper. +% +% \begin{macro}{\lst@BuildClassList} +% After |#1| follows a comma separated list of keyword classes terminated by +% |,\relax,|, e.g.~|keywords2,emph1,\relax,|. For each \meta{item} in this +% list we \emph{append} the two macros |\lst@|\meta{item}|\lst@g|\meta{item} +% to |#1|. +% \begin{macrocode} +\gdef\lst@BuildClassList#1#2,{% + \ifx\relax#2\@empty\else + \ifx\@empty#2\@empty\else + \lst@lExtend#1{\csname\@lst @#2\expandafter\endcsname + \csname\@lst @g#2\endcsname}% + \fi + \expandafter\lst@BuildClassList\expandafter#1 + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DeleteClassesIn} +% deletes pairs of tokens, namely the arguments |#2#3| to the submacro. +% \begin{macrocode} +\gdef\lst@DeleteClassesIn#1#2{% + \expandafter\lst@DCI@\expandafter#1#2\relax\relax} +\gdef\lst@DCI@#1#2#3{% + \ifx#2\relax + \expandafter\@gobbletwo + \else +% \end{macrocode} +% If we haven't reached the end of the class list, we define a temporary macro +% which removes all appearances. +% \begin{macrocode} + \def\lst@temp##1#2#3##2{% + \lst@lAddTo#1{##1}% + \ifx ##2\relax\else + \expandafter\lst@temp + \fi ##2}% + \let\@tempa#1\let#1\@empty + \expandafter\lst@temp\@tempa#2#3\relax + \fi + \lst@DCI@#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@MakeKeywords} +% We empty some macros and make use of |\lst@MakeMoreKeywords|. +% Note that this and the next two definitions have the following arguments: +% \begin{macroargs} +% \item class list (in brackets) +% \item keyword list +% \item |\lst@|\meta{name}|@list| +% \item |\lst@|\meta{name} +% \item |\lst@|\meta{name}|@also| +% \item |\lst@g|\meta{name} +% \end{macroargs} +% \begin{macrocode} +\gdef\lst@MakeKeywords[#1]#2#3#4#5#6{% + \def#3{#4#6}\let#4\@empty \let#5\@empty + \lst@MakeMoreKeywords[#1]{#2}#3#4#5#6} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@MakeMoreKeywords} +% We append classes and keywords. +% \begin{macrocode} +\gdef\lst@MakeMoreKeywords[#1]#2#3#4#5#6{% + \lst@BuildClassList#3#1,\relax,% + \lst@DefOther\lst@temp{,#2}\lst@lExtend#4\lst@temp} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@DeleteKeywords} +% We convert the keyword arguments via |\lst@MakeKeywords| and remove the +% classes and keywords. +% \begin{macrocode} +\gdef\lst@DeleteKeywords[#1]#2#3#4#5#6{% + \lst@MakeKeywords[#1]{#2}\@tempa\@tempb#5#6% + \lst@DeleteClassesIn#3\@tempa + \lst@DeleteKeysIn#4\@tempb} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Main families and classes} +% +% +% \paragraph{Keywords} +% +% \begin{lstkey}{keywords} +% Defining the keyword family gets very, very easy. +% \begin{macrocode} +\lst@InstallFamily k{keywords}{keywordstyle}\bfseries{keywordstyle}{}ld +% \end{macrocode} +% The following macro sets a keywordstyle, which \ldots +% \begin{macrocode} +\gdef\lst@DefKeywordstyle#1#2\@nil@{% + \@namedef{lst@keywordstyle\ifnum\@tempcnta=\@ne\else\the\@tempcnta + \fi}{#1#2}}% +% \end{macrocode} +% \ldots\space is put together here. If we detect a star after the class +% number, we insert code to make the keyword uppercase. +% \begin{macrocode} +\lst@Key{keywordstyle}{\bfseries}{\lstKV@OptArg[\@ne]{#1}% + {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax + \@ifstar{\lst@DefKeywordstyle{\uppercase\expandafter{% + \expandafter\lst@token + \expandafter{\the\lst@token}}}}% + {\lst@DefKeywordstyle{}}##2\@nil@}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{ndkeywords} +% Second order keywords use the same trick as |\lst@InstallKeywords|. +% \begin{macrocode} +\lst@Key{ndkeywords}\relax + {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeKeywords}% +\lst@Key{morendkeywords}\relax + {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@MakeMoreKeywords}% +\lst@Key{deletendkeywords}\relax + {\lst@UseFamily{keywords}[\tw@]#1\relax\lst@DeleteKeywords}% +\lst@Key{ndkeywordstyle}\relax{\@namedef{lst@keywordstyle2}{#1}}% +% \end{macrocode} +% \lsthelper{Dr.~Peter~Leibner}{1999/11/05}{undefined \lst@UseKeywords, +% Illegal parameter number (##1)} reported two bugs: |\lst@UseKeywords| and +% |##1| became |\lst@UseFamily| and |#1|. +% \end{lstkey} +% +% \begin{lstkey}{keywordsprefix} +% is implemented experimentally. The one and only prefix indicates its +% presence by making |\lst@prefixkeyword| empty. We can catch this information +% in the \keyname{Output} hook. +% \begin{macrocode} +\lst@Key{keywordsprefix}\relax{\lst@DefActive\lst@keywordsprefix{#1}} +\global\let\lst@keywordsprefix\@empty +\lst@AddToHook{SelectCharTable} + {\ifx\lst@keywordsprefix\@empty\else + \expandafter\lst@CArg\lst@keywordsprefix\relax + \lst@CDef{}% + {\lst@ifletter\else + \global\let\lst@prefixkeyword\@empty + \fi}% + {}% + \fi} +\lst@AddToHook{Init}{\global\let\lst@prefixkeyword\relax} +\lst@AddToHook{Output} + {\ifx\lst@prefixkeyword\@empty + \let\lst@thestyle\lst@gkeywords@sty + \global\let\lst@prefixkeyword\relax + \fi}% +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{otherkeywords} +% Thanks to \lsthelper{Bradford~Chamberlain}{2001/07/07}{otherkeywords={@,@^} +% does not work} we now iterate down the list of `other keywords' and make each +% active---instead of making the whole argument active. We append the active +% token sequence to |\lst@otherkeywords| to define each `other' keyword. +% \begin{macrocode} +\lst@Key{otherkeywords}{}{% + \let\lst@otherkeywords\@empty + \lst@for{#1}\do{% + \lst@MakeActive{##1}% + \lst@lExtend\lst@otherkeywords{% + \expandafter\lst@CArg\lst@temp\relax\lst@CDef + {}\lst@PrintOtherKeyword\@empty}}} +\lst@AddToHook{SelectCharTable}{\lst@otherkeywords} +% \end{macrocode} +% |\lst@PrintOtherkeyword| has been changed to |\lst@PrintOtherKeyword| after a +% bug report by \lsthelper{Peter~Bartke}{2001/11/06}{undefined control sequence +% \lst@PrintOtherkeyword}. +% \end{lstkey} +% +% \begin{macro}{\lst@PrintOtherKeyword} +% print preceding characters, prepare the output and typeset the argument in +% keyword style. \lsthelper{James~Willans}{2004/07/23}{problem: otherkeywords} +% reported problems when the output routine is invoked within |\begingroup| and +% |\endgroup|. Now the definition is restructured. +% \begin{macrocode} +\gdef\lst@PrintOtherKeyword#1\@empty{% + \lst@XPrintToken + \begingroup + \lst@modetrue \lsthk@TextStyle + \let\lst@ProcessDigit\lst@ProcessLetter + \let\lst@ProcessOther\lst@ProcessLetter + \lst@lettertrue + #1% + \lst@SaveToken + \endgroup + \lst@RestoreToken + \global\let\lst@savedcurrstyle\lst@currstyle + \let\lst@currstyle\lst@gkeywords@sty + \lst@Output + \let\lst@currstyle\lst@savedcurrstyle} +% \end{macrocode} +% \begin{TODO} +% Which part of \hookname{TextStyle} hook is required? Is it required anymore, +% i.e.after the restruction? Need to move it elsewhere? +% \end{TODO} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \paragraph{The emphasize family} +% +% \begin{aspect}{emph} +% is just one macro call here. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{emph} +\lst@InstallFamily e{emph}{emphstyle}{}{emphstyle}{}od +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \paragraph{\TeX\ control sequences} +% +% \begin{aspect}{tex} +% Here we check the last `other' processed token. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{tex} +% \end{macrocode} +% \begin{macrocode} +\lst@InstallFamily {cs}{texcs}{texcsstyle}\relax{keywordstyle} + {\ifx\lst@lastother\lstum@backslash + \expandafter\let\expandafter\lst@thestyle + \csname lst@texcsstyle#1\endcsname + \fi} + ld +% \end{macrocode} +% The style-key checks for the optional star (which must be in front of +% the optional class argument). +% \begin{macrocode} +\lst@Key{texcsstyle}\relax + {\@ifstar{\lst@true\lst@DefTexcsstyle}% + {\lst@false\lst@DefTexcsstyle}#1\@nil@} +\gdef\lst@DefTexcsstyle#1\@nil@{% + \let\lst@iftexcsincludebs\lst@if + \lstKV@OptArg[\@ne]{#1}% + {\@tempcnta\lst@classoffset \advance\@tempcnta##1\relax + \@namedef{lst@texcsstyle\ifnum\@tempcnta=\@ne\else + \the\@tempcnta \fi}{##2}}}% +\global\let\lst@iftexcsincludebs\iffalse +% \end{macrocode} +% To make the backslash belong to the control sequence, it is merged with +% the following token. This option was suggested by \lsthelper{Morten~H\o gholm} +% {2004/07/16}{defining new (colored) texcs}. +% \lsthelper{Christian~Schneider}{-}{2006/09/08} pointed out that the original +% implementation was broken when the identifier was preceded by an ``other'' +% character. To fix this (and other bugs), we first output whatever is in the +% current token before merging. +% \begin{macrocode} +\let\lst@iftexcsincludebs\iffalse +\lst@AddToHook{SelectCharTable} +{\lst@iftexcsincludebs \ifx\@empty\lst@texcs\else + \lst@DefSaveDef{`\\}\lsts@texcsbs + {\lst@ifletter + \lst@Output + \else + \lst@OutputOther + \fi + \lst@Merge\lsts@texcsbs}% + \fi \fi} +% \end{macrocode} +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \paragraph{Compiler directives} +% +% \begin{aspect}{directives} +% \begin{lstkey}{directives} +% First some usual stuff. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{directives} +% \end{macrocode} +% The initialization of |\lst@directives| has been added after a bug report +% from \lsthelper{Kris~Luyten}{2002/07/30}{Undefined control sequence +% \lst@thestyle caused by undefined \lst@directives after loading C}. +% \begin{macrocode} +\lst@NewMode\lst@CDmode +\lst@AddToHook{EOL}{\ifnum\lst@mode=\lst@CDmode \lst@LeaveMode \fi} +\lst@InstallKeywords{d}{directives}{directivestyle}\relax{keywordstyle} + {\ifnum\lst@mode=\lst@CDmode + \let\lst@thestyle\lst@directivestyle + \fi} + ld +\global\let\lst@directives\@empty % init +% \end{macrocode} +% Now we define a new delimiter for directives: We enter `directive mode' +% only in the first column. +% \begin{macrocode} +\lst@AddTo\lst@delimtypes{,directive} +\gdef\lst@Delim@directive#1\@empty#2#3#4{% + \lst@CArg #1\relax\lst@DefDelimB + {\lst@CalcColumn}% + {}% + {\ifnum\@tempcnta=\z@ + \def\lst@bnext{#2\lst@CDmode{#4\lst@Lmodetrue}% + \let\lst@currstyle\lst@directivestyle}% + \fi + \@gobblethree}% + #2\lst@CDmode{#4\lst@Lmodetrue}} +% \end{macrocode} +% We introduce a new string type (thanks to \lsthelper{R.~Isernhagen} +% {1999/11/12}{float isn't keyword in #include }), which \ldots +% \begin{macrocode} +\lst@AddTo\lst@stringtypes{,directive} +\gdef\lst@StringDM@directive#1#2#3\@empty{% + \lst@CArg #2\relax\lst@CDef + {}% +% \end{macrocode} +% \ldots\space is active only in |\lst@CDmode|: +% \begin{macrocode} + {\let\lst@bnext\lst@CArgEmpty + \ifnum\lst@mode=\lst@CDmode + \def\lst@bnext{\lst@BeginString{#1}}% + \fi + \lst@bnext}% + \@empty + \lst@CArg #3\relax\lst@CDef + {}% + {\let\lst@enext\lst@CArgEmpty + \ifnum #1=\lst@mode + \let\lst@bnext\lst@EndString + \fi + \lst@bnext}% + \@empty} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Keyword comments} +% +% \begin{aspect}{keywordcomments} +% includes both comment types and is possibly split into this and |dkcs|. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords,comments]{keywordcomments} +% \end{macrocode} +% +% \begin{macro}{\lst@BeginKC} +% \begin{macro}{\lst@BeginKCS} +% Starting a keyword comment is easy, but: (1) The submacros are called +% outside of two group levels, and \ldots +% \begin{macrocode} +\lst@NewMode\lst@KCmode \lst@NewMode\lst@KCSmode +\gdef\lst@BeginKC{\aftergroup\aftergroup\aftergroup\lst@BeginKC@}% +\gdef\lst@BeginKC@{% + \lst@ResetToken + \lst@BeginComment\lst@KCmode{{\lst@commentstyle}\lst@modetrue}% + \@empty}% +\gdef\lst@BeginKCS{\aftergroup\aftergroup\aftergroup\lst@BeginKCS@}% +\gdef\lst@BeginKCS@{% + \lst@ResetToken + \lst@BeginComment\lst@KCSmode{{\lst@commentstyle}\lst@modetrue}% + \@empty}% +% \end{macrocode} +% (2) we must ensure that the comment starts after printing the comment +% delimiter since it could be a keyword. We assign |\lst@BeginKC|[|S|] to +% |\lst@KCpost|, which is executed and reset in \hookname{PostOutput}. +% \begin{macrocode} +\lst@AddToHook{PostOutput}{\lst@KCpost \global\let\lst@KCpost\@empty} +\global\let\lst@KCpost\@empty % init +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@EndKC} +% leaves the comment mode before the (temporaryly saved) comment delimiter is +% printed. +% \begin{macrocode} +\gdef\lst@EndKC{\lst@SaveToken \lst@LeaveMode \lst@RestoreToken + \let\lst@thestyle\lst@identifierstyle \lsthk@Output} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{keywordcomment} +% The delimiters must be identical here, thus we use |\lst@KCmatch|. Note the +% last argument |o| to |\lst@InstallKeywords|: The working test is installed +% in the \hookname{Output} hook and not in \hookname{DetectKeywords}. +% Otherwise we couldn't detect the ending delimiter since keyword detection is +% done if and only if mode changes are allowed. +% \begin{macrocode} +\lst@InstallKeywords{kc}{keywordcomment}{}\relax{} + {\ifnum\lst@mode=\lst@KCmode + \edef\lst@temp{\the\lst@token}% + \ifx\lst@temp\lst@KCmatch + \lst@EndKC + \fi + \else + \lst@ifmode\else + \xdef\lst@KCmatch{\the\lst@token}% + \global\let\lst@KCpost\lst@BeginKC + \fi + \fi} + lo +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{keywordcommentsemicolon} +% The key simply stores the keywords. After a bug report by \lsthelper +% {Norbert~Eisinger}{2002/11/26}{keywordcommentsemicolon active after +% language change} the initialization in \hookname{SetLanguage} has been +% added. +% \begin{macrocode} +\lst@Key{keywordcommentsemicolon}{}{\lstKV@ThreeArg{#1}% + {\def\lst@KCAkeywordsB{##1}% + \def\lst@KCAkeywordsE{##2}% + \def\lst@KCBkeywordsB{##3}% + \def\lst@KCkeywords{##1##2##3}}} +\lst@AddToHook{SetLanguage}{% + \let\lst@KCAkeywordsB\@empty \let\lst@KCAkeywordsE\@empty + \let\lst@KCBkeywordsB\@empty \let\lst@KCkeywords\@empty} +% \end{macrocode} +% We define an appropriate semicolon if this keyword comment type is defined. +% Appropriate means that we leave any keyword comment mode if active. +% \lsthelper{Oldrich~Jedlicka}{2001/12/12}{keywordcomment(semicolon) fails} +% reported a bug and provided the fix, the two |\@empty|s. +% \begin{macrocode} +\lst@AddToHook{SelectCharTable} + {\ifx\lst@KCkeywords\@empty\else + \lst@DefSaveDef{`\;}\lsts@EKC + {\lst@XPrintToken + \ifnum\lst@mode=\lst@KCmode \lst@EndComment\@empty \else + \ifnum\lst@mode=\lst@KCSmode \lst@EndComment\@empty + \fi \fi + \lsts@EKC}% + \fi} +% \end{macrocode} +% The `working identifier' macros enter respectively leave comment mode. +% \begin{macrocode} +\gdef\lst@KCAWorkB{% + \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKC \fi} +\gdef\lst@KCBWorkB{% + \lst@ifmode\else \global\let\lst@KCpost\lst@BeginKCS \fi} +\gdef\lst@KCAWorkE{\ifnum\lst@mode=\lst@KCmode \lst@EndKC \fi} +% \end{macrocode} +% Now we install the tests and initialize the given macros. +% \begin{macrocode} +\lst@ProvideFamily@@ + \lst@KCAkeywordsB@list\lst@KCAkeywordsB \lst@KC@also + \lst@gKCAkeywordsB@list\lst@gKCAkeywordsB \lst@KCAWorkB + {kcb}owo % prefix, other key, working procedure, Output hook +\lst@ProvideFamily@@ + \lst@KCAkeywordsE@list\lst@KCAkeywordsE \lst@KC@also + \lst@gKCAkeywordsE@list\lst@gKCAkeywordsE \lst@KCAWorkE + {kce}owo +\lst@ProvideFamily@@ + \lst@KCBkeywordsB@list\lst@KCBkeywordsB \lst@KC@also + \lst@gKCBkeywordsB@list\lst@gKCBkeywordsB \lst@KCBWorkB + {kcs}owo +% \end{macrocode} +% \end{lstkey} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Export of identifiers} +% +% \begin{aspect}{index} +% \begin{macro}{\lstindexmacro} +% One more `keyword' class. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{index} +\lst@InstallFamily w{index}{indexstyle}\lstindexmacro{indexstyle} + {\csname\@lst @indexstyle#1\expandafter\endcsname + \expandafter{\the\lst@token}} + od +\lst@UserCommand\lstindexmacro#1{\index{{\ttfamily#1}}} +\lst@EndAspect +% +% \end{macrocode} +% \end{macro} +% \end{aspect} +% +% \begin{aspect}{procnames} +% \begin{lstkey}{procnamestyle} +% \begin{lstkey}{procnamekeys} +% \begin{lstkey}{indexprocnames} +% The `idea' here is the usage of a global |\lst@ifprocname|, indicating a +% preceding `procedure keyword'. All the other is known stuff. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{procnames} +\gdef\lst@procnametrue{\global\let\lst@ifprocname\iftrue} +\gdef\lst@procnamefalse{\global\let\lst@ifprocname\iffalse} +\lst@AddToHook{Init}{\lst@procnamefalse} +\lst@AddToHook{DetectKeywords} + {\lst@ifprocname + \let\lst@thestyle\lst@procnamestyle + \lst@ifindexproc \csname\@lst @gindex@sty\endcsname \fi + \lst@procnamefalse + \fi} +% \end{macrocode} +% \begin{macrocode} +\lst@Key{procnamestyle}{}{\def\lst@procnamestyle{#1}} +\lst@Key{indexprocnames}{false}[t]{\lstKV@SetIf{#1}\lst@ifindexproc} +\lst@AddToHook{Init}{\lst@ifindexproc \lst@indexproc \fi} +\gdef\lst@indexproc{% + \@ifundefined{lst@indexstyle1}% + {\@namedef{lst@indexstyle1}##1{}}% + {}} +% \end{macrocode} +% The default definition of |\lst@indexstyle| above has been moved outside the +% hook after a bug report from \lsthelper{Ulrich~G.~Wortmann}{2002/01/22} +% {procnames doesn't work}. +% \begin{macrocode} +\lst@InstallKeywords w{procnamekeys}{}\relax{} + {\global\let\lst@PNpost\lst@procnametrue} + od +\lst@AddToHook{PostOutput}{\lst@PNpost\global\let\lst@PNpost\@empty} +\global\let\lst@PNpost\@empty % init +\lst@EndAspect +% +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% \end{aspect} +% +% +% \section{More aspects and keys} +% +% \begin{lstkey}{basicstyle} +% \begin{lstkey}{inputencoding} +% There is no better place to define these keys, I think. +% \begin{macrocode} +%<*kernel> +\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}} +\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}} +\lst@AddToHook{Init} + {\lst@basicstyle + \ifx\lst@inputenc\@empty\else + \@ifundefined{inputencoding}{}% + {\inputencoding\lst@inputenc}% + \fi} +\lst@AddToHookExe{EmptyStyle} + {\let\lst@basicstyle\@empty + \let\lst@inputenc\@empty} +\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}} +% +% \end{macrocode} +% Michael Niedermair asked for a key like \keyname{inputencoding}. +% \end{lstkey} +% \end{lstkey} +% +% +% \subsection{Styles and languages} +% +% \begin{aspect}{style} +% We begin with style definition and selection. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{style} +% \end{macrocode} +% +% \begin{macro}{\lststylefiles} +% This macro is defined if and only if it's undefined yet. +% \begin{macrocode} +\@ifundefined{lststylefiles} + {\lst@UserCommand\lststylefiles{lststy0.sty}}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstdefinestyle} +% \begin{macro}{\lst@definestyle} +% \begin{macro}{\lst@DefStyle} +% are defined in terms of |\lst@DefStyle|, which is defined via +% |\lst@DefDriver|. +% \begin{macrocode} +\lst@UserCommand\lstdefinestyle{\lst@DefStyle\iftrue} +\lst@UserCommand\lst@definestyle{\lst@DefStyle\iffalse} +\gdef\lst@DefStyle{\lst@DefDriver{style}{sty}\lstset} +% \end{macrocode} +% The `empty' style calls the initial empty hook \hookname{EmptyStyle}. +% \begin{macrocode} +\global\@namedef{lststy@$}{\lsthk@EmptyStyle} +\lst@AddToHook{EmptyStyle}{}% init +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{lstkey}{style} +% is an application of |\lst@LAS|. We just specify the hook and an empty +% argument as `pre' and `post' code. +% \begin{macrocode} +\lst@Key{style}\relax{% + \lst@LAS{style}{sty}{[]{#1}}\lst@NoAlias\lststylefiles + \lsthk@SetStyle + {}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{SetStyle}{}% init +% \end{macrocode} +% \end{lstkey} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% \begin{aspect}{language} +% Now we deal with commands used in defining and selecting programming +% languages, in particular with aliases. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{language} +% \end{macrocode} +% +% \begin{macro}{\lstlanguagefiles} +% This macro is defined if and only if it's undefined yet. +% \begin{macrocode} +\@ifundefined{lstdriverfiles} + {\lst@UserCommand\lstlanguagefiles{lstlang0.sty}}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstdefinelanguage} +% \begin{macro}{\lst@definelanguage} +% \begin{macro}{\lst@DefLang} +% are defined in terms of |\lst@DefLang|, which is defined via +% |\lst@DefDriver|. +% \begin{macrocode} +\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue} +\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse} +\gdef\lst@DefLang{\lst@DefDriver{language}{lang}\lstset} +% \end{macrocode} +% Now we can provide the `empty' language. +% \begin{macrocode} +\lstdefinelanguage{}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{lstkey}{language} +% \begin{lstkey}{alsolanguage} +% is mainly an application of |\lst@LAS|. +% \begin{macrocode} +\lst@Key{language}\relax{\lstKV@OptArg[]{#1}% + {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles + \lsthk@SetLanguage + {\lst@FindAlias[##1]{##2}% + \let\lst@language\lst@malias + \let\lst@dialect\lst@oalias}}} +% \end{macrocode} +% Ditto, we simply don't execute |\lsthk@SetLanguage|. +% \begin{macrocode} +\lst@Key{alsolanguage}\relax{\lstKV@OptArg[]{#1}% + {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles + {}% + {\lst@FindAlias[##1]{##2}% + \let\lst@language\lst@malias + \let\lst@dialect\lst@oalias}}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{SetLanguage}{}% init +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lstalias} +% Now we concentrate on aliases and default dialects. +% |\lsta@|\meta{language}|$|\meta{dialect} and |\lsta@|\meta{language} contain +% the aliases of a particular dialect respectively a complete language. +% We'll use a |$|-character to separate a language name from its dialect. +% Thanks to \lsthelper{Walter~E.~Brown}{2004/02/25}{\lstalias +% (+\lstdefinelanguage) fails} for reporting a problem with the argument +% delimiter `[' in a previous definition of |\lstalias@|. +% \begin{macrocode} +\lst@UserCommand\lstalias{\@ifnextchar[\lstalias@\lstalias@@} +\gdef\lstalias@[#1]#2{\lstalias@b #2$#1} +\gdef\lstalias@b#1[#2]#3{\lst@NormedNameDef{lsta@#1}{#3$#2}} +\gdef\lstalias@@#1#2{\lst@NormedNameDef{lsta@#1}{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{defaultdialect} +% We simply store the dialect. +% \begin{macrocode} +\lst@Key{defaultdialect}\relax + {\lstKV@OptArg[]{#1}{\lst@NormedNameDef{lstdd@##2}{##1}}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@FindAlias} +% Now we have to find a language. First we test for a complete language alias, +% then we set the default dialect if necessary. +% \begin{macrocode} +\gdef\lst@FindAlias[#1]#2{% + \lst@NormedDef\lst@oalias{#1}% + \lst@NormedDef\lst@malias{#2}% + \@ifundefined{lsta@\lst@malias}{}% + {\edef\lst@malias{\csname\@lst a@\lst@malias\endcsname}}% +% \end{macrocode} +% \begin{macrocode} + \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}% + {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}% + \fi +% \end{macrocode} +% Now we are ready for an alias of a single dialect. +% \begin{macrocode} + \edef\lst@temp{\lst@malias $\lst@oalias}% + \@ifundefined{lsta@\lst@temp}{}% + {\edef\lst@temp{\csname\@lst a@\lst@temp\endcsname}}% +% \end{macrocode} +% Finally we again set the default dialect---for the case of a dialect alias. +% \begin{macrocode} + \expandafter\lst@FindAlias@\lst@temp $} +\gdef\lst@FindAlias@#1$#2${% + \def\lst@malias{#1}\def\lst@oalias{#2}% + \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}% + {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@RequireLanguages} +% This definition will be equivalent to |\lstloadlanguages|. We requested the +% given list of languages and load additionally required aspects. +% \begin{macrocode} +\gdef\lst@RequireLanguages#1{% + \lst@Require{language}{lang}{#1}\lst@FindAlias\lstlanguagefiles + \ifx\lst@loadaspects\@empty\else + \lst@RequireAspects\lst@loadaspects + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstloadlanguages} +% is the same as |\lst@RequireLanguages|. +% \begin{macrocode} +\global\let\lstloadlanguages\lst@RequireLanguages +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Format definitions*} +% +% \begin{aspect}{formats} +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{formats} +% \end{macrocode} +% +% \begin{macro}{\lstformatfiles} +% This macro is defined if and only if it's undefined yet. +% \begin{macrocode} +\@ifundefined{lstformatfiles} + {\lst@UserCommand\lstformatfiles{lstfmt0.sty}}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lstdefineformat} +% \begin{macro}{\lst@defineformat} +% \begin{macro}{\lst@DefFormat} +% are defined in terms of |\lst@DefFormat|, which is defined via +% |\lst@DefDriver|. +% \begin{macrocode} +\lst@UserCommand\lstdefineformat{\lst@DefFormat\iftrue} +\lst@UserCommand\lst@defineformat{\lst@DefFormat\iffalse} +\gdef\lst@DefFormat{\lst@DefDriver{format}{fmt}\lst@UseFormat} +% \end{macrocode} +% We provide the `empty' format. +% \begin{macrocode} +\lstdefineformat{}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{lstkey}{format} +% is an application of |\lst@LAS|. We just specify the hook as `pre' and an +% empty argument as `post' code. +% \begin{macrocode} +\lst@Key{format}\relax{% + \lst@LAS{format}{fmt}{[]{#1}}\lst@NoAlias\lstformatfiles + \lsthk@SetFormat + {}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{SetFormat}{\let\lst@fmtformat\@empty}% init +% \end{macrocode} +% \end{lstkey} +% +% +% \paragraph{Helpers} +% Our goal is to define the yet unkown |\lst@UseFormat|. This definition +% will parse the user supplied format. We start with some general macros. +% +% \begin{macro}{\lst@fmtSplit} +% splits the content of the macro |#1| at |#2| in the preceding characters +% |\lst@fmta| and the following ones |\lst@fmtb|. |\lst@if| is false if and +% only if |#1| doesn't contain |#2|. +% \begin{macrocode} +\gdef\lst@fmtSplit#1#2{% + \def\lst@temp##1#2##2\relax##3{% + \ifnum##3=\z@ + \ifx\@empty##2\@empty + \lst@false + \let\lst@fmta#1% + \let\lst@fmtb\@empty + \else + \expandafter\lst@temp#1\relax\@ne + \fi + \else + \def\lst@fmta{##1}\def\lst@fmtb{##2}% + \fi}% + \lst@true + \expandafter\lst@temp#1#2\relax\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@IfNextCharWhitespace} +% is defined in terms of |\lst@IfSubstring|. +% \begin{macrocode} +\gdef\lst@IfNextCharWhitespace#1#2#3{% + \lst@IfSubstring#3\lst@whitespaces{#1}{#2}#3} +% \end{macrocode} +% And here come all white space characters. +% \begin{macrocode} +\begingroup +\catcode`\^^I=12\catcode`\^^J=12\catcode`\^^M=12\catcode`\^^L=12\relax% +\lst@DefActive\lst@whitespaces{\ ^^I^^J^^M}% add ^^L +\global\let\lst@whitespaces\lst@whitespaces% +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtIfIdentifier} +% tests the first character of |#1| +% \begin{macrocode} +\gdef\lst@fmtIfIdentifier#1{% + \ifx\relax#1\@empty + \expandafter\@secondoftwo + \else + \expandafter\lst@fmtIfIdentifier@\expandafter#1% + \fi} +% \end{macrocode} +% against the `letters' |_|, |@|, |A|,\ldots,|Z| and |a|,\ldots,|z|. +% \begin{macrocode} +\gdef\lst@fmtIfIdentifier@#1#2\relax{% + \let\lst@next\@secondoftwo + \ifnum`#1=`_\else + \ifnum`#1<64\else + \ifnum`#1<91\let\lst@next\@firstoftwo\else + \ifnum`#1<97\else + \ifnum`#1<123\let\lst@next\@firstoftwo\else + \fi \fi \fi \fi \fi + \lst@next} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtIfNextCharIn} +% is required for the optional \meta{exceptional characters}. +% The implementation is easy---refer section \ref{iSubstringTests}. +% \begin{macrocode} +\gdef\lst@fmtIfNextCharIn#1{% + \ifx\@empty#1\@empty \expandafter\@secondoftwo \else + \def\lst@next{\lst@fmtIfNextCharIn@{#1}}% + \expandafter\lst@next\fi} +\gdef\lst@fmtIfNextCharIn@#1#2#3#4{% + \def\lst@temp##1#4##2##3\relax{% + \ifx \@empty##2\expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi}% + \lst@temp#1#4\@empty\relax{#2}{#3}#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtCDef} +% We need derivations of |\lst@CDef| and |\lst@CDefX|: we have to test the +% next character against the sequence |#5| of exceptional characters. +% These tests are inserted here. +% \begin{macrocode} +\gdef\lst@fmtCDef#1{\lst@fmtCDef@#1} +\gdef\lst@fmtCDef@#1#2#3#4#5#6#7{% + \lst@CDefIt#1{#2}{#3}% + {\lst@fmtIfNextCharIn{#5}{#4#2#3}{#6#4#2#3#7}}% + #4% + {}{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtCDefX} +% The same but `drop input'. +% \begin{macrocode} +\gdef\lst@fmtCDefX#1{\lst@fmtCDefX@#1} +\gdef\lst@fmtCDefX@#1#2#3#4#5#6#7{% + \let#4#1% + \ifx\@empty#2\@empty + \def#1{\lst@fmtIfNextCharIn{#5}{#4}{#6#7}}% + \else \ifx\@empty#3\@empty + \def#1##1{% + \ifx##1#2% + \def\lst@next{\lst@fmtIfNextCharIn{#5}{#4##1}% + {#6#7}}% + \else + \def\lst@next{#4##1}% + \fi + \lst@next}% + \else + \def#1{% + \lst@IfNextCharsArg{#2#3}% + {\lst@fmtIfNextCharIn{#5}{\expandafter#4\lst@eaten}% + {#6#7}}% + {\expandafter#4\lst@eaten}}% + \fi \fi} +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{The parser} +% applies |\lst@fmtSplit| to cut a format definition into items, items into +% `input' and `output', and `output' into `pre' and 'post'. This should be +% clear if you are in touch with format definitions. +% +% \begin{macro}{\lst@UseFormat} +% Now we can start with the parser. +% \begin{macrocode} +\gdef\lst@UseFormat#1{% + \def\lst@fmtwhole{#1}% + \lst@UseFormat@} +\gdef\lst@UseFormat@{% + \lst@fmtSplit\lst@fmtwhole,% +% \end{macrocode} +% We assign the rest of the format definition, \ldots +% \begin{macrocode} + \let\lst@fmtwhole\lst@fmtb + \ifx\lst@fmta\@empty\else +% \end{macrocode} +% \ldots\space split the item at the equal sign, and work on the item. +% \begin{macrocode} + \lst@fmtSplit\lst@fmta=% + \ifx\@empty\lst@fmta\else +% \end{macrocode} +% \begin{TODO} +% Insert |\let\lst@arg\@empty| |\expandafter\lst@XConvert\lst@fmtb\@nil| +% |\let\lst@fmtb\lst@arg|. +% \end{TODO} +% \begin{macrocode} + \expandafter\lstKV@XOptArg\expandafter[\expandafter]% + \expandafter{\lst@fmtb}\lst@UseFormat@b + \fi + \fi +% \end{macrocode} +% Finally we process the next item if the rest is not empty. +% \begin{macrocode} + \ifx\lst@fmtwhole\@empty\else + \expandafter\lst@UseFormat@ + \fi} +% \end{macrocode} +% We make |\lst@fmtc| contain the preceding characters as a braced argument. +% To add more arguments, we first split the replacement tokens at the control +% sequence |\string|. +% \begin{macrocode} +\gdef\lst@UseFormat@b[#1]#2{% + \def\lst@fmtc{{#1}}\lst@lExtend\lst@fmtc{\expandafter{\lst@fmta}}% + \def\lst@fmtb{#2}% + \lst@fmtSplit\lst@fmtb\string +% \end{macrocode} +% We append an empty argument or |\lst@fmtPre| with `|\string|-preceding' +% tokens as argument. We do the same for the tokens after |\string|. +% \begin{macrocode} + \ifx\@empty\lst@fmta + \lst@lAddTo\lst@fmtc{{}}% + \else + \lst@lExtend\lst@fmtc{\expandafter + {\expandafter\lst@fmtPre\expandafter{\lst@fmta}}}% + \fi + \ifx\@empty\lst@fmtb + \lst@lAddTo\lst@fmtc{{}}% + \else + \lst@lExtend\lst@fmtc{\expandafter + {\expandafter\lst@fmtPost\expandafter{\lst@fmtb}}}% + \fi +% \end{macrocode} +% Eventually we extend |\lst@fmtformat| appropriately. Note that |\lst@if| +% still indicates whether the replacement tokens contain |\string|. +% \begin{macrocode} + \expandafter\lst@UseFormat@c\lst@fmtc} +% \end{macrocode} +% \begin{macrocode} +\gdef\lst@UseFormat@c#1#2#3#4{% + \lst@fmtIfIdentifier#2\relax + {\lst@fmtIdentifier{#2}% + \lst@if\else \PackageWarning{Listings}% + {Cannot drop identifier in format definition}% + \fi}% + {\lst@if + \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDef}% + \else + \lst@lAddTo\lst@fmtformat{\lst@CArgX#2\relax\lst@fmtCDefX}% + \fi + \lst@DefActive\lst@fmtc{#1}% + \lst@lExtend\lst@fmtformat{\expandafter{\lst@fmtc}{#3}{#4}}}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{SelectCharTable}{\lst@fmtformat} +\global\let\lst@fmtformat\@empty +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{The formatting} +% +% \begin{macro}{\lst@fmtPre} +% \begin{macrocode} +\gdef\lst@fmtPre#1{% + \lst@PrintToken + \begingroup + \let\newline\lst@fmtEnsureNewLine + \let\space\lst@fmtEnsureSpace + \let\indent\lst@fmtIndent + \let\noindent\lst@fmtNoindent + #1% + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtPost} +% \begin{macrocode} +\gdef\lst@fmtPost#1{% + \global\let\lst@fmtPostOutput\@empty + \begingroup + \def\newline{\lst@AddTo\lst@fmtPostOutput\lst@fmtEnsureNewLine}% + \def\space{\aftergroup\lst@fmtEnsurePostSpace}% + \def\indent{\lst@AddTo\lst@fmtPostOutput\lst@fmtIndent}% + \def\noindent{\lst@AddTo\lst@fmtPostOutput\lst@fmtNoindent}% + \aftergroup\lst@PrintToken + #1% + \endgroup} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{Init}{\global\let\lst@fmtPostOutput\@empty} +\lst@AddToHook{PostOutput} + {\lst@fmtPostOutput \global\let\lst@fmtPostOutput\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtEnsureSpace} +% \begin{macro}{\lst@fmtEnsurePostSpace} +% \begin{macrocode} +\gdef\lst@fmtEnsureSpace{% + \lst@ifwhitespace\else \expandafter\lst@ProcessSpace \fi} +\gdef\lst@fmtEnsurePostSpace{% + \lst@IfNextCharWhitespace{}{\lst@ProcessSpace}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{lstkey}{fmtindent} +% \begin{macro}{\lst@fmtIndent} +% \begin{macro}{\lst@fmtNoindent} +% \begin{macrocode} +\lst@Key{fmtindent}{20pt}{\def\lst@fmtindent{#1}} +\newdimen\lst@fmtcurrindent +\lst@AddToHook{InitVars}{\global\lst@fmtcurrindent\z@} +\gdef\lst@fmtIndent{\global\advance\lst@fmtcurrindent\lst@fmtindent} +\gdef\lst@fmtNoindent{\global\advance\lst@fmtcurrindent-\lst@fmtindent} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{lstkey} +% +% \begin{macro}{\lst@fmtEnsureNewLine} +% \begin{macrocode} +\gdef\lst@fmtEnsureNewLine{% + \global\advance\lst@newlines\@ne + \global\advance\lst@newlinesensured\@ne + \lst@fmtignoretrue} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToAtTop\lst@DoNewLines{% + \ifnum\lst@newlines>\lst@newlinesensured + \global\advance\lst@newlines-\lst@newlinesensured + \fi + \global\lst@newlinesensured\z@} +\newcount\lst@newlinesensured % global +\lst@AddToHook{Init}{\global\lst@newlinesensured\z@} +% \end{macrocode} +% \begin{macrocode} +\gdef\lst@fmtignoretrue{\let\lst@fmtifignore\iftrue} +\gdef\lst@fmtignorefalse{\let\lst@fmtifignore\iffalse} +\lst@AddToHook{InitVars}{\lst@fmtignorefalse} +\lst@AddToHook{Output}{\lst@fmtignorefalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@fmtUseLostSpace} +% \begin{macrocode} +\gdef\lst@fmtUseLostSpace{% + \lst@ifnewline \kern\lst@fmtcurrindent \global\lst@lostspace\z@ + \else + \lst@OldOLS + \fi} +\lst@AddToHook{Init} + {\lst@true + \ifx\lst@fmtformat\@empty \ifx\lst@fmt\@empty \lst@false \fi\fi + \lst@if + \let\lst@OldOLS\lst@OutputLostSpace + \let\lst@OutputLostSpace\lst@fmtUseLostSpace + \let\lst@ProcessSpace\lst@fmtProcessSpace + \fi} +% \end{macrocode} +% \begin{TODO} +% This `lost space' doesn't use |\lst@alloverstyle| yet! +% \end{TODO} +% \end{macro} +% +% \begin{macro}{\lst@fmtProcessSpace} +% \begin{macrocode} +\gdef\lst@fmtProcessSpace{% + \lst@ifletter + \lst@Output + \lst@fmtifignore\else + \lst@AppendOther\lst@outputspace + \fi + \else \lst@ifkeepspaces + \lst@AppendOther\lst@outputspace + \else \ifnum\lst@newlines=\z@ + \lst@AppendSpecialSpace + \else \ifnum\lst@length=\z@ + \global\advance\lst@lostspace\lst@width + \global\advance\lst@pos\m@ne + \else + \lst@AppendSpecialSpace + \fi + \fi \fi \fi + \lst@whitespacetrue} +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{Formatting identifiers} +% +% \begin{macro}{\lst@fmtIdentifier} +% We install a (keyword) test for the `format identifiers'. +% \begin{macrocode} +\lst@InstallTest{f} + \lst@fmt@list\lst@fmt \lst@gfmt@list\lst@gfmt + \lst@gfmt@wp + wd +\gdef\lst@fmt@list{\lst@fmt\lst@gfmt}\global\let\lst@fmt\@empty +\gdef\lst@gfmt@list{\lst@fmt\lst@gfmt}\global\let\lst@gfmt\@empty +% \end{macrocode} +% The working procedure expands |\lst@fmt$|\meta{string} (and defines +% |\lst@PrintToken| to do nothing). +% \begin{macrocode} +\gdef\lst@gfmt@wp{% + \begingroup \let\lst@UM\@empty + \let\lst@PrintToken\@empty + \csname\@lst @fmt$\the\lst@token\endcsname + \endgroup} +% \end{macrocode} +% This control sequence is probably defined as `working identifier'. +% \begin{macrocode} +\gdef\lst@fmtIdentifier#1#2#3#4{% + \lst@DefOther\lst@fmta{#2}\edef\lst@fmt{\lst@fmt,\lst@fmta}% + \@namedef{\@lst @fmt$\lst@fmta}{#3#4}} +% \end{macrocode} +% |\lst@fmt$|\meta{identifier} expands to a |\lst@fmtPre|/|\lst@fmtPost| +% sequence defined by |#2| and |#3|. +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% +% \subsection{Line numbers} +% +% \begin{aspect}{labels} +% \lsthelper{Rolf~Niepraschk}{1997/04/24}{line numbers} asked for line numbers. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{labels} +% \end{macrocode} +% +% \begin{lstkey}{numbers} +% Depending on the argument we define |\lst@PlaceNumber| to print the line +% number. +% \begin{macrocode} +\lst@Key{numbers}{none}{% + \let\lst@PlaceNumber\@empty + \lstKV@SwitchCases{#1}% + {none&\\% + left&\def\lst@PlaceNumber{\llap{\normalfont + \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\% + right&\def\lst@PlaceNumber{\rlap{\normalfont + \kern\linewidth \kern\lst@numbersep + \lst@numberstyle{\thelstnumber}}}% + }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{numberstyle} +% \begin{lstkey}{numbersep} +% \begin{lstkey}{stepnumber} +% \begin{lstkey}{numberblanklines} +% \begin{lstkey}{numberfirstline} +% Definition of the keys. +% \begin{macrocode} +\lst@Key{numberstyle}{}{\def\lst@numberstyle{#1}} +\lst@Key{numbersep}{10pt}{\def\lst@numbersep{#1}} +\lst@Key{stepnumber}{1}{\def\lst@stepnumber{#1\relax}} +\lst@AddToHook{EmptyStyle}{\let\lst@stepnumber\@ne} +% \end{macrocode} +% \begin{macrocode} +\lst@Key{numberblanklines}{true}[t] + {\lstKV@SetIf{#1}\lst@ifnumberblanklines} +\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{#1}\lst@ifnumberfirstline} +\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{lstkey}{firstnumber} +% We select the first number according to the argument. +% \begin{macrocode} +\lst@Key{firstnumber}{auto}{% + \lstKV@SwitchCases{#1}% + {auto&\let\lst@firstnumber\@undefined\\% + last&\let\lst@firstnumber\c@lstnumber + }{\def\lst@firstnumber{#1\relax}}} +\lst@AddToHook{PreSet}{\let\lst@advancenumber\z@} +% \end{macrocode} +% |\lst@firstnumber| now set to |\lst@lineno| instead of |\lst@firstline|, +% as per changes in |lstpatch.sty| from 1.3b pertaining to linerange markers. +% \begin{macrocode} +\lst@AddToHook{PreInit} + {\ifx\lst@firstnumber\@undefined + \def\lst@firstnumber{\lst@lineno}% + \fi} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@SetFirstNumber} +% \begin{macro}{\lst@SaveFirstNumber} +% \lsthelper{Boris~Veytsman}{1998/03/25}{continue line numbering: a.c b.c a.c} +% proposed to continue line numbers according to listing names. We define the +% label number of the first printing line here. A bug reported by +% \lsthelper{Jens~Schwarzer}{2001/05/29}{wrong line numbering of lstlisting +% with first>1} has been removed by replacing |\@ne| by |\lst@firstline|. +% \begin{macrocode} +\gdef\lst@SetFirstNumber{% + \ifx\lst@firstnumber\@undefined + \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax + \ifnum\@tempcnta=\z@ \@tempcnta\lst@firstline + \else \lst@nololtrue \fi + \advance\@tempcnta\lst@advancenumber + \edef\lst@firstnumber{\the\@tempcnta\relax}% + \fi} +% \end{macrocode} +% The current label is stored in|\lstno@|\meta{name}. If the name is empty, +% we use a space instead, which leaves |\lstno@| undefined. +% \begin{macrocode} +\gdef\lst@SaveFirstNumber{% + \expandafter\xdef + \csname\@lst no\ifx\lst@intname\@empty @ \else @\lst@intname\fi + \endcsname{\the\c@lstnumber}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c@lstnumber} +% This counter keeps the current label number. We use it as current label to +% make line numbers referenced by |\ref|. This was proposed by +% \lsthelper{Boris~Veytsman}{1998/03/25}{make line numbers referenced via +% \label and \ref}. We now use |\refstepcounter| to do the job---thanks to a +% bug report from \lsthelper{Christian~Gudrian}{2000/11/13}{\ref{lst:line} +% jumps to top of listing and not to the line}. +% \begin{macrocode} +\newcounter{lstnumber}% \global +\global\c@lstnumber\@ne % init +\renewcommand*\thelstnumber{\@arabic\c@lstnumber} +\lst@AddToHook{EveryPar} + {\global\advance\c@lstnumber\lst@advancelstnum + \global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}% + \lst@SkipOrPrintLabel}% +\global\let\lst@advancelstnum\@ne +% \end{macrocode} +% Note that the counter advances \emph{before} the label is printed and not +% afterwards. Otherwise we have wrong references---reported by +% \lsthelper{Gregory~Van~Vooren}{1999/06/04}{reference one unit too large}. +% \begin{macrocode} +\lst@AddToHook{Init}{\def\@currentlabel{\thelstnumber}} +% \end{macrocode} +% The label number is initialized and we ensure correct line numbers for +% continued listings. An apparently-extraneous advancement of the line +% number by \verb|-\lst@advancelstnum| when \texttt{firstnumber=last} is +% specified was removed, following a bug report by \lsthelper{Joachim~Breitner}% +% {2006/05/14}{failure to continue counting correctly}. +% \begin{macrocode} +\lst@AddToHook{InitVars} + {\global\c@lstnumber\lst@firstnumber + \global\advance\c@lstnumber\lst@advancenumber + \global\advance\c@lstnumber-\lst@advancelstnum} +\lst@AddToHook{ExitVars} + {\global\advance\c@lstnumber\lst@advancelstnum} +% \end{macrocode} +% \lsthelper{Walter~E.~Brown}{2001/05/22}{pdftex 3.14159-14f warning: +% destination with the same identifier} reported problems with pdftex and +% \packagename{hyperref}. A bad default of |\theHlstlabel| was the reason. +% \lsthelper{Heiko~Oberdiek}{2001/11/08}{pdftex warning: destination with +% the same identifier} found another bug which was due to the localization +% of |\lst@neglisting|. He also provided the following fix, replacing +% |\thelstlisting| with the |\ifx| \ldots\ |\fi| construction. +% \begin{macrocode} +\AtBeginDocument{% + \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting + \else \thelstlisting \fi + .\thelstnumber}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@skipnumbers} +% There are more things to do. We calculate how many lines must skip their +% label. The formula is +% $$|\lst@skipnumbers|= +% \textrm{\emph{first printing line}}\bmod|\lst@stepnumber|.$$ +% Note that we use a nonpositive representative for |\lst@skipnumbers|. +% \begin{macrocode} +\newcount\lst@skipnumbers % \global +\lst@AddToHook{Init} + {\ifnum \z@>\lst@stepnumber + \let\lst@advancelstnum\m@ne + \edef\lst@stepnumber{-\lst@stepnumber}% + \fi + \ifnum \z@<\lst@stepnumber + \global\lst@skipnumbers\lst@firstnumber + \global\divide\lst@skipnumbers\lst@stepnumber + \global\multiply\lst@skipnumbers-\lst@stepnumber + \global\advance\lst@skipnumbers\lst@firstnumber + \ifnum\lst@skipnumbers>\z@ + \global\advance\lst@skipnumbers -\lst@stepnumber + \fi +% \end{macrocode} +% If |\lst@stepnumber| is zero, no line numbers are printed: +% \begin{macrocode} + \else + \let\lst@SkipOrPrintLabel\relax + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@SkipOrPrintLabel} +% But default is this. We use the fact that |\lst@skipnumbers| is nonpositive. +% The counter advances every line and if that counter is zero, we print a line +% number and decrement the counter by |\lst@stepnumber|. +% \begin{macrocode} +\gdef\lst@SkipOrPrintLabel{% + \ifnum\lst@skipnumbers=\z@ + \global\advance\lst@skipnumbers-\lst@stepnumber\relax + \lst@PlaceNumber + \lst@numberfirstlinefalse + \else +% \end{macrocode} +% If the first line of a listing should get a number, it gets it here. +% \begin{macrocode} + \lst@ifnumberfirstline + \lst@PlaceNumber + \lst@numberfirstlinefalse + \fi + \fi + \global\advance\lst@skipnumbers\@ne}% +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{OnEmptyLine}{% + \lst@ifnumberblanklines\else \ifnum\lst@skipnumbers=\z@ + \global\advance\lst@skipnumbers-\lst@stepnumber\relax + \fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Line shape and line breaking} +% +% \begin{macro}{\lst@parshape} +% We define a default version of |\lst@parshape| for the case that the +% \aspectname{lineshape} aspect is not loaded. We use this parshape every line +% (in fact every paragraph). Furthermore we must repeat the parshape if we +% close a group level---or the shape is forgotten. +% \begin{macrocode} +%<*kernel> +\def\lst@parshape{\parshape\@ne \z@ \linewidth} +\lst@AddToHookAtTop{EveryLine}{\lst@parshape} +\lst@AddToHookAtTop{EndGroup}{\lst@parshape} +% +% \end{macrocode} +% \end{macro} +% +% \begin{aspect}{lineshape} +% Our first aspect in this section. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect{lineshape} +% \end{macrocode} +% +% \begin{lstkey}{xleftmargin} +% \begin{lstkey}{xrightmargin} +% \begin{lstkey}{resetmargins} +% \begin{lstkey}{linewidth} +% Usual stuff. +% \begin{macrocode} +\lst@Key{xleftmargin}{\z@}{\def\lst@xleftmargin{#1}} +\lst@Key{xrightmargin}{\z@}{\def\lst@xrightmargin{#1}} +\lst@Key{resetmargins}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins} +% \end{macrocode} +% The margins become zero if we make an exact box around the listing. +% \begin{macrocode} +\lst@AddToHook{BoxUnsafe}{\let\lst@xleftmargin\z@ + \let\lst@xrightmargin\z@} +\lst@AddToHook{TextStyle}{% + \let\lst@xleftmargin\z@ \let\lst@xrightmargin\z@ + \let\lst@ifresetmargins\iftrue} +% \end{macrocode} +% Added above hook after bug report from \lsthelper{Magnus~Lewis-Smith} +%{1999/08/06}{|\lstinline| indented} and \lsthelper{Jos\'e~Romildo~Malaquias} +%{2000/08/22}{|\lstinline| indented (resetmargins)} respectively. +% \begin{macrocode} +\lst@Key{linewidth}\linewidth{\def\lst@linewidth{#1}} +\lst@AddToHook{PreInit}{\linewidth\lst@linewidth\relax} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{macro}{\lst@parshape} +% The definition itself is easy. +% \begin{macrocode} +\gdef\lst@parshape{% + \parshape\@ne \@totalleftmargin \linewidth} +% \end{macrocode} +% We calculate the line width and (inner/outer) indent for a listing. +% \begin{macrocode} +\lst@AddToHook{Init} + {\lst@ifresetmargins + \advance\linewidth\@totalleftmargin + \advance\linewidth\rightmargin + \@totalleftmargin\z@ + \fi + \advance\linewidth-\lst@xleftmargin + \advance\linewidth-\lst@xrightmargin + \advance\@totalleftmargin\lst@xleftmargin\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{lstkey}{lineskip} +% The introduction of this key is due to communication with +% \lsthelper{Andreas~Bartelt}{1997/09/11}{problem with redefed \parskip; +% \lstlineskip introduced}. Version 1.0 implements this feature by +% redefining |\baselinestretch|. +% \begin{macrocode} +\lst@Key{lineskip}{\z@}{\def\lst@lineskip{#1\relax}} +\lst@AddToHook{Init} + {\parskip\z@ + \ifdim\z@=\lst@lineskip\else + \@tempdima\baselineskip + \advance\@tempdima\lst@lineskip +% \end{macrocode} +% The following three lines simulate the `bad' |\divide| |\@tempdima| +% |\strip@pt| |\baselineskip| |\relax|. Thanks to \lsthelper{Peter~Bartke} +% {2002/04/10}{bad use of \strip@pt} for the bug report. +% \begin{macrocode} + \multiply\@tempdima\@cclvi + \divide\@tempdima\baselineskip\relax + \multiply\@tempdima\@cclvi +% \end{macrocode} +% \begin{macrocode} + \edef\baselinestretch{\strip@pt\@tempdima}% + \selectfont + \fi} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{breaklines} +% \begin{lstkey}{breakindent} +% \begin{lstkey}{breakautoindent} +% \begin{lstkey}{breakatwhitespace} +% \begin{lstkey}{prebreak} +% \begin{lstkey}{postbreak} +% As usual we have no problems in announcing more keys. +% \keyname{breakatwhitespace} is due to \lsthelper{Javier~Bezos}{2003/09/23} +% {breaklines breaks at odd places}. Unfortunately a previous definition of +% that key was wrong as \lsthelper{Franz~Rinnerthaler}{2004/03/12} +% {breakatwhitespace has no effect} and \lsthelper{Ulrike~Fischer}{2004/07/11} +% {breakatwhitespace has no effect} reported. +% \begin{macrocode} +\lst@Key{breaklines}{false}[t]{\lstKV@SetIf{#1}\lst@ifbreaklines} +\lst@Key{breakindent}{20pt}{\def\lst@breakindent{#1}} +\lst@Key{breakautoindent}{t}[t]{\lstKV@SetIf{#1}\lst@ifbreakautoindent} +\lst@Key{breakatwhitespace}{false}[t]% + {\lstKV@SetIf{#1}\lst@ifbreakatwhitespace} +\lst@Key{prebreak}{}{\def\lst@prebreak{#1}} +\lst@Key{postbreak}{}{\def\lst@postbreak{#1}} +% \end{macrocode} +% We assign some different macros and (if necessary) suppress ``underfull +% |\hbox|'' messages (and use different pretolerance): +% \begin{macrocode} +\lst@AddToHook{Init} + {\lst@ifbreaklines + \hbadness\@M \pretolerance\@M + \@rightskip\@flushglue \rightskip\@rightskip % \raggedright + \leftskip\z@skip \parindent\z@ +% \end{macrocode} +% A |\raggedright| above has been replaced by setting the values by hand after +% a bug report from \lsthelper{Morten~H\o gholm}{2004/09/06}{ltugboat.cls and +% listings}. +% +% We use the normal parshape and the calculated |\lst@breakshape| (see below). +% \begin{macrocode} + \def\lst@parshape{\parshape\tw@ \@totalleftmargin\linewidth + \lst@breakshape}% + \else + \let\lst@discretionary\@empty + \fi} +\lst@AddToHook{OnNewLine} + {\lst@ifbreaklines \lst@breakNewLine \fi} +% \end{macrocode} +% \end{lstkey}\end{lstkey}\end{lstkey}\end{lstkey} +% \end{lstkey}\end{lstkey} +% +% \begin{macro}{\lst@discretionary} +% \begin{macro}{\lst@spacekern} +% Here comes the whole magic: We set a discretionary break after each `output +% unit'. However we redefine |\space| to be used inside |\discretionary| and +% use \hookname{EveryLine} hook. After a bug report by \lsthelper{Carsten~Hamm} +% {2002/04/19}{wrong frame rules with breaklines and xleftmargin>0pt} I've +% added |\kern-\lst@xleftmargin|, which became |\kern-\@totalleftmargin| after +% a bug report by \lsthelper{Christian~Kaiser}{2002/12/13}{wrong frame inside +% itemize with breaklines=true}. +% \begin{macrocode} +\gdef\lst@discretionary{% + \lst@ifbreakatwhitespace + \lst@ifwhitespace \lst@@discretionary \fi + \else + \lst@@discretionary + \fi}% +\gdef\lst@@discretionary{% + \discretionary{\let\space\lst@spacekern\lst@prebreak}% + {\llap{\lsthk@EveryLine + \kern\lst@breakcurrindent \kern-\@totalleftmargin}% + \let\space\lst@spacekern\lst@postbreak}{}} +\lst@AddToHook{PostOutput}{\lst@discretionary} +\gdef\lst@spacekern{\kern\lst@width} +% \end{macrocode} +% \begin{ALTERNATIVE} +% |\penalty\@M \hskip\z@ plus 1fil \penalty0\hskip\z@ plus-1fil| \emph{before} +% each `output unit' (i.e.~before |\hbox{...}| in the output macros) also break +% the lines as desired. But we wouldn't have |prebreak| and |postbreak|. +% \end{ALTERNATIVE} +% \end{macro}\end{macro} +% +% \begin{macro}{\lst@breakNewLine} +% We use \keyname{breakindent}, and additionally the current line indention +% (coming from white spaces at the beginning of the line) if `auto indent' is +% on. +% \begin{macrocode} +\gdef\lst@breakNewLine{% + \@tempdima\lst@breakindent\relax + \lst@ifbreakautoindent \advance\@tempdima\lst@lostspace \fi +% \end{macrocode} +% Now we calculate the margin and line width of the wrapped part \ldots +% \begin{macrocode} + \@tempdimc-\@tempdima \advance\@tempdimc\linewidth + \advance\@tempdima\@totalleftmargin +% \end{macrocode} +% \ldots\space and store it in |\lst@breakshape|. +% \begin{macrocode} + \xdef\lst@breakshape{\noexpand\lst@breakcurrindent \the\@tempdimc}% + \xdef\lst@breakcurrindent{\the\@tempdima}} +\global\let\lst@breakcurrindent\z@ % init +% \end{macrocode} +% The initialization of |\lst@breakcurrindent| has been added after a bug +% report by \lsthelper{Alvaro~Herrera}{2002/12/09}{`undefined control +% sequence \lst@breakcurrindent' with fancyvrb and breaklines}. +% \begin{TODO} +% We could speed this up by allocating two global dimensions. +% \end{TODO} +% \end{macro} +% +% \begin{macro}{\lst@breakshape} +% \lsthelper{Andreas~Deininger}{2000/08/25}{`breaklines,first>1' leads to +% ``undefined control sequence'' error} reported a problem which is resolved +% by providing a default break shape. +% \begin{macrocode} +\gdef\lst@breakshape{\@totalleftmargin \linewidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@breakProcessOther} +% is the same as |\lst@ProcessOther| except that it also outputs the current +% token string. This inserts a potential linebreak point. +% Only the closing parenthesis uses this macro yet. +% \begin{macrocode} +\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1\lst@OutputOther} +\lst@AddToHook{SelectCharTable} + {\lst@ifbreaklines \lst@Def{`)}{\lst@breakProcessOther)}\fi} +% \end{macrocode} +% A bug reported by \lsthelper{Gabriel~Tauro}{2001/04/18}{unexpected `)' if +% the character appears before first printed line} has been removed by using +% |\lst@ProcessOther| instead of |\lst@AppendOther|. +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Frames} +% +% \begin{aspect}{frames} +% Another aspect. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[lineshape]{frames} +% \end{macrocode} +% +% \begin{lstkey}{framexleftmargin} +% \begin{lstkey}{framexrightmargin} +% \begin{lstkey}{framextopmargin} +% \begin{lstkey}{framexbottommargin} +% These keys just save the argument. +% \begin{macrocode} +\lst@Key{framexleftmargin}{\z@}{\def\lst@framexleftmargin{#1}} +\lst@Key{framexrightmargin}{\z@}{\def\lst@framexrightmargin{#1}} +\lst@Key{framextopmargin}{\z@}{\def\lst@framextopmargin{#1}} +\lst@Key{framexbottommargin}{\z@}{\def\lst@framexbottommargin{#1}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{lstkey}{backgroundcolor} +% \lsthelper{Ralf~Imh\"auser}{2000/01/08}{coloured background} inspired the +% key \keyname{backgroundcolor}. All keys save the argument, and \ldots +% \begin{macrocode} +\lst@Key{backgroundcolor}{}{\def\lst@bkgcolor{#1}} +\lst@Key{fillcolor}{}{\def\lst@fillcolor{#1}} +\lst@Key{rulecolor}{}{\def\lst@rulecolor{#1}} +\lst@Key{rulesepcolor}{}{\def\lst@rulesepcolor{#1}} +% \end{macrocode} +% \ldots\space some have default settings if they are empty. +% \begin{macrocode} +\lst@AddToHook{Init}{% + \ifx\lst@fillcolor\@empty + \let\lst@fillcolor\lst@bkgcolor + \fi + \ifx\lst@rulesepcolor\@empty + \let\lst@rulesepcolor\lst@fillcolor + \fi} +% \end{macrocode} +% \end{lstkey} +% +% \begin{lstkey}{rulesep} +% \begin{lstkey}{framerule} +% \begin{lstkey}{framesep} +% \begin{lstkey}{frameshape} +% Another set of keys, which mainly save their respective argument. +% \keyname{frameshape} capitalizes all letters, and checks whether at least one +% round corner is specified. Eventually we define |\lst@frame| to be empty if +% and only if there is no frameshape. +% \begin{macrocode} +\lst@Key{rulesep}{2pt}{\def\lst@rulesep{#1}} +\lst@Key{framerule}{.4pt}{\def\lst@framerulewidth{#1}} +\lst@Key{framesep}{3pt}{\def\lst@frametextsep{#1}} +\lst@Key{frameshape}{}{% + \let\lst@xrulecolor\@empty + \lstKV@FourArg{#1}% + {\uppercase{\def\lst@frametshape{##1}}% + \uppercase{\def\lst@framelshape{##2}}% + \uppercase{\def\lst@framershape{##3}}% + \uppercase{\def\lst@framebshape{##4}}% + \let\lst@ifframeround\iffalse + \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}% + \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}% + \def\lst@frame{##1##2##3##4}}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% \end{lstkey} +% +% \begin{lstkey}{frameround} +% \begin{lstkey}{frame} +% We have to do some conversion here. +% \begin{macrocode} +\lst@Key{frameround}\relax + {\uppercase{\def\lst@frameround{#1}}% + \expandafter\lstframe@\lst@frameround ffff\relax} +\global\let\lst@frameround\@empty +% \end{macrocode} +% In case of an verbose argument, we use the |trbl|-subset replacement. +% \begin{macrocode} +\lst@Key{frame}\relax{% + \let\lst@xrulecolor\@empty + \lstKV@SwitchCases{#1}% + {none&\let\lst@frame\@empty\\% + leftline&\def\lst@frame{l}\\% + topline&\def\lst@frame{t}\\% + bottomline&\def\lst@frame{b}\\% + lines&\def\lst@frame{tb}\\% + single&\def\lst@frame{trbl}\\% + shadowbox&\def\lst@frame{tRBl}% + \def\lst@xrulecolor{\lst@rulesepcolor}% + \def\lst@rulesep{\lst@frametextsep}% + }{\def\lst@frame{#1}}% + \expandafter\lstframe@\lst@frameround ffff\relax} +% \end{macrocode} +% Adding |t|, |r|, |b|, and |l| in case of their upper case versions makes +% later tests easier. +% \begin{macrocode} +\gdef\lstframe@#1#2#3#4#5\relax{% + \lst@IfSubstring T\lst@frame{\edef\lst@frame{t\lst@frame}}{}% + \lst@IfSubstring R\lst@frame{\edef\lst@frame{r\lst@frame}}{}% + \lst@IfSubstring B\lst@frame{\edef\lst@frame{b\lst@frame}}{}% + \lst@IfSubstring L\lst@frame{\edef\lst@frame{l\lst@frame}}{}% +% \end{macrocode} +% We now check top and bottom frame rules, \ldots +% \begin{macrocode} + \let\lst@frametshape\@empty \let\lst@framebshape\@empty + \lst@frameCheck + ltr\lst@framelshape\lst@frametshape\lst@framershape #4#1% + \lst@frameCheck + LTR\lst@framelshape\lst@frametshape\lst@framershape #4#1% + \lst@frameCheck + lbr\lst@framelshape\lst@framebshape\lst@framershape #3#2% + \lst@frameCheck + LBR\lst@framelshape\lst@framebshape\lst@framershape #3#2% +% \end{macrocode} +% \ldots\space look for round corners \ldots +% \begin{macrocode} + \let\lst@ifframeround\iffalse + \lst@IfSubstring R\lst@frametshape{\let\lst@ifframeround\iftrue}{}% + \lst@IfSubstring R\lst@framebshape{\let\lst@ifframeround\iftrue}{}% +% \end{macrocode} +% and define left and right frame shape. +% \begin{macrocode} + \let\lst@framelshape\@empty \let\lst@framershape\@empty + \lst@IfSubstring L\lst@frame + {\def\lst@framelshape{YY}}% + {\lst@IfSubstring l\lst@frame{\def\lst@framelshape{Y}}{}}% + \lst@IfSubstring R\lst@frame + {\def\lst@framershape{YY}}% + {\lst@IfSubstring r\lst@frame{\def\lst@framershape{Y}}{}}} +% \end{macrocode} +% Now comes the macro used to define top and bottom frame shape. +% It extends the macro |#5|. +% The last two arguments show whether left and right corners are round. +% |#4| and |#6| are temporary macros. +% |#1#2#3| are the three characters we test for. +% \begin{macrocode} +\gdef\lst@frameCheck#1#2#3#4#5#6#7#8{% + \lst@IfSubstring #1\lst@frame + {\if #7T\def#4{R}\else \def#4{Y}\fi}% + {\def#4{N}}% + \lst@IfSubstring #3\lst@frame + {\if #8T\def#6{R}\else \def#6{Y}\fi}% + {\def#6{N}}% + \lst@IfSubstring #2\lst@frame{\edef#5{#5#4Y#6}}{}} +% \end{macrocode} +% For text style listings all frames and the background color are +% deactivated -- added after bug reports by \lsthelper{Stephen~Reindl}% +% {2002/06/04}{frames not deactivated for text style listings} and +% \lsthelper{Thomas~ten~Cate}{2006/07/14}{inline listings get background +% color after a line break} +% \begin{macrocode} +\lst@AddToHook{TextStyle} + {\let\lst@frame\@empty + \let\lst@frametshape\@empty + \let\lst@framershape\@empty + \let\lst@framebshape\@empty + \let\lst@framelshape\@empty + \let\lst@bkgcolor\@empty} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey} +% +% As per a bug report by \lsthelper{Ignacio~Fern\'andez~Galv\'an}{2006/07/26}% +% {Frame with background color has slight hole on left side}, the small section +% of background color to the left of the margin is now drawn before the left +% side of the frame is drawn, so that they overlap correctly in Acrobat. +% +% \begin{macro}{\lst@frameMakeVBox} +% \begin{macrocode} +\gdef\lst@frameMakeBoxV#1#2#3{% + \setbox#1\hbox{% + \color@begingroup \lst@rulecolor + \ifx\lst@framelshape\@empty + \else + \llap{% + \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}% + \kern\lst@framexleftmargin}% + \fi + \llap{\setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3% + \lst@frameL}% + \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}% + {\ht\z@}{\dp\z@}}% + \box\z@ + \kern\lst@frametextsep\relax + \kern\lst@framexleftmargin}% + \rlap{\kern-\lst@framexleftmargin + \@tempdima\linewidth + \advance\@tempdima\lst@framexleftmargin + \advance\@tempdima\lst@framexrightmargin + \lst@frameBlock\lst@bkgcolor\@tempdima{#2}{#3}% + \ifx\lst@framershape\@empty + \kern\lst@frametextsep\relax + \else + \lst@frameBlock\lst@fillcolor\lst@frametextsep{#2}{#3}% + \fi + \setbox\z@\hbox{\vrule\@width\z@\@height#2\@depth#3% + \lst@frameR}% + \rlap{\lst@frameBlock\lst@rulesepcolor{\wd\z@}% + {\ht\z@}{\dp\z@}}% + \box\z@}% + \color@endgroup}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameBlock} +% \begin{macrocode} +\gdef\lst@frameBlock#1#2#3#4{% + \color@begingroup + #1% + \setbox\z@\hbox{\vrule\@height#3\@depth#4% + \ifx#1\@empty \@width\z@ \kern#2\relax + \else \@width#2\relax \fi}% + \box\z@ + \color@endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameR} +% typesets right rules. +% We only need to iterate through |\lst@framershape|. +% \begin{macrocode} +\gdef\lst@frameR{% + \expandafter\lst@frameR@\lst@framershape\relax + \kern-\lst@rulesep} +\gdef\lst@frameR@#1{% + \ifx\relax#1\@empty\else + \if #1Y\lst@framevrule \else \kern\lst@framerulewidth \fi + \kern\lst@rulesep + \expandafter\lst@frameR@b + \fi} +\gdef\lst@frameR@b#1{% + \ifx\relax#1\@empty + \else + \if #1Y\color@begingroup + \lst@xrulecolor + \lst@framevrule + \color@endgroup + \else + \kern\lst@framerulewidth + \fi + \kern\lst@rulesep + \expandafter\lst@frameR@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameL} +% Ditto left rules. +% \begin{macrocode} +\gdef\lst@frameL{% + \kern-\lst@rulesep + \expandafter\lst@frameL@\lst@framelshape\relax} +\gdef\lst@frameL@#1{% + \ifx\relax#1\@empty\else + \kern\lst@rulesep + \if#1Y\lst@framevrule \else \kern\lst@framerulewidth \fi + \expandafter\lst@frameL@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameH} +% This is the central macro used to draw top and bottom frame rules. +% The first argument is either |T| or |B| and the second contains the shape. +% We use |\@tempcntb| as size counter. +% \begin{macrocode} +\gdef\lst@frameH#1#2{% + \global\let\lst@framediml\z@ \global\let\lst@framedimr\z@ + \setbox\z@\hbox{}\@tempcntb\z@ + \expandafter\lst@frameH@\expandafter#1#2\relax\relax\relax + \@tempdimb\lst@frametextsep\relax + \advance\@tempdimb\lst@framerulewidth\relax + \@tempdimc-\@tempdimb + \advance\@tempdimc\ht\z@ + \advance\@tempdimc\dp\z@ + \setbox\z@=\hbox{% + \lst@frameHBkg\lst@fillcolor\@tempdimb\@firstoftwo + \if#1T\rlap{\raise\dp\@tempboxa\box\@tempboxa}% + \else\rlap{\lower\ht\@tempboxa\box\@tempboxa}\fi + \lst@frameHBkg\lst@rulesepcolor\@tempdimc\@secondoftwo + \advance\@tempdimb\ht\@tempboxa + \if#1T\rlap{\raise\lst@frametextsep\box\@tempboxa}% + \else\rlap{\lower\@tempdimb\box\@tempboxa}\fi + \rlap{\box\z@}% + }} +\gdef\lst@frameH@#1#2#3#4{% + \ifx\relax#4\@empty\else + \lst@frameh \@tempcntb#1#2#3#4% + \advance\@tempcntb\@ne + \expandafter\lst@frameH@\expandafter#1% + \fi} +\gdef\lst@frameHBkg#1#2#3{% + \setbox\@tempboxa\hbox{% + \kern-\lst@framexleftmargin + #3{\kern-\lst@framediml\relax}{\@tempdima\z@}% + \ifdim\lst@framediml>\@tempdimb + #3{\@tempdima\lst@framediml \advance\@tempdima-\@tempdimb + \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@}% + {\kern-\lst@framediml + \advance\@tempdima\lst@framediml\relax}% + \fi + #3{\@tempdima\z@ + \ifx\lst@framelshape\@empty\else + \advance\@tempdima\@tempdimb + \fi + \ifx\lst@framershape\@empty\else + \advance\@tempdima\@tempdimb + \fi}% + {\ifdim\lst@framedimr>\@tempdimb + \advance\@tempdima\lst@framedimr\relax + \fi}% + \advance\@tempdima\linewidth + \advance\@tempdima\lst@framexleftmargin + \advance\@tempdima\lst@framexrightmargin + \lst@frameBlock#1\@tempdima#2\z@ + #3{\ifdim\lst@framedimr>\@tempdimb + \@tempdima-\@tempdimb + \advance\@tempdima\lst@framedimr\relax + \lst@frameBlock\lst@rulesepcolor\@tempdima\@tempdimb\z@ + \fi}{}% + }} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameh} +% This is the low-level macro used to draw top and bottom frame rules. +% It \emph{adds} one rule plus corners to box 0. +% The first parameter gives the size of the corners and the second is either +% |T| or |B|. +% |#3#4#5| is a left-to-right description of the frame and is in +% $\{$\texttt{Y,N,R}$\}\times\{$\texttt{Y,N}$\}\times\{$\texttt{Y,N,R}$\}$. +% We move to the correct horizontal position, set the left corner, the +% horizontal line, and the right corner. +% \begin{macrocode} +\gdef\lst@frameh#1#2#3#4#5{% + \lst@frameCalcDimA#1% + \lst@ifframeround \@getcirc\@tempdima \fi +% \end{macrocode} +% \begin{macrocode} + \setbox\z@\hbox{% + \begingroup + \setbox\z@\hbox{% + \kern-\lst@framexleftmargin + \color@begingroup + \ifnum#1=\z@ \lst@rulecolor \else \lst@xrulecolor \fi +% \end{macrocode} +% |\lst@frameCorner| gets four arguments: +% |\llap|, |TL| or |BL|, the corner type $\in\{$\texttt{Y,N,R}$\}$, and the +% size |#1|. +% \begin{macrocode} + \lst@frameCornerX\llap{#2L}#3#1% + \ifdim\lst@framediml<\@tempdimb + \xdef\lst@framediml{\the\@tempdimb}% + \fi + \begingroup + \if#4Y\else \let\lst@framerulewidth\z@ \fi + \@tempdima\lst@framexleftmargin + \advance\@tempdima\lst@framexrightmargin + \advance\@tempdima\linewidth + \vrule\@width\@tempdima\@height\lst@framerulewidth \@depth\z@ + \endgroup + \lst@frameCornerX\rlap{#2R}#5#1% + \ifdim\lst@framedimr<\@tempdimb + \xdef\lst@framedimr{\the\@tempdimb}% + \fi + \color@endgroup}% +% \end{macrocode} +% \begin{macrocode} + \if#2T\rlap{\raise\dp\z@\box\z@}% + \else\rlap{\lower\ht\z@\box\z@}\fi + \endgroup + \box\z@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameCornerX} +% typesets a single corner and returns |\@tempdimb|, the width of the corner. +% \begin{macrocode} +\gdef\lst@frameCornerX#1#2#3#4{% + \setbox\@tempboxa\hbox{\csname\@lst @frame\if#3RR\fi #2\endcsname}% + \@tempdimb\wd\@tempboxa + \if #3R% + #1{\box\@tempboxa}% + \else + \if #3Y\expandafter#1\else + \@tempdimb\z@ \expandafter\vphantom \fi + {\box\@tempboxa}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameCalcDimA} +% calculates an all over width; used by |\lst@frameh| and |\lst@frameInit|. +% \begin{macrocode} +\gdef\lst@frameCalcDimA#1{% + \@tempdima\lst@rulesep + \advance\@tempdima\lst@framerulewidth + \multiply\@tempdima#1\relax + \advance\@tempdima\lst@frametextsep + \advance\@tempdima\lst@framerulewidth + \multiply\@tempdima\tw@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameInit} +% First we look which frame types we have on the left and on the right. +% We speed up things if there are no vertical rules. +% \begin{macrocode} +\lst@AddToHook{Init}{\lst@frameInit} +\newbox\lst@framebox +\gdef\lst@frameInit{% + \ifx\lst@framelshape\@empty \let\lst@frameL\@empty \fi + \ifx\lst@framershape\@empty \let\lst@frameR\@empty \fi + \def\lst@framevrule{\vrule\@width\lst@framerulewidth\relax}% +% \end{macrocode} +% We adjust values to round corners if necessary. +% \begin{macrocode} + \lst@ifframeround + \lst@frameCalcDimA\z@ \@getcirc\@tempdima + \@tempdimb\@tempdima \divide\@tempdimb\tw@ + \advance\@tempdimb -\@wholewidth + \edef\lst@frametextsep{\the\@tempdimb}% + \edef\lst@framerulewidth{\the\@wholewidth}% +% \end{macrocode} +% \begin{macrocode} + \lst@frameCalcDimA\@ne \@getcirc\@tempdima + \@tempdimb\@tempdima \divide\@tempdimb\tw@ + \advance\@tempdimb -\tw@\@wholewidth + \advance\@tempdimb -\lst@frametextsep + \edef\lst@rulesep{\the\@tempdimb}% + \fi +% \end{macrocode} +% \begin{macrocode} + \lst@frameMakeBoxV\lst@framebox{\ht\strutbox}{\dp\strutbox}% + \def\lst@framelr{\copy\lst@framebox}% +% \end{macrocode} +% Finally we typeset the rules (+ corners). +% We possibly need to insert negative |\vskip| to remove space between +% preceding text and top rule. +% \begin{TODO} +% Use |\vspace| instead of |\vskip|? +% \end{TODO} +% \begin{macrocode} + \ifx\lst@frametshape\@empty\else + \lst@frameH T\lst@frametshape + \ifvoid\z@\else + \par\lst@parshape + \@tempdima-\baselineskip \advance\@tempdima\ht\z@ + \ifdim\prevdepth<\@cclvi\p@\else + \advance\@tempdima\prevdepth + \fi + \ifdim\@tempdima<\z@ + \vskip\@tempdima\vskip\lineskip + \fi + \noindent\box\z@\par + \lineskiplimit\maxdimen \lineskip\z@ + \fi + \lst@frameSpreadV\lst@framextopmargin + \fi} +% \end{macrocode} +% |\parshape\lst@parshape| ensures that the top rules correctly indented. +% The bug was reported by \lsthelper{Marcin~Kasperski}{1999/04/28}{top rules +% indented right inside itemize}. +% +% We typeset left and right rules every line. +% \begin{macrocode} +\lst@AddToHook{EveryLine}{\lst@framelr} +\global\let\lst@framelr\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameExit} +% The rules at the bottom. +% \begin{macrocode} +\lst@AddToHook{DeInit} + {\ifx\lst@framebshape\@empty\else \lst@frameExit \fi} +\gdef\lst@frameExit{% + \lst@frameSpreadV\lst@framexbottommargin + \lst@frameH B\lst@framebshape + \ifvoid\z@\else + \everypar{}\par\lst@parshape\nointerlineskip\noindent\box\z@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameSpreadV} +% sets rules for vertical spread. +% \begin{macrocode} +\gdef\lst@frameSpreadV#1{% + \ifdim\z@=#1\else + \everypar{}\par\lst@parshape\nointerlineskip\noindent + \lst@frameMakeBoxV\z@{#1}{\z@}% + \box\z@ + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lst@frameTR} +% \begin{macro}{\lst@frameBR} +% \begin{macro}{\lst@frameBL} +% \begin{macro}{\lst@frameTL} +% These macros make a vertical and horizontal rule. +% The implicit argument |\@tempdima| gives the size of two corners and is +% provided by |\lst@frameh|. +% \begin{macrocode} +\gdef\lst@frameTR{% + \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@ + \kern-\lst@framerulewidth + \raise\lst@framerulewidth\hbox{% + \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}} +\gdef\lst@frameBR{% + \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@ + \kern-\lst@framerulewidth + \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@} +\gdef\lst@frameBL{% + \vrule\@width\lst@framerulewidth\@height.5\@tempdima\@depth\z@ + \kern-\lst@framerulewidth + \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@} +\gdef\lst@frameTL{% + \raise\lst@framerulewidth\hbox{% + \vrule\@width\lst@framerulewidth\@height\z@\@depth.5\@tempdima}% + \kern-\lst@framerulewidth + \vrule\@width.5\@tempdima\@height\lst@framerulewidth\@depth\z@} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\lst@frameRoundT} +% \begin{macro}{\lst@frameRoundB} +% are helper macros to typeset round corners. We set height and depth to +% the visible parts of the circle font. +% \begin{macrocode} +\gdef\lst@frameRoundT{% + \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}% + \ht\@tempboxa\lst@framerulewidth + \box\@tempboxa} +\gdef\lst@frameRoundB{% + \setbox\@tempboxa\hbox{\@circlefnt\char\@tempcnta}% + \dp\@tempboxa\z@ + \box\@tempboxa} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lst@frameRTR} +% \begin{macro}{\lst@frameRBR} +% \begin{macro}{\lst@frameRBL} +% \begin{macro}{\lst@frameRTL} +% The round corners. +% \begin{macrocode} +\gdef\lst@frameRTR{% + \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth + \kern.5\@tempdima \lst@frameRoundT \hss}} +\gdef\lst@frameRBR{% + \hb@xt@.5\@tempdima{\kern-\lst@framerulewidth + \advance\@tempcnta\@ne \kern.5\@tempdima \lst@frameRoundB \hss}} +\gdef\lst@frameRBL{% + \advance\@tempcnta\tw@ \lst@frameRoundB + \kern-.5\@tempdima} +\gdef\lst@frameRTL{% + \advance\@tempcnta\thr@@\lst@frameRoundT + \kern-.5\@tempdima} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \subsection{Macro use for make} +% +% \begin{aspect}{make} +% \begin{macro}{\lst@makemode} +% \begin{macro}{\lst@ifmakekey} +% If we've entered the special mode for Make, we save whether the last +% identifier has been a first order keyword. +% \begin{macrocode} +%<*misc> +\lst@BeginAspect[keywords]{make} +% \end{macrocode} +% \begin{macrocode} +\lst@NewMode\lst@makemode +\lst@AddToHook{Output}{% + \ifnum\lst@mode=\lst@makemode + \ifx\lst@thestyle\lst@gkeywords@sty + \lst@makekeytrue + \fi + \fi} +% \end{macrocode} +% \begin{macrocode} +\gdef\lst@makekeytrue{\let\lst@ifmakekey\iftrue} +\gdef\lst@makekeyfalse{\let\lst@ifmakekey\iffalse} +\global\lst@makekeyfalse % init +% \end{macrocode} +% \end{macro}\end{macro} +% +% \begin{lstkey}{makemacrouse} +% adjusts the character table if necessary +% \begin{macrocode} +\lst@Key{makemacrouse}f[t]{\lstKV@SetIf{#1}\lst@ifmakemacrouse} +% \end{macrocode} +% \end{lstkey} +% +% \begin{macro}{\lst@MakeSCT} +% If `macro use' is on, the opening |$(| prints preceding characters, enters +% the special mode and merges the two characters with the following output. +% +% \begin{macrocode} +\gdef\lst@MakeSCT{% + \lst@ifmakemacrouse + \lst@ReplaceInput{$(}{% + \lst@PrintToken + \lst@EnterMode\lst@makemode{\lst@makekeyfalse}% + \lst@Merge{\lst@ProcessOther\$\lst@ProcessOther(}}% +% \end{macrocode} +% The closing parenthesis tests for the mode and either processes |)| as usual +% or outputs it right here (in keyword style if a keyword was between |$(| and +% |)|). +% \begin{macrocode} + \lst@ReplaceInput{)}{% + \ifnum\lst@mode=\lst@makemode + \lst@PrintToken + \begingroup + \lst@ProcessOther)% + \lst@ifmakekey + \let\lst@currstyle\lst@gkeywords@sty + \fi + \lst@OutputOther + \endgroup + \lst@LeaveMode + \else + \expandafter\lst@ProcessOther\expandafter)% + \fi}% +% \end{macrocode} +% If \keyname{makemacrouse} is off then both |$(| are just `others'. +% \begin{macrocode} + \else + \lst@ReplaceInput{$(}{\lst@ProcessOther\$\lst@ProcessOther(}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\lst@EndAspect +% +% \end{macrocode} +% \end{aspect} +% +% +% \section{Typesetting a listing} +% +% \begingroup +% \begin{macrocode} +%<*kernel> +% \end{macrocode} +% \endgroup +% \begin{macro}{\lst@lineno} +% \begin{lstkey}{print} +% \begin{lstkey}{firstline} +% \begin{lstkey}{lastline} +% \begin{lstkey}{linerange} +% The `current line' counter and three keys. +% \begin{macrocode} +\newcount\lst@lineno % \global +\lst@AddToHook{InitVars}{\global\lst@lineno\@ne} +% \end{macrocode} +% \begin{macrocode} +\lst@Key{print}{true}[t]{\lstKV@SetIf{#1}\lst@ifprint} +\lst@Key{firstline}\relax{\def\lst@firstline{#1\relax}} +\lst@Key{lastline}\relax{\def\lst@lastline{#1\relax}} +% \end{macrocode} +% \begin{macrocode} +\lst@AddToHook{PreSet} + {\let\lst@firstline\@ne \def\lst@lastline{9999999\relax}} +% \end{macrocode} +% \end{lstkey} +% \end{lstkey}\end{lstkey}\end{lstkey}\end{macro} +% The following code is just copied from the current development version, and +% from the |lstpatch.sty| file that Carsten left in version 1.3b for doing +% line ranges with numbers and range markers. +% +% First, the options that control the line-range handling. +% \begin{macrocode} +\lst@Key{linerange}\relax{\lstKV@OptArg[]{#1}{% + \def\lst@interrange{##1}\def\lst@linerange{##2,}}} +\lst@Key{rangeprefix}\relax{\def\lst@rangebeginprefix{#1}% + \def\lst@rangeendprefix{#1}} +\lst@Key{rangesuffix}\relax{\def\lst@rangebeginsuffix{#1}% + \def\lst@rangeendsuffix{#1}} +\lst@Key{rangebeginprefix}{}{\def\lst@rangebeginprefix{#1}} +\lst@Key{rangebeginsuffix}{}{\def\lst@rangebeginsuffix{#1}} +\lst@Key{rangeendprefix}{}{\def\lst@rangeendprefix{#1}} +\lst@Key{rangeendsuffix}{}{\def\lst@rangeendsuffix{#1}} +\lst@Key{includerangemarker}{true}[t]{\lstKV@SetIf{#1}\lst@ifincluderangemarker} +\lst@AddToHook{PreSet}{\def\lst@firstline{1\relax}% + \let\lst@linerange\@empty} +\lst@AddToHook{Init} +{\ifx\lst@linerange\@empty + \edef\lst@linerange{{\lst@firstline}-{\lst@lastline},}% + \fi + \lst@GetLineInterval}% +\def\lst@GetLineInterval{\expandafter\lst@GLI\lst@linerange\@nil} +\def\lst@GLI#1,#2\@nil{\def\lst@linerange{#2}\lst@GLI@#1--\@nil} +\def\lst@GLI@#1-#2-#3\@nil{% + \lst@IfNumber{#1}% + {\ifx\@empty#1\@empty + \let\lst@firstline\@ne + \else + \def\lst@firstline{#1\relax}% + \fi + \ifx\@empty#3\@empty + \def\lst@lastline{9999999\relax}% + \else + \ifx\@empty#2\@empty + \let\lst@lastline\lst@firstline + \else + \def\lst@lastline{#2\relax}% + \fi + \fi}% +% \end{macrocode} +% If we've found a general marker, we set firstline and lastline to 9999999. +% This prevents (almost) anything from being printed for now. +% \begin{macrocode} + {\def\lst@firstline{9999999\relax}% + \let\lst@lastline\lst@firstline +% \end{macrocode} +% We add the prefixes and suffixes to the markers. +% \begin{macrocode} + \let\lst@rangebegin\lst@rangebeginprefix + \lst@AddTo\lst@rangebegin{#1}\lst@Extend\lst@rangebegin\lst@rangebeginsuffix + \ifx\@empty#3\@empty + \let\lst@rangeend\lst@rangeendprefix + \lst@AddTo\lst@rangeend{#1}\lst@Extend\lst@rangeend\lst@rangeendsuffix + \else + \ifx\@empty#2\@empty + \let\lst@rangeend\@empty + \else + \let\lst@rangeend\lst@rangeendprefix + \lst@AddTo\lst@rangeend{#2}\lst@Extend\lst@rangeend\lst@rangeendsuffix + \fi + \fi +% \end{macrocode} +% The following definition will be executed in the SelectCharTable hook +% and here right now if we are already processing a listing. +% \begin{macrocode} + \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}% + \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}} +% \end{macrocode} +% \lst@DefRange is not inserted via a hook anymore. Instead it is now called +% directly from \lst@SelectCharTable. This was necessary to get rid of an +% interference with the escape-to-LaTeX-feature. The bug was reported by +% \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung +% m\"oglich...}. Another chance is due to the same bug: \lst@DefRange is +% redefined globally when the begin of code is found, see below. The bug was +% reported by \lsthelper{Tobias~Rapp}{2004/04/06}{undetected end of range if +% listing crosses page break} \lsthelper{Markus~Luisser}{2004/08/13}{Bug mit +% 'linerangemarker' in umgebrochenen listings} +% \begin{macrocode} +\lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty} +% \end{macrocode} +% +% Actually defining the marker (via \lst@GLI@, \lst@DefRange, \lst@CArgX as +% seen above) is similar to \lst@DefDelimB---except that we unfold the first +% parameter and use different ,
, and  statements.
+%    \begin{macrocode}
+\def\lst@DefRangeB#1#2{\lst@DefRangeB@#1#2}
+\def\lst@DefRangeB@#1#2#3#4{%
+    \lst@CDef{#1{#2}{#3}}#4{}%
+    {\lst@ifincluderangemarker
+         \lst@LeaveMode
+         \let#1#4%
+         \lst@DefRangeEnd
+         \lst@InitLstNumber
+     \else
+         \@tempcnta\lst@lineno \advance\@tempcnta\@ne
+         \edef\lst@firstline{\the\@tempcnta\relax}%
+         \gdef\lst@OnceAtEOL{\let#1#4\lst@DefRangeEnd}%
+         \lst@InitLstNumber
+     \fi
+	 \global\let\lst@DefRange\lst@DefRangeEnd
+     \lst@CArgEmpty}%
+    \@empty}
+%    \end{macrocode}
+%
+% Modify labels and define |\lst@InitLstNumber| used above.
+% \lsthelper{Omair-Inam~Abdul-Matin}{2004/05/10}{experimental linerange
+% feature does not work with firstnumber}
+%    \begin{macrocode}
+\def\lstpatch@labels{%
+\gdef\lst@SetFirstNumber{%
+    \ifx\lst@firstnumber\@undefined
+        \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
+        \ifnum\@tempcnta=\z@ \else
+            \lst@nololtrue
+            \advance\@tempcnta\lst@advancenumber
+            \edef\lst@firstnumber{\the\@tempcnta\relax}%
+        \fi
+    \fi}%
+}
+\def\lst@InitLstNumber{%
+     \global\c@lstnumber\lst@firstnumber
+     \global\advance\c@lstnumber\lst@advancenumber
+     \global\advance\c@lstnumber-\lst@advancelstnum
+     \ifx \lst@firstnumber\c@lstnumber
+         \global\advance\c@lstnumber-\lst@advancelstnum
+     \fi}
+%    \end{macrocode}
+%
+%    The end-marker is defined if and only if it's not empty. The definition is
+%    similar to \lst@DefDelimE---with the above exceptions and except that we
+%    define the re-entry point \lst@DefRangeE@@ as it is defined in the new
+%    version of \lst@MProcessListing above.
+%    \begin{macrocode}
+\def\lst@DefRangeEnd{%
+    \ifx\lst@rangeend\@empty\else
+        \expandafter\lst@CArgX\lst@rangeend\relax\lst@DefRangeE
+    \fi}
+\def\lst@DefRangeE#1#2{\lst@DefRangeE@#1#2}
+\def\lst@DefRangeE@#1#2#3#4{%
+    \lst@CDef{#1#2{#3}}#4{}%
+    {\let#1#4%
+     \edef\lst@lastline{\the\lst@lineno\relax}%
+     \lst@DefRangeE@@}%
+    \@empty}
+\def\lst@DefRangeE@@#1\@empty{%
+    \lst@ifincluderangemarker
+        #1\lst@XPrintToken
+    \fi
+    \lst@LeaveModeToPmode
+    \lst@BeginDropInput{\lst@Pmode}}
+\def\lst@LeaveModeToPmode{%
+    \ifnum\lst@mode=\lst@Pmode
+        \expandafter\lsthk@EndGroup
+    \else
+        \expandafter\egroup\expandafter\lst@LeaveModeToPmode
+    \fi}
+%    \end{macrocode}
+%
+%    Eventually we shouldn't forget to install \lst@OnceAtEOL, which must
+%    also be called in \lst@MSkipToFirst.
+%    \begin{macrocode}
+\lst@AddToHook{EOL}{\lst@OnceAtEOL\global\let\lst@OnceAtEOL\@empty}
+\gdef\lst@OnceAtEOL{}% Init
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \def\lst@next{\lst@LeaveMode \global\lst@newlines\z@
+        \lst@OnceAtEOL \global\let\lst@OnceAtEOL\@empty
+        \lst@InitLstNumber % Added to work with modified \lsthk@PreInit.
+        \lsthk@InitVarsBOL
+        \lst@BOLGobble}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+        \def\lst@next{\lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst}%
+        \expandafter\lst@next
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+%
+%    Finally the service macro \lst@IfNumber:
+%    \begin{macrocode}
+\def\lst@IfNumber#1{%
+    \ifx\@empty#1\@empty
+        \let\lst@next\@firstoftwo
+    \else
+        \lst@IfNumber@#1\@nil
+    \fi
+    \lst@next}
+\def\lst@IfNumber@#1#2\@nil{%
+    \let\lst@next\@secondoftwo
+    \ifnum`#1>47\relax \ifnum`#1>57\relax\else
+        \let\lst@next\@firstoftwo
+    \fi\fi}
+%    \end{macrocode}
+%
+% \begin{lstkey}{nolol}
+% is just a key here. We'll use it below, of course.
+%    \begin{macrocode}
+\lst@Key{nolol}{false}[t]{\lstKV@SetIf{#1}\lst@ifnolol}
+\def\lst@nololtrue{\let\lst@ifnolol\iftrue}
+\let\lst@ifnolol\iffalse % init
+%    \end{macrocode}
+% \end{lstkey}
+%
+%
+% \subsection{Floats, boxes and captions}
+%
+% \begin{lstkey}{captionpos}
+% \begin{lstkey}{abovecaptionskip}
+% \begin{lstkey}{belowcaptionskip}
+% \begin{lstkey}{label}
+% \begin{lstkey}{title}
+% \begin{lstkey}{caption}
+% Some keys and \ldots
+%    \begin{macrocode}
+\lst@Key{captionpos}{t}{\def\lst@captionpos{#1}}
+\lst@Key{abovecaptionskip}\smallskipamount{\def\lst@abovecaption{#1}}
+\lst@Key{belowcaptionskip}\smallskipamount{\def\lst@belowcaption{#1}}
+%    \end{macrocode}
+% \lsthelper{Rolf~Niepraschk}{2000/01/10}{key: title} proposed \keyname{title}.
+%    \begin{macrocode}
+\lst@Key{label}\relax{\def\lst@label{#1}}
+\lst@Key{title}\relax{\def\lst@title{#1}\let\lst@caption\relax}
+\lst@Key{caption}\relax{\lstKV@OptArg[{#1}]{#1}%
+    {\def\lst@caption{##2}\def\lst@@caption{##1}}%
+     \let\lst@title\@empty}
+\lst@AddToHookExe{TextStyle}
+    {\let\lst@caption\@empty \let\lst@@caption\@empty
+     \let\lst@title\@empty \let\lst@label\@empty}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\thelstlisting}
+% \begin{macro}{\lstlistingname}
+% \begin{lstkey}{numberbychapter}
+% \ldots\space and how the caption numbers look like. I switched to
+% |\@ifundefined| (instead of |\ifx| |\@undefined|) after an error report from
+% \lsthelper{Denis~Girou}{1999/07/26}{incompatible if hyperref loaded before
+% listings}.
+%
+% This is set |\AtBeginDocument| so that the user can specify whether or not
+% the counter should be reset at each chapter before the counter is defined,
+% using the |numberbychapter| key.
+%    \begin{macrocode}
+\AtBeginDocument{
+  \@ifundefined{thechapter}{\let\lst@ifnumberbychapter\iffalse}{}
+  \lst@ifnumberbychapter
+      \newcounter{lstlisting}[chapter]
+      \gdef\thelstlisting%
+           {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@lstlisting}
+  \else
+      \newcounter{lstlisting}
+      \gdef\thelstlisting{\@arabic\c@lstlisting}
+  \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@UserCommand\lstlistingname{Listing}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{numberbychapter}{true}[t]{\lstKV@SetIf{#1}\lst@ifnumberbychapter}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@MakeCaption}
+% Before defining this macro, we ensure that some other control sequences
+% exist---\lsthelper{Adam~Prugel-Bennett}{2001/02/19}{\abovecaptionskip
+% undefined in slides.cls} reported problems with the slides document class.
+% In particular we allocate above- and belowcaption skip registers and define
+% |\@makecaption|, which is an exact copy of the definition in the article
+% class. To respect the LPPL: you should have a copy of this class on your
+% \TeX\ system or you can obtain a copy from the CTAN, e.g.~from the ftp-server
+% \texttt{ftp.dante.de}.
+%
+% Axel Sommerfeldt proposed a couple of improvements regarding captions and
+% titles. The first is to separate the definitions of the skip registers and
+% |\@makecaption|.
+%    \begin{macrocode}
+\@ifundefined{abovecaptionskip}
+{\newskip\abovecaptionskip
+ \newskip\belowcaptionskip}{}
+\@ifundefined{@makecaption}
+{\long\def\@makecaption#1#2{%
+   \vskip\abovecaptionskip
+   \sbox\@tempboxa{#1: #2}%
+   \ifdim \wd\@tempboxa >\hsize
+     #1: #2\par
+   \else
+     \global \@minipagefalse
+     \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+   \fi
+   \vskip\belowcaptionskip}%
+}{}
+%    \end{macrocode}
+% The introduction of |\fnum@lstlisting| is also due to Axel. Previously the
+% replacement text was used directly in |\lst@MakeCaption|. A |\noindent| has
+% been moved elsewhere and became |\@parboxrestore| after a bug report from
+% \lsthelper{Frank~Mittelbach}{2004/02/13}{Re: Info: Inkompatibilit\"at
+% zwischen caption und listings}.
+%    \begin{macrocode}
+\def\fnum@lstlisting{%
+  \lstlistingname
+  \ifx\lst@@caption\@empty\else~\thelstlisting\fi}%
+%    \end{macrocode}
+% Captions are set only for display style listings -- thanks to
+% \lsthelper{Peter~L\"offler}{2004/04/24}{pdfTeX warning (dest): name{figure.1}
+% has been referenced but does not exist} for reporting the bug and to
+% \lsthelper{Axel~Sommerfeldt}{2004/02/27}{Re: caption + listings + hyperref}
+% for analyzing the bug.
+% We |\refstepcounter| the listing counter if and only if |\lst@@caption| is
+% not empty. Otherwise we ensure correct hyper-references,
+% see |\lst@HRefStepCounter| below. We do this once a listing, namely at the
+% top.
+%    \begin{macrocode}
+\def\lst@MakeCaption#1{%
+  \lst@ifdisplaystyle
+    \ifx #1t%
+        \ifx\lst@@caption\@empty\expandafter\lst@HRefStepCounter \else
+                                \expandafter\refstepcounter
+        \fi {lstlisting}%
+        \ifx\lst@label\@empty\else \label{\lst@label}\fi
+%    \end{macrocode}
+% The following code has been moved here from the \hookname{Init} hook after
+% a bug report from \lsthelper{Rolf~Niepraschk}{2003/06/11}{pagebreak between
+% caption and listing}. Moreover the initialization of |\lst@name| et al have
+% been inserted here after a bug report from \lsthelper{Werner~Struckmann}
+% {2003/06/25}{undefined control sequence \lst@name}.
+% We make a `lol' entry if the name is neither empty nor a single space. But
+% we test |\lst@|(|@|)|caption| and |\lst@ifnolol| first.
+%    \begin{macrocode}
+        \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+        \global\let\lst@name\lst@arg \global\let\lstname\lst@name
+        \lst@ifnolol\else
+            \ifx\lst@@caption\@empty
+                \ifx\lst@caption\@empty
+                    \ifx\lst@intname\@empty \else \def\lst@temp{ }%
+                    \ifx\lst@intname\lst@temp \else
+                        \addcontentsline{lol}{lstlisting}\lst@name
+                    \fi\fi
+                \fi
+            \else
+                \addcontentsline{lol}{lstlisting}%
+                    {\protect\numberline{\thelstlisting}\lst@@caption}%
+            \fi
+         \fi
+     \fi
+%    \end{macrocode}
+% We make a caption if and only if the caption is not empty and the user
+% requested a caption at |#1| $\in\{\mathtt t,\mathtt b\}$. To disallow
+% pagebreaks between caption (or title) and a listing, we redefine the
+% primitive |\vskip| locally to insert |\nobreak|s. Note that we allow
+% pagebreaks in front of a `top-caption' and after a `bottom-caption'.
+% Also, the |\ignorespaces| in the |\@makecaption| call is added to match
+% what \LaTeX\ does in |\@caption|; the AMSbook class (and perhaps others)
+% assume this is present and attempt to strip it off when testing for an
+% empty caption, causing a bug noted by \lsthelper{Xiaobo~Peng}{2006/06/29}%
+% {captions not shown with amsbook class}.
+% \begin{TODO}
+% This redefinition is a brute force method. Is there a better one?
+% \end{TODO}
+%    \begin{macrocode}
+    \ifx\lst@caption\@empty\else
+        \lst@IfSubstring #1\lst@captionpos
+            {\begingroup \let\@@vskip\vskip
+             \def\vskip{\afterassignment\lst@vskip \@tempskipa}%
+             \def\lst@vskip{\nobreak\@@vskip\@tempskipa\nobreak}%
+             \par\@parboxrestore\normalsize\normalfont % \noindent (AS)
+             \ifx #1t\allowbreak \fi
+             \ifx\lst@title\@empty
+                 \lst@makecaption\fnum@lstlisting{\ignorespaces \lst@caption}
+             \else
+                 \lst@maketitle\lst@title % (AS)
+             \fi
+             \ifx #1b\allowbreak \fi
+             \endgroup}{}%
+    \fi
+  \fi}
+%    \end{macrocode}
+% I've inserted |\normalsize| after a bug report from
+% \lsthelper{Andreas~Matthias}{2000/01/04}{caption affected by basicstyle}
+% and moved it in front of |\@makecaption| after receiving another from
+% \lsthelper{Sonja~Weidmann}{2000/02/01}{listings and caption packages
+% not compatible}.
+% \end{macro}
+%
+% \begin{macro}{\lst@makecaption}
+% \begin{macro}{\lst@maketitle}
+% Axel proposed the first definition. The other two are default definitions.
+% They may be adjusted to make \packagename{listings} compatible with other
+% packages and classes.
+%    \begin{macrocode}
+\def\lst@makecaption{\@makecaption}
+\def\lst@maketitle{\@makecaption\lst@title@dropdelim}
+\def\lst@title@dropdelim#1{\ignorespaces}
+%    \end{macrocode}
+% The following \packagename{caption}(\packagename{2}) support comes also from
+% Axel.
+%    \begin{macrocode}
+\AtBeginDocument{%
+\@ifundefined{captionlabelfalse}{}{%
+  \def\lst@maketitle{\captionlabelfalse\@makecaption\@empty}}%
+\@ifundefined{caption@startrue}{}{%
+  \def\lst@maketitle{\caption@startrue\@makecaption\@empty}}%
+}
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\lst@HRefStepCounter}
+% This macro sets the listing number to a negative value since the user
+% shouldn't refer to such a listing. If the \packagename{hyperref} package
+% is present, we use `lstlisting' (argument from above) to hyperref to.
+% The groups have been added to prevent other packages (namely
+% \packagename{tabularx}) from reading the locally changed counter
+% and writing it back globally. Thanks to \lsthelper{Michael~Niedermair}
+% {2001/09/18}{strange numbering of listings} for the report. Unfortunately
+% this localization led to another bug, see |\theHlstnumber|.
+%    \begin{macrocode}
+\def\lst@HRefStepCounter#1{%
+    \begingroup
+    \c@lstlisting\lst@neglisting
+    \advance\c@lstlisting\m@ne \xdef\lst@neglisting{\the\c@lstlisting}%
+    \ifx\hyper@refstepcounter\@undefined\else
+        \hyper@refstepcounter{#1}%
+    \fi
+    \endgroup}
+\gdef\lst@neglisting{\z@}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{boxpos}
+% \begin{macro}{\lst@boxtrue}
+% sets the vertical alignment of the (possibly) used box respectively indicates
+% that a box is used.
+%    \begin{macrocode}
+\lst@Key{boxpos}{c}{\def\lst@boxpos{#1}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\lst@boxtrue{\let\lst@ifbox\iftrue}
+\let\lst@ifbox\iffalse
+%    \end{macrocode}
+% \end{macro}\end{lstkey}
+%
+% \begin{lstkey}{float}
+% \begin{lstkey}{floatplacement}
+% Matthias Zenger asked for double-column floats, so I've inserted some code.
+% We first check for a star \ldots
+%    \begin{macrocode}
+\lst@Key{float}\relax[\lst@floatplacement]{%
+    \lstKV@SwitchCases{#1}%
+    {true&\let\lst@floatdefault\lst@floatplacement
+          \let\lst@float\lst@floatdefault\\%
+     false&\let\lst@floatdefault\relax
+           \let\lst@float\lst@floatdefault
+    }{\def\lst@next{\@ifstar{\let\lst@beginfloat\@dblfloat
+                             \let\lst@endfloat\end@dblfloat
+                             \lst@KFloat}%
+                            {\let\lst@beginfloat\@float
+                             \let\lst@endfloat\end@float
+                             \lst@KFloat}}
+      \edef\lst@float{#1}%
+      \expandafter\lst@next\lst@float\relax}}
+%    \end{macrocode}
+% \ldots\ and define |\lst@float|.
+%    \begin{macrocode}
+\def\lst@KFloat#1\relax{%
+    \ifx\@empty#1\@empty
+        \let\lst@float\lst@floatplacement
+    \else
+        \def\lst@float{#1}%
+    \fi}
+%    \end{macrocode}
+% The setting |\lst@AddToHook{PreSet}{\let\lst@float\relax}| has been
+% changed on request of \lsthelper{Tanguy~Fautr\'e}{2004/02/02}{listings
+% not following float directive?}. This also led to some adjustments above.
+%    \begin{macrocode}
+\lst@Key{floatplacement}{tbp}{\def\lst@floatplacement{#1}}
+\lst@AddToHook{PreSet}{\let\lst@float\lst@floatdefault}
+\lst@AddToHook{TextStyle}{\let\lst@float\relax}
+\let\lst@floatdefault\relax % init
+%    \end{macrocode}
+% |\lst@doendpe| is set according to |\lst@float| -- thanks to
+% \lsthelper{Andreas~Schmidt}{2004/05/15}{wrong spacing when a floating listing
+% follows \section} and \lsthelper{Heiko~Oberdiek}{2004/05/18}{dito}.
+%    \begin{macrocode}
+\lst@AddToHook{DeInit}{%
+    \ifx\lst@float\relax
+        \global\let\lst@doendpe\@doendpe
+    \else
+        \global\let\lst@doendpe\@empty
+    \fi}
+%    \end{macrocode}
+% The float type |\ftype@lstlisting| is set according to whether the
+% \packagename{float} package is loaded and whether \texttt{figure} and
+% \texttt{table} floats are defined. This is done at |\begin{document}| to
+% make the code independent of the order of package loading.
+%    \begin{macrocode}
+\AtBeginDocument{%
+\@ifundefined{c@float@type}%
+    {\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}}
+    {\edef\ftype@lstlisting{\the\c@float@type}%
+     \addtocounter{float@type}{\value{float@type}}}%
+}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+%
+% \subsection{Init and EOL}
+%
+% \begin{lstkey}{aboveskip}
+% \begin{lstkey}{belowskip}
+% We define and initialize these keys and prevent extra spacing for `inline'
+% listings (in particular if \packagename{fancyvrb} interface is active,
+% problem reported by \lsthelper{Denis~Girou}{1999/08/03}{wrong spacing}).
+%    \begin{macrocode}
+\lst@Key{aboveskip}\medskipamount{\def\lst@aboveskip{#1}}
+\lst@Key{belowskip}\medskipamount{\def\lst@belowskip{#1}}
+\lst@AddToHook{TextStyle}
+    {\let\lst@aboveskip\z@ \let\lst@belowskip\z@}
+%    \end{macrocode}
+% \end{lstkey}\end{lstkey}
+%
+% \begin{lstkey}{everydisplay}
+% \begin{macro}{\lst@ifdisplaystyle}
+% Some things depend on display-style listings.
+%    \begin{macrocode}
+\lst@Key{everydisplay}{}{\def\lst@EveryDisplay{#1}}
+\lst@AddToHook{TextStyle}{\let\lst@ifdisplaystyle\iffalse}
+\lst@AddToHook{DisplayStyle}{\let\lst@ifdisplaystyle\iftrue}
+\let\lst@ifdisplaystyle\iffalse
+%    \end{macrocode}
+% \end{macro}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@Init}
+% Begin a float or multicolumn environment if requested.
+%    \begin{macrocode}
+\def\lst@Init#1{%
+    \begingroup
+    \ifx\lst@float\relax\else
+        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%
+        \expandafter\@tempa
+    \fi
+    \ifx\lst@multicols\@empty\else
+        \edef\lst@next{\noexpand\multicols{\lst@multicols}}
+        \expandafter\lst@next
+    \fi
+%    \end{macrocode}
+% In restricted horizontal \TeX\ mode we switch to |\lst@boxtrue|.
+% In that case we make appropriate box(es) around the listing.
+%    \begin{macrocode}
+    \ifhmode\ifinner \lst@boxtrue \fi\fi
+    \lst@ifbox
+        \lsthk@BoxUnsafe
+        \hbox to\z@\bgroup
+             $\if t\lst@boxpos \vtop
+        \else \if b\lst@boxpos \vbox
+        \else \vcenter \fi\fi
+        \bgroup \par\noindent
+    \else
+        \lst@ifdisplaystyle
+            \lst@EveryDisplay
+            \par\penalty-50\relax
+            \vspace\lst@aboveskip
+        \fi
+    \fi
+%    \end{macrocode}
+% Moved |\vspace| after |\par|---or we can get an empty line atop listings.
+% Bug reported by \lsthelper{Jim~Hefferon}{1999/08/27}{empty line before
+% listings with |\lstinputlisting|}.
+%
+% Now make the top caption.
+%    \begin{macrocode}
+    \normalbaselines
+    \abovecaptionskip\lst@abovecaption\relax
+    \belowcaptionskip\lst@belowcaption\relax
+    \lst@MakeCaption t%
+%    \end{macrocode}
+% Some initialization.
+% I removed |\par\nointerlineskip| |\normalbaselines| after bug report from
+% \lsthelper{Jim~Hefferon}{1999/08/23}{bad vertical space after lstlisting}.
+% He reported the same problem as Aidan Philip Heerdegen (see below), but I
+% immediately saw the bug here since Jim used |\parskip|$\,\neq0$.
+%    \begin{macrocode}
+    \lsthk@PreInit \lsthk@Init
+    \lst@ifdisplaystyle
+        \global\let\lst@ltxlabel\@empty
+        \if@inlabel
+            \lst@ifresetmargins
+                \leavevmode
+            \else
+                \xdef\lst@ltxlabel{\the\everypar}%
+                \lst@AddTo\lst@ltxlabel{%
+                    \global\let\lst@ltxlabel\@empty
+                    \everypar{\lsthk@EveryLine\lsthk@EveryPar}}%
+            \fi
+        \fi
+        \everypar\expandafter{\lst@ltxlabel
+                              \lsthk@EveryLine\lsthk@EveryPar}%
+    \else
+        \everypar{}\let\lst@NewLine\@empty
+    \fi
+    \lsthk@InitVars \lsthk@InitVarsBOL
+%    \end{macrocode}
+% The end of line character chr(13)=|^^M| controls the processing, see the
+% definition of |\lst@MProcessListing| below.
+% The argument |#1| is either |\relax| or |\lstenv@backslash|.
+%    \begin{macrocode}
+    \lst@Let{13}\lst@MProcessListing
+    \let\lst@Backslash#1%
+    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%
+    \lst@InitFinalize}
+%    \end{macrocode}
+% Note: From version 0.19 on `listing processing' is implemented as an internal
+% mode, namely a mode with special character table. Since a bug report from
+% \lsthelper{Fermin~Reig}{2002/09/04}{bad top frame inside figure+centering}
+% |\rightskip| and the others are reset via \hookname{PreInit} and not via
+% \hookname{InitVars}.
+%    \begin{macrocode}
+\let\lst@InitFinalize\@empty % init
+\lst@AddToHook{PreInit}
+    {\rightskip\z@ \leftskip\z@ \parfillskip=\z@ plus 1fil
+     \let\par\@@par}
+\lst@AddToHook{EveryLine}{}% init
+\lst@AddToHook{EveryPar}{}% init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{showlines}
+% lets the user control whether empty lines at the end of a listing are
+% printed. But you know that if you've read the User's guide.
+%    \begin{macrocode}
+\lst@Key{showlines}f[t]{\lstKV@SetIf{#1}\lst@ifshowlines}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@DeInit}
+% Output the remaining characters and update all things. First I missed to
+% to use |\lst@ifdisplaystyle| here, but then \lsthelper{KP~Gores}{2001/07/11}
+% {\csname{par} after each \lstinline} reported a problem.
+% The |\everypar| has been put behind |\lsthk@ExitVars| after a bug report by
+% \lsthelper{Michael~Niedermair}{2002/05/14}{listings.sty und caption} and
+% I've added |\normalbaselines| after a bug report by \lsthelper{Georg~Rehm}
+% {2002/05/14}{listings.sty und lange captions} and |\normalcolor| after a
+% report by \lsthelper{Walter~E.~Brown}{2004/03/01}{captions at bottom of
+% listings inherit color from basicstyle}.
+%    \begin{macrocode}
+\def\lst@DeInit{%
+    \lst@XPrintToken \lst@EOLUpdate
+    \global\advance\lst@newlines\m@ne
+    \lst@ifshowlines
+        \lst@DoNewLines
+    \else
+        \setbox\@tempboxa\vbox{\lst@DoNewLines}%
+    \fi
+    \lst@ifdisplaystyle \par\removelastskip \fi
+    \lsthk@ExitVars\everypar{}\lsthk@DeInit\normalbaselines\normalcolor
+%    \end{macrocode}
+% Place the bottom caption.
+%    \begin{macrocode}
+    \lst@MakeCaption b%
+%    \end{macrocode}
+% Close the boxes if necessary and make a rule to get the right width.
+% I added the |\par\nointerlineskip| (and removed |\nointerlineskip| later
+% again) after receiving a bug report from \lsthelper{Aidan~Philip~Heerdegen}
+% {1999/07/23}{wrong vertical spacing}. |\everypar{}| is due to a bug report
+% from \lsthelper{Sonja~Weidmann}{2000/02/01}{listings and caption packages
+% not compatible}.
+%    \begin{macrocode}
+    \lst@ifbox
+        \egroup $\hss \egroup
+        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@
+    \else
+        \lst@ifdisplaystyle
+            \par\penalty-50\vspace\lst@belowskip
+        \fi
+    \fi
+%    \end{macrocode}
+% End the multicolumn environment and/or float if necessary.
+%    \begin{macrocode}
+    \ifx\lst@multicols\@empty\else
+        \def\lst@next{\global\let\@checkend\@gobble
+                      \endmulticols
+                      \global\let\@checkend\lst@@checkend}
+        \expandafter\lst@next
+    \fi
+    \ifx\lst@float\relax\else
+        \expandafter\lst@endfloat
+    \fi
+    \endgroup}
+\let\lst@@checkend\@checkend
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@maxwidth}
+% is to be allocated, initialized and updated.
+%    \begin{macrocode}
+\newdimen\lst@maxwidth % \global
+\lst@AddToHook{InitVars}{\global\lst@maxwidth\z@}
+\lst@AddToHook{InitVarsEOL}
+    {\ifdim\lst@currlwidth>\lst@maxwidth
+         \global\lst@maxwidth\lst@currlwidth
+     \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EOLUpdate}
+% What do you think this macro does?
+%    \begin{macrocode}
+\def\lst@EOLUpdate{\lsthk@EOL \lsthk@InitVarsEOL}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@MProcessListing}
+% This is what we have to do at EOL while processing a listing.
+% We output all remaining characters and update the variables.
+% If we've reached the last line, we check whether there is a next line
+% interval to input or not.
+%    \begin{macrocode}
+\def\lst@MProcessListing{%
+    \lst@XPrintToken \lst@EOLUpdate \lsthk@InitVarsBOL
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno>\lst@lastline
+        \lst@ifdropinput \lst@LeaveMode \fi
+        \ifx\lst@linerange\@empty
+            \expandafter\expandafter\expandafter\lst@EndProcessListing
+        \else
+            \lst@interrange
+            \lst@GetLineInterval
+            \expandafter\expandafter\expandafter\lst@SkipToFirst
+        \fi
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@EndProcessListing}
+% Default definition is |\endinput|.
+% This works for |\lstinputlisting|.
+%    \begin{macrocode}
+\let\lst@EndProcessListing\endinput
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{gobble}
+% The key sets the number of characters to gobble each line.
+%    \begin{macrocode}
+\lst@Key{gobble}{0}{\def\lst@gobble{#1}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@BOLGobble}
+% If the number is positive, we set a temporary counter and start a loop.
+%    \begin{macrocode}
+\def\lst@BOLGobble{%
+    \ifnum\lst@gobble>\z@
+        \@tempcnta\lst@gobble\relax
+        \expandafter\lst@BOLGobble@
+	\fi}
+%    \end{macrocode}
+% A nonpositive number terminates the loop (by not continuing).
+% Note: This is not the macro just used in |\lst@BOLGobble|.
+%    \begin{macrocode}
+\def\lst@BOLGobble@@{%
+    \ifnum\@tempcnta>\z@
+        \expandafter\lst@BOLGobble@
+    \fi}
+%    \end{macrocode}
+% If we gobble a backslash, we have to look whether this backslash ends an
+% environment. Whether the coming characters equal e.g.~|end{lstlisting}|,
+% we either end the environment or insert all just eaten characters after the
+% `continue loop' macro.
+%    \begin{macrocode}
+\def\lstenv@BOLGobble@@{%
+    \lst@IfNextChars\lstenv@endstring{\lstenv@End}%
+    {\advance\@tempcnta\m@ne \expandafter\lst@BOLGobble@@\lst@eaten}}
+%    \end{macrocode}
+% Now comes the loop: if we read |\relax|, EOL or FF, the next operation is
+% exactly the same token. Note that for FF (and tabs below) we test against
+% a macro which contains |\lst@ProcessFormFeed|. This was a bug analyzed by
+% \lsthelper{Heiko~Oberdiek}{2002/04/16}{Re: first experience ...}.
+%    \begin{macrocode}
+\def\lst@BOLGobble@#1{%
+    \let\lst@next#1%
+    \ifx \lst@next\relax\else
+    \ifx \lst@next\lst@MProcessListing\else
+    \ifx \lst@next\lst@processformfeed\else
+%    \end{macrocode}
+% Otherwise we use one of the two submacros.
+%    \begin{macrocode}
+    \ifx \lst@next\lstenv@backslash
+        \let\lst@next\lstenv@BOLGobble@@
+    \else
+        \let\lst@next\lst@BOLGobble@@
+%    \end{macrocode}
+% Now we really gobble characters. A tabulator decreases the temporary counter
+% by |\lst@tabsize| (and deals with remaining amounts, if necessary), \ldots
+%    \begin{macrocode}
+        \ifx #1\lst@processtabulator
+            \advance\@tempcnta-\lst@tabsize\relax
+            \ifnum\@tempcnta<\z@
+                \lst@length-\@tempcnta \lst@PreGotoTabStop
+            \fi
+%    \end{macrocode}
+% \ldots\space whereas any other character decreases the counter by one.
+%    \begin{macrocode}
+        \else
+            \advance\@tempcnta\m@ne
+        \fi
+    \fi \fi \fi \fi
+    \lst@next}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\lst@processformfeed{\lst@ProcessFormFeed}
+\def\lst@processtabulator{\lst@ProcessTabulator}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{List of listings}
+%
+% \begin{lstkey}{name}
+% \begin{macro}{\lstname}
+% \begin{macro}{\lst@name}
+% \begin{macro}{\lst@intname}
+% Each pretty-printing command values |\lst@intname| before setting any keys.
+%    \begin{macrocode}
+\lst@Key{name}\relax{\def\lst@intname{#1}}
+\lst@AddToHookExe{PreSet}{\global\let\lst@intname\@empty}
+\lst@AddToHook{PreInit}{%
+    \let\lst@arg\lst@intname \lst@ReplaceIn\lst@arg\lst@filenamerpl
+    \global\let\lst@name\lst@arg \global\let\lstname\lst@name}
+%    \end{macrocode}
+% Use of |\lst@ReplaceIn| removes a bug first reported by
+% \lsthelper{Magne~Rudshaug}{1998/01/09}{_ and list of listings}.
+% Here is the replacement list.
+%    \begin{macrocode}
+\def\lst@filenamerpl{_\textunderscore $\textdollar -\textendash}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lstkey}
+%
+% \begin{macro}{\l@lstlisting}
+% prints one `lol' line.
+%    \begin{macrocode}
+\def\l@lstlisting#1#2{\@dottedtocline{1}{1.5em}{2.3em}{#1}{#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstlistlistingname}
+% contains simply the header name.
+%    \begin{macrocode}
+\lst@UserCommand\lstlistlistingname{Listings}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstlistoflistings}
+% We make local adjustments and call |\tableofcontents|. This way,
+% redefinitions of that macro (e.g.~without any |\MakeUppercase| inside)
+% also take effect on the list of listings.
+%    \begin{macrocode}
+\lst@UserCommand\lstlistoflistings{\bgroup
+    \let\contentsname\lstlistlistingname
+    \let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lol}}%
+    \tableofcontents \egroup}
+%    \end{macrocode}
+% For KOMA-script classes, we define it a la KOMA thanks to a bug report by
+% \lsthelper{Tino~Langer}{2003/11/01}{koma-script's listsleft option does not
+% affect lol}.  \lsthelper{Markus~Kohm}{2006/08/12}{koma-script support is 
+% broken} suggested a much-improved version of this, which also works with
+% the \packagename{float} package.  The following few comments are from Markus.
+%
+% Make use of |\float@listhead| if defined (e.g. using float or KOMA-Script)
+%    \begin{macrocode}
+\@ifundefined{float@listhead}{}{%
+  \renewcommand*{\lstlistoflistings}{%
+    \begingroup
+%    \end{macrocode}
+% Switch to one-column mode if the switch for switching is available.
+%    \begin{macrocode}
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@twocolumn
+          \@restonecoltrue\onecolumn
+        \else
+          \@restonecolfalse
+        \fi
+      }%
+      \float@listhead{\lstlistlistingname}%
+%    \end{macrocode}
+% Set |\parskip| to 0pt (should be!), |\parindent| to 0pt (better but not always
+% needed), |\parfillskip| to 0pt plus 1fil (should be!).
+%    \begin{macrocode}
+      \parskip\z@\parindent\z@\parfillskip \z@ \@plus 1fil%
+      \@starttoc{lol}%
+%    \end{macrocode}
+% Switch back to twocolumn (see above).
+%    \begin{macrocode}
+      \@ifundefined{@restonecoltrue}{}{%
+        \if@restonecol\twocolumn\fi
+      }%
+    \endgroup
+  }%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\float@addtolists}
+% The \packagename{float} package defines a generic way for packages to add
+% things (such as chapter names) to all of the lists of floats other than the
+% standard figure and table lists.  Each package that defines a list of
+% floats adds a command to |\float@addtolists|, and then packages (such as
+% the KOMA-script document classes) which wish to add things to all lists of
+% floats can then use it, without needing to be aware of all of the possible
+% lists that could exist.  Thanks to \lsthelper{Markus~Kohm}{-}{2007/02/25}
+% for the suggestion.
+%
+% Unfortunately, \packagename{float} defines this with |\newcommand|; thus,
+% to avoid conflict, we have to redefine it after \packagename{float} is 
+% loaded.  |\AtBeginDocument| is the easiest way to do this.  Again, thanks
+% to Markus for the advice.
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \@ifundefined{float@addtolists}%
+    {\gdef\float@addtolists#1{\addtocontents{lol}{#1}}}%
+    {\let\orig@float@addtolists\float@addtolists
+     \gdef\float@addtolists#1{%
+       \addtocontents{lol}{#1}%
+       \orig@float@addtolists{#1}}}%
+}%
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Inline listings}\label{iInlineListings}
+%
+% \subsubsection{Processing inline listings}
+%
+% \begin{macro}{\lstinline}
+% In addition to |\lsthk@PreSet|, we use |boxpos=b| and flexiblecolumns.
+% I've inserted |\leavevmode| after bug report from \lsthelper{Michael~Weber}
+% {1999/12/16}{wrong spacing in list environments}. \lsthelper{Olivier~Lecarme}
+% {2001/07/30}{inconsistent `break' when \lstinline is used inside caption}
+% reported a problem which has gone after removing |\let| |\lst@newlines|
+% |\@empty| (now |\lst@newlines| is a counter!). Unfortunately I don't know
+% the reason for inserting this code some time ago! At the end of the macro we
+% check the delimiter.
+%    \begin{macrocode}
+\newcommand\lstinline[1][]{%
+    \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+      \def\lst@boxpos{b}%
+      \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+      \lsthk@TextStyle
+      \@ifnextchar\bgroup{\afterassignment\lst@InlineG \let\@let@token}%
+                         \lstinline@}
+\def\lstinline@#1{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}}
+\lst@AddToHook{TextStyle}{}% init
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@AddToHook{SelectCharTable}{\lst@inlinechars}
+\global\let\lst@inlinechars\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InlineM}
+% \begin{macro}{\lst@InlineJ}
+% treat the cases of `normal' inlines and inline listings inside an argument.
+% In the first case the given character ends the inline listing and EOL within
+% such a listing immediately ends it and produces an error message.
+%    \begin{macrocode}
+\def\lst@InlineM#1{\gdef\lst@inlinechars{%
+    \lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}%
+    \lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty
+        \PackageError{Listings}{lstinline ended by EOL}\@ehc}}%
+    \lst@inlinechars}
+%    \end{macrocode}
+% In the other case we get all characters up to |#1|, make these characters
+% active, execute (typeset) them and end the listing (all via temporary macro).
+% That's all about it.
+%    \begin{macrocode}
+\def\lst@InlineJ#1{%
+    \def\lst@temp##1#1{%
+        \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg
+        \lst@DeInit\egroup}%
+    \lst@temp}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\lst@InlineG}
+% is experimental.
+%    \begin{macrocode}
+\def\lst@InlineG{%
+    \lst@Init\relax
+    \lst@IfNextCharActive{\lst@InlineM\}}%
+                         {\let\lst@arg\@empty \lst@InlineGJ}}
+\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest}
+\def\lst@InlineGJTest{%
+    \ifx\@let@token\egroup
+        \afterassignment\lst@InlineGJEnd
+        \expandafter\let\expandafter\@let@token
+    \else
+        \ifx\@let@token\@sptoken
+            \let\lst@next\lst@InlineGJReadSp
+        \else
+            \let\lst@next\lst@InlineGJRead
+        \fi
+        \expandafter\lst@next
+    \fi}
+\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup}
+\def\lst@InlineGJRead#1{%
+    \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ}
+\def\lst@InlineGJReadSp#1{%
+    \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}%
+    \lst@InlineGJ#1}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Short inline listing environments}
+%
+% The implementation in this section is based on the \packagename{shortvrb}
+% package, which is part of |doc.dtx| from the Standard \LaTeX\ documentation
+% package, version 2006/02/02 v2.1d.  Portions of it are thus copyright
+% 1993--2006 by The \LaTeX3 Project and copyright 1989--1999 by Frank
+% Mittelbach.
+%
+% \begin{macro}{\lstMakeShortInline}
+% \begin{macro}{\lstMakeShortInline@}
+% First, we supply an optional argument if it's omitted.
+%    \begin{macrocode}
+\newcommand\lstMakeShortInline[1][]{%
+  \def\lst@shortinlinedef{\lstinline[#1]}%
+  \lstMakeShortInline@}%
+\def\lstMakeShortInline@#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \lst@shortlstinlineinfo{Made }{#1}%
+    \lst@add@special{#1}%
+%    \end{macrocode}
+% The character's current catcode is stored in
+% |\lst@ShortInlineOldCatcode\|\meta{c}.
+%    \begin{macrocode}
+    \expandafter
+    \xdef\csname lst@ShortInlineOldCatcode\string#1\endcsname{\the\catcode`#1}%
+%    \end{macrocode}
+% The character is spliced into the definition using the same trick as
+% used in |\verb| (for instance), having activated |~| in a group.
+%    \begin{macrocode}
+    \begingroup
+      \catcode`\~\active  \lccode`\~`#1%
+      \lowercase{%
+%    \end{macrocode}
+% The character's old meaning is recorded
+% in |\lst@ShortInlineOldMeaning\|\meta{c} prior to assigning it a new one.
+%    \begin{macrocode}
+        \global\expandafter\let
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname~%
+          \expandafter\gdef\expandafter~\expandafter{\lst@shortinlinedef#1}}%
+    \endgroup
+%    \end{macrocode}
+% Finally the character is made active.
+%    \begin{macrocode}
+    \global\catcode`#1\active
+%    \end{macrocode}
+% If we suspect that \meta{c} is already a short reference, we tell
+% the user. Now he or she is responsible if anything goes wrong\,\dots
+% (Change in \packagename{listings}: We give a proper error here.)
+%    \begin{macrocode}
+  \else
+    \PackageError{Listings}%
+    {\string\lstMakeShorterInline\ definitions cannot be nested}%
+    {Use \string\lstDeleteShortInline first.}%
+    {}%
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\lstDeleteShortInline}
+%    \begin{macrocode}
+\def\lstDeleteShortInline#1{%
+  \expandafter\ifx\csname lst@ShortInlineOldCatcode\string#1\endcsname\relax
+    \PackageError{Listings}%
+    {#1 is not a short reference for \string\lstinline}%
+    {Use \string\lstMakeShortInline first.}%
+    {}%
+  \else
+    \lst@shortlstinlineinfo{Deleted }{#1 as}%
+    \lst@rem@special{#1}%
+    \global\catcode`#1\csname lst@ShortInlineOldCatcode\string#1\endcsname
+    \global \expandafter\let%
+      \csname lst@ShortInlineOldCatcode\string#1\endcsname \relax
+    \ifnum\catcode`#1=\active
+      \begingroup
+        \catcode`\~\active  \lccode`\~`#1%
+        \lowercase{%
+          \global\expandafter\let\expandafter~%
+          \csname lst@ShortInlineOldMeaning\string#1\endcsname}%
+      \endgroup
+    \fi
+  \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@shortlstinlineinfo}
+%    \begin{macrocode}
+\def\lst@shortlstinlineinfo#1#2{%
+     \PackageInfo{Listings}{%
+       #1\string#2 a short reference for \string\lstinline}}
+%    \end{macrocode}
+%  \end{macro}
+%
+% \begin{macro}{\lst@add@special}
+% This helper macro adds its argument to the
+% |\dospecials| macro which is conventionally used by verbatim macros
+% to alter the catcodes of the currently active characters.  We need
+% to add |\do\|\meta{c} to the expansion of |\dospecials| after
+% removing the character if it was already there to avoid multiple
+% copies building up should |\lstMakeShortInline| not be balanced by
+% |\lstDeleteShortInline| (in case anything that uses |\dospecials|
+% cares about repetitions).
+%    \begin{macrocode}
+\def\lst@add@special#1{%
+  \lst@rem@special{#1}%
+  \expandafter\gdef\expandafter\dospecials\expandafter
+    {\dospecials \do #1}%
+%    \end{macrocode}
+% Similarly we have to add |\@makeother\|\meta{c} to |\@sanitize|
+% (which is used in things like "\index" to re-catcode all special
+% characters except braces).
+%    \begin{macrocode}
+  \expandafter\gdef\expandafter\@sanitize\expandafter
+    {\@sanitize \@makeother #1}}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\lst@rem@special}
+% The inverse of |\lst@add@special| is slightly trickier.  |\do| is
+% re-defined to expand to nothing if its argument is the character of
+% interest, otherwise to expand simply to the argument.  We can then
+% re-define |\dospecials| to be the expansion of itself.  The space
+% after |=`##1| prevents an expansion to |\relax|!
+%    \begin{macrocode}
+\def\lst@rem@special#1{%
+  \def\do##1{%
+    \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}%
+  \xdef\dospecials{\dospecials}%
+%    \end{macrocode}
+% Fixing |\@sanitize| is the same except that we need to re-define
+% |\@makeother| which obviously needs to be done in a group. 
+%    \begin{macrocode}
+  \begingroup
+    \def\@makeother##1{%
+      \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}%
+    \xdef\@sanitize{\@sanitize}%
+  \endgroup}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The input command}\label{iTheInputCommand}
+%
+% \begin{macro}{\lst@MakePath}
+% \begin{lstkey}{inputpath}
+% The macro appends a slash to a path if necessary.
+%    \begin{macrocode}
+\def\lst@MakePath#1{\ifx\@empty#1\@empty\else\lst@MakePath@#1/\@nil/\fi}
+\def\lst@MakePath@#1/{#1/\lst@MakePath@@}
+\def\lst@MakePath@@#1/{%
+    \ifx\@nil#1\expandafter\@gobble
+         \else \ifx\@empty#1\else #1/\fi \fi
+    \lst@MakePath@@}
+%    \end{macrocode}
+% Now we can empty the path or use |\lst@MakePath|.
+%    \begin{macrocode}
+\lst@Key{inputpath}{}{\edef\lst@inputpath{\lst@MakePath{#1}}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{macro}
+%
+% \begin{macro}{\lstinputlisting}
+% inputs the listing or asks the user for a new file name.
+%    \begin{macrocode}
+\def\lstinputlisting{%
+    \begingroup \lst@setcatcodes \lst@inputlisting}
+\newcommand\lst@inputlisting[2][]{%
+    \endgroup
+    \def\lst@set{#1}%
+    \IfFileExists{\lst@inputpath#2}%
+        {\expandafter\lst@InputListing\expandafter{\lst@inputpath#2}}%
+        {\filename@parse{\lst@inputpath#2}%
+         \edef\reserved@a{\noexpand\lst@MissingFileError
+             {\filename@area\filename@base}%
+             {\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
+         \reserved@a}%
+    \lst@doendpe \@newlistfalse \ignorespaces}
+%    \end{macrocode}
+% We use |\lst@doendpe| to remove indention at the beginning of the next
+% line---except there is an empty line after |\lstinputlisting|. Bug was
+% reported by \lsthelper{David~John~Evans}{1999/06/08}{indention after
+% listings} and \lsthelper{David~Carlisle}{1999/06/08}{LaTeX `display
+% environment' code} pointed me to the solution.
+% \end{macro}
+%
+% \begin{macro}{\lst@MissingFileError}
+% is a derivation of \LaTeX's |\@missingfileerror|. The parenthesis have been
+% added after \lsthelper{Heiko~Oberdiek}{2003/01/14}{File `Makefile.tex' not
+% found} reported about a problem discussed on TEX-D-L.
+%    \begin{macrocode}
+\def\lst@MissingFileError#1#2{%
+    \typeout{^^J! Package Listings Error: File `#1(.#2)' not found.^^J%
+        ^^JType X to quit or  to proceed,^^J%
+        or enter new name. (Default extension: #2)^^J}%
+    \message{Enter file name: }%
+    {\endlinechar\m@ne \global\read\m@ne to\@gtempa}%
+%    \end{macrocode}
+% Typing |x| or |X| exits.
+%    \begin{macrocode}
+    \ifx\@gtempa\@empty \else
+        \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+        \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+%    \end{macrocode}
+% In all other cases we try the new file name.
+%    \begin{macrocode}
+        \filename@parse\@gtempa
+        \edef\filename@ext{%
+            \ifx\filename@ext\relax#2\else\filename@ext\fi}%
+        \edef\reserved@a{\noexpand\IfFileExists %
+                {\filename@area\filename@base.\filename@ext}%
+            {\noexpand\lst@InputListing %
+                {\filename@area\filename@base.\filename@ext}}%
+            {\noexpand\lst@MissingFileError
+                {\filename@area\filename@base}{\filename@ext}}}%
+        \expandafter\reserved@a %
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@ifdraft}
+% makes use of |\lst@ifprint|. \lsthelper{Enrico~Straube}{2002/02/12}
+% {de.comp.text.tex: listings und draft Modus} requested the final option.
+%    \begin{macrocode}
+\let\lst@ifdraft\iffalse
+\DeclareOption{draft}{\let\lst@ifdraft\iftrue}
+\DeclareOption{final}{\let\lst@ifdraft\iffalse}
+\lst@AddToHook{PreSet}
+    {\lst@ifdraft
+         \let\lst@ifprint\iffalse
+         \@gobbletwo\fi\fi
+     \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@InputListing}
+% The one and only argument is the file name, but we have the `implicit'
+% argument |\lst@set|. Note that |\lst@Init| takes |\relax| as argument.
+%    \begin{macrocode}
+\def\lst@InputListing#1{%
+    \begingroup
+      \lsthk@PreSet \gdef\lst@intname{#1}%
+      \expandafter\lstset\expandafter{\lst@set}%
+      \lsthk@DisplayStyle
+      \catcode\active=\active
+      \lst@Init\relax \let\lst@gobble\z@
+      \lst@SkipToFirst
+      \lst@ifprint \def\lst@next{\input{#1}}%
+             \else \let\lst@next\@empty \fi
+      \lst@next
+      \lst@DeInit
+    \endgroup}
+%    \end{macrocode}
+% The line |\catcode\active=\active|, which makes the CR-character active,
+% has been added after a bug report by \lsthelper{Rene~H.~Larsen}{2002/04/15}
+% {\lstinputlistings and texcl conflict}.
+% \end{macro}
+%
+% \begin{macro}{\lst@SkipToFirst}
+% The end of line character either processes the listing or is responsible for
+% dropping lines up to first printing line.
+%    \begin{macrocode}
+\def\lst@SkipToFirst{%
+    \ifnum \lst@lineno<\lst@firstline
+%    \end{macrocode}
+% We drop the input and redefine the end of line characters.
+%    \begin{macrocode}
+        \lst@BeginDropInput\lst@Pmode
+        \lst@Let{13}\lst@MSkipToFirst
+        \lst@Let{10}\lst@MSkipToFirst
+    \else
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@MSkipToFirst}
+% We just look whether to drop more lines or to leave the mode which restores
+% the definition of chr(13) and chr(10).
+%    \begin{macrocode}
+\def\lst@MSkipToFirst{%
+    \global\advance\lst@lineno\@ne
+    \ifnum \lst@lineno=\lst@firstline
+        \lst@LeaveMode \global\lst@newlines\z@
+        \lsthk@InitVarsBOL
+        \expandafter\lst@BOLGobble
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The environment}
+%
+%
+% \subsubsection{Low-level processing}
+%
+% \begin{macro}{\lstenv@DroppedWarning}
+% gives a warning if characters have been dropped.
+%    \begin{macrocode}
+\def\lstenv@DroppedWarning{%
+    \ifx\lst@dropped\@undefined\else
+        \PackageWarning{Listings}{Text dropped after begin of listing}%
+    \fi}
+\let\lst@dropped\@undefined % init
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@Process}
+% We execute `|\lstenv@ProcessM|' or |\lstenv@ProcessJ| according to whether we
+% find an active EOL or a nonactive |^^J|.
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lstenv@Process#1{%
+    \ifx~#1%
+%    \end{macrocode}
+% We make no extra |\lstenv@ProcessM| definition since there is nothing to do
+% at all if we've found an active EOL.
+%    \begin{macrocode}
+        \lstenv@DroppedWarning \let\lst@next\lst@SkipToFirst
+    \else\ifx^^J#1%
+        \lstenv@DroppedWarning \let\lst@next\lstenv@ProcessJ
+    \else
+        \let\lst@dropped#1\let\lst@next\lstenv@Process
+    \fi \fi
+    \lst@next}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@ProcessJ}
+% Now comes the horrible scenario: a listing inside an argument. We've
+% already worked in section \ref{iApplicationsTo} for this. Here we must get
+% all characters up to `end environment'. We distinguish the cases `command
+% fashion' and `true environment'.
+%    \begin{macrocode}
+\def\lstenv@ProcessJ{%
+    \let\lst@arg\@empty
+    \ifx\@currenvir\lstenv@name
+        \expandafter\lstenv@ProcessJEnv
+    \else
+%    \end{macrocode}
+% The first case is pretty simple: The code is terminated by
+% |\end|\meta{name of environment}. Thus we expand that control sequence
+% before defining a temporary macro, which gets the listing and does all
+% the rest. Back to the definition of |\lstenv@ProcessJ| we call the
+% temporary macro after expanding |\fi|.
+%    \begin{macrocode}
+        \expandafter\def\expandafter\lst@temp\expandafter##1%
+            \csname end\lstenv@name\endcsname
+                {\lst@InsideConvert{##1}\lstenv@ProcessJ@}%
+        \expandafter\lst@temp
+    \fi}
+%    \end{macrocode}
+% We must append an active backslash and the `end string' to |\lst@arg|. So all
+% (in fact most) other processing won't notice that the code has been inside
+% an argument. But the EOL character is chr(10)=|^^J| now and not chr(13).
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@ProcessJ@{%
+    \lst@lExtend\lst@arg
+        {\expandafter\ \expandafter~\lstenv@endstring}%
+    \catcode10=\active \lst@Let{10}\lst@MProcessListing
+%    \end{macrocode}
+% We execute |\lst@arg| to typeset the listing.
+%    \begin{macrocode}
+    \lst@SkipToFirst \lst@arg}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@ProcessJEnv}
+% The `true environment' case is more complicated. We get all characters up to
+% an |\end| and the following argument. If that equals |\lstenv@name|, we have
+% found the end of environment and start typesetting.
+%    \begin{macrocode}
+\def\lstenv@ProcessJEnv#1\end#2{\def\lst@temp{#2}%
+    \ifx\lstenv@name\lst@temp
+        \lst@InsideConvert{#1}%
+        \expandafter\lstenv@ProcessJ@
+    \else
+%    \end{macrocode}
+% Otherwise we append the characters including the eaten |\end| and the eaten
+% argument to current |\lst@arg|. And we look for the end of environment again.
+%    \begin{macrocode}
+        \lst@InsideConvert{#1\\end\{#2\}}%
+        \expandafter\lstenv@ProcessJEnv
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@backslash}
+% Coming to a backslash we either end the listing or process a backslash and
+% insert the eaten characters again.
+%    \begin{macrocode}
+\def\lstenv@backslash{%
+    \lst@IfNextChars\lstenv@endstring
+        {\lstenv@End}%
+        {\expandafter\lsts@backslash \lst@eaten}}%
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@End}
+% This macro has just been used and terminates a listing environment:
+% We call the `end environment' macro using |\end| or as a command.
+%    \begin{macrocode}
+\def\lstenv@End{%
+    \ifx\@currenvir\lstenv@name
+        \edef\lst@next{\noexpand\end{\lstenv@name}}%
+    \else
+        \def\lst@next{\csname end\lstenv@name\endcsname}%
+    \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Defining new environments}
+%
+% \begin{macro}{\lstnewenvironment}
+% Now comes the main command. We define undefined environments only. On the
+% parameter text |#1#2#| (in particular the last sharp) see the paragraph
+% following example 20.5 on page 204 of `The \TeX book'.
+%    \begin{macrocode}
+\lst@UserCommand\lstnewenvironment#1#2#{%
+    \@ifundefined{#1}%
+        {\let\lst@arg\@empty
+         \lst@XConvert{#1}\@nil
+         \expandafter\lstnewenvironment@\lst@arg{#1}{#2}}%
+        {\PackageError{Listings}{Environment `#1' already defined}\@eha
+         \@gobbletwo}}
+\def\@tempa#1#2#3{%
+\gdef\lstnewenvironment@##1##2##3##4##5{%
+    \begingroup
+%    \end{macrocode}
+% A lonely `end environment' produces an error.
+%    \begin{macrocode}
+    \global\@namedef{end##2}{\lstenv@Error{##2}}%
+%    \end{macrocode}
+% The `main' environment macro defines the environment name for later use and
+% calls a submacro getting all arguments. We open a group and make EOL active.
+% This ensures |\@ifnextchar[| not to read characters of the listing---it reads
+% the active EOL instead.
+%    \begin{macrocode}
+    \global\@namedef{##2}{\def\lstenv@name{##2}%
+        \begingroup \lst@setcatcodes \catcode\active=\active
+        \csname##2@\endcsname}%
+%    \end{macrocode}
+% The submacro is defined via |\new@command|. We misuse |\l@ngrel@x| to make
+% the definition |\global| and refine \LaTeX's |\@xargdef|.
+%    \begin{macrocode}
+    \let\l@ngrel@x\global
+    \let\@xargdef\lstenv@xargdef
+    \expandafter\new@command\csname##2@\endcsname##3%
+%    \end{macrocode}
+% First we execute |##4|=\meta{begin code}. Then follows the definition of
+% the terminating string (|end{lstlisting}| or |endlstlisting|, for example):
+%    \begin{macrocode}
+        {\lsthk@PreSet ##4%
+         \ifx\@currenvir\lstenv@name
+             \def\lstenv@endstring{#1#2##1#3}%
+         \else
+             \def\lstenv@endstring{#1##1}%
+         \fi
+%    \end{macrocode}
+% We redefine (locally) `end environment' since ending is legal now.
+% Note that the redefinition also works inside a \TeX\ comment line.
+%    \begin{macrocode}
+         \@namedef{end##2}{\lst@DeInit ##5\endgroup
+                          \lst@doendpe \@ignoretrue}%
+%    \end{macrocode}
+% |\lst@doendpe| again removes the indention problem.
+%
+% Finally we start the processing. The |\lst@EndProcessListing| assignment
+% has been moved in front of |\lst@Init| after a bug report by
+% \lsthelper{Andreas~Deininger}{2002/11/11}{Compiling just stops}.
+%    \begin{macrocode}
+         \lsthk@DisplayStyle
+         \let\lst@EndProcessListing\lstenv@SkipToEnd
+         \lst@Init\lstenv@backslash
+         \lst@ifprint
+             \expandafter\expandafter\expandafter\lstenv@Process
+         \else
+             \expandafter\lstenv@SkipToEnd
+         \fi
+         \lst@insertargs}%
+    \endgroup}%
+}
+\let\lst@arg\@empty \lst@XConvert{end}\{\}\@nil
+\expandafter\@tempa\lst@arg
+\let\lst@insertargs\@empty
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@xargdef}
+% This is a derivation of \LaTeX's |\@xargdef|. We expand the submacro's name,
+% use |\gdef| instead of |\def|, and hard code a kind of |\@protected@testopt|.
+%    \begin{macrocode}
+\def\lstenv@xargdef#1{
+    \expandafter\lstenv@xargdef@\csname\string#1\endcsname#1}
+\def\lstenv@xargdef@#1#2[#3][#4]#5{%
+  \@ifdefinable#2{%
+       \gdef#2{%
+          \ifx\protect\@typeset@protect
+            \expandafter\lstenv@testopt
+          \else
+            \@x@protect#2%
+          \fi
+          #1%
+          {#4}}%
+       \@yargdef
+          #1%
+           \tw@
+           {#3}%
+           {#5}}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@testopt}
+% The difference between this macro and |\@testopt| is that we temporaryly
+% reset the catcode of the EOL character |^^M| to read the optional argument.
+%    \begin{macrocode}
+\long\def\lstenv@testopt#1#2{%
+  \@ifnextchar[{\catcode\active5\relax \lstenv@testopt@#1}%
+               {#1[{#2}]}}
+\def\lstenv@testopt@#1[#2]{%
+    \catcode\active\active
+    #1[#2]}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@SkipToEnd}
+% We use the temporary definition
+% \begin{itemize}\item[]
+%    |\long\def\lst@temp##1\|\meta{content of \textup{\cs{lstenv@endstring}}}|{\lstenv@End}|
+% \end{itemize}
+% which gobbles all characters up to the end of environment and finishes it.
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\\\lowercase{%
+\gdef\lstenv@SkipToEnd{%
+    \long\expandafter\def\expandafter\lst@temp\expandafter##\expandafter
+        1\expandafter~\lstenv@endstring{\lstenv@End}%
+    \lst@temp}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstenv@Error}
+% is called by a lonely `end environment'.
+%    \begin{macrocode}
+\def\lstenv@Error#1{\PackageError{Listings}{Extra \string\end#1}%
+    {I'm ignoring this, since I wasn't doing a \csname#1\endcsname.}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@TestEOLChar}
+% Here we test for the two possible EOL characters.
+%    \begin{macrocode}
+\begingroup \lccode`\~=`\^^M\lowercase{%
+\gdef\lst@TestEOLChar#1{%
+    \def\lst@insertargs{#1}%
+    \ifx ~#1\@empty \else
+    \ifx^^J#1\@empty \else
+        \global\let\lst@intname\lst@insertargs
+        \let\lst@insertargs\@empty
+    \fi \fi}
+}\endgroup
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{lstlisting}
+% The awkward work is done, the definition is quite easy now. We test whether
+% the user has given the name argument, set the keys, and deal with
+% continued line numbering.
+%    \begin{macrocode}
+\lstnewenvironment{lstlisting}[2][]
+    {\lst@TestEOLChar{#2}%
+     \lstset{#1}%
+     \csname\@lst @SetFirstNumber\endcsname}
+    {\csname\@lst @SaveFirstNumber\endcsname}
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \end{environment}
+%
+%
+% \section{Documentation support}
+%
+% \begin{syntax}
+% \item[0.19]
+%   |\begin{lstsample}|\marg{point list}\marg{left}\marg{right}
+%
+%   \leavevmode\hspace*{-\leftmargini}|\end{lstsample}|
+%
+%       Roughly speaking all material in between this environment is executed
+%       `on the left side' and typeset verbatim on the right. \meta{left} is
+%       executed before the left side is typeset, and similarly \meta{right}
+%       before the right-hand side.
+%
+%       \meta{point list} is used as argument to the \keyname{point} key.
+%       This is a special key used to highlight the keys in the examples.
+%
+% \item[1.0]
+%   |\begin{lstxsample}|\marg{point list}
+%
+%   \leavevmode\hspace*{-\leftmargini}|\end{lstxsample}|
+%
+%       The material in between is (a) added to the left side of the next
+%       \texttt{lstsample} environment and (b) typeset verbatim using the
+%       whole line width.
+%
+% \item[0.21] |\newdocenvironment|\marg{name}\marg{short name}\marg{begin code}\marg{end code}
+%
+%       The \meta{name} environment can be used in the same way as `macro'.
+%       The provided(!) definitions
+%           |\Print|\meta{short name}|Name|
+%       and |\SpecialMain|\meta{short name}|Index|
+%       control printing in the margin and indexing as the defaults
+%       |\PrintMacroName| and |\SpecialMainIndex| do.
+%
+%       This command is used to define the `aspect' and `lstkey' environments.
+%
+%\item[0.21] \texttt{macroargs} environment
+%
+%       This `enumerate' environment uses as labels `|#1| =', `|#2| =',
+%       and so on.
+%
+% \item \texttt{TODO} environment
+% \item \texttt{ALTERNATIVE} environment
+% \item \texttt{REMOVED} environment
+% \item \texttt{OLDDEF} environment
+%
+%       These environments enclose comments on `to do's', alternatives and
+%       removed or old definitions.
+%
+% \item[0.21] |\lstscanlanguages|\meta{list macro}\marg{input files}\marg{don't input}
+%
+%       scans \marg{input files}$\setminus$\marg{don't input} for language
+%       definitions. The available languages are stored in \meta{list macro}
+%       using the form \meta{language}|(|\meta{dialtect}|),|.
+%
+% \item[0.21] |\lstprintlanguages|\meta{list macro}
+%
+%       prints the languages in two column format.
+% \end{syntax}
+% and a lot of more simple commands.
+%
+%
+% \subsection{Required packages}
+%
+% Most of the `required' packages are optional.
+% \lsthelper{Stephan~Hennig}{2006-09-25}{documentation incompatible with algorithmic}
+% noted a bug where |\ifalgorithmic| conflicts with an update to |algorithmic.sty|, so
+% this has been changed to |\ifalgorithmicpkg|.
+%    \begin{macrocode}
+%<*doc>
+\let\lstdoc@currversion\fileversion
+\RequirePackage[writefile]{listings}[2004/09/07]
+\newif\iffancyvrb \IfFileExists{fancyvrb.sty}{\fancyvrbtrue}{}
+\newif\ifcolor \IfFileExists{color.sty}{\colortrue}{}
+\lst@false
+\newif\ifhyper
+\@ifundefined{pdfoutput}
+    {}
+    {\ifnum\pdfoutput>\z@ \lst@true \fi}
+\@ifundefined{VTeXversion}
+    {}
+    {\ifnum\OpMode>\z@ \lst@true \fi}
+\lst@if \IfFileExists{hyperref.sty}{\hypertrue}{}\fi
+\newif\ifalgorithmicpkg \IfFileExists{algorithmic.sty}{\algorithmicpkgtrue}{}
+\newif\iflgrind \IfFileExists{lgrind.sty}{\lgrindtrue}{}
+\iffancyvrb \RequirePackage{fancyvrb}\fi
+\ifhyper \RequirePackage[colorlinks]{hyperref}\else
+    \def\href#1{\texttt}\fi
+\ifcolor \RequirePackage{color}\fi
+\ifalgorithmicpkg \RequirePackage{algorithmic}\fi
+\iflgrind \RequirePackage{lgrind}\fi
+\RequirePackage{nameref}
+\RequirePackage{url}
+\renewcommand\ref{\protect\T@ref}
+\renewcommand\pageref{\protect\T@pageref}
+%    \end{macrocode}
+%
+%
+% \subsection{Environments for notes}
+%
+% \begin{macro}{\lst@BeginRemark}
+% \begin{macro}{\lst@EndRemark}
+% We begin with two simple definitions \ldots
+%    \begin{macrocode}
+\def\lst@BeginRemark#1{%
+    \begin{quote}\topsep0pt\let\small\footnotesize\small#1:}
+\def\lst@EndRemark{\end{quote}}
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{environment}{TODO}
+% \begin{environment}{ALTERNATIVE}
+% \begin{environment}{REMOVED}
+% \begin{environment}{OLDDEF}
+% \ldots\space used to define some environments.
+%    \begin{macrocode}
+\newenvironment{TODO}
+    {\lst@BeginRemark{To do}}{\lst@EndRemark}
+\newenvironment{ALTERNATIVE}
+    {\lst@BeginRemark{Alternative}}{\lst@EndRemark}
+\newenvironment{REMOVED}
+    {\lst@BeginRemark{Removed}}{\lst@EndRemark}
+\newenvironment{OLDDEF}
+    {\lst@BeginRemark{Old definition}}{\lst@EndRemark}
+%    \end{macrocode}
+% \end{environment}\end{environment}\end{environment}\end{environment}
+%
+% \begin{environment}{advise}
+% \begin{macro}{\advisespace}
+% The environment uses |\@listi|.
+%    \begin{macrocode}
+\def\advise{\par\list\labeladvise
+    {\advance\linewidth\@totalleftmargin
+     \@totalleftmargin\z@
+     \@listi
+     \let\small\footnotesize \small\sffamily
+     \parsep \z@ \@plus\z@ \@minus\z@
+     \topsep6\p@ \@plus1\p@\@minus2\p@
+     \def\makelabel##1{\hss\llap{##1}}}}
+\let\endadvise\endlist
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\advisespace{\hbox{}\qquad}
+\def\labeladvise{$\to$}
+%    \end{macrocode}
+% \end{macro}
+% \end{environment}
+%
+% \begin{environment}{syntax}
+% \begin{macro}{\syntaxbreak}
+% \begin{macro}{\syntaxnewline}
+% \begin{macro}{\syntaxor}
+% This environment uses |\list| with a special |\makelabel|, \ldots
+%    \begin{macrocode}
+\newenvironment{syntax}
+   {\list{}{\itemindent-\leftmargin
+    \def\makelabel##1{\hss\lst@syntaxlabel##1,,,,\relax}}}
+   {\endlist}
+%    \end{macrocode}
+% \ldots\ which is defined here. The comma separated items are placed as
+% needed.
+%    \begin{macrocode}
+\def\lst@syntaxlabel#1,#2,#3,#4\relax{%
+    \llap{\scriptsize\itshape#3}%
+    \def\lst@temp{#2}%
+    \expandafter\lst@syntaxlabel@\meaning\lst@temp\relax
+    \rlap{\hskip-\itemindent\hskip\itemsep\hskip\linewidth
+          \llap{\ttfamily\lst@temp}\hskip\labelwidth
+          \def\lst@temp{#1}%
+          \ifx\lst@temp\lstdoc@currversion#1\fi}}
+\def\lst@syntaxlabel@#1>#2\relax
+    {\edef\lst@temp{\zap@space#2 \@empty}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newcommand*\syntaxnewline{\newline\hbox{}\kern\labelwidth}
+\newcommand*\syntaxor{\qquad or\qquad}
+\newcommand*\syntaxbreak
+    {\hfill\kern0pt\discretionary{}{\kern\labelwidth}{}}
+\let\syntaxfill\hfill
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{environment}
+%
+% \begin{macro}{\alternative}
+% iterates down the list and inserts vertical rule(s).
+%    \begin{macrocode}
+\def\alternative#1{\lst@true \alternative@#1,\relax,}
+\def\alternative@#1,{%
+    \ifx\relax#1\@empty
+        \expandafter\@gobble
+    \else
+        \ifx\@empty#1\@empty\else
+            \lst@if \lst@false \else $\vert$\fi
+            \textup{\texttt{#1}}%
+        \fi
+    \fi
+    \alternative@}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Extensions to \textsf{doc}}
+%
+% \begin{macro}{\m@cro@}
+% We need a slight modification of \packagename{doc}'s internal macro.
+% The former argument |#2| has become |#3|. This change is not marked below.
+% The second argument is now \meta{short name}.
+%    \begin{macrocode}
+\long\def\m@cro@#1#2#3{\endgroup \topsep\MacroTopsep \trivlist
+  \edef\saved@macroname{\string#3}%
+  \def\makelabel##1{\llap{##1}}%
+  \if@inlabel
+    \let\@tempa\@empty \count@\macro@cnt
+    \loop \ifnum\count@>\z@
+      \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat
+    \edef\makelabel##1{\llap{\vtop to\baselineskip
+                               {\@tempa\hbox{##1}\vss}}}%
+    \advance \macro@cnt \@ne
+  \else  \macro@cnt\@ne  \fi
+  \edef\@tempa{\noexpand\item[%
+     #1%
+       \noexpand\PrintMacroName
+     \else
+%    \end{macrocode}
+% The next line has been modified.
+%    \begin{macrocode}
+       \expandafter\noexpand\csname Print#2Name\endcsname % MODIFIED
+     \fi
+     {\string#3}]}%
+  \@tempa
+  \global\advance\c@CodelineNo\@ne
+   #1%
+      \SpecialMainIndex{#3}\nobreak
+      \DoNotIndex{#3}%
+   \else
+%    \end{macrocode}
+% Ditto.
+%    \begin{macrocode}
+      \csname SpecialMain#2Index\endcsname{#3}\nobreak % MODIFIED
+   \fi
+  \global\advance\c@CodelineNo\m@ne
+  \ignorespaces}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\macro}
+% \begin{macro}{\environment}
+% These two definitions need small adjustments due to the modified |\m@cro@|.
+%    \begin{macrocode}
+\def\macro{\begingroup
+   \catcode`\\12
+   \MakePrivateLetters \m@cro@ \iftrue {Macro}}% MODIFIED
+\def\environment{\begingroup
+   \catcode`\\12
+   \MakePrivateLetters \m@cro@ \iffalse {Env}}% MODIFIED
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\newdocenvironment}
+% This command simply makes definitions similar to `environment' and provides
+% the printing and indexing commands.
+%    \begin{macrocode}
+\def\newdocenvironment#1#2#3#4{%
+    \@namedef{#1}{#3\begingroup \catcode`\\12\relax
+                  \MakePrivateLetters \m@cro@ \iffalse {#2}}%
+    \@namedef{end#1}{#4\endmacro}%
+    \@ifundefined{Print#2Name}{\expandafter
+        \let\csname Print#2Name\endcsname\PrintMacroName}{}%
+    \@ifundefined{SpecialMain#2Index}{\expandafter
+        \let\csname SpecialMain#2Index\endcsname\SpecialMainIndex}{}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{aspect}
+% \begin{macro}{\PrintAspectName}
+% \begin{macro}{\SpecialMainAspectIndex}
+% The environment and its `print' and `index' commands.
+%    \begin{macrocode}
+\newdocenvironment{aspect}{Aspect}{}{}
+\def\PrintAspectName#1{}
+\def\SpecialMainAspectIndex#1{%
+    \@bsphack
+    \index{aspects:\levelchar\protect\aspectname{#1}}%
+    \@esphack}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{environment}
+%
+% \begin{environment}{lstkey}
+% \begin{macro}{\PrintKeyName}
+% \begin{macro}{\SpecialMainKeyIndex}
+% One more environment with its `print' and `index' commands.
+%    \begin{macrocode}
+\newdocenvironment{lstkey}{Key}{}{}
+\def\PrintKeyName#1{\strut\keyname{#1}\ }
+\def\SpecialMainKeyIndex#1{%
+    \@bsphack
+    \index{keys\levelchar\protect\keyname{#1}}%
+    \@esphack}
+%    \end{macrocode}
+% \end{macro}\end{macro}\end{environment}
+%
+% \begin{macro}{\labelargcount}
+% \begin{environment}{macroargs}
+% We just allocate a counter and use \LaTeX's |\list| to implement this
+% environment.
+%    \begin{macrocode}
+\newcounter{argcount}
+\def\labelargcount{\texttt{\#\arabic{argcount}}\hskip\labelsep$=$}
+%    \end{macrocode}
+%    \begin{macrocode}
+\def\macroargs{\list\labelargcount
+    {\usecounter{argcount}\leftmargin=2\leftmargin
+     \parsep \z@ \@plus\z@ \@minus\z@
+     \topsep4\p@ \@plus\p@ \@minus2\p@
+     \itemsep\z@ \@plus\z@ \@minus\z@
+     \def\makelabel##1{\hss\llap{##1}}}}
+\def\endmacroargs{\endlist\@endparenv}
+%    \end{macrocode}
+% \end{environment}\end{macro}
+%
+%
+% \subsection{The \texttt{lstsample} environment}
+%
+% \begin{environment}{lstsample}
+% We store the verbatim part and write the source code also to file.
+%    \begin{macrocode}
+\lst@RequireAspects{writefile}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newbox\lst@samplebox
+\lstnewenvironment{lstsample}[3][]
+    {\global\let\lst@intname\@empty
+     \gdef\lst@sample{#2}%
+     \setbox\lst@samplebox=\hbox\bgroup
+         \setkeys{lst}{language={},style={},tabsize=4,gobble=5,%
+             basicstyle=\small\ttfamily,basewidth=0.51em,point={#1}}
+         #3%
+         \lst@BeginAlsoWriteFile{\jobname.tmp}}
+    {\lst@EndWriteFile\egroup
+%    \end{macrocode}
+% Now |\lst@samplebox| contains the verbatim part.
+% If it's too wide, we use atop and below instead of left and right.
+%    \begin{macrocode}
+     \ifdim \wd\lst@samplebox>.5\linewidth
+         \begin{center}%
+             \hbox to\linewidth{\box\lst@samplebox\hss}%
+         \end{center}%
+         \lst@sampleInput
+     \else
+         \begin{center}%
+         \begin{minipage}{0.45\linewidth}\lst@sampleInput\end{minipage}%
+         \qquad
+         \begin{minipage}{0.45\linewidth}%
+             \hbox to\linewidth{\box\lst@samplebox\hss}%
+         \end{minipage}%
+         \end{center}%
+     \fi}
+%    \end{macrocode}
+% The new keyword class \keyname{point}.
+%    \begin{macrocode}
+\lst@InstallKeywords{p}{point}{pointstyle}\relax{keywordstyle}{}ld
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{lstxsample}
+% Omitting |\lst@EndWriteFile| leaves the file open.
+%    \begin{macrocode}
+\lstnewenvironment{lstxsample}[1][]
+    {\begingroup
+         \setkeys{lst}{belowskip=-\medskipamount,language={},style={},%
+             tabsize=4,gobble=5,basicstyle=\small\ttfamily,%
+             basewidth=0.51em,point={#1}}
+         \lst@BeginAlsoWriteFile{\jobname.tmp}}
+    {\endgroup
+     \endgroup}
+%    \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\lst@sampleInput}
+% inputs the `left-hand' side.
+%    \begin{macrocode}
+\def\lst@sampleInput{%
+    \MakePercentComment\catcode`\^^M=10\relax
+    \small\lst@sample
+    {\setkeys{lst}{SelectCharTable=\lst@ReplaceInput{\^\^I}%
+                                  {\lst@ProcessTabulator}}%
+     \leavevmode \input{\jobname.tmp}}\MakePercentIgnore}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Miscellaneous}
+%
+% \paragraph{Sectioning and cross referencing}
+% We begin with a redefinition paragraph.
+%    \begin{macrocode}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
+                                      {1.25ex \@plus1ex \@minus.2ex}%
+                                      {-1em}%
+                                      {\normalfont\normalsize\bfseries}}
+%    \end{macrocode}
+% We introduce |\lstref| which prints section number together with its name.
+%    \begin{macrocode}
+\def\lstref#1{\emph{\ref{#1} \nameref{#1}}}
+%    \end{macrocode}
+% Moreover we adjust the table of contents.  The |\phantomsection| before
+% adding the contents line provides \packagename{hyperref} with an appropriate
+% destination for the contents line link, thereby ensuring that the contents
+% line is at the right level in the PDF bookmark tree.
+%    \begin{macrocode}
+\def\@part[#1]#2{\ifhyper\phantomsection\fi
+    \addcontentsline{toc}{part}{#1}%
+    {\parindent\z@ \raggedright \interlinepenalty\@M
+     \normalfont \huge \bfseries #2\markboth{}{}\par}%
+    \nobreak\vskip 3ex\@afterheading}
+\renewcommand*\l@section[2]{%
+    \addpenalty\@secpenalty
+    \addvspace{.25em \@plus\p@}%
+    \setlength\@tempdima{1.5em}%
+    \begingroup
+      \parindent \z@ \rightskip \@pnumwidth
+      \parfillskip -\@pnumwidth
+      \leavevmode
+      \advance\leftskip\@tempdima
+      \hskip -\leftskip
+      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+    \endgroup}
+\renewcommand*\l@subsection{\@dottedtocline{2}{0pt}{2.3em}}
+\renewcommand*\l@subsubsection{\@dottedtocline{3}{0pt}{3.2em}}
+%    \end{macrocode}
+%
+% \paragraph{Indexing}
+% The `user' commands. |\rstyle| is defined below.
+%    \begin{macrocode}
+\newcommand\ikeyname[1]{%
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \keyname{#1}}
+\newcommand\ekeyname[1]{%
+    \@bsphack
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \@esphack}
+\newcommand\rkeyname[1]{%
+    \@bsphack
+    \lstkeyindex{#1}{}%
+    \lstaspectindex{#1}{}%
+    \@esphack{\rstyle\keyname{#1}}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\newcommand\icmdname[1]{%
+    \@bsphack
+    \lstaspectindex{#1}{}%
+    \@esphack\texttt{\string#1}}
+\newcommand\rcmdname[1]{%
+    \@bsphack
+    \lstaspectindex{#1}{}%
+    \@esphack\texttt{\rstyle\string#1}}
+%    \end{macrocode}
+% One of the two yet unknown `index'-macros is empty, the other looks up
+% the aspect name for the given argument.
+%    \begin{macrocode}
+\def\lstaspectindex#1#2{%
+    \global\@namedef{lstkandc@\string#1}{}%
+    \@ifundefined{lstisaspect@\string#1}
+        {\index{unknown\levelchar
+                \protect\texttt{\protect\string\string#1}#2}}%
+        {\index{\@nameuse{lstisaspect@\string#1}\levelchar
+                \protect\texttt{\protect\string\string#1}#2}}%
+}
+\def\lstkeyindex#1#2{%
+%    \index{key\levelchar\protect\keyname{#1}#2}%
+}
+%    \end{macrocode}
+% The key/command to aspect relation is defined near the top of this file using
+% the following command. In future the package should read this information
+% from the aspect files.
+%    \begin{macrocode}
+\def\lstisaspect[#1]#2{%
+    \global\@namedef{lstaspect@#1}{#2}%
+    \lst@AddTo\lst@allkeysandcmds{,#2}%
+    \@for\lst@temp:=#2\do
+    {\ifx\@empty\lst@temp\else
+         \global\@namedef{lstisaspect@\lst@temp}{#1}%
+     \fi}}
+\gdef\lst@allkeysandcmds{}
+%    \end{macrocode}
+% This relation is also good to print all keys and commands of a particular
+% aspect \ldots
+%    \begin{macrocode}
+\def\lstprintaspectkeysandcmds#1{%
+    \lst@true
+    \expandafter\@for\expandafter\lst@temp
+    \expandafter:\expandafter=\csname lstaspect@#1\endcsname\do
+    {\lst@if\lst@false\else, \fi \texttt{\lst@temp}}}
+%    \end{macrocode}
+% \ldots\ or to check the reference. Note that we've defined
+% |\lstkandc@|\meta{name} in |\lstaspectindex|.
+%    \begin{macrocode}
+\def\lstcheckreference{%
+   \@for\lst@temp:=\lst@allkeysandcmds\do
+   {\ifx\lst@temp\@empty\else
+        \@ifundefined{lstkandc@\lst@temp}
+        {\typeout{\lst@temp\space not in reference guide?}}{}%
+    \fi}}
+%    \end{macrocode}
+%
+% \paragraph{Unique styles}
+%    \begin{macrocode}
+\newcommand*\lst{\texttt{lst}}
+\newcommand*\Cpp{C\texttt{++}}
+\let\keyname\texttt
+\let\keyvalue\texttt
+\let\hookname\texttt
+\newcommand*\aspectname[1]{{\normalfont\sffamily#1}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\DeclareRobustCommand\packagename[1]{%
+    {\leavevmode\text@command{#1}%
+     \switchfontfamily\sfdefault\rmdefault
+     \check@icl #1\check@icr
+     \expandafter}}%
+\renewcommand\packagename[1]{{\normalfont\sffamily#1}}
+\def\switchfontfamily#1#2{%
+    \begingroup\xdef\@gtempa{#1}\endgroup
+    \ifx\f@family\@gtempa\fontfamily#2%
+                    \else\fontfamily#1\fi
+    \selectfont}
+%    \end{macrocode}
+% The color mainly for keys and commands in the reference guide.
+%    \begin{macrocode}
+\ifcolor
+    \definecolor{darkgreen}{rgb}{0,0.5,0}
+    \def\rstyle{\color{darkgreen}}
+\else
+    \let\rstyle\empty
+\fi
+%    \end{macrocode}
+%
+% \paragraph{Commands for credits and helpers}
+%    \begin{macrocode}
+\gdef\lst@emails{}
+\newcommand*\lstthanks[2]
+    {#1\lst@AddTo\lst@emails{,#1,<#2>}%
+     \ifx\@empty#2\@empty\typeout{Missing email for #1}\fi}
+\newcommand*\lsthelper[3]
+    {{\let~\ #1}%
+     \lst@IfOneOf#1\relax\lst@emails
+     {}{\typeout{^^JWarning: Unknown helper #1.^^J}}}
+%    \end{macrocode}
+%
+% \paragraph{Languages and styles}
+%    \begin{macrocode}
+\lstdefinelanguage[doc]{Pascal}{%
+  morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
+     do,downto,else,end,false,file,for,function,get,goto,if,in,%
+     integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
+     procedure,put,read,readln,real,record,repeat,reset,rewrite,set,%
+     text,then,to,true,type,unpack,until,var,while,with,write,writeln},%
+  sensitive=false,%
+  morecomment=[s]{(*}{*)},%
+  morecomment=[s]{\{}{\}},%
+  morestring=[d]{'}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lstdefinestyle{}
+    {basicstyle={},%
+     keywordstyle=\bfseries,identifierstyle={},%
+     commentstyle=\itshape,stringstyle={},%
+     numberstyle={},stepnumber=1,%
+     pointstyle=\pointstyle}
+\def\pointstyle{%
+    {\let\lst@um\@empty \xdef\@gtempa{\the\lst@token}}%
+    \expandafter\lstkeyindex\expandafter{\@gtempa}{}%
+    \expandafter\lstaspectindex\expandafter{\@gtempa}{}%
+    \rstyle}
+\lstset{defaultdialect=[doc]Pascal,language=Pascal,style={}}
+%    \end{macrocode}
+%
+%
+% \subsection{Scanning languages}
+%
+% \begin{macro}{\lstscanlanguages}
+% We modify some internal definitions and input the files.
+%    \begin{macrocode}
+\def\lstscanlanguages#1#2#3{%
+    \begingroup
+        \def\lst@DefDriver@##1##2##3##4[##5]##6{%
+           \lst@false
+           \lst@lAddTo\lst@scan{##6(##5),}%
+           \begingroup
+           \@ifnextchar[{\lst@XDefDriver{##1}##3}{\lst@DefDriver@@##3}}%
+        \def\lst@XXDefDriver[##1]{}%
+        \lst@InputCatcodes
+        \def\lst@dontinput{#3}%
+        \let\lst@scan\@empty
+        \lst@for{#2}\do{%
+            \lst@IfOneOf##1\relax\lst@dontinput
+                {}%
+                {\InputIfFileExists{##1}{}{}}}%
+        \global\let\@gtempa\lst@scan
+    \endgroup
+    \let#1\@gtempa}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstprintlanguages}
+% |\do| creates a box of width 0.5|\linewidth| or |\linewidth| depending
+% on how wide the argument is. This leads to `two column' output.
+% The other main thing is sorting the list and begin with the output.
+%    \begin{macrocode}
+\def\lstprintlanguages#1{%
+    \def\do##1{\setbox\@tempboxa\hbox{##1\space\space}%
+        \ifdim\wd\@tempboxa<.5\linewidth \wd\@tempboxa.5\linewidth
+                                   \else \wd\@tempboxa\linewidth \fi
+        \box\@tempboxa\allowbreak}%
+    \begin{quote}
+      \par\noindent
+      \hyphenpenalty=\@M \rightskip=\z@\@plus\linewidth\relax
+      \lst@BubbleSort#1%
+      \expandafter\lst@NextLanguage#1\relax(\relax),%
+    \end{quote}}
+%    \end{macrocode}
+% We get and define the current language and \ldots
+%    \begin{macrocode}
+\def\lst@NextLanguage#1(#2),{%
+    \ifx\relax#1\else
+        \def\lst@language{#1}\def\lst@dialects{(#2),}%
+        \expandafter\lst@NextLanguage@
+    \fi}
+%    \end{macrocode}
+% \ldots\space gather all available dialect of this language (note that the
+% list has been sorted)
+%    \begin{macrocode}
+\def\lst@NextLanguage@#1(#2),{%
+    \def\lst@temp{#1}%
+    \ifx\lst@temp\lst@language
+        \lst@lAddTo\lst@dialects{(#2),}%
+        \expandafter\lst@NextLanguage@
+    \else
+%    \end{macrocode}
+% or begin to print this language with all its dialects. Therefor we sort the
+% dialects
+%    \begin{macrocode}
+        \do{\lst@language
+        \ifx\lst@dialects\lst@emptydialect\else
+            \expandafter\lst@NormedDef\expandafter\lst@language
+                \expandafter{\lst@language}%
+            \space(%
+            \lst@BubbleSort\lst@dialects
+            \expandafter\lst@PrintDialects\lst@dialects(\relax),%
+            )%
+        \fi}%
+        \def\lst@next{\lst@NextLanguage#1(#2),}%
+        \expandafter\lst@next
+    \fi}
+\def\lst@emptydialect{(),}
+%    \end{macrocode}
+% and print the dialect with appropriate commas in between.
+%    \begin{macrocode}
+\def\lst@PrintDialects(#1),{%
+    \ifx\@empty#1\@empty empty\else
+        \lst@PrintDialect{#1}%
+    \fi
+    \lst@PrintDialects@}
+\def\lst@PrintDialects@(#1),{%
+    \ifx\relax#1\else
+        , \lst@PrintDialect{#1}%
+        \expandafter\lst@PrintDialects@
+    \fi}
+%    \end{macrocode}
+% Here we take care of default dialects.
+%    \begin{macrocode}
+\def\lst@PrintDialect#1{%
+    \lst@NormedDef\lst@temp{#1}%
+    \expandafter\ifx\csname\@lst dd@\lst@language\endcsname\lst@temp
+        \texttt{\underbar{#1}}%
+    \else
+        \texttt{#1}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Bubble sort}
+%
+% \begin{macro}{\lst@IfLE}
+% \meta{string 1}|\relax\@empty|\meta{string 2}|\relax\@empty|\marg{then}\meta{else}.
+% If \meta{string 1} $\leq$ \meta{string 2}, we execute \meta{then} and
+% \meta{else} otherwise.
+% Note that this comparision is case insensitive.
+%    \begin{macrocode}
+\def\lst@IfLE#1#2\@empty#3#4\@empty{%
+    \ifx #1\relax
+        \let\lst@next\@firstoftwo
+    \else \ifx #3\relax
+        \let\lst@next\@secondoftwo
+    \else
+        \lowercase{\ifx#1#3}%
+            \def\lst@next{\lst@IfLE#2\@empty#4\@empty}%
+        \else
+            \lowercase{\ifnum`#1<`#3}\relax
+                \let\lst@next\@firstoftwo
+            \else
+                \let\lst@next\@secondoftwo
+            \fi
+        \fi
+    \fi \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@BubbleSort}
+% is in fact a derivation of bubble sort.
+%    \begin{macrocode}
+\def\lst@BubbleSort#1{%
+    \ifx\@empty#1\else
+        \lst@false
+%    \end{macrocode}
+% We `bubble sort' the first, second, \ldots\ elements and \ldots
+%    \begin{macrocode}
+        \expandafter\lst@BubbleSort@#1\relax,\relax,%
+%    \end{macrocode}
+% \ldots\space then the second, third, \ldots\ elements until no elemets have
+% been swapped.
+%    \begin{macrocode}
+        \expandafter\lst@BubbleSort@\expandafter,\lst@sorted
+                                      \relax,\relax,%
+        \let#1\lst@sorted
+        \lst@if
+            \def\lst@next{\lst@BubbleSort#1}%
+            \expandafter\expandafter\expandafter\lst@next
+        \fi
+    \fi}
+\def\lst@BubbleSort@#1,#2,{%
+    \ifx\@empty#1\@empty
+        \def\lst@sorted{#2,}%
+        \def\lst@next{\lst@BubbleSort@@}%
+    \else
+        \let\lst@sorted\@empty
+        \def\lst@next{\lst@BubbleSort@@#1,#2,}%
+    \fi
+    \lst@next}
+%    \end{macrocode}
+% But the bubbles rise only one step per call. Putting the elements at their
+% top most place would be inefficient (since \TeX\ had to read much more
+% parameters in this case).
+%    \begin{macrocode}
+\def\lst@BubbleSort@@#1,#2,{%
+    \ifx\relax#1\else
+        \ifx\relax#2%
+            \lst@lAddTo\lst@sorted{#1,}%
+            \expandafter\expandafter\expandafter\lst@BubbleSort@@@
+        \else
+            \lst@IfLE #1\relax\@empty #2\relax\@empty
+                          {\lst@lAddTo\lst@sorted{#1,#2,}}%
+                {\lst@true \lst@lAddTo\lst@sorted{#2,#1,}}%
+            \expandafter\expandafter\expandafter\lst@BubbleSort@@
+        \fi
+    \fi}
+\def\lst@BubbleSort@@@#1\relax,{}
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Interfaces to other programs}
+%
+%
+% \subsection{0.21 compatibility}
+%
+% \begin{aspect}{0.21}
+% Some keys have just been renamed.
+%    \begin{macrocode}
+%<*0.21>
+\lst@BeginAspect{0.21}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@Key{labelstyle}{}{\def\lst@numberstyle{#1}}
+\lst@Key{labelsep}{10pt}{\def\lst@numbersep{#1}}
+\lst@Key{labelstep}{0}{%
+    \ifnum #1=\z@ \KV@lst@numbers{none}%
+            \else \KV@lst@numbers{left}\fi
+    \def\lst@stepnumber{#1\relax}}
+\lst@Key{firstlabel}\relax{\def\lst@firstnumber{#1\relax}}
+\lst@Key{advancelabel}\relax{\def\lst@advancenumber{#1\relax}}
+\let\c@lstlabel\c@lstnumber
+\lst@AddToHook{Init}{\def\thelstnumber{\thelstlabel}}
+\newcommand*\thelstlabel{\@arabic\c@lstlabel}
+%    \end{macrocode}
+% A |\let| in the second last line has been changed to |\def| after a bug
+% report by \lsthelper{Venkatesh~Prasad~Ranganath}{2002/08/31}{Undefined
+% control sequence \thelstnumber with 0.21-option}.
+%    \begin{macrocode}
+\lst@Key{first}\relax{\def\lst@firstline{#1\relax}}
+\lst@Key{last}\relax{\def\lst@lastline{#1\relax}}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{framerulewidth}{.4pt}{\def\lst@framerulewidth{#1}}
+\lst@Key{framerulesep}{2pt}{\def\lst@rulesep{#1}}
+\lst@Key{frametextsep}{3pt}{\def\lst@frametextsep{#1}}
+\lst@Key{framerulecolor}{}{\lstKV@OptArg[]{#1}%
+    {\ifx\@empty##2\@empty
+         \let\lst@rulecolor\@empty
+     \else
+         \ifx\@empty##1\@empty
+             \def\lst@rulecolor{\color{##2}}%
+         \else
+             \def\lst@rulecolor{\color[##1]{##2}}%
+         \fi
+     \fi}}
+\lst@Key{backgroundcolor}{}{\lstKV@OptArg[]{#1}%
+    {\ifx\@empty##2\@empty
+         \let\lst@bkgcolor\@empty
+     \else
+         \ifx\@empty##1\@empty
+             \def\lst@bkgcolor{\color{##2}}%
+         \else
+             \def\lst@bkgcolor{\color[##1]{##2}}%
+         \fi
+     \fi}}
+\lst@Key{framespread}{\z@}{\def\lst@framespread{#1}}
+\lst@AddToHook{PreInit}
+    {\@tempdima\lst@framespread\relax \divide\@tempdima\tw@
+     \edef\lst@framextopmargin{\the\@tempdima}%
+     \let\lst@framexrightmargin\lst@framextopmargin
+     \let\lst@framexbottommargin\lst@framextopmargin
+     \advance\@tempdima\lst@xleftmargin\relax
+     \edef\lst@framexleftmargin{\the\@tempdima}}
+%    \end{macrocode}
+% \lsthelper{Harald~Harders}{1998/03/30}{inner- and outerspread} had the idea
+% of two spreads (inner and outer). We either divide the dimension by two or
+% assign the two dimensions to inner- and outerspread.
+%    \begin{macrocode}
+\newdimen\lst@innerspread \newdimen\lst@outerspread
+\lst@Key{spread}{\z@,\z@}{\lstKV@CSTwoArg{#1}%
+    {\lst@innerspread##1\relax
+     \ifx\@empty##2\@empty
+         \divide\lst@innerspread\tw@\relax
+         \lst@outerspread\lst@innerspread
+     \else
+         \lst@outerspread##2\relax
+     \fi}}
+\lst@AddToHook{BoxUnsafe}{\lst@outerspread\z@ \lst@innerspread\z@}
+\lst@Key{wholeline}{false}[t]{\lstKV@SetIf{#1}\lst@ifresetmargins}
+\lst@Key{indent}{\z@}{\def\lst@xleftmargin{#1}}
+\lst@AddToHook{PreInit}
+    {\lst@innerspread=-\lst@innerspread
+     \lst@outerspread=-\lst@outerspread
+     \ifodd\c@page \advance\lst@innerspread\lst@xleftmargin
+             \else \advance\lst@outerspread\lst@xleftmargin \fi
+     \ifodd\c@page
+         \edef\lst@xleftmargin{\the\lst@innerspread}%
+         \edef\lst@xrightmargin{\the\lst@outerspread}%
+     \else
+         \edef\lst@xleftmargin{\the\lst@outerspread}%
+         \edef\lst@xrightmargin{\the\lst@innerspread}%
+     \fi}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{defaultclass}\relax{\def\lst@classoffset{#1}}
+\lst@Key{stringtest}\relax{}% dummy
+\lst@Key{outputpos}\relax{\lst@outputpos#1\relax\relax}
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@Key{stringspaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowstringspaces}
+\lst@Key{visiblespaces}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowspaces}
+\lst@Key{visibletabs}\relax[t]{\lstKV@SetIf{#1}\lst@ifshowtabs}
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{\textsf{fancyvrb}}
+%
+% \lsthelper{Denis~Girou}{1998/07/26}{fancyvrb} asked whether
+% \packagename{fancyvrb} and \packagename{listings} could work together.
+%
+% \begin{lstkey}{fancyvrb}
+% We set the boolean and call a submacro.
+%    \begin{macrocode}
+%<*kernel>
+\lst@Key{fancyvrb}\relax[t]{%
+    \lstKV@SetIf{#1}\lst@iffancyvrb
+    \lstFV@fancyvrb}
+\ifx\lstFV@fancyvrb\@undefined
+    \gdef\lstFV@fancyvrb{\lst@RequireAspects{fancyvrb}\lstFV@fancyvrb}
+\fi
+%
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{aspect}{fancyvrb}
+% We end the job if \packagename{fancyvrb} is not present.
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect{fancyvrb}
+%    \end{macrocode}
+%    \begin{macrocode}
+\@ifundefined{FancyVerbFormatLine}
+    {\typeout{^^J%
+     ***^^J%
+     *** `listings.sty' needs `fancyvrb.sty' right now.^^J%
+     *** Please ensure its availability and try again.^^J%
+     ***^^J}%
+     \batchmode \@@end}{}
+%    \end{macrocode}
+%
+% \begin{macro}{\lstFV@fancyvrb}
+% We assign the correct |\FancyVerbFormatLine| macro.
+%    \begin{macrocode}
+\gdef\lstFV@fancyvrb{%
+    \lst@iffancyvrb
+        \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine\else
+            \let\lstFV@FVFL\FancyVerbFormatLine
+            \let\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \fi
+    \else
+        \ifx\lstFV@FVFL\@undefined\else
+            \let\FancyVerbFormatLine\lstFV@FVFL
+            \let\lstFV@FVFL\@undefined
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstFV@VerbatimBegin}
+% We initialize things if necessary.
+%    \begin{macrocode}
+\gdef\lstFV@VerbatimBegin{%
+    \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \lsthk@TextStyle \lsthk@BoxUnsafe
+        \lsthk@PreSet
+        \lst@activecharsfalse
+        \let\normalbaselines\relax
+%    \end{macrocode}
+% \begin{TODO}
+% Is this |\let| bad?
+% \end{TODO}
+% I inserted |\lst@ifresetmargins|\ldots|\fi| after a bug report from
+% \lsthelper{Peter~Bartke}{1999/11/18}{wrong fancyvrb frame}. The linewidth
+% is saved and restored since a bug report by \lsthelper{Denis~Girou}
+% {2003/07/04}{problem in list environments with fancyvrb=true}.
+%    \begin{macrocode}
+\xdef\lstFV@RestoreData{\noexpand\linewidth\the\linewidth\relax}%
+        \lst@Init\relax
+        \lst@ifresetmargins \advance\linewidth-\@totalleftmargin \fi
+\lstFV@RestoreData
+        \everypar{}\global\lst@newlines\z@
+        \lst@mode\lst@nomode \let\lst@entermodes\@empty
+        \lst@InterruptModes
+%    \end{macrocode}
+% \lsthelper{Rolf~Niepraschk}{1998/11/25}{ligatures problem} reported a bug
+% concerning ligatures to \lsthelper{Denis~Girou}{1998/11/27}{use |\@noligs|}.
+%    \begin{macrocode}
+%% D.G. modification begin - Nov. 25, 1998
+        \let\@noligs\relax
+%% D.G. modification end
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lstFV@VerbatimEnd}
+% A box and macro must exist after |\lst@DeInit|.
+% We store them globally.
+%    \begin{macrocode}
+\gdef\lstFV@VerbatimEnd{%
+    \ifx\FancyVerbFormatLine\lstFV@FancyVerbFormatLine
+        \global\setbox\lstFV@gtempboxa\box\@tempboxa
+        \global\let\@gtempa\FV@ProcessLine
+        \lst@mode\lst@Pmode
+        \lst@DeInit
+        \let\FV@ProcessLine\@gtempa
+        \setbox\@tempboxa\box\lstFV@gtempboxa
+        \par
+    \fi}
+%    \end{macrocode}
+% The |\par| has been added after a bug report by \lsthelper{Peter~Bartke}
+% {2002/04/10}{TeX is not in vertical mode when leaving "Verbatim"}.
+%    \begin{macrocode}
+\newbox\lstFV@gtempboxa
+%    \end{macrocode}
+% \end{macro}
+%
+% \noindent
+% We insert |\lstFV@VerbatimBegin| and |\lstFV@VerbatimEnd| where necessary.
+%    \begin{macrocode}
+\lst@AddTo\FV@VerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@VerbatimEnd\lstFV@VerbatimEnd
+\lst@AddTo\FV@LVerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@LVerbatimEnd\lstFV@VerbatimEnd
+\lst@AddTo\FV@BVerbatimBegin\lstFV@VerbatimBegin
+\lst@AddToAtTop\FV@BVerbatimEnd\lstFV@VerbatimEnd
+%    \end{macrocode}
+%
+% \begin{macro}{\lstFV@FancyVerbFormatLine}
+% `@' terminates the argument of |\lst@FVConvert|.
+% Moreover |\lst@ReenterModes| and |\lst@InterruptModes| encloses some code.
+% This ensures that we have same group level at the beginning and at the end of
+% the macro---even if the user begins but doesn't end a comment, which means
+% one open group.
+% Furthermore we use |\vtop| and reset |\lst@newlines| to allow line breaking.
+%    \begin{macrocode}
+\gdef\lstFV@FancyVerbFormatLine#1{%
+    \let\lst@arg\@empty \lst@FVConvert#1\@nil
+    \global\lst@newlines\z@
+    \vtop{\noindent\lst@parshape
+          \lst@ReenterModes
+          \lst@arg \lst@PrintToken\lst@EOLUpdate\lsthk@InitVarsBOL
+          \lst@InterruptModes}}
+%    \end{macrocode}
+% The |\lst@parshape| inside |\vtop| is due to a bug report from
+% \lsthelper{Peter~Bartke}{1999/11/18}{wrong par indention with fancyvrb}.
+% A |\leavevmode| became |\noindent|.
+% \end{macro}
+%
+% \begin{lstkey}{fvcmdparams}
+% \begin{lstkey}{morefvcmdparams}
+% These keys adjust \lst@FVcmdparams, which will be used by the following
+% conversion macro. The base set of commands and parameter numbers was
+% provided by \lsthelper{Denis~Girou}{2002/05/31}{init of fvcmdparams}.
+%    \begin{macrocode}
+\lst@Key{fvcmdparams}%
+    {\overlay\@ne}%
+    {\def\lst@FVcmdparams{,#1}}
+\lst@Key{morefvcmdparams}\relax{\lst@lAddTo\lst@FVcmdparams{,#1}}
+%    \end{macrocode}
+% \end{lstkey}
+% \end{lstkey}
+%
+% \begin{macro}{\lst@FVConvert}
+% We do conversion or \ldots
+%    \begin{macrocode}
+\gdef\lst@FVConvert{\@tempcnta\z@ \lst@FVConvertO@}%
+\gdef\lst@FVConvertO@{%
+    \ifcase\@tempcnta
+        \expandafter\futurelet\expandafter\@let@token
+        \expandafter\lst@FVConvert@@
+    \else
+%    \end{macrocode}
+% \ldots\ we append arguments without conversion, argument by argument,
+% |\@tempcnta| times.
+%    \begin{macrocode}
+        \expandafter\lst@FVConvertO@a
+    \fi}
+\gdef\lst@FVConvertO@a#1{%
+    \lst@lAddTo\lst@arg{{#1}}\advance\@tempcnta\m@ne
+    \lst@FVConvertO@}%
+%    \end{macrocode}
+% Since |\@ifnextchar\bgroup| might fail, we have to use |\ifcat| here.
+% Bug reported by \lsthelper{Denis~Girou}{1999/07/26}{fancyvrb=true + `second
+% commandchar' other than \{ doesn't work}.
+% However we don't gobble space tokens as |\@ifnextchar| does.
+%    \begin{macrocode}
+\gdef\lst@FVConvert@@{%
+    \ifcat\noexpand\@let@token\bgroup \expandafter\lst@FVConvertArg
+                                \else \expandafter\lst@FVConvert@ \fi}
+%    \end{macrocode}
+% Coming to such a catcode${}={}$1 character we convert the argument and add
+% it together with group delimiters to |\lst@arg|.
+% We also add |\lst@PrintToken|, which prints all collected characters before
+% we forget them.
+% Finally we continue the conversion.
+%    \begin{macrocode}
+\gdef\lst@FVConvertArg#1{%
+    {\let\lst@arg\@empty
+     \lst@FVConvert#1\@nil
+     \global\let\@gtempa\lst@arg}%
+     \lst@lExtend\lst@arg{\expandafter{\@gtempa\lst@PrintToken}}%
+     \lst@FVConvert}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@FVConvert@#1{%
+    \ifx \@nil#1\else
+       \if\relax\noexpand#1%
+          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}%
+       \else
+          \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+       \fi
+       \expandafter\lst@FVConvert
+    \fi}
+%    \end{macrocode}
+% Having no |\bgroup|, we look whether we've found the end of the input, and
+% convert one token ((non)active character or control sequence).
+%    \begin{macrocode}
+\gdef\lst@FVConvert@#1{%
+    \ifx \@nil#1\else
+       \if\relax\noexpand#1%
+          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken#1}%
+%    \end{macrocode}
+% Here we check for registered commands with arguments and set the value of
+% |\@tempcnta| as required.
+%    \begin{macrocode}
+          \def\lst@temp##1,#1##2,##3##4\relax{%
+              \ifx##3\@empty \else \@tempcnta##2\relax \fi}%
+          \expandafter\lst@temp\lst@FVcmdparams,#1\z@,\@empty\relax
+       \else
+          \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+       \fi
+       \expandafter\lst@FVConvertO@
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{Omega support}
+%
+% \begingroup
+% $\Omega$ support looks easy---I hope it works at least in some cases.
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+%    \begin{macrocode}
+\@ifundefined{ocp}{}
+    {\lst@AddToHook{OutputBox}%
+         {\let\lst@ProcessLetter\@firstofone
+          \let\lst@ProcessDigit\@firstofone
+          \let\lst@ProcessOther\@firstofone}}
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{\textsf{LGrind}}
+%
+% \begin{aspect}{lgrind}
+% \begin{macro}{\lst@LGGetNames}
+% is used to extract the language names from |\lst@arg| (the
+% \packagename{LGrind} definition).
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords,comments,strings,language]{lgrind}
+%    \end{macrocode}
+%    \begin{macrocode}
+\gdef\lst@LGGetNames#1:#2\relax{%
+    \lst@NormedDef\lstlang@{#1}\lst@ReplaceInArg\lstlang@{|,}%
+    \def\lst@arg{:#2}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGGetValue}
+% returns in |\lst@LGvalue| the value of capability |#1| given by the list
+% |\lst@arg|. If |#1| is not found, we have |\lst@if|=|\iffalse|.
+% Otherwise it is true and the ``cap=value'' pair is removed from the list.
+% First we test for |#1| and
+%    \begin{macrocode}
+\gdef\lst@LGGetValue#1{%
+    \lst@false
+    \def\lst@temp##1:#1##2##3\relax{%
+        \ifx\@empty##2\else \lst@LGGetValue@{#1}\fi}
+    \expandafter\lst@temp\lst@arg:#1\@empty\relax}
+%    \end{macrocode}
+% remove the pair if necessary.
+%    \begin{macrocode}
+\gdef\lst@LGGetValue@#1{%
+    \lst@true
+    \def\lst@temp##1:#1##2:##3\relax{%
+        \@ifnextchar=\lst@LGGetValue@@{\lst@LGGetValue@@=}##2\relax
+        \def\lst@arg{##1:##3}}%
+    \expandafter\lst@temp\lst@arg\relax}
+\gdef\lst@LGGetValue@@=#1\relax{\def\lst@LGvalue{#1}}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGGetComment}
+% stores the comment delimiters (enclosed in braces) in |#2| if comment of type
+% |#1| is present and not a comment line. Otherwise |#2| is empty.
+%    \begin{macrocode}
+\gdef\lst@LGGetComment#1#2{%
+    \let#2\@empty
+    \lst@LGGetValue{#1b}%
+    \lst@if
+        \let#2\lst@LGvalue
+        \lst@LGGetValue{#1e}%
+        \ifx\lst@LGvalue\lst@LGEOL
+            \edef\lstlang@{\lstlang@,commentline={#2}}%
+            \let#2\@empty
+        \else
+            \edef#2{{#2}{\lst@LGvalue}}%
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGGetString}
+% does the same for string delimiters, but it doesn't `return' any value.
+%    \begin{macrocode}
+\gdef\lst@LGGetString#1#2{%
+    \lst@LGGetValue{#1b}%
+    \lst@if
+        \let#2\lst@LGvalue
+        \lst@LGGetValue{#1e}%
+        \ifx\lst@LGvalue\lst@LGEOL
+            \edef\lstlang@{\lstlang@,morestringizer=[l]{#2}}%
+        \else
+%    \end{macrocode}
+% we must check for |\e|, i.e.~whether we have to use \texttt doubled or
+% \texttt backslashed stringizer.
+%    \begin{macrocode}
+            \ifx #2\lst@LGvalue
+                \edef\lstlang@{\lstlang@,morestringizer=[d]{#2}}%
+            \else
+                \edef\lst@temp{\lst@LGe#2}%
+                \ifx \lst@temp\lst@LGvalue
+                    \edef\lstlang@{\lstlang@,morestringizer=[b]{#2}}%
+                \else
+                    \PackageWarning{Listings}%
+                    {String #2...\lst@LGvalue\space not supported}%
+                \fi
+            \fi
+        \fi
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGDefLang}
+% defines the language given by |\lst@arg|, the definition part, and
+% |\lst@language@|, the language name. First we remove unwanted stuff from
+% |\lst@arg|, e.g.~we replace |:\ :| by |:|.
+%    \begin{macrocode}
+\gdef\lst@LGDefLang{%
+    \lst@LGReplace
+    \let\lstlang@\empty
+%    \end{macrocode}
+% Get the keywords and values of friends.
+%    \begin{macrocode}
+    \lst@LGGetValue{kw}%
+    \lst@if
+        \lst@ReplaceInArg\lst@LGvalue{{ },}%
+        \edef\lstlang@{\lstlang@,keywords={\lst@LGvalue}}%
+    \fi
+%    \end{macrocode}
+%    \begin{macrocode}
+    \lst@LGGetValue{oc}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,sensitive=f}%
+    \fi
+%    \end{macrocode}
+%    \begin{macrocode}
+    \lst@LGGetValue{id}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,alsoletter=\lst@LGvalue}%
+    \fi
+%    \end{macrocode}
+% Now we get the comment delimiters and use them as single or double comments
+% according to whether there are two or four delimiters.
+% Note that |\lst@LGGetComment| takes care of comment lines.
+%    \begin{macrocode}
+    \lst@LGGetComment a\lst@LGa
+    \lst@LGGetComment c\lst@LGc
+    \ifx\lst@LGa\@empty
+        \ifx\lst@LGc\@empty\else
+            \edef\lstlang@{\lstlang@,singlecomment=\lst@LGc}%
+        \fi
+    \else
+        \ifx\lst@LGc\@empty
+            \edef\lstlang@{\lstlang@,singlecomment=\lst@LGa}%
+        \else
+            \edef\lstlang@{\lstlang@,doublecomment=\lst@LGc\lst@LGa}%
+        \fi
+    \fi
+%    \end{macrocode}
+% Now we parse the stringizers.
+%    \begin{macrocode}
+    \lst@LGGetString s\lst@LGa
+    \lst@LGGetString l\lst@LGa
+%    \end{macrocode}
+% We test for the continuation capability and
+%    \begin{macrocode}
+    \lst@LGGetValue{tc}%
+    \lst@if
+        \edef\lstlang@{\lstlang@,lgrindef=\lst@LGvalue}%
+    \fi
+%    \end{macrocode}
+% define the language.
+%    \begin{macrocode}
+    \expandafter\xdef\csname\@lst LGlang@\lst@language@\endcsname
+        {\noexpand\lstset{\lstlang@}}%
+%    \end{macrocode}
+% Finally we inform the user of all ignored capabilities.
+%    \begin{macrocode}
+    \lst@ReplaceInArg\lst@arg{{: :}:}\let\lst@LGvalue\@empty
+    \expandafter\lst@LGDroppedCaps\lst@arg\relax\relax
+    \ifx\lst@LGvalue\@empty\else
+        \PackageWarningNoLine{Listings}{Ignored capabilities for
+            \space `\lst@language@' are\MessageBreak\lst@LGvalue}%
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGDroppedCaps}
+% just drops a previous value and appends the next capabilty name to
+% |\lst@LGvalue|.
+%    \begin{macrocode}
+\gdef\lst@LGDroppedCaps#1:#2#3{%
+    \ifx#2\relax
+        \lst@RemoveCommas\lst@LGvalue
+    \else
+        \edef\lst@LGvalue{\lst@LGvalue,#2#3}%
+        \expandafter\lst@LGDroppedCaps
+    \fi}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lst@LGReplace}
+% \begin{macro}{\lst@LGe}
+% We replace `escaped \verb!:^$|!' by catcode 11 versions, and other strings
+% by some kind of short versions (which is necessary to get the above
+% definitions work).
+%    \begin{macrocode}
+\begingroup
+\catcode`\/=0
+\lccode`\z=`\:\lccode`\y=`\^\lccode`\x=`\$\lccode`\v=`\|
+\catcode`\\=12\relax
+/lowercase{%
+/gdef/lst@LGReplace{/lst@ReplaceInArg/lst@arg
+    {{\:}{z }{\^}{y}{\$}{x}{\|}{v}{ \ }{ }{:\ :}{:}{\ }{ }{\(}({\)})}}
+/gdef/lst@LGe{\e}
+}
+/endgroup
+%    \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\lst@LGRead}
+% reads one language definition and defines the language if the correct one
+% is found.
+%    \begin{macrocode}
+\gdef\lst@LGRead#1\par{%
+    \lst@LGGetNames#1:\relax
+    \def\lst@temp{endoflanguagedefinitions}%
+    \ifx\lstlang@\lst@temp
+        \let\lst@next\endinput
+    \else
+        \expandafter\lst@IfOneOf\lst@language@\relax\lstlang@
+            {\lst@LGDefLang \let\lst@next\endinput}%
+            {\let\lst@next\lst@LGRead}%
+    \fi
+    \lst@next}
+%    \end{macrocode}
+% \end{macro}
+%
+% \begin{lstkey}{lgrindef}
+% We only have to request the language and
+%    \begin{macrocode}
+\lst@Key{lgrindef}\relax{%
+    \lst@NormedDef\lst@language@{#1}%
+    \begingroup
+    \@ifundefined{lstLGlang@\lst@language@}%
+        {\everypar{\lst@LGRead}%
+         \catcode`\\=12\catcode`\{=12\catcode`\}=12\catcode`\%=12%
+         \catcode`\#=14\catcode`\$=12\catcode`\^=12\catcode`\_=12\relax
+         \input{\lstlgrindeffile}%
+        }{}%
+    \endgroup
+%    \end{macrocode}
+% select it or issue an error message.
+%    \begin{macrocode}
+    \@ifundefined{lstLGlang@\lst@language@}%
+        {\PackageError{Listings}%
+         {LGrind language \lst@language@\space undefined}%
+         {The language is not loadable. \@ehc}}%
+        {\lsthk@SetLanguage
+         \csname\@lst LGlang@\lst@language@\endcsname}}
+%    \end{macrocode}
+% \end{lstkey}
+%
+% \begin{macro}{\lstlgrindeffile}
+% contains just the file name.
+%    \begin{macrocode}
+\@ifundefined{lstlgrindeffile}
+    {\lst@UserCommand\lstlgrindeffile{lgrindef.}}{}
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \subsection{\textsf{hyperref}}
+%
+% \begin{aspect}{hyper}
+%    \begin{macrocode}
+%<*misc>
+\lst@BeginAspect[keywords]{hyper}
+%    \end{macrocode}
+%
+% \begin{lstkey}{hyperanchor}
+% \begin{lstkey}{hyperlink}
+% determine the macro to set an anchor and a link, respectively.
+%    \begin{macrocode}
+\lst@Key{hyperanchor}\hyper@@anchor{\let\lst@hyperanchor#1}
+\lst@Key{hyperlink}\hyperlink{\let\lst@hyperlink#1}
+%    \end{macrocode}
+% \end{lstkey}\end{lstkey}
+% Again, the main thing is a special working procedure. First we extract the
+% contents of |\lst@token| and get a free macro name for this current character
+% string (using prefix |lstHR@| and a number as suffix). Then we make this
+% free macro equivalent to |\@empty|, so it is not used the next time.
+%    \begin{macrocode}
+\lst@InstallKeywords{h}{hyperref}{}\relax{}
+    {\begingroup
+         \let\lst@UM\@empty \xdef\@gtempa{\the\lst@token}%
+     \endgroup
+     \lst@GetFreeMacro{lstHR@\@gtempa}%
+     \global\expandafter\let\lst@freemacro\@empty
+%    \end{macrocode}
+% |\@tempcnta| is the suffix of the free macro. We use it here to refer to
+% the last occurence of the same string. To do this, we redefine the output
+% macro |\lst@alloverstyle| to set an anchor \ldots
+%    \begin{macrocode}
+     \@tempcntb\@tempcnta \advance\@tempcntb\m@ne
+     \edef\lst@alloverstyle##1{%
+         \let\noexpand\lst@alloverstyle\noexpand\@empty
+         \noexpand\smash{\raise\baselineskip\hbox
+             {\noexpand\lst@hyperanchor{lst.\@gtempa\the\@tempcnta}%
+                                       {\relax}}}%
+%    \end{macrocode}
+% \ldots\space and a link to the last occurence (if there is any).
+%    \begin{macrocode}
+         \ifnum\@tempcnta=\z@ ##1\else
+             \noexpand\lst@hyperlink{lst.\@gtempa\the\@tempcntb}{##1}%
+         \fi}%
+    }
+    od
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\lst@EndAspect
+%
+%    \end{macrocode}
+% \end{aspect}
+%
+%
+% \section{Epilogue}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*kernel>
+%    \end{macrocode}
+% Each option adds the aspect name to |\lst@loadaspects| or removes it from that data macro.
+%    \begin{macrocode}
+\DeclareOption*{\expandafter\lst@ProcessOption\CurrentOption\relax}
+\def\lst@ProcessOption#1#2\relax{%
+    \ifx #1!%
+        \lst@DeleteKeysIn\lst@loadaspects{#2}%
+    \else
+        \lst@lAddTo\lst@loadaspects{,#1#2}%
+    \fi}
+%    \end{macrocode}
+% The following aspects are loaded by default.
+%    \begin{macrocode}
+\@ifundefined{lst@loadaspects}
+  {\def\lst@loadaspects{strings,comments,escape,style,language,%
+      keywords,labels,lineshape,frames,emph,index}%
+  }{}
+%    \end{macrocode}
+% We load the patch file, \ldots
+%    \begin{macrocode}
+\InputIfFileExists{lstpatch.sty}{}{}
+%    \end{macrocode}
+% \ldots\ process the options, \ldots
+%    \begin{macrocode}
+\let\lst@ifsavemem\iffalse
+\DeclareOption{savemem}{\let\lst@ifsavemem\iftrue}
+\DeclareOption{noaspects}{\let\lst@loadaspects\@empty}
+\ProcessOptions
+%    \end{macrocode}
+% \ldots\ and load the aspects.
+%    \begin{macrocode}
+\lst@RequireAspects\lst@loadaspects
+\let\lst@loadaspects\@empty
+%    \end{macrocode}
+% If present we select the empty style and language.
+%    \begin{macrocode}
+\lst@UseHook{SetStyle}\lst@UseHook{EmptyStyle}
+\lst@UseHook{SetLanguage}\lst@UseHook{EmptyLanguage}
+%    \end{macrocode}
+% Finally we load the configuration files.
+%    \begin{macrocode}
+\InputIfFileExists{listings.cfg}{}{}
+\InputIfFileExists{lstlocal.cfg}{}{}
+%\lst@ReportAllocs
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \section{History}
+% \begingroup\small
+% Only major changes are listed here. Introductory version numbers of commands
+% and keys are in the sources of the guides, which makes this history fairly
+% short.
+% \renewcommand\labelitemi{--}
+% \begin{itemize}
+% \item[0.1] from 1996/03/09
+%   \item test version to look whether package is possible or not
+% \item[0.11] from 1996/08/19
+%\iffalse
+%   \item additional blank option (= language)
+%\fi
+%   \item improved alignment
+% \item[0.12] from 1997/01/16
+%   \item nearly `perfect' alignment
+% \item[0.13] from 1997/02/11
+%\iffalse
+%   \item additional languages: Eiffel, Fortran 90, Modula-2, Pascal XSC
+%\fi
+%   \item load on demand: language specific macros moved to driver files
+%   \item comments are declared now and not implemented for each language again
+%         (this makes the \TeX\ sources easier to read)
+% \item[0.14] from 1997/02/18
+%   \item User's guide rewritten, Implementation guide uses macro environment
+%   \item (non) case sensitivity implemented and multiple string types,
+%         i.e.~Modula-2 handles both string types: quotes and double quotes
+%\iffalse
+%   \item comment declaration is user-accessible
+%   \item package compatible to \verb!german.sty!
+%\fi
+% \item[0.15] from 1997/04/18
+%\iffalse
+%   \item additional languages: Java, Turbo Pascal
+%\fi
+%   \item package renamed from \packagename{listing} to \packagename{listings}
+%         since the first already exists
+% \item[0.16] from 1997/06/01
+%\iffalse
+%   \item changed `$<$' to `$>$' in |\lst@SkipToFirst|
+%   \item bug removed: |\lst@Init| must be placed before |\lst@SkipToFirst|
+%\fi
+%   \item listing environment rewritten
+% \item[0.17] from 1997/09/29
+%\iffalse
+%   \item |\spreadlisting| works correct now (e.g.~page numbers don't move right)
+%\fi
+%   \item speed up things (quick `if parameter empty', all |\long| except one
+%         removed, faster \verb!\lst@GotoNextTabStop!, etc.)
+%   \item improved alignment of wide other characters (e.g.~$==$)
+%\iffalse
+%   \item many new languages: Ada, Algol, Cobol, Comal 80, Elan, Fortran 77,
+%         Lisp, Logo, Matlab, Oberon, Perl, PL/I, Simula, SQL, \TeX
+%\fi
+% \item[pre-0.18] from 1998/03/24 (unpublished)
+%\iffalse
+%   \item bug concerning |\labelstyle| (becomes \keyname{numberstyle}) removed
+%         (now oldstylenum example works)
+%\fi
+%   \item experimental implementation of character classes
+% \item[0.19] from 1998/11/09
+%   \item character classes and new \lst-aspects seem to be good
+%   \item user interface uses \packagename{keyval} package
+%   \item \packagename{fancyvrb} support
+% \item[0.20] from 1999/07/12
+%   \item new keyword detection mechanism
+%   \item new aspects: \aspectname{writefile}, \aspectname{breaklines},
+%         captions, \aspectname{html}
+%\iffalse
+%   \item improved \packagename{fancyvrb} support
+%\fi
+%   \item all aspects reside in a single file and the language drivers in
+%         currently two files
+% \item[0.21] 2000/08/23
+%   \item completely new User's guide
+%   \item experimental format definitions
+%   \item keyword classes replaced by families
+%   \item dynamic modes
+% \item[1.0$\beta$] 2001/09/21
+%   \item key names synchronized with \packagename{fancyvrb}
+%   \item \aspectname{frames} aspect extended
+%   \item new output concept (delaying and merging)
+% \item[1.0] 2002/04/01
+%   \item update of all documentation sections including Developer's guide
+%   \item delimiters unified
+% \item[1.1] 2003/06/21
+%   \item bugfix-release with some new keys
+% \item[1.2] 2004/02/13
+%   \item bugfix-release with two new keys and new section \ref{rArbitraryLinerangeMarkers}
+% \item[1.3] 2004/09/07
+%   \item another bugfix-release with LPPL-1.3-compliance
+% \item[1.4] 2007/02/26
+%   \item many bugfixes, and new maintainership
+%   \item several new and updated language definitions
+%   \item many small documentation improvements
+%   \item new keys, multicharacter string delimiters, short inline listings, and more.
+% \end{itemize}
+% \endgroup
+%
+%
+% \Finale
+%
+\endinput
diff --git a/Master/texmf-dist/source/latex/listings/listings.ins b/Master/texmf-dist/source/latex/listings/listings.ins
new file mode 100644
index 00000000000..6b1805f229c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/listings/listings.ins
@@ -0,0 +1,48 @@
+%%
+%% This file generates files required to use the listings package.
+%% At your command prompt write
+%%
+%%     tex listings.ins
+%%
+%%
+%% (w)(c) 1996--1999,2002--2004 Carsten Heinz
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+\input docstrip
+\preamble
+\endpreamble
+
+\usedir{tex/latex/listings}
+\keepsilent
+\askforoverwritefalse
+
+
+%
+% generate base package
+%
+\generate{
+    \file{listings.sty}{\from{listings.dtx}{kernel}}
+    \file{lstmisc.sty}{\from{listings.dtx}{misc,0.21}}
+    \file{lstdoc.sty}{\from{listings.dtx}{doc}}
+    \file{lstdrvrs.ins}{\from{lstdrvrs.dtx}{install}}
+    \file{listings.cfg}{\from{lstdrvrs.dtx}{config}}
+}
+
+%
+% generate language driver files
+%
+\batchinput{lstdrvrs.ins}
+
+
+\Msg{*}
+\Msg{* You probably need to move all created `.sty' and `.cfg'}
+\Msg{* files into a directory searched by TeX.}
+\Msg{*}
+\Msg{* And don't forget to refresh your filename database}
+\Msg{* if your TeX distribution uses such a database.}
+\Msg{*}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/listings/lstdrvrs-1.3.dtx b/Master/texmf-dist/source/latex/listings/lstdrvrs-1.3.dtx
deleted file mode 100644
index 442c9581521..00000000000
--- a/Master/texmf-dist/source/latex/listings/lstdrvrs-1.3.dtx
+++ /dev/null
@@ -1,5347 +0,0 @@
-% \iffalse
-%
-%<*driver>
-\documentclass{ltxdoc}
-\EnableCrossrefs
-\CodelineIndex
-\begin{document}
-    \DocInput{lstdrvrs-1.3.dtx}
-\end{document}
-%
-% \fi
-%
-%
-% \DoNotIndex{\[,\{,\},\],\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
-% \DoNotIndex{\`,\,,\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
-% \DoNotIndex{\askforoverwritefalse,\askforoverwritetrue,\batchfile}
-% \DoNotIndex{\begin,\def,\else,\@empty,\end,\endpreamble,\expandafter}
-% \DoNotIndex{\fi,\file,\from,\gdef,\generate,\ifnum,\ifx,\input}
-% \DoNotIndex{\keepsilent,\lccode,\let,\lowercase,\preamble,\relax}
-% \DoNotIndex{\undefined}
-%
-%
-% \title{Language, Style and Format drivers\\ for \textsf{Listings 1.3}\\ {\large by Carsten Heinz and individual authors:}}
-% \author{\InputIfFileExists{lstdrvrs.tmp}{}{}}
-% \date{}
-%
-% \maketitle
-%
-% \newwrite\authors \immediate\openout\authors lstdrvrs.tmp\relax
-% \gdef\lstthanks#1#2#3{#1\global\let\lstthanks\lstthanksb\lstwrite{#1}}
-% \gdef\lstthanksb#1#2#3{#1\lstwrite{\string\and\space#1}}
-% \gdef\lstwrite#1{\begingroup\let~\space\def\"{\string\"}\def\'{\string\'}\immediate\write\authors{#1}\endgroup}
-%
-% \newcommand*\lsthelper[4]{#1}
-%
-%
-% \section{Installation and configuration}
-%
-% \begingroup
-%    \begin{macrocode}
-%% The listings package is copyright 1996--2004 Carsten Heinz, and 
-%% continued maintenance on the package is copyright 2006 Brooks Moses.
-%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004 any
-%% individual author listed in this file.
-%%
-%% This file is distributed under the terms of the LaTeX Project Public
-%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
-%% Either version 1.3 or, at your option, any later version.
-%%
-%% This file is completely free and comes without any warranty.
-%%
-%% Send comments and ideas on the package, error reports and additional
-%% programming languages to Brooks Moses at .
-%%
-%    \end{macrocode}
-% \endgroup
-%
-% \begingroup
-%    \begin{macrocode}
-%<*install>
-\input docstrip
-\preamble
-\endpreamble
-
-\ifToplevel{
-\usedir{tex/latex/listings}
-\keepsilent
-\askonceonly
-}
-
-
-\generate{
-    \file{lstlang1.sty}{\from{lstdrvrs-1.3.dtx}{lang1}}
-    \file{lstlang2.sty}{\from{lstdrvrs-1.3.dtx}{lang2}}
-    \file{lstlang3.sty}{\from{lstdrvrs-1.3.dtx}{lang3}}
-}
-
-
-\ifToplevel{
-\Msg{*}
-\Msg{* You probably need to move all created `.sty' and `.cfg'}
-\Msg{* files into a directory searched by TeX.}
-\Msg{*}
-\Msg{* Run `lstdrvrs.dtx' through LaTeX2e to get the documentation.}
-\Msg{*}
-}
-
-\endbatchfile
-%
-%    \end{macrocode}
-% \endgroup
-%
-% \begingroup
-%    \begin{macrocode}
-%<*config>
-%    \end{macrocode}
-% \endgroup
-% We mainly define default dialects.
-%    \begin{macrocode}
-\ProvidesFile{listings.cfg}[2004/09/05 1.3 listings configuration]
-\def\lstlanguagefiles
-    {lstlang0.sty,lstlang1.sty,lstlang2.sty,lstlang3.sty}
-\lstset{defaultdialect=[R/3 6.10]ABAP,
-        defaultdialect=[95]Ada,
-        defaultdialect=[68]Algol,
-        defaultdialect=[gnu]Awk,
-        defaultdialect=[ANSI]C,
-        defaultdialect=[light]Caml,
-        defaultdialect=[1985]Cobol,
-        defaultdialect=[ISO]C++,
-        defaultdialect=[95]Fortran,
-        defaultdialect=[3.0]Mathematica,
-        defaultdialect=[OMG]OCL,
-        defaultdialect=[Standard]Pascal,
-        defaultdialect=[67]Simula,
-        defaultdialect=[plain]TeX,
-        defaultdialect=[97]VRML}
-\lstalias[]{TclTk}[tk]{tcl}
-%    \end{macrocode}
-% And now some shortcuts for the ABAP versions (provided by Knut Lickert).
-% I (Knut) think the leading R/2, R/3 is not necessary (The support for R/2
-% is finished). The version number with letter is important for the
-% runtime-system, but the programming language should be the same
-% for each version.
-%    \begin{macrocode}
-\lstalias[6.1]{ABAP}[R/3 6.10]{ABAP}
-\lstalias[3.1]{ABAP}[R/3 3.1C]{ABAP}
-\lstalias[4.6]{ABAP}[R/3 4.6C]{ABAP}
-%    \end{macrocode}
-% \begingroup
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%    \begin{macrocode}
-%<+lang1>\ProvidesFile{lstlang1.sty}
-%<+lang2>\ProvidesFile{lstlang2.sty}
-%<+lang3>\ProvidesFile{lstlang3.sty}
-%<-config>    [2004/09/05 1.3 listings language file]
-%    \end{macrocode}
-%
-%
-% \section{Language drivers}
-%
-%
-% \subsection{Abap}
-%
-% \lstthanks{Knut Lickert}{knut.lickert@gmx.de}{2000/08/01,2001/12/29,2002/04/11}
-% added support for Abap.\footnote{In this section `I' is Knut Lickert.}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Abap definition by Knut Lickert
-%%
-%    \end{macrocode}
-%
-% There are some other new commands in release 6.10.
-% They will follow later, but up to now I don't work
-% with 6.10.
-%
-%    \begin{macrocode}
-\lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}%
-  {morekeywords={try,endtry},%
-  }[keywords,comments,strings]
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}%
-  {morekeywords={method,ref,class,create,object,%
-        methods,endmethod,private,protected,public,section,%
-        catch,system-exceptions,endcatch,%
-        },%
-   moreprocnamekeys={class},%
-   literate={->}{{$\rightarrow$}}1{=>}{{$\Rightarrow$}}1,%
-  }[keywords,comments,strings,procnames]
-%    \end{macrocode}
-% Yes there are also some more releases in R/3 (2.1\ldots), but I
-% know them not really. So let's start with R/3~3.1.
-%    \begin{macrocode}
-\lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}%
-%    \end{macrocode}
-% As I remember all this commands exists in R/2. Many commands are
-% new in R/2~5.0 (compared with R/2 4.3). But as I am not using
-% R/2~4.3 any more, I start with R/2~5.0.
-%    \begin{macrocode}
-\lst@definelanguage[R/2 5.0]{ABAP}%
-  {sensitive=f,%
-   procnamekeys={report,program,form,function,module},%
-   morekeywords={*,add,after,alias,analyzer,and,append,appending,area,assign,at,%
-        authority-check,before,binary,blank,break-point,calendar,call,%
-        case,change,changing,check,clear,cnt,co,collect,commit,common,%
-        component,compute,condense,corresponding,cos,cp,cs,currency-conversion,%
-        cursor,data,database,dataset,decimals,define,delete,deleting,dequeue,%
-        describe,detail,dialog,directory,div,divide,do,documentation,%
-        during,dynpro,else,end-of-page,end-of-selection,endat,endcase,%
-        enddo,endfor,endform,endif,endloop,endmodule,endselect,%
-        endwhile,enqueue,exceptions,exit,exp,export,exporting,extract,%
-        field,fields,field-groups,field-symbols,find,for,form,format,free,%
-        from,function,generating,get,giving,hide,id,if,import,%
-        importing,in,incl,include,initial,initialization,input,insert,%
-        interrupt,into,is,language,leave,leading,left-justified,like,line,lines,line-count,
-        line-selection,list-processing,load,local,log,logfile,loop,%
-        margin,mark,mask,memory,menue,message,mod,modify,module,move,%
-        move-text,multiply,na,new,new-line,new-page,no-gaps,np,ns,%
-        number,obligatory,occurs,of,on,or,others,output,parameter,%
-        parameters,parts,perform,pf-status,places,position,process,%
-        raise,raising,ranges,read,refresh,refresh-dynpro,reject,remote,%
-        replace,report,reserve,reset,restart,right-justified,run,screen,scroll,search,%
-        segments,select,select-options,selection-screen,set,shift,sin,%
-        single,sqrt,start-of-selection,statement,structure,submit,%
-        subtract,summary,summing,suppress,system,table,tables,task,%
-        text,time,to,top-of-page,trace,transaction,transfer,%
-        transfer-dynpro,translate,type,unpack,update,user-command,%
-        using,value,when,where,while,window,with,workfile,write,},%
-   morecomment=[l]",%
-   morecomment=[f][0]*,%
-   morestring=[d]'%
-  }[keywords,comments,strings,procnames]
-%    \end{macrocode}
-% This section for R/2~4.3 is not really maintained. It is just what I remember
-% of the past.
-%    \begin{macrocode}
-\lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}%
-  {deletekeywords={function,importing,exporting,changing,exceptions,%
-        raise,raising}%
-  }[keywords,comments,strings]
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{ACSL}
-%
-% This language was provided by \lstthanks{Andreas~Matthias}{amat@kabsi.at}
-% {2000/03/21}. I'm sorry for forgetting to add this language for a long time.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% ACSL definition (c) 2000 by Andreas Matthias
-%%
-\lst@definelanguage{ACSL}[90]{Fortran}%
-   {morekeywords={algorithm,cinterval,constant,derivative,discrete,%
-         dynamic,errtag,initial,interval,maxterval,minterval,%
-         merror,xerror,nsteps,procedural,save,schedule,sort,%
-         table,terminal,termt,variable},%
-    sensitive=false,%
-    morecomment=[l]!%
-   }[keywords, comments]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Ada}
-%
-% Data come from
-% \begin{itemize}
-% \item
-%		\textsc{Barnes, John Gilbert Presslie}:
-%		\textbf{Programming in Ada plus language reference manual};
-%		{\copyright} 1991 Addison-Wesley Publishing Company, Inc.;
-%		ISBN 0-201-56539-0.
-% \end{itemize}
-% \lstthanks{Torsten~Neuer}{tneuer@inwise.de}{1998/11/23} added support for
-% Ada 95. I changed the definition to reduce the required string memory.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Ada 95 definition (c) Torsten Neuer
-%%
-\lst@definelanguage[95]{Ada}[83]{Ada}%
-  {morekeywords={abstract,aliased,protected,requeue,tagged,until}}%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[83]{Ada}%
-  {morekeywords={abort,abs,accept,access,all,and,array,at,begin,body,%
-      case,constant,declare,delay,delta,digits,do,else,elsif,end,entry,%
-      exception,exit,for,function,generic,goto,if,in,is,limited,loop,%
-      mod,new,not,null,of,or,others,out,package,pragma,private,%
-      procedure,raise,range,record,rem,renames,return,reverse,select,%
-      separate,subtype,task,terminate,then,type,use,when,while,with,%
-      xor},%
-   sensitive=f,%
-   morecomment=[l]--,%
-   morestring=[m]",% percent not defined as stringizer so far
-   morestring=[m]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Algol}
-%
-% Data come from
-% \begin{itemize}
-% \item
-%		\textsc{Uwe Pape}:
-%		\textbf{Programmieren in ALGOL 60};
-%		{\copyright} 1973 Carl Hanser Verlag M\"unchen;
-%		ISBN 3-446-11605-2
-% \item
-%		\textsc{Frank G.\ Pagan}:
-%		\textbf{A practical guide to ALGOL 68};
-%		{\copyright} 1976 by John Wiley $\&$ Sohn Ltd.;
-%		ISBN 0-471-65746-8 (Cloth); ISBN 0-471-65747-6 (Pbk).
-% \end{itemize}
-% The definition of Algol 68 doesn't support comments enclosed by \rlap{/}c.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[68]{Algol}%
-% ??? should 'i' be a keyword
-  {morekeywords={abs,and,arg,begin,bin,bits,bool,by,bytes,case,channel,%
-      char,co,comment,compl,conj,divab,do,down,elem,elif,else,empty,%
-      end,entier,eq,esac,exit,false,fi,file,flex,for,format,from,ge,%
-      goto,gt,heap,if,im,in,int,is,isnt,le,leng,level,loc,long,lt,lwb,%
-      minusab,mod,modab,mode,ne,nil,not,od,odd,of,op,or,ouse,out,over,%
-      overab,par,plusab,plusto,pr,pragmat,prio,proc,re,real,ref,repr,%
-      round,sema,shl,short,shorten,shr,sign,skip,string,struct,then,%
-      timesab,to,true,union,up,upb,void,while},%
-   sensitive=f,% ???
-   morecomment=[s]{\#}{\#},%
-   keywordcomment={co,comment}%
-  }[keywords,comments,keywordcomments]%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[60]{Algol}%
-  {morekeywords={array,begin,Boolean,code,comment,div,do,else,end,%
-      false,for,goto,if,integer,label,own,power,procedure,real,step,%
-      string,switch,then,true,until,value,while},%
-   sensitive=f,% ???
-   keywordcommentsemicolon={end}{else,end}{comment}%
-  }[keywords,keywordcomments]%
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Assembler}
-%
-% Credits go to \lstthanks{Andrew~Zabolotny}{zap@cobra.ru}{2002/07/05}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%%
-%% x86masm definition (c) 2002 Andrew Zabolotny
-%%
-\lst@definelanguage[x86masm]{Assembler}%
-  {morekeywords={al,ah,ax,eax,bl,bh,bx,ebx,cl,ch,cx,ecx,dl,dh,dx,edx,%
-      si,esi,di,edi,bp,ebp,sp,esp,cs,ds,es,ss,fs,gs,cr0,cr1,cr2,cr3,%
-      db0,db1,db2,db3,db4,db5,db6,db7,tr0,tr1,tr2,tr3,tr4,tr5,tr6,tr7,%
-      st,aaa,aad,aam,aas,adc,add,and,arpl,bound,bsf,bsr,bswap,bt,btc,%
-      btr,bts,call,cbw,cdq,clc,cld,cli,clts,cmc,cmp,cmps,cmpsb,cmpsw,%
-      cmpsd,cmpxchg,cwd,cwde,daa,das,dec,div,enter,hlt,idiv,imul,in,%
-      inc,ins,int,into,invd,invlpg,iret,ja,jae,jb,jbe,jc,jcxz,jecxz,%
-      je,jg,jge,jl,jle,jna,jnae,jnb,jnbe,jnc,jne,jng,jnge,jnl,jnle,%
-      jno,jnp,jns,jnz,jo,jp,jpe,jpo,js,jz,jmp,lahf,lar,lea,leave,lgdt,%
-      lidt,lldt,lmsw,lock,lods,lodsb,lodsw,lodsd,loop,loopz,loopnz,%
-      loope,loopne,lds,les,lfs,lgs,lss,lsl,ltr,mov,movs,movsb,movsw,%
-      movsd,movsx,movzx,mul,neg,nop,not,or,out,outs,pop,popa,popad,%
-      popf,popfd,push,pusha,pushad,pushf,pushfd,rcl,rcr,rep,repe,%
-      repne,repz,repnz,ret,retf,rol,ror,sahf,sal,sar,sbb,scas,seta,%
-      setae,setb,setbe,setc,sete,setg,setge,setl,setle,setna,setnae,%
-      setnb,setnbe,setnc,setne,setng,setnge,setnl,setnle,setno,setnp,%
-      setns,setnz,seto,setp,setpe,setpo,sets,setz,sgdt,shl,shld,shr,%
-      shrd,sidt,sldt,smsw,stc,std,sti,stos,stosb,stosw,stosd,str,sub,%
-      test,verr,verw,wait,wbinvd,xadd,xchg,xlatb,xor,fabs,fadd,fbld,%
-      fbstp,fchs,fclex,fcom,fcos,fdecstp,fdiv,fdivr,ffree,fiadd,ficom,%
-      fidiv,fidivr,fild,fimul,fincstp,finit,fist,fisub,fisubr,fld,fld1,%
-      fldl2e,fldl2t,fldlg2,fldln2,fldpi,fldz,fldcw,fldenv,fmul,fnop,%
-      fpatan,fprem,fprem1,fptan,frndint,frstor,fsave,fscale,fsetpm,%
-      fsin,fsincos,fsqrt,fst,fstcw,fstenv,fstsw,fsub,fsubr,ftst,fucom,%
-      fwait,fxam,fxch,fxtract,fyl2x,fyl2xp1,f2xm1},%
-   morekeywords=[2]{.align,.alpha,assume,byte,code,comm,comment,.const,%
-      .cref,.data,.data?,db,dd,df,dosseg,dq,dt,dw,dword,else,end,endif,%
-      endm,endp,ends,eq,equ,.err,.err1,.err2,.errb,.errdef,.errdif,%
-      .erre,.erridn,.errnb,.errndef,.errnz,event,exitm,extrn,far,%
-      .fardata,.fardata?,fword,ge,group,gt,high,if,if1,if2,ifb,ifdef,%
-      ifdif,ife,ifidn,ifnb,ifndef,include,includelib,irp,irpc,label,%
-      .lall,le,length,.lfcond,.list,local,low,lt,macro,mask,mod,.model,%
-      name,ne,near,offset,org,out,page,proc,ptr,public,purge,qword,.%
-      radix,record,rept,.sall,seg,segment,.seq,.sfcond,short,size,%
-      .stack,struc,subttl,tbyte,.tfcond,this,title,type,.type,width,%
-      word,.xall,.xcref,.xlist},%
-   alsoletter=.,alsodigit=?,%
-   sensitive=f,%
-   morestring=[b]",%
-   morestring=[b]',%
-   morecomment=[l];%
-   }[keywords,comments,strings]
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Awk}
-%
-% Thanks to \lstthanks{Dr.~Christoph~Giess}{Ch.Giess@gmx.de}{2003/07/15} for
-% providing these definitions.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%%
-%% awk definitions (c) Christoph Giess
-%%
-\lst@definelanguage[gnu]{Awk}[POSIX]{Awk}%
-  {morekeywords={and,asort,bindtextdomain,compl,dcgettext,gensub,%
-      lshift,mktime,or,rshift,strftime,strtonum,systime,xor,extension}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[POSIX]{Awk}%
-  {keywords={BEGIN,END,close,getline,next,nextfile,print,printf,%
-      system,fflush,atan2,cos,exp,int,log,rand,sin,sqrt,srand,gsub,%
-      index,length,match,split,sprintf,strtonum,sub,substr,tolower,%
-      toupper,if,while,do,for,break,continue,delete,exit,function,%
-      return},%
-   sensitive,%
-   morecomment=[l]\#,%
-   morecomment=[l]//,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]"%
-  }[keywords,comments,strings]%
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Basic}
-%
-% Credits go to \lstthanks{Robert Frank}{rf7@ukc.ac.uk}{2002/07/05}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%%
-%% Visual Basic definition (c) 2002 Robert Frank
-%%
-\lst@definelanguage[Visual]{Basic}
-  {morekeywords={Abs,Array,Asc,AscB,AscW,Atn,Avg,CBool,CByte,CCur,%
-      CDate,CDbl,Cdec,Choose,Chr,ChrB,ChrW,CInt,CLng,Command,Cos,%
-      Count,CreateObject,CSng,CStr,CurDir,CVar,CVDate,CVErr,Date,%
-      DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,DDB,Dir,%
-      DoEvents,Environ,EOF,Error,Exp,FileAttr,FileDateTime,FileLen,%
-      Fix,Format,FreeFile,FV,GetAllStrings,GetAttr,%
-      GetAutoServerSettings,GetObject,GetSetting,Hex,Hour,IIf,%
-      IMEStatus,Input,InputB,InputBox,InStr,InstB,Int,Integer,IPmt,%
-      IsArray,IsDate,IsEmpty,IsError,IsMissing,IsNull,IsNumeric,%
-      IsObject,LBound,LCase,Left,LeftB,Len,LenB,LoadPicture,Loc,LOF,%
-      Log,Ltrim,Max,Mid,MidB,Min,Minute,MIRR,Month,MsgBox,Now,NPer,%
-      NPV,Oct,Partition,Pmt,PPmt,PV,QBColor,Rate,RGB,Right,RightB,Rnd,%
-      Rtrim,Second,Seek,Sgn,Shell,Sin,SLN,Space,Spc,Sqr,StDev,StDevP,%
-      Str,StrComp,StrConv,String,Switch,Sum,SYD,Tab,Tan,Time,Timer,%
-      TimeSerial,TimeValue,Trim,TypeName,UBound,Ucase,Val,Var,VarP,%
-      VarType,Weekday,Year},% functions
-   morekeywords=[2]{Accept,Activate,Add,AddCustom,AddFile,AddFromFile,%
-      AddFromTemplate,AddItem,AddNew,AddToAddInToolbar,%
-      AddToolboxProgID,Append,AppendChunk,Arrange,Assert,AsyncRead,%
-      BatchUpdate,BeginTrans,Bind,Cancel,CancelAsyncRead,CancelBatch,%
-      CancelUpdate,CanPropertyChange,CaptureImage,CellText,CellValue,%
-      Circle,Clear,ClearFields,ClearSel,ClearSelCols,Clone,Close,Cls,%
-      ColContaining,ColumnSize,CommitTrans,CompactDatabase,Compose,%
-      Connect,Copy,CopyQueryDef,CreateDatabase,CreateDragImage,%
-      CreateEmbed,CreateField,CreateGroup,CreateIndex,CreateLink,%
-      CreatePreparedStatement,CreatePropery,CreateQuery,%
-      CreateQueryDef,CreateRelation,CreateTableDef,CreateUser,%
-      CreateWorkspace,Customize,Delete,DeleteColumnLabels,%
-      DeleteColumns,DeleteRowLabels,DeleteRows,DoVerb,Drag,Draw,Edit,%
-      EditCopy,EditPaste,EndDoc,EnsureVisible,EstablishConnection,%
-      Execute,ExtractIcon,Fetch,FetchVerbs,Files,FillCache,Find,%
-      FindFirst,FindItem,FindLast,FindNext,FindPrevious,Forward,%
-      GetBookmark,GetChunk,GetClipString,GetData,GetFirstVisible,%
-      GetFormat,GetHeader,GetLineFromChar,GetNumTicks,GetRows,%
-      GetSelectedPart,GetText,GetVisibleCount,GoBack,GoForward,Hide,%
-      HitTest,HoldFields,Idle,InitializeLabels,InsertColumnLabels,%
-      InsertColumns,InsertObjDlg,InsertRowLabels,InsertRows,Item,%
-      KillDoc,Layout,Line,LinkExecute,LinkPoke,LinkRequest,LinkSend,%
-      Listen,LoadFile,LoadResData,LoadResPicture,LoadResString,%
-      LogEvent,MakeCompileFile,MakeReplica,MoreResults,Move,MoveData,%
-      MoveFirst,MoveLast,MoveNext,MovePrevious,NavigateTo,NewPage,%
-      NewPassword,NextRecordset,OLEDrag,OnAddinsUpdate,OnConnection,%
-      OnDisconnection,OnStartupComplete,Open,OpenConnection,%
-      OpenDatabase,OpenQueryDef,OpenRecordset,OpenResultset,OpenURL,%
-      Overlay,PaintPicture,Paste,PastSpecialDlg,PeekData,Play,Point,%
-      PopulatePartial,PopupMenu,Print,PrintForm,PropertyChanged,Pset,%
-      Quit,Raise,RandomDataFill,RandomFillColumns,RandomFillRows,%
-      rdoCreateEnvironment,rdoRegisterDataSource,ReadFromFile,%
-      ReadProperty,Rebind,ReFill,Refresh,RefreshLink,RegisterDatabase,%
-      Reload,Remove,RemoveAddInFromToolbar,RemoveItem,Render,%
-      RepairDatabase,Reply,ReplyAll,Requery,ResetCustom,%
-      ResetCustomLabel,ResolveName,RestoreToolbar,Resync,Rollback,%
-      RollbackTrans,RowBookmark,RowContaining,RowTop,Save,SaveAs,%
-      SaveFile,SaveToFile,SaveToolbar,SaveToOle1File,Scale,ScaleX,%
-      ScaleY,Scroll,Select,SelectAll,SelectPart,SelPrint,Send,%
-      SendData,Set,SetAutoServerSettings,SetData,SetFocus,SetOption,%
-      SetSize,SetText,SetViewport,Show,ShowColor,ShowFont,ShowHelp,%
-      ShowOpen,ShowPrinter,ShowSave,ShowWhatsThis,SignOff,SignOn,Size,%
-      Span,SplitContaining,StartLabelEdit,StartLogging,Stop,%
-      Synchronize,TextHeight,TextWidth,ToDefaults,TwipsToChartPart,%
-      TypeByChartType,Update,UpdateControls,UpdateRecord,UpdateRow,%
-      Upto,WhatsThisMode,WriteProperty,ZOrder},% methods
-   morekeywords=[3]{AccessKeyPress,AfterAddFile,AfterChangeFileName,%
-      AfterCloseFile,AfterColEdit,AfterColUpdate,AfterDelete,%
-      AfterInsert,AfterLabelEdit,AfterRemoveFile,AfterUpdate,%
-      AfterWriteFile,AmbienChanged,ApplyChanges,Associate,%
-      AsyncReadComplete,AxisActivated,AxisLabelActivated,%
-      AxisLabelSelected,AxisLabelUpdated,AxisSelected,%
-      AxisTitleActivated,AxisTitleSelected,AxisTitleUpdated,%
-      AxisUpdated,BeforeClick,BeforeColEdit,BeforeColUpdate,%
-      BeforeConnect,BeforeDelete,BeforeInsert,BeforeLabelEdit,%
-      BeforeLoadFile,BeforeUpdate,ButtonClick,ButtonCompleted,%
-      ButtonGotFocus,ButtonLostFocus,Change,ChartActivated,%
-      ChartSelected,ChartUpdated,Click,ColEdit,Collapse,ColResize,%
-      ColumnClick,Compare,ConfigChageCancelled,ConfigChanged,%
-      ConnectionRequest,DataArrival,DataChanged,DataUpdated,DblClick,%
-      Deactivate,DeviceArrival,DeviceOtherEvent,DeviceQueryRemove,%
-      DeviceQueryRemoveFailed,DeviceRemoveComplete,DeviceRemovePending,%
-      DevModeChange,Disconnect,DisplayChanged,Dissociate,%
-      DoGetNewFileName,Done,DonePainting,DownClick,DragDrop,DragOver,%
-      DropDown,EditProperty,EnterCell,EnterFocus,Event,ExitFocus,%
-      Expand,FootnoteActivated,FootnoteSelected,FootnoteUpdated,%
-      GotFocus,HeadClick,InfoMessage,Initialize,IniProperties,%
-      ItemActivated,ItemAdded,ItemCheck,ItemClick,ItemReloaded,%
-      ItemRemoved,ItemRenamed,ItemSeletected,KeyDown,KeyPress,KeyUp,%
-      LeaveCell,LegendActivated,LegendSelected,LegendUpdated,%
-      LinkClose,LinkError,LinkNotify,LinkOpen,Load,LostFocus,%
-      MouseDown,MouseMove,MouseUp,NodeClick,ObjectMove,%
-      OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,%
-      OLESetData,OLEStartDrag,OnAddNew,OnComm,Paint,PanelClick,%
-      PanelDblClick,PathChange,PatternChange,PlotActivated,%
-      PlotSelected,PlotUpdated,PointActivated,PointLabelActivated,%
-      PointLabelSelected,PointLabelUpdated,PointSelected,%
-      PointUpdated,PowerQuerySuspend,PowerResume,PowerStatusChanged,%
-      PowerSuspend,QueryChangeConfig,QueryComplete,QueryCompleted,%
-      QueryTimeout,QueryUnload,ReadProperties,Reposition,%
-      RequestChangeFileName,RequestWriteFile,Resize,ResultsChanged,%
-      RowColChange,RowCurrencyChange,RowResize,RowStatusChanged,%
-      SelChange,SelectionChanged,SendComplete,SendProgress,%
-      SeriesActivated,SeriesSelected,SeriesUpdated,SettingChanged,%
-      SplitChange,StateChanged,StatusUpdate,SysColorsChanged,%
-      Terminate,TimeChanged,TitleActivated,TitleSelected,%
-      TitleActivated,UnboundAddData,UnboundDeleteRow,%
-      UnboundGetRelativeBookmark,UnboundReadData,UnboundWriteData,%
-      Unload,UpClick,Updated,Validate,ValidationError,WillAssociate,%
-      WillChangeData,WillDissociate,WillExecute,WillUpdateRows,%
-      WithEvents,WriteProperties},% VB-events
-   morekeywords=[4]{AppActivate,Base,Beep,Call,Case,ChDir,ChDrive,%
-      Const,Declare,DefBool,DefByte,DefCur,DefDate,DefDbl,DefDec,%
-      DefInt,DefLng,DefObj,DefSng,DefStr,Deftype,DefVar,DeleteSetting,%
-      Dim,Do,Else,ElseIf,End,Enum,Erase,Event,Exit,Explicit,FileCopy,%
-      For,ForEach,Friend,Function,Get,GoSub,GoTo,If,Implements,Kill,%
-      Let,LineInput,Lock,Lset,MkDir,Name,Next,OnError,On,Option,%
-      Private,Property,Public,Put,RaiseEvent,Randomize,ReDim,Rem,%
-      Reset,Resume,Return,RmDir,Rset,SavePicture,SaveSetting,%
-      SendKeys,SetAttr,Static,Sub,Then,Type,Unlock,Wend,While,Width,%
-      With,Write},% statements
-   sensitive=false,%
-   keywordcomment=rem,%
-   MoreSelectCharTable=\def\lst@BeginKC@{% chmod
-      \lst@ResetToken
-      \lst@BeginComment\lst@GPmode{{\lst@commentstyle}%
-                       \lst@Lmodetrue\lst@modetrue}\@empty},%
-   morecomment=[l]{'},%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]",%
-   }[keywords,comments,strings,keywordcomments]
-%
-%    \end{macrocode}
-% Thanks to \lsthelper{Jonathan~de~Halleux}{dehalleux@pelikhan.com}
-% {2002/12/27}{missing comma} for reporting a missing comma after
-% \texttt{MoreSelectCharTable}, which was the cause of a problem
-% reported by \lsthelper{Robert~Frank}{rf7@ukc.ac.uk}{2002/10/27}
-% {indention with language={[Visual]Basic} in optional argument}.
-% \lsthelper{Martina~Hansel}{Martina.Hansel@fhtw-berlin.de}{2003/05/29}
-% {missing comma} also found the bug and the fix.
-% \endgroup
-%
-%
-% \subsection{Clean}
-%
-% Thanks to \lstthanks{Jos\'e~Romildo~Malaquias}{romildo@iceb.ufop.br}{2000/08/08}.
-% \lsthelper{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}{2001/10/12}{missing comma}
-% found a missing comma
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%%
-%% Clean definition (c) 1999 Jos\'e Romildo Malaquias
-%%
-%% Clean 1.3 :  some standard functional language: pure, lazy,
-%%              polymorphic type system, modules, type classes,
-%%              garbage collection, functions as first class citizens
-%%
-\lst@definelanguage{Clean}%
-  {otherkeywords={:,::,=,:==,=:,=>,->,<-,<-:,\{,\},\{|,|\},\#,\#!,|,\&,%
-      [,],!,.,\\\\,;,_},%
-   morekeywords={from,definition,implementation,import,module,system,%
-      case,code,if,in,let,let!,of,where,with,infix,infixl,infixr},%
-   morendkeywords={True,False,Start,Int,Real,Char,Bool,String,World,%
-      File,ProcId},%
-   sensitive,%
-   morecomment=[l]//,% missing comma: Markus Pahlow
-   morecomment=[n]{/*}{*/},%
-   morestring=[b]"%
-  }[keywords,comments,strings]%
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Corba IDL}
-%
-% This language definition is due to \lstthanks{Jens~T.~Berger~Thielemann}
-% {jensthi@ifi.uio.no}{1999/11/28}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%%
-%% Corba IDL definition (c) 1999 Jens T. Berger Thielemann
-%%
-\lst@definelanguage[CORBA]{IDL}%
-  {morekeywords={any,attribute,boolean,case,char,const,context,default,%
-      double,enum,exception,fixed,float,in,inout,interface,long,module,%
-      native,Object,octet,oneway,out,raises,readonly,sequence,short,%
-      string,struct,switch,typedef,union,unsigned,void,wchar,wstring,%
-      FALSE,TRUE},%
-   sensitive,%
-   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
-      include,pragma,undef,warning},%
-   moredelim=*[directive]\#,%
-   morecomment=[l]//,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]"%
-  }[keywords,comments,strings,directives]%
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{C, C++, et al}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-% For compatibility the `ANSI' language is defined in terms of ISO.
-%    \begin{macrocode}
-\lst@definelanguage[ANSI]{C++}[ISO]{C++}{}%
-%    \end{macrocode}
-% \lstthanks{Michael Piefel}{piefel@informatik.hu-berlin.de}{2001/11/21}
-% suggested some more changes and added GNU C++.
-%    \begin{macrocode}
-\lst@definelanguage[GNU]{C++}[ISO]{C++}%
-  {morekeywords={__attribute__,__extension__,__restrict,__restrict__,%
-      typeof,__typeof__},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[Visual]{C++}[ISO]{C++}%
-  {morekeywords={__asm,__based,__cdecl,__declspec,dllexport,%
-      dllimport,__except,__fastcall,__finally,__inline,__int8,__int16,%
-      __int32,__int64,naked,__stdcall,thread,__try,__leave},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[ISO]{C++}[ANSI]{C}%
-  {morekeywords={and,and_eq,asm,bad_cast,bad_typeid,bitand,bitor,bool,%
-      catch,class,compl,const_cast,delete,dynamic_cast,explicit,export,%
-      false,friend,inline,mutable,namespace,new,not,not_eq,operator,or,%
-      or_eq,private,protected,public,reinterpret_cast,static_cast,%
-      template,this,throw,true,try,typeid,type_info,typename,using,%
-      virtual,wchar_t,xor,xor_eq},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-% Objective-C is due to \lstthanks{Detlev~Dr\"oge}
-%{droege@informatik.uni-koblenz.de}{1997/11/04}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Objective-C definition (c) 1997 Detlev Droege 
-%%
-\lst@definelanguage[Objective]{C}[ANSI]{C}
-  {morekeywords={bycopy,id,in,inout,oneway,out,self,super,%
-      @class,@defs,@encode,@end,@implementation,@interface,@private,%
-      @protected,@protocol,@public,@selector},%
-   moredirectives={import}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \lstthanks{J\"org~Viermann}{}{2004/07/17} provided the keywords for Handel-C.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Handel-C definition, refer http://www.celoxica.com
-%%
-\lst@definelanguage[Handel]{C}[ANSI]{C}
-  {morekeywords={assert,chan,chanin,chanout,clock,delay,expr,external,%
-      external_divide,family,ifselect,in,inline,interface,internal,%
-      internal_divid,intwidth,let,macro,mpram,par,part,prialt,proc,ram,%
-      releasesema,reset,rom,select,sema,set,seq,shared,signal,try,%
-      reset,trysema,typeof,undefined,width,with,wom},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[ANSI]{C}%
-  {morekeywords={auto,break,case,char,const,continue,default,do,double,%
-      else,enum,extern,float,for,goto,if,int,long,register,return,%
-      short,signed,sizeof,static,struct,switch,typedef,union,unsigned,%
-      void,volatile,while},%
-   sensitive,%
-   morecomment=[s]{/*}{*/},%
-   morecomment=[l]//,% nonstandard
-   morestring=[b]",%
-   morestring=[b]',%
-   moredelim=*[directive]\#,%
-   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
-      include,pragma,undef,warning}%
-  }[keywords,comments,strings,directives]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-% Thanks go to \lstthanks{Martin~Brodbeck}{Martin.Brodbeck@gmx.de}{2002/03/17}.
-%    \begin{macrocode}
-%%
-%% C-Sharp definition (c) 2002 Martin Brodbeck
-%%
-\lst@definelanguage[Sharp]{C}%
-  {morekeywords={abstract,base,bool,break,byte,case,catch,char,checked,%
-      class,const,continue,decimal,default,delegate,do,double,else,%
-      enum,event,explicit,extern,false,finally,fixed,float,for,foreach,%
-      goto,if,implicit,in,int,interface,internal,is,lock,long,%
-      namespace,new,null,object,operator,out,override,params,private,%
-      protected,public,readonly,ref,return,sbyte,sealed,short,sizeof,%
-      static,string,struct,switch,this,throw,true,try,typeof,uint,%
-      ulong,unchecked,unsafe,ushort,using,virtual,void,while,%
-      as,volatile,stackalloc},% Kai K\"ohne
-   sensitive,%
-   morecomment=[s]{/*}{*/},%
-   morecomment=[l]//,%
-   morestring=[b]"
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Caml and Objective Caml}
-%
-% \lstthanks{Patrick~Cousot}{Patrick.Cousot@wanadoo.fr}{1999/01/09} mailed me
-% the definition. \lsthelper{Tom~Hirschowitz}{tom.hirschowitz@inria.fr}
-% {2003/05/27}{missing keywords: object, ref} added two keywords.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% (Objective) Caml definition (c) 1999 Patrick Cousot
-%%
-%% Objective CAML and Caml light are freely available, together with a
-%% reference manual, at URL ftp.inria.fr/lang/caml-light for the Unix,
-%% Windows and Macintosh OS operating systems.
-%%
-\lst@definelanguage[Objective]{Caml}[light]{Caml}
-  {deletekeywords={not,prefix,value,where},%
-   morekeywords={assert,asr,class,closed,constraint,external,false,%
-      functor,include,inherit,land,lazy,lor,lsl,lsr,lxor,method,mod,%
-      module,new,open,parser,private,sig,struct,true,val,virtual,when,%
-      object,ref},% TH
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[light]{Caml}
-  {morekeywords={and,as,begin,do,done,downto,else,end,exception,for,%
-      fun,function,if,in,let,match,mutable,not,of,or,prefix,rec,then,%
-      to,try,type,value,where,while,with},%
-   sensitive,%
-   morecomment=[n]{(*}{*)},%
-   morestring=[b]",%
-   moredelim=*[directive]\#,%
-   moredirectives={open,close,include}%
-  }[keywords,comments,strings,directives]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Cobol}
-%
-% Keywords are not marked if their names are broken by EOL, for example DEBUG-
-% CONTENTS. Sometimes portions of a string are not printed as a string.
-% This happens if the double quote is not doubled to insert a quote,
-% e.g.~|""bad" cobol"| won't be printed correctly.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[ibm]{Cobol}[1985]{Cobol}%
-  {morekeywords={ADDRESS,BEGINNING,COMP-3,COMP-4,COMPUTATIONAL,%
-      COMPUTATIONAL-3,COMPUTATIONAL-4,DISPLAY-1,EGCS,EJECT,ENDING,%
-      ENTRY,GOBACK,ID,MORE-LABELS,NULL,NULLS,PASSWORD,RECORDING,%
-      RETURN-CODE,SERVICE,SKIP1,SKIP2,SKIP3,SORT-CONTROL,SORT-RETURN,%
-      SUPPRESS,TITLE,WHEN-COMPILED},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[1985]{Cobol}[1974]{Cobol}%
-  {morekeywords={ALPHABET,ALPHABETIC-LOWER,ALPHABETIC-UPPER,%
-      ALPHANUMERIC,ALPHANUMERIC-EDITED,ANY,CLASS,COMMON,CONTENT,%
-      CONTINUE,DAY-OF-WEEK,END-ADD,END-CALL,END-COMPUTE,END-DELETE,%
-      END-DIVIDE,END-EVALUATE,END-IF,END-MULTIPLY,END-PERFORM,END-READ,%
-      END-RECEIVE,END-RETURN,END-REWRITE,END-SEARCH,END-START,%
-      END-STRING,END-SUBTRACT,END-UNSTRING,END-WRITE,EVALUATE,EXTERNAL,%
-      FALSE,GLOBAL,INITIALIZE,NUMERIC-EDITED,ORDER,OTHER,%
-      PACKED-DECIMAL,PADDING,PURGE,REFERENCE,RELOAD,REPLACE,STANDARD-1,%
-      STANDARD-2,TEST,THEN,TRUE},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[1974]{Cobol}%
-  {morekeywords={ACCEPT,ACCESS,ADD,ADVANCING,AFTER,ALL,ALPHABETIC,ALSO,%
-      ALTER,ALTERNATE,AND,ARE,AREA,AREAS,ASCENDING,ASSIGN,AT,AUTHOR,%
-      BEFORE,BINARY,BLANK,BLOCK,BOTTOM,BY,CALL,CANCEL,CD,CF,CH,%
-      CHARACTER,CHARACTERS,CLOCK-UNITS,CLOSE,COBOL,CODE,CODE-SET,%
-      COLLATING,COLUMN,COMMA,COMMUNICATION,COMP,COMPUTE,CONFIGURATION,%
-      CONTAINS,CONTROL,CONTROLS,CONVERTING,COPY,CORR,CORRESPONDING,%
-      COUNT,CURRENCY,DATA,DATE,DATE-COMPILED,DATE-WRITTEN,DAY,DE,%
-      DEBUG-CONTENTS,DEGUB-ITEM,DEBUG-LINE,DEBUG-NAME,DEBUG-SUB1,%
-      DEBUG-SUB2,DEBUG-SUB3,DEBUGGING,DECIMAL-POINT,DECLARATIVES,%
-      DELETE,DELIMITED,DELIMITER,DEPENDING,DESCENDING,DESTINATION,%
-      DETAIL,DISABLE,DISPLAY,DIVIDE,DIVISION,DOWN,DUPLICATES,DYNAMIC,%
-      EGI,ELSE,EMI,ENABLE,END,END-OF-PAGE,ENTER,ENVIRONMENT,EOP,EQUAL,%
-      ERROR,ESI,EVERY,EXCEPTION,EXIT,EXTEND,FD,FILE,FILE-CONTROL,%
-      FILLER,FINAL,FIRST,FOOTING,FOR,FROM,GENERATE,GIVING,GO,GREATER,%
-      GROUP,HEADING,HIGH-VALUE,HIGH-VALUES,I-O,I-O-CONTROL,%
-      IDENTIFICATION,IF,IN,INDEX,INDEXED,INDICATE,INITIAL,INITIATE,%
-      INPUT,INPUT-OUTPUT,INSPECT,INSTALLATION,INTO,INVALID,IS,JUST,%
-      JUSTIFIED,KEY,LABEL,LAST,LEADING,LEFT,LENGTH,LESS,LIMIT,LIMITS,%
-      LINAGE,LINAGE-COUNTER,LINE,LINE-COUNTER,LINES,LINKAGE,LOCK,%
-      LOW-VALUE,LOW-VALUES,MEMORY,MERGE,MESSAGE,MODE,MODULES,MOVE,%
-      MULTIPLE,MULTIPLY,NATIVE,NEGATIVE,NEXT,NO,NOT,NUMBER,NUMERIC,%
-      OBJECT-COMPUTER,OCCURS,OF,OFF,OMITTED,ON,OPEN,OPTIONAL,OR,%
-      ORGANIZATION,OUTPUT,OVERFLOW,PAGE,PAGE-COUNTER,PERFORM,PF,PH,PIC,%
-      PICTURE,PLUS,POINTER,POSITION,PRINTING,POSITIVE,PRINTING,%
-      PROCEDURE,PROCEDURES,PROCEED,PROGRAM,PROGRAM-ID,QUEUE,QUOTE,%
-      QUOTES,RANDOM,RD,READ,RECEIVE,RECORD,RECORDING,RECORDS,REDEFINES,%
-      REEL,REFERENCES,RELATIVE,RELEASE,REMAINDER,REMOVAL,RENAMES,%
-      REPLACING,REPORT,REPORTING,REPORTS,RERUN,RESERVE,RESET,RETURN,%
-      REVERSED,REWIND,REWRITE,RF,RH,RIGHT,ROUNDED,RUN,SAME,SD,SEARCH,%
-      SECTION,SECURITY,SEGMENT,SEGMENT-LIMIT,SELECT,SEND,SENTENCE,%
-      SEPARATE,SEQUENCE,SEQUENTIAL,SET,SIGN,SIZE,SORT,SORT-MERGE,%
-      SOURCE,SOURCE-COMPUTER,SPACE,SPACES,SPECIAL-NAMES,STANDARD,START,%
-      STATUS,STOP,STRING,SUB-QUEUE-1,SUB-QUEUE-2,SUB-QUEUE-3,SUBTRACT,%
-      SUM,SYMBOLIC,SYNC,SYNCHRONIZED,TABLE,TALLYING,TAPE,TERMINAL,%
-      TERMINATE,TEXT,THAN,THROUGH,THRU,TIME,TIMES,TO,TOP,TRAILING,TYPE,%
-      UNIT,UNSTRING,UNTIL,UP,UPON,USAGE,USE,USING,VALUE,VALUES,VARYING,%
-      WHEN,WITH,WORDS,WORKING-STORAGE,WRITE,ZERO,ZEROES,ZEROS},%
-   alsodigit=-,%
-   sensitive=f,% ???
-   morecomment=[f][commentstyle][6]*,%
-   morestring=[d]"% ??? doubled
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-% \texttt{commentstyle} (not the surrounding brackets) have been added after
-% a bug report by \lsthelper{Stephen Reindl}{Stephen.Reindl@vodafone.de}
-% {2002/05/28}{no commentstyle in Cobol}.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Comal 80}
-%
-% The data is from
-% \begin{itemize}
-% \item
-%		\textsc{Borge R. Christensen}:
-%		\textbf{Strukturierte Programmierung mit COMAL 80} [aus dem
-%		D\"anischen \"ubertragen und bearbeitet von Margarete Kragh];
-%		2., verb.\ Auflage -- M\"unchen; Wien: Oldenburg, 1985;
-%		ISBN 3-486-26902-X.
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Comal 80}%
-  {morekeywords={AND,AUTO,CASE,DATA,DEL,DIM,DIV,DO,ELSE,ENDCASE,ENDIF,%
-      ENDPROC,ENDWHILE,EOD,EXEC,FALSE,FOR,GOTO,IF,INPUT,INT,LIST,LOAD,%
-      MOD,NEW,NEXT,NOT,OF,OR,PRINT,PROC,RANDOM,RENUM,REPEAT,RND,RUN,%
-      SAVE,SELECT,STOP,TAB,THEN,TRUE,UNTIL,WHILE,ZONE},%
-   sensitive=f,% ???
-   morecomment=[l]//,%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{bash, csh, and sh}
-%
-% csh is from \lstthanks{Kai~Below}{below@tu-harburg.de}{1998/09/21},
-% but he pointed out that some keywords are probably missing.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% csh definition (c) 1998 Kai Below
-%%
-\lst@definelanguage{csh}
-  {morekeywords={alias,awk,cat,echo,else,end,endif,endsw,exec,exit,%
-      foreach,glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
-      set,setenv,shift,source,switch,then,time,while,umask,unalias,%
-      unset,wait,while,@,env,argv,child,home,ignoreeof,noclobber,%
-      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
-      sqrt,BEGIN,END},%
-   morecomment=[l]\#,%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-% Thanks to \lstthanks{Riccardo~Murri}{riccardo.murri@gmx.it}{2003/09/24}
-% for the following two definitions.
-%    \begin{macrocode}
-%%
-%% bash,sh definition (c) 2003 Riccardo Murri 
-%%
-\lst@definelanguage{bash}[]{sh}%
-  {morekeywords={alias,bg,bind,builtin,command,compgen,complete,%
-      declare,disown,enable,fc,fg,history,jobs,et,local,logout,printf,%
-      pushd,popd,select,set,suspend,shopt,source,times,type,typeset,%
-      ulimit,unalias,wait},%
-  }%
-\lst@definelanguage{sh}%
-  {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,else,%
-      env,eval,exec,expr,exit,export,false,fi,for,function,getopts,%
-      hash,history,if,kill,nice,nohup,ps,pwd,read,readonly,return,%
-      sed,shift,test,then,times,trap,true,umask,unset,until,while},%
-   morecomment=[l]\#,%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Delphi}
-%
-% I took the data from Delphi 1.0 (?) online help.
-% \lstthanks{Christian~Gudrian}{chrigu@kawo1.rwth-aachen.de}{2001/08/16}
-% provided the `double slash' comment.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Delphi}%
-  {morekeywords={and,as,asm,array,begin,case,class,const,constructor,%
-      destructor,div,do,downto,else,end,except,exports,file,finally,%
-      for,function,goto,if,implementation,in,inherited,inline,%
-      initialization,interface,is,label,library,mod,nil,not,object,of,%
-      or,packed,procedure,program,property,raise,record,repeat,set,%
-      shl,shr,string,then,to,try,type,unit,until,uses,var,while,with,%
-      xor,%
-      absolute,abstract,assembler,at,cdecl,default,dynamic,export,%
-      external,far,forward,index,name,near,nodefault,on,override,%
-      private,protected,public,published,read,resident,storedDir,%
-      virtual,write},%
-   morendkeywords={Abs,AddExitProc,Addr,AllocMem,AnsiCompareStr,%
-      AnsiCompareText,AnsiLowerCase,AnsiUpperCase,Append,AppendStr,%
-      ArcTan,AssignCrt,Assigned,AssignFile,BlockRead,BlockWrite,Break,%
-      ChangeFileExt,ChDir,Chr,CloseFile,ClrEol,ClrScr,Concat,Continue,%
-      Copy,Cos,CSeg,CursorTo,Date,DateTimeToFileDate,DateTimeToStr,%
-      DateTimeToString,DateToStr,DayOfWeek,Dec,DecodeDate,DecodeTime,%
-      Delete,DeleteFile,DiskFree,DiskSize,Dispose,DisposeStr,%
-      DoneWinCrt,DSeg,EncodeDate,EncodeTime,Eof,Eoln,Erase,Exclude,%
-      Exit,Exp,ExpandFileName,ExtractFileExt,ExtractFileName,%
-      ExtractFilePath,FileAge,FileClose,FileDateToDateTime,FileExists,%
-      FileGetAttr,FileGetDate,FileOpen,FilePos,FileRead,FileSearch,%
-      FileSeek,FileSetAttr,FileSetDate,FileSize,FillChar,FindClose,%
-      FindFirst,FindNext,FloatToDecimal,FloatToStrF,FloatToStr,%
-      FloatToText,FloatToTextFmt,Flush,FmtLoadStr,FmtStr,Format,%
-      FormatBuf,FormatDateTime,FormatFloat,Frac,Free,FreeMem,GetDir,%
-      GetMem,GotoXY,Halt,Hi,High,Inc,Include,InitWinCrt,Insert,Int,%
-      IntToHex,IntToStr,IOResult,IsValidIdent,KeyPressed,Length,Ln,Lo,%
-      LoadStr,Low,LowerCase,MaxAvail,MemAvail,MkDir,Move,New,NewStr,%
-      Now,Odd,Ofs,Ord,ParamCount,ParamStr,Pi,Pos,Pred,Ptr,Random,%
-      Randomize,Read,ReadBuf,ReadKey,Readln,ReAllocMem,Rename,%
-      RenameFile,Reset,Rewrite,RmDir,Round,RunError,ScrollTo,Seek,%
-      SeekEof,SeekEoln,Seg,SetTextBuf,Sin,SizeOf,SPtr,Sqr,Sqrt,SSeg,%
-      Str,StrCat,StrComp,StrCopy,StrDispose,StrECopy,StrEnd,StrFmt,%
-      StrLCat,StrIComp,StrLComp,StrLCopy,StrLen,StrLFmt,StrLIComp,%
-      StrLower,StrMove,StrNew,StrPas,StrPCopy,StrPos,StrScan,StrRScan,%
-      StrToDate,StrToDateTime,StrToFloat,StrToInt,StrToIntDef,%
-      StrToTime,StrUpper,Succ,Swap,TextToFloat,Time,TimeToStr,%
-      TrackCursor,Trunc,Truncate,TypeOf,UpCase,UpperCase,Val,WhereX,%
-      WhereY,Write,WriteBuf,WriteChar,Writeln},%
-   sensitive=f,%
-   morecomment=[s]{(*}{*)},%
-   morecomment=[s]{\{}{\}},%
-   morecomment=[l]{//},% 2001 Christian Gudrian
-   morestring=[d]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Eiffel}
-%
-% Data is from
-% \begin{itemize}
-% \item
-%       \textsc{Bertrand Meyer}: \textbf{Eiffel: the language};
-%       Prentice Hall International (UK) Ldt, 1992;
-%       ISBN 0-13-247925-7.
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Eiffel}%
-  {morekeywords={alias,all,and,as,BIT,BOOLEAN,CHARACTER,check,class,%
-      creation,Current,debug,deferred,do,DOUBLE,else,elseif,end,%
-      ensure,expanded,export,external,false,feature,from,frozen,if,%
-      implies,indexing,infix,inherit,inspect,INTEGER,invariant,is,%
-      like,local,loop,NONE,not,obsolete,old,once,or,POINTER,prefix,%
-      REAL,redefine,rename,require,rescue,Result,retry,select,%
-      separate,STRING,strip,then,true,undefine,unique,until,variant,%
-      when,xor},%
-   sensitive,%
-   morecomment=[l]--,%
-   morestring=[d]",%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-% The key=value \texttt{stringtest=false} has been removed after a bug
-% report from \lsthelper{Xavier~Cr\'egut}{cregut@enseeiht.fr}{2002/09/09}
-% {stringtest no more part of package}.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Elan}
-%
-% The data come from
-% \begin{itemize}
-% \item
-%		\textsc{Leo~H.~Klingen, Jochen Liedtke}:
-%		\textbf{Programmieren mit ELAN};
-%		B.G.\ Teubner, Stuttgart 1983; ISBN 3-519-02507-8.
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Elan}%
-  {morekeywords={ABS,AND,BOOL,CAND,CASE,CAT,COLUMNS,CONCR,CONJ,CONST,%
-      COR,DECR,DEFINES,DET,DIV,DOWNTO,ELIF,ELSE,END,ENDIF,ENDOP,%
-      ENDPACKET,ENDPROC,ENDREP,ENDSELECT,FALSE,FI,FILE,FOR,FROM,IF,%
-      INCR,INT,INV,LEAVE,LENGTH,LET,MOD,NOT,OF,OP,OR,OTHERWISE,PACKET,%
-      PROC,REAL,REP,REPEAT,ROW,ROWS,SELECT,SIGN,STRUCT,SUB,TEXT,THEN,%
-      TRANSP,TRUE,TYPE,UNTIL,UPTO,VAR,WHILE,WITH,XOR,%
-      maxint,sign,abs,min,max,random,initializerandom,subtext,code,%
-      replace,text,laenge,pos,compress,change,maxreal,smallreal,floor,%
-      pi,e,ln,log2,log10,sqrt,exp,tan,tand,sin,sind,cos,cosd,arctan,%
-      arctand,int,real,lastconversionok,put,putline,line,page,get,%
-      getline,input,output,sequentialfile,maxlinelaenge,reset,eof,%
-      close,complexzero,complexone,complexi,complex,realpart,imagpart,%
-      dphi,phi,vector,norm,replace,matrix,idn,row,column,sub,%
-      replacerow,replacecolumn,replaceelement,transp,errorsstop,stop},%
-   sensitive,%
-   morestring=[d]"%
-  }[keywords,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Erlang}
-%
-% Thanks to \lstthanks{Daniel~Gazard}{gazard_d@epita.fr}{2003/05/31}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Erlang definition (c) 2003 Daniel Gazard
-%%
-\lst@definelanguage{erlang}%
-  {morekeywords={abs,after,and,apply,atom,atom_to_list,band,binary,%
-      binary_to_list,binary_to_term,bor,bsl,bsr,bxor,case,catch,%
-      date,div,element,erase,end,exit,export,float,float_to_list,%
-      get,halt,hash,hd,if,info,import,integer,integer_to_list,%
-      length,link,list,list_to_atom,list_to_float,list_to_integer,%
-      list_to_tuple,module,node,nodes,now,of,or,pid,port,ports,%
-      processes,put,receive,reference,register,registered,rem,%
-      round,self,setelement,size,spawn,throw,time,tl,trace,trunc,%
-      tuple,tuple_to_list,unlink,unregister,whereis,error,false,%
-      infinity,nil,ok,true,undefined,when},%
-   otherkeywords={->,!,[,],\{,\}},%
-   morecomment=[l]\%,%
-   morestring=[b]",%
-   morestring=[b]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Euphoria}
-%
-% \lstthanks{Detlef~Reimers}{dreimers@aol.com}{1998/08/30} sent me the language
-% definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Euphoria definition (c) 1998 Detlef Reimers
-%%
-\lst@definelanguage{Euphoria}%
-% for Euphoria 2.0, Rapid Deployment Software, Kanada
-  {morekeywords={abort,and,and_bits,append,arctan,atom,by,call,%
-      call_proc,call_func,c_proc,c_func,clear_screen,close,%
-      command_line,compare,constant,cos,do,date,else,elsif,end,exit,%
-      find,floor,for,function,getc,getenv,get_key,gets,global,%
-      get_pixel,if,include,integer,length,log,match,machine_func,%
-      machine_proc,mem_copy,mem_set,not,not_bits,or,object,open,%
-      or_bits,procedure,puts,position,prepend,print,printf,power,peek,%
-      poke,pixel,poke4,peek4s,peek4u,return,rand,repeat,remainder,%
-      routine_id,sequence,sqrt,sin,system,sprintf,then,type,to,time,%
-      trace,tan,while,with,without,xor,xor_bits},%
-   sensitive,%
-   morecomment=[l]--,%
-   morestring=[d]',%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Fortran}
-%
-% Took things from
-% \begin{itemize}
-% \item
-%		\textsc{Karl Hans M\"uller}:
-%		\textbf{Fortran 77: Programmierungsanleitung};
-%		3., v\"ollig neu bearb.\ Aufl.\ -- Mannheim; Wien; Z\"urich:
-%		Bibliographisches Institut, 1984;
-%		ISBN 3-411-05804-8
-% \item
-%       \textsc{Thomas Michel}: \textbf{Fortran 90: Lehr-- und Handbuch};
-%       Mannheim; Leipzig; Wien; Z\"urich: BI-Wiss.-Verlag, 1994;
-%       ISBN 3-411-16861-7.
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-% \lsthelper{Denis Girou}{Denis.Girou@idris.fr}{1998/07/26}{Fortran 95=90}
-% proposed to have Fortran 95 and Fortran 90 to be equivalent.
-%    \begin{macrocode}
-\lst@definelanguage[90]{Fortran}[95]{Fortran}{}
-%    \end{macrocode}
-% There is no |morecomment=[f]| in Fortran 90 since otherwise CONTAINS could
-% start a comment. This problem was reported by \lsthelper{Magne Rudshaug}
-% {magne@ife.no}{1998/01/09}{no morecomment=[f] in Fortran 90}.
-% Moreover the keyword INCLUDE is due to him.
-%    \begin{macrocode}
-\lst@definelanguage[95]{Fortran}[77]{Fortran}%
-  {deletekeywords=SAVE,%
-   morekeywords={ACTION,ADVANCE,ALLOCATE,ALLOCATABLE,ASSIGNMENT,CASE,%
-      CONTAINS,CYCLE,DEALLOCATE,DEFAULT,DELIM,EXIT,INCLUDE,IN,NONE,IN,%
-      OUT,INTENT,INTERFACE,IOLENGTH,KIND,LEN,MODULE,NAME,NAMELIST,NMT,%
-      NULLIFY,ONLY,OPERATOR,OPTIONAL,OUT,PAD,POINTER,POSITION,PRIVATE,%
-      PUBLIC,READWRITE,RECURSIVE,RESULT,SELECT,SEQUENCE,SIZE,STAT,%
-      TARGET,USE,WHERE,WHILE,BLOCKDATA,DOUBLEPRECISION,ELSEIF,%
-      ENDBLOCKDATA,ENDDO,ENDFILE,ENDFUNCTION,ENDIF,ENDINTERFACE,%
-      ENDMODULE,ENDPROGRAM,ENDSELECT,ENDSUBROUTINE,ENDTYPE,ENDWHERE,%
-      GOTO,INOUT,SELECTCASE},%
-   deletecomment=[f],% no fixed comment line: 1998 Magne Rudshaug
-   morecomment=[l]!%
-  }%
-%    \end{macrocode}
-% As proposed by \lsthelper{J\"orn Wilms}{wilms@rocinante.colorado.edu}
-% {1997/07/07}{Fortran with \lstsensitivefalse} keywords are \emph{not} case
-% sensitive.
-%    \begin{macrocode}
-\lst@definelanguage[77]{Fortran}%
-  {morekeywords={ACCESS,ASSIGN,BACKSPACE,BLANK,BLOCK,CALL,CHARACTER,%
-      CLOSE,COMMON,COMPLEX,CONTINUE,DATA,DIMENSION,DIRECT,DO,DOUBLE,%
-      ELSE,END,ENTRY,EOF,EQUIVALENCE,ERR,EXIST,EXTERNAL,FILE,FMT,FORM,%
-      FORMAT,FORMATTED,FUNCTION,GO,TO,IF,IMPLICIT,INQUIRE,INTEGER,%
-      INTRINSIC,IOSTAT,LOGICAL,NAMED,NEXTREC,NUMBER,OPEN,OPENED,%
-      PARAMETER,PAUSE,PRECISION,PRINT,PROGRAM,READ,REAL,REC,RECL,%
-      RETURN,REWIND,SEQUENTIAL,STATUS,STOP,SUBROUTINE,THEN,TYPE,%
-      UNFORMATTED,UNIT,WRITE,SAVE},%
-   sensitive=f,%% not Fortran standard %%
-   morecomment=[f]*,%
-   morecomment=[f]C,%
-   morecomment=[f]c,%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Guarded Command Language (GCL)}
-%
-% As you can read below, \lstthanks{Mark~van~Eijk}{mark@luon.net}{2002/10/30}
-% provided this language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Guarded Command Language (GCL)  definition
-%% (c) 2002 Mark van Eijk
-%%
-\lst@definelanguage{GCL}%
-  {morekeywords={const,con,var,array,of,skip,if,fi,do,od,div,mod},%
-   literate={|[}{\ensuremath{|\hskip -0.1em[}}2%
-            {]|}{\ensuremath{]\hskip -0.1em|}}2%
-	    {[]}{\ensuremath{[\hskip -0.1em]}}2%
-	    {->}{\ensuremath{\rightarrow}~}2%
-	    {==}{\ensuremath{\equiv}~}2%
-	    {>=}{\ensuremath{\geq}~}2%
-	    {<=}{\ensuremath{\leq}~}2%
-	    {/\\}{\ensuremath{\land}~}2%
-	    {\\/}{\ensuremath{\lor}~}2%
-	    {!}{\ensuremath{\lnot}}1%
-	    {!=}{\ensuremath{\neq}~}2%
-	    {max}{\ensuremath{\uparrow}}1%
-	    {min}{\ensuremath{\downarrow}}1,%
-   sensitive=f,%
-   morecomment=[s]{\{}{\}},%
-   morestring=[d]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Gnuplot}
-%
-% Thanks to \lsthelper{Dr.~Christoph~Giess}{Ch.Giess@gmx.de}{2003/07/15}{} for
-% providing this definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%%
-%% gnuplot definition (c) Christoph Giess
-%%
-\lst@definelanguage{Gnuplot}%
-  {keywords={abs,acos,acosh,arg,asin,asinh,atan,atan2,atanh,besj0,%
-       besj1,besy0,besy1,ceil,cos,cosh,erf,erfc,exp,floor,gamma,ibeta,%
-       inverf,igamma,imag,invnorm,int,lgamma,log,log10,norm,rand,real,%
-       sgn,sin,sinh,sqrt,tan,tanh,column,tm_hour,tm_mday,tm_min,tm_mon,%
-       tm_sec,tm_wday,tm_yday,tm_year,valid,cd,call,clear,exit,fit,%
-       help,if,load,pause,plot,print,pwd,quit,replot,reread,reset,save,%
-       set,show,shell,splot,test,update,angles,arrow,autoscale,border,%
-       boxwidth,clabel,clip,cntrparam,contour,data,dgrid3d,dummy,%
-       format,function,functions,grid,hidden3d,isosamples,key,keytitle,%
-       label,logscale,mapping,offsets,output,parametric,pointsize,%
-       polar,rrange,samples,size,style,surface,terminal,tics,time,%
-       timefmt,title,trange,urange,variables,view,vrange,xdata,xlabel,%
-       xmargin,xrange,xtics,mxtics,mytics,xdtics,xmtics,xzeroaxis,%
-       ydata,ylabel,yrange,ytics,ydtics,ymtics,yzeroaxis,zdata,zero,%
-       zeroaxis,zlabel,zrange,ztics,zdtics,zmtics,timefm,using,title,%
-       with,index,every,thru,smooth},%
-   sensitive,%
-   comment=[l]\#,%
-   morestring=[b]",%
-   morestring=[b]',%
-  }[keywords,comments,strings]%
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Haskell}
-%
-% Thanks to \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de}{1999/11/18} for
-% providing the new definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Haskell98 as implemented in Hugs98. See http://www.haskell.org
-%% All keywords from Prelude and Standard Libraries
-%% (c) 1999 Peter Bartke
-%%
-\lst@definelanguage{Haskell}%
-  {otherkeywords={=>},%
-   morekeywords={abstype,if,then,else,case,class,data,default,deriving,%
-      hiding,if,in,infix,infixl,infixr,import,instance,let,module,%
-      newtype,of,qualified,type,where,do,AbsoluteSeek,AppendMode,%
-      Array,BlockBuffering,Bool,BufferMode,Char,Complex,Double,Either,%
-      FilePath,Float,Int,Integer,IO,IOError,Ix,LineBuffering,Maybe,%
-      Ordering,NoBuffering,ReadMode,ReadWriteMode,ReadS,RelativeSeek,%
-      SeekFromEnd,SeekMode,ShowS,StdGen,String,Void,Bounded,Enum,Eq,%
-      Eval,ExitCode,exitFailure,exitSuccess,Floating,Fractional,%
-      Functor,Handle,HandlePosn,IOMode,Integral,List,Monad,MonadPlus,%
-      MonadZero,Num,Numeric,Ord,Random,RandomGen,Ratio,Rational,Read,%
-      Real,RealFloat,RealFrac,Show,System,Prelude,EQ,False,GT,Just,%
-      Left,LT,Nothing,Right,WriteMode,True,abs,accum,accumArray,%
-      accumulate,acos,acosh,all,and,any,ap,appendFile,applyM,%
-      approxRational,array,asTypeOf,asin,asinh,assocs,atan,atan2,atanh,%
-      bounds,bracket,bracket_,break,catch,catMaybes,ceiling,chr,cis,%
-      compare,concat,concatMap,conjugate,const,cos,cosh,curry,cycle,%
-      decodeFloat,delete,deleteBy,deleteFirstsBy,denominator,%
-      digitToInt,div,divMod,drop,dropWhile,either,elem,elems,elemIndex,%
-      elemIndices,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,%
-      enumFromTo,error,even,exitFailure,exitWith,exp,exponent,fail,%
-      filter,filterM,find,findIndex,findIndices,flip,floatDigits,%
-      floatRadix,floatRange,floatToDigits,floor,foldl,foldM,foldl1,%
-      foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,%
-      fromIntegral,fromJust,fromMaybe,fromRat,fromRational,%
-      fromRealFrac,fst,gcd,genericLength,genericTake,genericDrop,%
-      genericSplitAt,genericIndex,genericReplicate,getArgs,getChar,%
-      getContents,getEnv,getLine,getProgName,getStdGen,getStdRandom,%
-      group,groupBy,guard,hClose,hFileSize,hFlush,hGetBuffering,%
-      hGetChar,hGetContents,hGetLine,hGetPosn,hIsClosed,hIsEOF,hIsOpen,%
-      hIsReadable,hIsSeekable,hIsWritable,hLookAhead,hPutChar,hPutStr,%
-      hPutStrLn,hPrint,hReady,hSeek,hSetBuffering,hSetPosn,head,%
-      hugsIsEOF,hugsHIsEOF,hugsIsSearchErr,hugsIsNameErr,%
-      hugsIsWriteErr,id,ioError,imagPart,index,indices,init,inits,%
-      inRange,insert,insertBy,interact,intersect,intersectBy,%
-      intersperse,intToDigit,ioeGetErrorString,ioeGetFileName,%
-      ioeGetHandle,isAlreadyExistsError,isAlreadyInUseError,isAlpha,%
-      isAlphaNum,isAscii,isControl,isDenormalized,isDoesNotExistError,%
-      isDigit,isEOF,isEOFError,isFullError,isHexDigit,isIEEE,%
-      isIllegalOperation,isInfinite,isJust,isLower,isNaN,%
-      isNegativeZero,isNothing,isOctDigit,isPermissionError,isPrefixOf,%
-      isPrint,isSpace,isSuffixOf,isUpper,isUserError,iterate,ixmap,%
-      join,last,lcm,length,lex,lexDigits,lexLitChar,liftM,liftM2,%
-      liftM3,liftM4,liftM5,lines,listArray,listToMaybe,log,logBase,%
-      lookup,magnitude,makePolar,map,mapAccumL,mapAccumR,mapAndUnzipM,%
-      mapM,mapM_,mapMaybe,max,maxBound,maximum,maximumBy,maybe,%
-      maybeToList,min,minBound,minimum,minimumBy,mkPolar,mkStdGen,%
-      mplus,mod,msum,mzero,negate,next,newStdGen,not,notElem,nub,nubBy,%
-      null,numerator,odd,openFile,or,ord,otherwise,partition,phase,pi,%
-      polar,pred,print,product,properFraction,putChar,putStr,putStrLn,%
-      quot,quotRem,random,randomIO,randomR,randomRIO,randomRs,randoms,%
-      rangeSize,read,readDec,readFile,readFloat,readHex,readInt,readIO,%
-      readList,readLitChar,readLn,readParen,readOct,readSigned,reads,%
-      readsPrec,realPart,realToFrac,recip,rem,repeat,replicate,return,%
-      reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,%
-      sequence_,setStdGen,show,showChar,showEFloat,showFFloat,%
-      showFloat,showGFloat,showInt,showList,showLitChar,showParen,%
-      showSigned,showString,shows,showsPrec,significand,signum,sin,%
-      sinh,snd,sort,sortBy,span,split,splitAt,sqrt,stderr,stdin,stdout,%
-      strict,subtract,succ,sum,system,tail,tails,take,takeWhile,tan,%
-      tanh,toEnum,toInt,toInteger,toLower,toRational,toUpper,transpose,%
-      truncate,try,uncurry,undefined,unfoldr,union,unionBy,unless,%
-      unlines,until,unwords,unzip,unzip3,unzip4,unzip5,unzip6,unzip7,%
-      userError,when,words,writeFile,zero,zip,zip3,zip4,zip5,zip6,zip7,%
-      zipWith,zipWithM,zipWithM_,zipWith3,zipWith4,zipWith5,zipWith6,%
-      zipWith7},%
-   sensitive,%
-   morecomment=[l]--,%
-   morecomment=[n]{\{-}{-\}},%
-   morestring=[b]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{HTML}
-%
-% I'm quite the opposite of a HTML wizard. In particular this is true for the
-% defined keywords. \lstthanks{Matthias~Bethke}{-}{2003/09/01} helped me out
-% and extended the list.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{HTML}%
-  {morekeywords={A,ABBR,ACRONYM,ADDRESS,APPLET,AREA,B,BASE,BASEFONT,%
-      BDO,BIG,BLOCKQUOTE,BODY,BR,BUTTON,CAPTION,CENTER,CITE,CODE,COL,%
-      COLGROUP,DD,DEL,DFN,DIR,DIV,DL,DOCTYPE,DT,EM,FIELDSET,FONT,FORM,%
-      FRAME,FRAMESET,HEAD,HR,H1,H2,H3,H4,H5,H6,HTML,I,IFRAME,IMG,INPUT,%
-      INS,ISINDEX,KBD,LABEL,LEGEND,LH,LI,LINK,LISTING,MAP,META,MENU,%
-      NOFRAMES,NOSCRIPT,OBJECT,OPTGROUP,OPTION,P,PARAM,PLAINTEXT,PRE,%
-      OL,Q,S,SAMP,SCRIPT,SELECT,SMALL,SPAN,STRIKE,STRING,STRONG,STYLE,%
-      SUB,SUP,TABLE,TBODY,TD,TEXTAREA,TFOOT,TH,THEAD,TITLE,TR,TT,U,UL,%
-      VAR,XMP,%
-      accesskey,action,align,alink,alt,archive,axis,background,bgcolor,%
-      border,cellpadding,cellspacing,charset,checked,cite,class,classid,%
-      code,codebase,codetype,color,cols,colspan,content,coords,data,%
-      datetime,defer,disabled,dir,event,error,for,frameborder,headers,%
-      height,href,hreflang,hspace,http-equiv,id,ismap,label,lang,link,%
-      longdesc,marginwidth,marginheight,maxlength,media,method,multiple,%
-      name,nohref,noresize,noshade,nowrap,onblur,onchange,onclick,%
-      ondblclick,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,%
-      profile,readonly,onmousemove,onmouseout,onmouseover,onmouseup,%
-      onselect,onunload,rel,rev,rows,rowspan,scheme,scope,scrolling,%
-      selected,shape,size,src,standby,style,tabindex,text,title,type,%
-      units,usemap,valign,value,valuetype,vlink,vspace,width,xmlns},%
-   tag=**[s]<>,%
-   sensitive=f,%
-   morestring=[d]",% ??? doubled
-%    \end{macrocode}
-% Now we take care of comments.
-% We don't enter comment mode if we aren't inside |<>|.
-%    \begin{macrocode}
-   MoreSelectCharTable=%
-      \lst@CArgX--\relax\lst@DefDelimB{}{}%
-          {\ifnum\lst@mode=\lst@tagmode\else
-               \expandafter\@gobblethree
-           \fi}%
-          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
-      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
-          \lst@EndComment\lst@commentmode
-  }[keywords,comments,strings,html]%
-%    \end{macrocode}
-% \lsthelper{Peter~Biechele}{peter.biechele@physik.uni-freiburg.de}
-% {1999/07/01}{! Missing $\}$ inserted} reported a problem which was due to
-% missing |\@empty| in value of |SelectCharTable|. And after receiving a bug
-% report from \lsthelper{Jochen Schneider}{jschneider@ds3.etech.haw-hamburg.de}
-% {2002/04/05}{use of \lst@thestyle doesn't match its definition} I converted
-% the version 0.21 contents of |MoreSelectCharTable| to version 1.0.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{IDL}
-%
-% The definition is from \lstthanks{J\"urgen~Heim}
-% {heim@astro.uni-tuebingen.de}{1998/07/27}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% IDL definition (c) 1998 Juergen Heim
-%%
-\lst@definelanguage{IDL}%
-  {morekeywords={and,begin,case,common,do,else,end,endcase,endelse,%
-      endfor,endif,endrep,endwhile,eq,for,function,ge,goto,gt,if,le,lt,%
-      mod,ne,not,of,on_ioerror,or,pro,repeat,return,then,until,while,%
-      xor,on_error,openw,openr,openu,print,printf,printu,plot,read,%
-      readf,readu,writeu,stop},%
-   sensitive=f,%
-   morecomment=[l];,%
-   morestring=[d]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Inform}
-%
-% Thanks to \lstthanks{Jonathan~Sauer}{jonathan.sauer@gmx.de}{2003/11/10}
-% for this language definition. \lsthelper{Ulrike Fischer}{-}{2004/04/21}
-% {Bug in listings.sty} pointed out that |\lstdefinelanguage| should be
-% |\lst@definelanguage|.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Inform definition (c) 2003 Jonathan Sauer
-%%
-\lst@definelanguage{inform}{%
-    % Language keywords
-    morekeywords={breakdo,else,false,for,has,hasnt,if,%
-                in,indirect,jump,notin,nothing,NULL,objectloop,ofclass,%
-                private,property,provides,return,rfalse,rtrue,self,string,%
-                switch,to,true,until,while,with,%
-                creature,held,multiexcept,multiheld,multiinside,noun,number,%
-                scope,topic},%
-    %
-    % Inform functions
-    morekeywords=[2]{box,child,children,font,give,inversion,metaclass,move,%
-                new_line,parent,print,print_ret,read,remove,restore,sibling,%
-                save,spaces,quit,style,bold,underline,reverse,roman remaining,%
-                create,destroy,recreate,copy},%
-    %
-    % Inform definitions
-    morekeywords=[3]{Attribute,Array,Class,Constant,Default,End,Endif,Extend,%
-                Global,Ifdef,Iffalse,Ifndef,Ifnot,Iftrue,Include,Object,%
-                Property,Verb,Release,Serial,Statusline},%
-    %
-    % Library attributes
-    morekeywords=[4]{absent,animate,clothing,concealed,container,door,edible,%
-                enterable,female,general,light,lockable locked,male,moved,%
-                neuter,on,open,openable,pluralname,proper,scenery,scored,%
-                static,supporter,switchable,talkable,transparent,visited,%
-                workflag,worn},%
-    %
-    % Libary properties
-    morekeywords=[5]{n_to,s_to,e_to,w_to,ne_to,nw_to,se_to,sw_to,in_to,%
-                out_to,u_to,d_to,add_to_scope,after,article,articles,before,%
-                cant_go,capacity,daemon,describe,description,door_dir,door_to,%
-                each_turn,found_in,grammar,initial,inside_description,invent,%
-                life,list_together,name number,orders,parse_name,plural,%
-                react_after,react_before,short_name,short_name_indef,time_left,%
-                time_out,when_closed,when_open,when_on,when_off,%
-                with_key}, 
-    %
-    % Library routines
-    morekeywords=[6]{Achieved,AfterRoutines,AllowPushDir,Banner,ChangePlayer,%
-                CommonAncestor,DictionaryLookup,GetGNAOfObject,HasLightSource,%
-                IndirectlyContains,IsSeeThrough,Locale,LoopOverScope,LTI_Insert,%
-                MoveFloatingObjects,NextWord,NextWordStopped,NounDomain,%
-                ObjectIsUntouchable OffersLight,ParseToken,PlaceInScope,PlayerTo,%
-                PronounNotice,PronounValue,ScopeWithin,SetPronoun,SetTime,%
-                StartDaemon,StartTimer,StopDaemon,StopTimer,TestScope,TryNumber,%
-                UnsignedCompare,WordAddress,WordInProperty,WordLength,%
-                WriteListFrom,YesOrNo},%
-    %
-    % Library,entry points
-    morekeywords=[7]{AfterLife,AfterPrompt,Amusing,BeforeParsing,ChooseObjects,%
-                DarkToDark,DeathMessage,GamePostRoutine GamePreRoutine,%
-                Initialise,InScope,LookRoutine,NewRoom,ParseNoun,ParseNumber,%
-                ParserError,PrintRank,PrintTaskName,PrintVerb,TimePasses,%
-                UnknownVerb},%
-    %
-    % Library constants
-    morekeywords=[8]{NEWLINE_BIT,INDENT_BIT,FULLINV_BIT,ENGLISH_BIT,RECURSE_BIT,%
-                ALWAYS_BIT,TERSE_BIT,PARTINV_BIT,DEFART_BIT,WORKFLAG_BIT,%
-                ISARE_BIT,CONCEAL_BIT},%
-    %
-    % Library,meta actions
-    morekeywords=[9]{Pronouns,Quit,Restart,Restore,Save,Verify,ScriptOn,ScriptOff,%
-                NotifyOn,NotifyOff,Places,Objects,Score,FullScore,Version,LMode1,%
-                LMode2,Lmode3},%
-    %
-    % Library,main actions
-    morekeywords=[10]{Close,Disrobe,Drop,Eat,Empty,EmptyT,Enter,Examine,Exit,GetOff,%
-                Give,Go,GoIn,Insert,Inv,InvTall,InvWide,Lock,Look,Open,PutOn,Remove,%
-                Search,Show,SwitchOff,SwitchOn,Take,Transfer,Unlock VagueGo,%
-                Wear},%
-    %
-    % Library,stub actions
-    morekeywords=[11]{Answer,Ask,AskFor,Attack,Blow,Burn,Buy,Climb,Consult,Cut,Dig,%
-                Drink,Fill,Jump,JumpOver,Kiss,Listen,LookUnder,Mild,No,Pray,Pull,%
-                Push,PushDir,Rub,Set,SetTo,Sing,Sleep,Smell,,Sleep,Smell,Sorry,%
-                Squeeze,Strong,Swim,Swing,Taste,Tell,Think,ThrowAt,Tie,Touch,Turn,%
-                Wait,Wake,WakeOther,Wave,WaveHands,Yes},%
-    %
-    otherkeywords={->,-->},%
-    sensitive=false,%
-    morestring=[d]{"},%
-    morecomment=[l]{!}%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Java}
-%
-% \lstthanks{Robert~Wenner}{robert.wenner@gmx.de}{2003/03/27} sent in the
-% first of the following two definitions.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% AspectJ definition (c) Robert Wenner
-%%
-\lst@definelanguage[AspectJ]{Java}[]{Java}%
-  {morekeywords={%
-      adviceexecution,after,args,around,aspect,aspectOf,before,%
-      call,cflow,cflowbelow,%
-% declare error,declare parents,declare precedence,
-% declare soft,declare warning,
-      execution,get,handler,if,initialization,issingleton,pointcut,%
-      percflow,percflowbelow,perthis,pertarget,preinitialization,%
-      privileged,proceed,returning,set,staticinitialization,strictfp,%
-      target,this,thisEnclosingJoinPoint,thisJoinPoint,throwing,%
-      within,withincode},%
-   MoreSelectCharTable=%
-     \lst@DefSaveDef{`.}\lst@umdot{\lst@umdot\global\let\lst@derefop\@empty}%
-     \ifx\lst@derefinstalled\@empty\else
-        \global\let\lst@derefinstalled\@empty
-\lst@AddToHook{Output}%
-{\lst@ifkeywords
-    \ifx\lst@derefop\@empty
-       \global\let\lst@derefop\relax
-       \ifx\lst@thestyle\lst@gkeywords@sty
-          \ifx\lst@currstyle\relax
-             \let\lst@thestyle\lst@identifierstyle
-          \else
-             \let\lst@thestyle\lst@currstyle
-          \fi
-       \fi
-    \fi
- \fi}
-\lst@AddToHook{BOL}{\global\let\lst@derefop\relax}%
-\lst@AddTo\lst@ProcessSpace{\global\let\lst@derefop\relax}%
-     \fi
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-% Got data from \texttt{http://java.sun.com}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Java}%
-  {morekeywords={abstract,boolean,break,byte,case,catch,char,class,%
-      const,continue,default,do,double,else,extends,false,final,%
-      finally,float,for,goto,if,implements,import,instanceof,int,%
-      interface,label,long,native,new,null,package,private,protected,%
-      public,return,short,static,super,switch,synchronized,this,throw,%
-      throws,transient,true,try,void,volatile,while},%
-   sensitive,%
-   morecomment=[l]//,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]",%
-   morestring=[b]',%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-% \lsthelper{Herbert Voss}{Herbert.Voss@alumni.TU-Berlin.de}{2002/07/30}
-% {missing keyword label} added the keyword \texttt{label}.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-% \lstthanks{Martine~Gautier}{Martine.Gautier@loria.fr}{2004/03/30} made the
-% following contribution.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% ByteCodeJava definition (c) 2004 Martine Gautier
-%%
-\lst@definelanguage{JVMIS}%
-  {morekeywords={aaload,astore,aconst_null,aload,aload_0,aload_1,%
-      aload_2,aload_3,anewarray,areturn,arraylength,astore,astore_0,%
-      astore_1,astore_2,astore_3,athrow,baload,bastore,bipush,caload,%
-      castore,checkcast,d2f,d2i,d2l,dadd,daload,dastore,dcmpg,dcmpl,%
-      dconst_0,dconst_1,ddiv,dload,dload_0,dload_1,dload_2,dload_3,%
-      dmul,dneg,drem,dreturn,dstore,dstore_0,dstore_1,dstore_2,%
-      dstore_3,dsub,dup,dup_x1,dup_x2,dup2,dup2_x1,dup2_x2,f2d,%
-      f2i,f2l,fadd,faload,fastore,fcmpg,fcmpl,fconst_0,fconst_1,%
-      fconst_2,fdiv,fload,fload_0,fload_1,fload_2,fload_3,fmul,%
-      fneg,frem,freturn,fstore,fstore_0,fstore_1,fstore_2,fstore_3,%
-      fsub,getfield,getstatic,goto,goto_w,i2b,i2c,i2d,i2f,i2l,i2s,%
-      iadd,iaload,iand,iastore,iconst_0,iconst_1,iconst_2,iconst_3,%
-      iconst_4,iconst_5,idiv,if_acmpeq,if_acmpne,if_icmpeq,if_icmpne,%
-      if_icmplt,if_cmpge,if_cmpgt,if_cmple,ifeq,ifne,iflt,ifge,ifgt,%
-      ifle,ifnonnull,ifnull,iinc,iload,iload_0,iload_1,iload_2,%
-      iload_3,imul,ineg,instanceof,invokeinterface,invokespecial,%
-      invokestatic,invokevirtual,ior,irem,ireturn,ishl,ishr,istore,%
-      istore_0,istore_1,istore_2,istore_3,isub,iushr,ixor,jsr,jsr_w,%
-      l2d,l2f,l2i,ladd,laload,land,lastore,lcmp,lconst_0,lconst_1,%
-      ldc,ldc_w,ldc2_w,ldiv,lload,lload_0,lload_1,lload_2,lload_3,%
-      lmul,lneg,lookupswitch,lor,lrem,lreturn,lshl,lshr,lstore,%
-      lstore_0,lstore_1,lstore_2,lstore_3,lsub,lushr,lxor,%
-      monitorenter,monitorexit,multianewarray,new,newarray,nop,pop,%
-      pop2,putfield,putstatic,ret,return,saload,sastore,sipush,swap,%
-      tableswitch,wide,limit,locals,stack},%
-  }[keywords]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{ksh}
-%
-% Thanks to \lstthanks{Jeffrey Ratcliffe}{Jeffrey.Ratcliffe@m.eads.net}
-% {2002/02/21} for this language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{ksh}
-  {morekeywords={alias,awk,cat,echo,else,elif,fi,exec,exit,%
-      for,in,do,done,select,case,esac,while,until,function,%
-      time,export,cd,eval,fc,fg,kill,let,pwd,read,return,rm,%
-      glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
-      set,setenv,shift,source,switch,then,umask,unalias,%
-      unset,wait,@,env,argv,child,home,ignoreeof,noclobber,%
-      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
-      sqrt,BEGIN,END},%
-   morecomment=[l]\#,%
-   morestring=[d]",%
-   morestring=[d]',%
-   morestring=[d]`%
-  }[keywords,comments,strings]%
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \lsthelper{Herbert Voss}{Herbert.Voss@alumni.TU-Berlin.de}{2002/10/28}
-% {[Fwd: Re: Probleme mit Paket listings bei ksh]} suggested to add the
-% string delimiter |`|.
-% \endgroup
-%
-%
-% \subsection{Lisp, AutoLisp}
-%
-% Most data are from
-% \begin{itemize}
-% \item
-%		\textsc{Guy Steele}:
-%		\textbf{Common Lisp};
-%		Copyright 1990 by Digital Equipment Corporation;
-%		ISBN 1-55558-042-4.
-% \end{itemize}
-% Thanks to \lsthelper{Aslak Raanes}{araanes@ifi.ntnu.no}{1997/11/24}{single
-% comment in Lisp} for the `single comment' delimiters. The keywords are the
-% `one-word' functions and macros of Common Lisp, i.e.~words not containing a
-% minus. But I left out the \texttt{caaaar}, \ldots{} functions.
-% If anyone types them in, I'd like to get them.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Lisp}%
-  {morekeywords={abort,abs,acons,acos,acosh,adjoin,alphanumericp,alter,%
-      append,apply,apropos,aref,arrayp,ash,asin,asinh,assoc,atan,atanh,%
-      atom,bit,boole,boundp,break,butlast,byte,catenate,ceiling,cerror,%
-      char,character,characterp,choose,chunk,cis,close,clrhash,coerce,%
-      collect,commonp,compile,complement,complex,complexp,concatenate,%
-      conjugate,cons,consp,constantp,continue,cos,cosh,cotruncate,%
-      count,delete,denominator,describe,directory,disassemble,%
-      documentation,dpb,dribble,ed,eighth,elt,enclose,endp,eq,eql,%
-      equal,equalp,error,eval,evalhook,evenp,every,exp,expand,export,%
-      expt,fboundp,fceiling,fdefinition,ffloor,fifth,fill,find,first,%
-      float,floatp,floor,fmakunbound,format,fourth,fround,ftruncate,%
-      funcall,functionp,gatherer,gcd,generator,gensym,gentemp,get,getf,%
-      gethash,identity,imagpart,import,inspect,integerp,intern,%
-      intersection,tively,isqrt,keywordp,last,latch,lcm,ldb,ldiff,%
-      length,list,listen,listp,load,log,logand,logbitp,logcount,logeqv,%
-      logior,lognand,lognor,lognot,logtest,logxor,macroexpand,%
-      makunbound,map,mapc,mapcan,mapcar,mapcon,maphash,mapl,maplist,%
-      mask,max,member,merge,min,mingle,minusp,mismatch,mod,namestring,%
-      nbutlast,nconc,nintersection,ninth,not,notany,notevery,nreconc,%
-      nreverse,nsublis,nsubst,nth,nthcdr,null,numberp,numerator,nunion,%
-      oddp,open,packagep,pairlis,pathname,pathnamep,phase,plusp,%
-      position,positions,pprint,previous,princ,print,proclaim,provide,%
-      random,rassoc,rational,rationalize,rationalp,read,readtablep,%
-      realp,realpart,reduce,rem,remhash,remove,remprop,replace,require,%
-      rest,revappend,reverse,room,round,rplaca,rplacd,sbit,scan,schar,%
-      search,second,series,set,seventh,shadow,signal,signum,sin,sinh,%
-      sixth,sleep,some,sort,split,sqrt,streamp,string,stringp,sublis,%
-      subseq,subseries,subsetp,subst,substitute,subtypep,svref,sxhash,%
-      symbolp,tailp,tan,tanh,tenth,terpri,third,truename,truncate,%
-      typep,unexport,unintern,union,until,values,vector,vectorp,warn,%
-      write,zerop,and,assert,case,ccase,cond,ctypecase,decf,declaim,%
-      defclass,defconstant,defgeneric,defmacro,defmethod,defpackage,%
-      defparameter,defsetf,defstruct,deftype,defun,defvar,do,dolist,%
-      dotimes,ecase,encapsulated,etypecase,flet,formatter,gathering,%
-      incf,iterate,labels,let,locally,loop,macrolet,mapping,or,pop,%
-      producing,prog,psetf,psetq,push,pushnew,remf,return,rotatef,%
-      setf,shiftf,step,time,trace,typecase,unless,untrace,when},%
-   sensitive,% ???
-   alsodigit=-,%
-   morecomment=[l];,%
-   morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes
-   morestring=[b]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-% \lstthanks{Stefan Lagotzki}{info@lagotzki.de}{2001/10/28} warned me to
-% define this as a lisp dialect \ldots
-%    \begin{macrocode}
-%%
-%% AutoLISP/VisualLISP - Stefan Lagotzki, info@lagotzki.de
-%%
-\lst@definelanguage[Auto]{Lisp}%
-  {morekeywords={abs,acad_colordlg,acad_helpdlg,acad_strlsort,%
-      action_tile,add_list,alert,alloc,and,angle,angtof,angtos,append,%
-      apply,arx,arxload,arxunload,ascii,assoc,atan,atof,atoi,atom,%
-      atoms-family,autoarxload,autoload,Boole,boundp,caddr,cadr,car,%
-      cdr,chr,client_data_tile,close,command,cond,cons,cos,cvunit,%
-      defun,defun-q,defun-q-list-ref,defun-q-list-set,dictadd,dictnext,%
-      dictremove,dictrename,dictsearch,dimx_tile,dimy_tile,distance,%
-      distof,done_dialog,end_image,end_list,entdel,entget,entlast,%
-      entmake,entmakex,entmod,entnext,entsel,entupd,eq,equal,*error*,%
-      eval,exit,exp,expand,expt,fill_image,findfile,fix,float,foreach,%
-      function,gc,gcd,get_attr,get_tile,getangle,getcfg,getcname,%
-      getcorner,getdist,getenv,getfiled,getint,getkword,getorient,%
-      getpoint,getreal,getstring,getvar,graphscr,grclear,grdraw,grread,%
-      grtext,grvecs,handent,help,if,initdia,initget,inters,itoa,lambda,%
-      last,layoutlist,length,list,listp,load,load_dialog,log,logand,%
-      logior,lsh,mapcar,max,mem,member,menucmd,menugroup,min,minusp,%
-      mode_tile,namedobjdict,nentsel,nentselp,new_dialog,not,nth,%
-      null,numberp,open,or,osnap,polar,prin1,princ,print,progn,prompt,%
-      quit,quote,read,read-char,read-line,redraw,regapp,rem,repeat,%
-      reverse,rtos,set,set_tile,setcfg,setenv,setfunhelp,setq,%
-      setvar,setview,sin,slide_image,snvalid,sqrt,ssadd,ssdel,ssget,%
-      ssgetfirst,sslength,ssmemb,ssname,ssnamex,sssetfirst,startapp,%
-      start_dialog,start_image,start_list,strcase,strcat,strlen,subst,%
-      substr,tablet,tblnext,tblobjname,tblsearch,term_dialog,terpri,%
-      textbox,textpage,textscr,trace,trans,type,unload_dialog,untrace,%
-      vector_image,ver,vl-acad-defun,vl-acad-undefun,vl-arx-import,%
-      vl-bb-ref,vl-bb-set,vl-catch-all-apply,%
-      vl-catch-all-error-message,vl-catch-all-error-p,vl-cmdf,vl-consp,%
-      vl-directory-files,vl-doc-export,vl-doc-import,vl-doc-ref,%
-      vl-doc-set,vl-every,vl-exit-with-error,vl-exit-with-value,%
-      vl-file-copy,vl-file-delete,vl-file-directory-p,vl-file-rename,%
-      vl-file-size,vl-file-systime,vl-filename-base,%
-      vl-filename-directory,vl-filename-extension,vl-filename-mktemp,%
-      vl-get-resource,vl-list*,vl-list->string,%
-      vl-list-exported-functions,vl-list-length,vl-list-loaded-vlx,%
-      vl-load-all,vl-load-com,vl-load-reactors,vl-member-if,%
-      vl-member-if-not,vl-position,vl-prin1-to-string,%
-      vl-princ-to-string,vl-propagate,vl-registry-delete,%
-      vl-registry-descendents,vl-registry-read,vl-registry-write,%
-      vl-remove,vl-remove-if,vl-remove-if-not,vl-some,vl-sort,%
-      vl-sort-i,vl-string->list,vl-string-elt,vl-string-left-trim,%
-      vl-string-mismatch,vl-string-position,vl-string-right-trim,%
-      vl-string-search,vl-string-subst,vl-string-translate,%
-      vl-string-trim,vl-symbol-name,vl-symbol-value,vl-symbolp,%
-      vl-unload-vlx,vl-vbaload,vl-vbarun,vl-vlx-loaded-p,vlax-3D-point,%
-      vlax-add-cmd,vlax-create-object,vlax-curve-getArea,%
-      vlax-curve-getDistAtParam,vlax-curve-getDistAtPoint,%
-      vlax-curve-getEndParam,vlax-curve-getEndPoint,%
-      vlax-curve-getParamAtDist,vlax-curve-getParamAtPoint,%
-      vlax-curve-getPointAtDist,vlax-curve-getPointAtParam,%
-      vlax-curve-getStartParam,vlax-curve-getStartPoint,%
-      vlax-curve-isClosed,vlax-curve-isPeriodic,vlax-curve-isPlanar,%
-      vlax-curve-getClosestPointTo,%
-      vlax-curve-getClosestPointToProjection,vlax-curve-getFirstDeriv,%
-      vlax-curve-getSecondDeriv,vlax-dump-object,%
-      vlax-ename->vla-object,vlax-erased-p,vlax-for,%
-      vlax-get-acad-object,vlax-get-object,vlax-get-or-create-object,%
-      vlax-get-property,vlax-import-type-library,vlax-invoke-method,%
-      vlax-ldata-delete,vlax-ldata-get,vlax-ldata-list,vlax-ldata-put,%
-      vlax-ldata-test,vlax-make-safearray,vlax-make-variant,%
-      vlax-map-collection,vlax-method-applicable-p,%
-      vlax-object-released-p,vlax-product-key,%
-      vlax-property-available-p,vlax-put-property,vlax-read-enabled-p,%
-      vlax-release-object,vlax-remove-cmd,vlax-safearray-fill,%
-      vlax-safearray-get-dim,vlax-safearray-get-element,%
-      vlax-safearray-get-l-bound,vlax-safearray-get-u-bound,%
-      vlax-safearray-put-element,vlax-safearray-type,%
-      vlax-safearray->list,vlax-tmatrix,vlax-typeinfo-available-p,%
-      vlax-variant-change-type,vlax-variant-type,vlax-variant-value,%
-      vlax-vla-object->ename,vlax-write-enabled-p,vlisp-compile,%
-      vlr-acdb-reactor,vlr-add,vlr-added-p,vlr-beep-reaction,%
-      vlr-command-reactor,vlr-current-reaction-name,vlr-data,%
-      vlr-data-set,vlr-deepclone-reactor,vlr-docmanager-reactor,%
-      vlr-dwg-reactor,vlr-dxf-reactor,vlr-editor-reactor,%
-      vlr-insert-reactor,vlr-linker-reactor,vlr-lisp-reactor,%
-      vlr-miscellaneous-reactor,vlr-mouse-reactor,vlr-notification,%
-      vlr-object-reactor,vlr-owner-add,vlr-owner-remove,vlr-owners,%
-      vlr-pers,vlr-pers-list,vlr-pers-p,vlr-pers-release,%
-      vlr-reaction-names,vlr-reaction-set,vlr-reactions,vlr-reactors,%
-      vlr-remove,vlr-remove-all,vlr-set-notification,%
-      vlr-sysvar-reactor,vlr-toolbar-reactor,vlr-trace-reaction,%
-      vlr-type,vlr-types,vlr-undo-reactor,vlr-wblock-reactor,%
-      vlr-window-reactor,vlr-xref-reactor,vports,wcmatch,while,%
-      write-char,write-line,xdroom,xdsize,zerop},%
-   alsodigit=->,%
-   otherkeywords={1+,1-},%
-   sensitive=false,% 
-   morecomment=[l];,%
-   morecomment=[l];;,%
-   morestring=[b]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Logo}
-%
-% I don't know where the keywords are from and what kind of Logo it is.
-% Help me!
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Logo}%
-% ??? {end,unix} also keywords
-  {morekeywords={and,atan,arctan,both,break,bf,bl,butfirst,butlast,%
-      cbreak, close,co,continue,cos,count,clearscreen,cs,debquit,%
-      describe,diff,difference,ed,edit,either,emptyp,equalp,er,erase,%
-      errpause,errquit,fifp,filefprint,fifty,fileftype,fip,fileprint,%
-      fird,fileread,fity,filetype,fiwd,fileword,f,first,or,fp,fprint,%
-      fput,fty,ftype,full,fullscreen,go,bye,goodbye,gprop,greaterp,%
-      help,if,iff,iffalse,ift,iftrue,nth,item,keyp,llast,lessp,list,%
-      local,lput,make,max,maximum,memberp,memtrace,min,minimum,namep,%
-      not,numberp,oflush,openr,openread,openw,openwrite,op,output,%
-      pause,plist,pots,pow,pprop,pps,pr,print,product,quotient,random,%
-      rc,readchar,rl,readlist,remprop,repcount,repeat,request,rnd,run,%
-      se,sentence,sentencep,setc,setcolor,setipause,setqpause,po,show,%
-      sin,split,splitscreen,sqrt,stop,sum,test,text,textscreen,thing,%
-      to,tone,top,toplevel,type,untrace,wait,word,wordp,yaccdebug,is,%
-      mod,remainder,trace,zerop,back,bk,bto,btouch,fd,forward,fto,%
-      ftouch,getpen,heading,hit,hitoot,ht,hideturtle,loff,lampoff,lon,%
-      lampon,lt,left,lot,lotoot,lto,ltouch,penc,pencolor,pd,pendown,pe,%
-      penerase,penmode,pu,penup,px,penreverse,rt,right,rto,rtouch,%
-      scrunch,seth,setheading,setscrun,setscrunch,setxy,shownp,st,%
-      showturtle,towardsxy,clean,wipeclean,xcor,ycor,tur,turtle,%
-      display,dpy},%
-   sensitive=f% ???
-  }[keywords]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Make}
-%
-% \lstthanks{Rolf~Niepraschk}{niepraschk@ptb.de}{2000/01/10} sent me the new
-% definitions. \lstthanks{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}{2001/10/12}
-% found a missing comma and added some keywords, which improve the highlighting
-% with |makemacrouse=true| (but I haven't tested this).
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Make definitions (c) 2000 Rolf Niepraschk
-%%
-\lst@definelanguage[gnu]{make}%
-  {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*,%
-      @,^,<,\%,+,?,*,% Markus Pahlow
-      export,unexport,include,override,define,ifdef,ifneq,ifeq,else,%
-      endif,vpath,subst,patsubst,strip,findstring,filter,filter-out,%
-      sort,dir,notdir,suffix,basename,addsuffix,addprefix,join,word,%
-      words,firstword,wildcard,shell,origin,foreach,%
-      @D,@F,*D,*F,\%D,\%F,
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Matlab}
-%
-% I took the keywords from \texttt{http://www.utexas.edu/math/Matlab/Manual},
-% but I removed the keywords |i|, |j| and |tmp|---the change was proposed by
-% \lsthelper{Kai Below}{below@tu-harburg.de}{1998/09/21}{Matlab: keywords
-% i,j,tmp removed}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Matlab}%
-  {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
-      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
-      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
-      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
-      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
-      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
-      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
-      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
-      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
-      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
-      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
-      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
-      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
-      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
-      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
-      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
-      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,error,%
-      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
-      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
-      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
-      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
-      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
-      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
-      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
-      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
-      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
-      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
-      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
-      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
-      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
-      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
-      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
-      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
-      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
-      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
-      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
-      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
-      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
-      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
-      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
-      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
-      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
-      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
-      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
-      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
-      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
-      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
-      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
-      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
-      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
-      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
-      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
-      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
-      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
-      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
-      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
-      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
-      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
-      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
-      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
-      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
-      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
-      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
-      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
-      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
-      wk1write,xlabel,xor,ylabel,zeros,zlabel,zoom},%
-   sensitive,%
-   morecomment=[l]\%,%
-   morestring=[m]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Mathematica}
-%
-% \lstthanks{Michael Wiese}{wiese@itwm.uni-kl.de}{1999/02/25} typed in all the
-% keywords!
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Mathematica definitions (c) 1999 Michael Wiese
-%%
-\lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}%
-  {morekeywords={Abort,AbortProtect,AbsoluteDashing,AbsolutePointSize,%
-      AbsoluteThickness,AbsoluteTime,AccountingFormAiry,AiPrime,AiryBi,%
-      AiryBiPrime,Alternatives,AnchoredSearch,AxesEdge,AxesOrigin,%
-      AxesStyle,Background,BetaRegularized,BoxStyle,C,CheckAbort,%
-      Circle,ClebschGordan,CMYKColor,ColorFunction,ColorOutput,Compile,%
-      Compiled,CompiledFunction,ComplexExpand,ComposeList,Composition,%
-      ConstrainedMax,ConstrainedMin,Contexts,ContextToFilename,%
-      ContourLines,Contours,ContourShading,ContourSmoothing,%
-      ContourStyle,CopyDirectory,CopyFile,CosIntegral,CreateDirectory,%
-      Cuboid,Date,DeclarePackage,DefaultColor,DefaultFont,Delete,%
-      DeleteCases,DeleteDirectory,DeleteFile,Dialog,DialogIndent,%
-      DialogProlog,DialogSymbols,DigitQ,Directory,DirectoryStack,Disk,%
-      Dispatch,DownValues,DSolve,Encode,Epilog,Erfc,Evaluate,%
-      ExponentFunction,FaceGrids,FileByteCount,FileDate,FileNames,%
-      FileType,Find,FindList,FixedPointList,FlattenAt,Fold,FoldList,%
-      Frame,FrameLabel,FrameStyle,FrameTicks,FromCharacterCode,%
-      FromDate,FullGraphics,FullOptions,GammaRegularized,%
-      GaussianIntegers,GraphicsArray,GraphicsSpacing,GridLines,%
-      GroebnerBasis,Heads,HeldPart,HomeDirectory,Hue,IgnoreCases,%
-      InputStream,Install,InString,IntegerDigits,InterpolatingFunction,%
-      InterpolatingPolynomial,Interpolation,Interrupt,InverseFunction,%
-      InverseFunctions,JacobiZeta,LetterQ,LinearProgramming,ListPlay,%
-      LogGamma,LowerCaseQ,MachineNumberQ,MantissaExponent,MapIndexed,%
-      MapThread,MatchLocalNames,MatrixExp,MatrixPower,MeshRange,%
-      MeshStyle,MessageList,Module,NDSolve,NSolve,NullRecords,%
-      NullWords,NumberFormat,NumberPadding,NumberSigns,OutputStream,%
-      PaddedForm,ParentDirectory,Pause,Play,PlayRange,PlotRegion,%
-      PolygonIntersections,PolynomialGCD,PolynomialLCM,PolynomialMod,%
-      PostScript,PowerExpand,PrecisionGoal,PrimePi,Prolog,%
-      QRDecomposition,Raster,RasterArray,RealDigits,Record,RecordLists,%
-      RecordSeparators,ReleaseHold,RenameDirectory,RenameFile,%
-      ReplaceHeldPart,ReplacePart,ResetDirectory,Residue,%
-      RiemannSiegelTheta,RiemannSiegelZ,RotateLabel,SameTest,%
-      SampleDepth,SampledSoundFunction,SampledSoundList,SampleRate,%
-      SchurDecomposition,SessionTime,SetAccuracy,SetDirectory,%
-      SetFileDate,SetPrecision,SetStreamPosition,Shallow,SignPadding,%
-      SinIntegral,SixJSymbol,Skip,Sound,SpellingCorrection,%
-      SphericalRegion,Stack,StackBegin,StackComplete,StackInhibit,%
-      StreamPosition,Streams,StringByteCount,StringConversion,%
-      StringDrop,StringInsert,StringPosition,StringReplace,%
-      StringReverse,StringTake,StringToStream,SurfaceColor,%
-      SyntaxLength,SyntaxQ,TableAlignments,TableDepth,%
-      TableDirections,TableHeadings,TableSpacing,ThreeJSymbol,TimeUsed,%
-      TimeZone,ToCharacterCode,ToDate,ToHeldExpression,TokenWords,%
-      ToLowerCase,ToUpperCase,Trace,TraceAbove,TraceBackward,%
-      TraceDepth,TraceDialog,TraceForward,TraceOff,TraceOn,%
-      TraceOriginal,TracePrint,TraceScan,Trig,Unevaluated,Uninstall,%
-      UnsameQ,UpperCaseQ,UpValues,ViewCenter,ViewVertical,With,Word,%
-      WordSearch,WordSeparators},%
-    morendkeywords={Stub,Temporary,$Aborted,$BatchInput,$BatchOutput,%
-      $CreationDate,$DefaultFont,$DumpDates,$DumpSupported,$Failed,%
-      $Input,$Inspector,$IterationLimit,$Language,$Letters,$Linked,%
-      $LinkSupported,$MachineEpsilon,$MachineID,$MachineName,%
-      $MachinePrecision,$MachineType,$MaxMachineNumber,$MessageList,%
-      $MessagePrePrint,$MinMachineNumber,$ModuleNumber,$NewMessage,%
-      $NewSymbol,$Notebooks,$OperatingSystem,$Packages,$PipeSupported,%
-      $PreRead,$ReleaseNumber,$SessionID,$SoundDisplayFunction,%
-      $StringConversion,$StringOrder,$SyntaxHandler,$TimeUnit,%
-      $VersionNumber}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[1.0]{Mathematica}%
-  {morekeywords={Abs,Accuracy,AccurayGoal,AddTo,AiryAi,AlgebraicRules,%
-      AmbientLight,And,Apart,Append,AppendTo,Apply,ArcCos,ArcCosh,%
-      ArcCot,ArcCoth,ArcCsc,ArcCsch,ArcSec,ArcSech,ArcSin,ArcSinh,%
-      ArcTan,ArcTanh,Arg,ArithmeticGeometricMean,Array,AspectRatio,%
-      AtomQ,Attributes,Axes,AxesLabel,BaseForm,Begin,BeginPackage,%
-      BernoulliB,BesselI,BesselJ,BesselK,BesselY,Beta,Binomial,Blank,%
-      BlankNullSequence,BlankSequence,Block,Boxed,BoxRatios,Break,Byte,%
-      ByteCount,Cancel,Cases,Catch,Ceiling,CForm,Character,Characters,%
-      ChebyshevT,ChebyshevU,Check,Chop,Clear,ClearAll,ClearAttributes,%
-      ClipFill,Close,Coefficient,CoefficientList,Collect,ColumnForm,%
-      Complement,Complex,CompoundExpression,Condition,Conjugate,%
-      Constants,Context,Continuation,Continue,ContourGraphics,%
-      ContourPlot,Cos,Cosh,Cot,Coth,Count,Csc,Csch,Cubics,Cyclotomic,%
-      D,Dashing,Decompose,Decrement,Default,Definition,Denominator,%
-      DensityGraphics,DensityPlot,Depth,Derivative,Det,DiagonalMatrix,%
-      DigitBlock,Dimensions,DirectedInfinity,Display,DisplayFunction,%
-      Distribute,Divide,DivideBy,Divisors,DivisorSigma,Do,Dot,Drop,Dt,%
-      Dump,EdgeForm,Eigensystem,Eigenvalues,Eigenvectors,Eliminate,%
-      EllipticE,EllipticExp,EllipticF,EllipticK,EllipticLog,EllipticPi,%
-      EllipticTheta,End,EndPackage,EngineeringForm,Environment,Equal,%
-      Erf,EulerE,EulerPhi,EvenQ,Exit,Exp,Expand,ExpandAll,%
-      ExpandDenominator,ExpandNumerator,ExpIntegralE,ExpIntegralEi,%
-      Exponent,Expression,ExtendedGCD,FaceForm,Factor,FactorComplete,%
-      Factorial,Factorial2,FactorInteger,FactorList,FactorSquareFree,%
-      FactorSquareFreeList,FactorTerms,FactorTermsList,FindMinimum,%
-      FindRoot,First,Fit,FixedPoint,Flatten,Floor,FontForm,For,Format,%
-      FormatType,FortranForm,Fourier,FreeQ,FullDefinition,FullForm,%
-      Function,Gamma,GCD,GegenbauerC,General,Get,Goto,Graphics,%
-      Graphics3D,GrayLevel,Greater,GreaterEqual,Head,HermiteH,%
-      HiddenSurface,Hold,HoldForm,Hypergeometric0F1, Hypergeometric1F1,%
-      Hypergeometric2F1,HypergeometricU,Identity,IdentityMatrix,If,Im,%
-      Implies,In,Increment,Indent,Infix,Information,Inner,Input,%
-      InputForm,InputString,Insert,Integer,IntegerQ,Integrate,%
-      Intersection,Inverse,InverseFourier,InverseJacobiSN,%
-      InverseSeries,JacobiAmplitude,JacobiP,JacobiSN,JacobiSymbol,Join,%
-      Label,LaguerreL,Last,LatticeReduce,LCM,LeafCount,LegendreP,%
-      LegendreQ,LegendreType,Length,LerchPhi,Less,LessEqual,Level,%
-      Lighting,LightSources,Limit,Line,LinearSolve,LineBreak,List,%
-      ListContourPlot,ListDensityPlot,ListPlot,ListPlot3D,Literal,Log,%
-      LogicalExpand,LogIntegral,MainSolve,Map,MapAll,MapAt,MatchQ,%
-      MatrixForm,MatrixQ,Max,MaxBend,MaxMemoryUsed,MemberQ,%
-      MemoryConstrained,MemoryInUse,Mesh,Message,MessageName,Messages,%
-      Min,Minors,Minus,Mod,Modulus,MoebiusMu,Multinomial,N,NameQ,Names,%
-      NBernoulliB,Needs,Negative,Nest,NestList,NIntegrate,%
-      NonCommutativeMultiply,NonConstants,NonNegative,Normal,Not,%
-      NProduct,NSum,NullSpace,Number,NumberForm,NumberPoint,NumberQ,%
-      NumberSeparator,Numerator,O,OddQ,Off,On,OpenAppend,OpenRead,%
-      OpenTemporary,OpenWrite,Operate,Optional,Options,Or,Order,%
-      OrderedQ,Out,Outer,OutputForm,PageHeight,PageWidth,%
-      ParametricPlot,ParametricPlot3D,Part,Partition,PartitionsP,%
-      PartitionsQ,Pattern,Permutations,Plot,Plot3D,PlotDivision,%
-      PlotJoined,PlotLabel,PlotPoints,PlotRange,PlotStyle,Pochhammer,%
-      Plus,Point,PointSize,PolyGamma,Polygon,PolyLog,PolynomialQ,%
-      PolynomialQuotient,PolynomialRemainder,Position,Positive,Postfix,%
-      Power,PowerMod,PrecedenceForm,Precision,PreDecrement,Prefix,%
-      PreIncrement,Prepend,PrependTo,Prime,PrimeQ,Print,PrintForm,%
-      Product,Protect,PseudoInverse,Put,PutAppend,Quartics,Quit,%
-      Quotient,Random,Range,Rational,Rationalize,Raw,Re,Read,ReadList,%
-      Real,Rectangle,Reduce,Remove,RenderAll,Repeated,RepeatedNull,%
-      Replace,ReplaceAll,ReplaceRepeated,Rest,Resultant,Return,Reverse,%
-      RGBColor,Roots,RotateLeft,RotateRight,Round,RowReduce,Rule,%
-      RuleDelayed,Run,RunThrough,SameQ,Save,Scaled,Scan,ScientificForm,%
-      Sec,Sech,SeedRandom,Select,Sequence,SequenceForm,Series,%
-      SeriesData,Set,SetAttributes,SetDelayed,SetOptions,Shading,Share,%
-      Short,Show,Sign,Signature,Simplify,Sin,SingularValues,Sinh,%
-      Skeleton,Slot,SlotSequence,Solve,SolveAlways,Sort,%
-      SphericalHarmonicY,Splice,Sqrt,StirlingS1,StirlingS2,String,%
-      StringBreak,StringForm,StringJoin,StringLength,StringMatchQ,%
-      StringSkeleton,Subscript,Subscripted,Subtract,SubtractForm,Sum,%
-      Superscript,SurfaceGraphics,Switch,Symbol,Table,TableForm,TagSet,%
-      TagSetDelayed,TagUnset,Take,Tan,Tanh,ToString,TensorRank,TeXForm,%
-      Text,TextForm,Thickness,Thread,Through,Throw,Ticks,%
-      TimeConstrained,Times,TimesBy,Timing,ToExpression,Together,%
-      ToRules,ToString,TotalHeight,TotalWidth,Transpose,TreeForm,TrueQ,%
-      Unequal,Union,Unique,Unprotect,Unset,Update,UpSet,UpSetDelayed,%
-      ValueQ,Variables,VectorQ,ViewPoint,WeierstrassP,%
-      WeierstrassPPrime,Which,While,WorkingPrecision,Write,WriteString,%
-      Xor,ZeroTest,Zeta},%
-   morendkeywords={All,Automatic,Catalan,ComplexInfinity,Constant,%
-      Degree,E,EndOfFile,EulerGamma,False,Flat,GoldenRatio,HoldAll,%
-      HoldFirst,HoldRest,I,Indeterminate,Infinity,Listable,Locked,%
-      Modular,None,Null,OneIdentity,Orderless,Pi,Protected,%
-      ReadProtected,True,$CommandLine,$Context,$ContextPath,$Display,%
-      $DisplayFunction,$Echo,$Epilog,$IgnoreEOF,$Line,$Messages,%
-      $Output,$Path,$Post,$Pre,$PrePrint,$RecursionLimit,$System,%
-      $Urgent,$Version},%
-   sensitive,%
-   morecomment=[s]{(*}{*)},%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Mercury}
-%
-% \lstthanks{Dominique~de~Waleffe}{ddw@miscrit.be}{1997/11/24} mailed me the
-% data and \lstthanks{Ralph~Becket}{rbeck@microsoft.com}{2001/05/01} extended
-% the definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Mercury definition (c) 1997 Dominique de Waleffe
-%% Extended (c) 2001 Ralph Becket
-%%
-\lst@definelanguage{Mercury}%
-  {otherkeywords={::,->,-->,--->,:-,==,=>,<=,<=>},%
-   morekeywords={module,include_module,import_module,interface,%
-      end_module,implementation,mode,is,failure,semidet,nondet,det,%
-      multi,erroneous,inst,in,out,di,uo,ui,type,typeclass,instance,%
-      where,with_type,pred,func,lambda,impure,semipure,if,then,else,%
-      some,all,not,true,fail,pragma,memo,no_inline,inline,loop_check,%
-      minimal_model,fact_table,type_spec,terminates,does_not_terminate,%
-      check_termination,promise_only_solution,unsafe_promise_unique,%
-      source_file,obsolete,import,export,c_header_code,c_code,%
-      foreign_code,foreign_proc,may_call_mercury,will_not_call_mercury,%
-      thread_safe,not_thread_safe},%
-   sensitive=t,%
-   morecomment=[l]\%,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[bd]",%
-   morestring=[bd]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{MetaPost}
-%
-% \lstthanks{Uwe~Siart}{uwe.siart@ei.tum.de}{2003/03/28} provided the
-% keywords for a previous version. The current language definition comes
-% from \lstthanks{Brooks~Moses}{}{2004/08/07}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% MetaPost definition (c) 2004 Brooks Moses
-%%   This definition is based on the language specifications
-%%   contained in the _User's Manual for Metapost_, with the core
-%%   language enhancements that are described in the _Drawing
-%%   Graphs with MetaPost_ documentation.
-%%
-\lst@definelanguage{MetaPost}%
-  {% keywords[1] = MetaPost primitives (not found in following tables)
-   morekeywords={end,begingroup,endgroup,beginfig,endfig,def,vardef,%
-      primary,secondary,tertiary,primarydef,secondarydef,tertiarydef,%
-      expr,suffix,text,enddef,if,fi,else,elseif,for,forsuffixes,%
-      forever,endfor,upto,downto,stop,until,tension,controls,on,off,%
-      btex,etex,within,input},
-   % keywords[2] = Operators (Tables 6-9 in MetaPost User's manual)
-   morekeywords=[2]{abs,and,angle,arclength,arctime,ASCII,bbox,bluepart,%
-      boolean,bot,ceiling,center,char,color,cosd,cutafter,cutbefore,%
-      cycle,decimal,dir,direction,directionpoint,directiontime,div,%
-      dotprod,floor,fontsize,greenpart,hex,infont,intersectionpoint,%
-      intersectiontimes,inverse,known,length,lft,llcorner,lrcorner,%
-      makepath,makepen,mexp,mlog,mod,normaldeviate,not,numeric,oct,%
-      odd,or,pair,path,pen,penoffset,picture,point,postcontrol,%
-      precontrol,redpart,reverse,rotated,round,rt,scaled,shifted,%
-      sind,slanted,sqrt,str,string,subpath,substring,top,transform,%
-      transformed,ulcorner,uniformdeviate,unitvector,unknown,%
-      urcorner,whatever,xpart,xscaled,xxpart,xypart,ypart,yscaled,%
-      yxpart,yypart,zscaled,of,reflectedabout,rotatedaround,ulft,urt,%
-      llft,lrt,readfrom,write,stroked,filled,textual,clipped,bounded,%
-      pathpart,penpart,dashpart,textpart,fontpart},%
-   % keywords[3] = Commands (Table 10)
-   morekeywords=[3]{addto,clip,cutdraw,draw,drawarrow,drawdblarrow,%
-      fill,filldraw,interim,let,loggingall,newinternal,pickup,%
-      save,setbounds,shipout,show,showdependencies,showtoken,%
-      showvariable,special,tracingall,tracingnone,undraw,unfill,%
-      unfilldraw,to,also,contour,doublepath,withcolor,withpen,%
-      dashed,randomseed},%
-   % keywords[4] = Function-Like Macros (Table 11)
-   morekeywords=[4]{boxit,boxjoin,bpath,buildcycle,circleit,dashpattern,%
-      decr,dotlabel,dotlabels,drawboxed,drawboxes,drawoptions,%
-      drawunboxed,fixpos,fixsize,incr,interpath,label,labels,max,min,pic,%
-      thelabel,z,image},%
-   % keywords[5] = Internal and Predefined Variables (Tables 3, 4)
-   morekeywords=[5]{ahangle,ahlength,bboxmargin,charcode,circmargin,%
-      day,defaultdx,defaultdy,defaultpen,defaultscale,labeloffset,%
-      linecap,linejoin,miterlimit,month,pausing,prologues,showstopping,%
-      time,tracingcapsules,tracingchoices,tracingcommands,%
-      tracingequations,tracinglostchars,tracingmacros,tracingonline,%
-      tracingoutput,tracingrestores,tracingspecs,tracingstats,%
-      tracingtitles,truecorners,warningcheck,year},
-   morekeywords=[5]{background,currentpen,currentpicture,cuttings,%
-      defaultfont},%
-   % keywords[6] = Predefined Constants (Table 5)
-   morekeywords=[6]{beveled,black,blue,bp,butt,cc,cm,dd,ditto,down,%
-      epsilon,evenly,false,fullcircle,green,halfcircle,identity,%
-      in,infinity,left,mitered,mm,nullpicture,origin,pc,pencircle,%
-      pt,quartercircle,red,right,rounded,squared,true,unitsquare,%
-      up,white,withdots},
-   sensitive=false,%
-   alsoother={0123456789$},%
-   morecomment=[l]\%,%
-   morestring=[mf]{input\ },%
-   morestring=[b]"%
-  }[keywords,comments,strings,mf]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Miranda}
-%
-% Thanks to \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de}{1999/01/30}
-% for providing the definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Miranda definition (c) 1998 Peter Bartke
-%% 
-%% Miranda: pure lazy functional language with polymorphic type system,
-%%          garbage collection and functions as first class citizens
-%%
-\lst@definelanguage{Miranda}%
-  {morekeywords={abstype,div,if,mod,otherwise,readvals,show,type,where,%
-     with,bool,char,num,sys_message,False,True,Appendfile,Closefile,%
-     Exit,Stderr,Stdout,System,Tofile,\%include,\%export,\%free,%
-     \%insert,abs,and,arctan,cjustify,code,concat,const,converse,cos,%
-     decode,digit,drop,dropwhile,entier,error,exp,filemode,filter,%
-     foldl,foldl1,foldr,foldr1,force,fst,getenv,hd,hugenum,id,index,%
-     init,integer,iterate,last,lay,layn,letter,limit,lines,ljustify,%
-     log,log10,map,map2,max,max2,member,merge,min,min2,mkset,neg,%
-     numval,or,pi,postfix,product,read,rep,repeat,reverse,rjustify,%
-     scan,seq,showfloat,shownum,showscaled,sin,snd,sort,spaces,sqrt,%
-     subtract,sum,system,take,takewhile,tinynum,tl,transpose,undef,%
-     until,zip2,zip3,zip4,zip5,zip6,zip},%
-   sensitive,%
-   morecomment=[l]||,%
-   morestring=[b]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-%
-% \subsection{Mizar}
-%
-% As you can read below, \lstthanks{Adam~Grabowski}{adam@mizar.org}
-% {2003/03/29} provided this language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Mizar definition (c) 2003 Adam Grabowski
-%%
-%% Mizar is freely available at URL www.mizar.org for the Linux x86,
-%% Solaris x86, and Windows operating systems.
-%%
-\lst@definelanguage{Mizar}%
-  {otherkeywords={->,(\#,\#),.=),\&},%
-   morekeywords={vocabulary,constructors,$1,$1,$2,$3,$4,$5,$6,$7,$8,%
-      @proof,according,aggregate,and,antonym,as,associativity,assume,%
-      asymmetry,attr,be,begin,being,by,canceled,case,cases,cluster,%
-      clusters,coherence,commutativity,compatibility,connectedness,%
-      consider,consistency,constructors,contradiction,correctness,def,%
-      deffunc,define,definition,definitions,defpred,end,environ,equals,%
-      ex,exactly,existence,for,from,func,given,hence,hereby,holds,%
-      idempotence,if,iff,implies,involutiveness,irreflexivity,is,it,%
-      let,means,mode,non,not,notation,now,of,or,otherwise,over,per,%
-      pred,prefix,projectivity,proof,provided,qua,reconsider,redefine,%
-      reflexivity,requirements,reserve,scheme,schemes,section,selector,%
-      set,st,struct,such,suppose,symmetry,synonym,take,that,the,then,%
-      theorem,theorems,thesis,thus,to,transitivity,uniqueness,%
-      vocabulary,where},%
-   sensitive=t,%
-   morecomment=[l]::%
-  }[keywords,comments]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{ML}
-%
-% Thanks to \lstthanks{Torben~Hoffmann}{toho@it.dtu.dk}{1999/02/18} for
-% providing the definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% ML definition (c) 1999 Torben Hoffmann
-%%
-\lst@definelanguage{ML}%
-  {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,%
-       eqtype,exception,fn,fun,functor,handle,if,in,include,infix,%
-       infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,%
-       signature,struct,structure,then,type,val,with,withtype,while},%
-   sensitive,%
-   morecomment=[n]{(*}{*)},%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Modula-2}
-%
-% Took data from
-% \begin{itemize}
-% \item
-%       \textsc{Niklaus Wirth}: \textbf{Programmieren in Modula-2},
-%       \"Ubers.\ Guido Pfeiffer;
-%       2.\ Auflage -- Berlin; Heidelberg; New York; London; Paris; Tokyo;
-%               Hong Kong: Springer, 1991;
-%       ISBN 3-540-51689-1.
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Modula-2}%
-  {morekeywords={AND,ARRAY,BEGIN,BY,CASE,CONST,DIV,DO,ELSE,ELSIF,END,%
-      EXIT,EXPORT,FOR,FROM,IF,IMPLEMENTATION,IMPORT,IN,MOD,MODULE,NOT,%
-      OF,OR,POINTER,PROCEDURE,QUALIFIED,RECORD,REPEAT,RETURN,SET,THEN,%
-      TYPE,UNTIL,VAR,WHILE,WITH,ABS,BITSET,BOOLEAN,CAP,CARDINAL,CHAR,%
-      CHR,DEC,EXCL,FALSE,FLOAT,HALT,HIGH,INC,INCL,INTEGER,LONGCARD,%
-      LONGINT,LONGREAL,MAX,MIN,NIL,ODD,ORD,PROC,REAL,SIZE,TRUE,TRUNC,%
-      VAL,DEFINITION,LOOP},% added keywords due to Peter Bartke 99/07/22
-   sensitive,%
-   morecomment=[n]{(*}{*)},%
-   morestring=[d]',%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{MuPAD}
-%
-% This definition was provided by \lstthanks{Christopher~Creutzig}
-% {ccr@mupad.de}{2002/10/15}. Again thanks to \lsthelper{Ulrike Fischer}
-% {-}{2004/04/23}{Re: Bug in listings.sty} for pointing to a missing |@|
-% in |\lstdefinelanguage|.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{MuPAD}{%
-   morekeywords={end,next,break,if,then,elif,else,end_if,case,end_case,%
-      otherwise,for,from,to,step,downto,in,end_for,while,end_while,%
-      repeat,until,end_repeat,or,and,not,xor,div,mod,union,minus,%
-      intersect,subset,proc,begin,end_proc,domain,end_domain,category,%
-      end_category,axiom,end_axiom,quit,delete,frame},%
-   morekeywords=[2]{NIL,FAIL,TRUE,FALSE,UNKNOWN,I,RD_INF,RD_NINF,%
-      RD_NAN,name,local,option,save,inherits,of,do},%
-   otherkeywords={\%if,?,!,:=,<,>,=,<=,<>,>=,==>,<=>,::,..,...,->,%
-      @,@@,\$},%
-   sensitive=true,%
-   morecomment=[l]{//},%
-   morecomment=[n]{/*}{*/},%
-   morestring=[b]",%
-   morestring=[d]{`}%
-  }[keywords,comments,strings]
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{NASTRAN}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-% The definition is from \lsthelper{Jeffrey Ratcliffe}
-% {Jeffrey.Ratcliffe@m.eads.net}{2002/02/21}{}---except the
-% \texttt{MoreSelectCharTable} part which simulates the keyword
-% \texttt{BEGIN BULK}.
-%    \begin{macrocode}
-\lst@definelanguage{NASTRAN}
-  {morekeywords={ENDDATA},%
-   morecomment=[l]$,%
-   MoreSelectCharTable=%
-        \lst@CArgX BEGIN\ BULK\relax\lst@CDef{}%
-        {\lst@ifmode\else \ifnum\lst@length=\z@
-             \lst@EnterMode{\lst@GPmode}{\lst@modetrue
-                  \let\lst@currstyle\lst@gkeywords@sty}%
-         \fi \fi}%
-        {\ifnum\lst@mode=\lst@GPmode
-             \lst@XPrintToken \lst@LeaveMode
-         \fi}%
-  }[keywords,comments]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Oberon-2}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Oberon-2}%
-  {morekeywords={ARRAY,BEGIN,BOOLEAN,BY,CASE,CHAR,CONST,DIV,DO,ELSE,%
-      ELSIF,END,EXIT,FALSE,FOR,IF,IMPORT,IN,INTEGER,IS,LONGINT,%
-      LONGREAL,LOOP,MOD,MODULE,NIL,OF,OR,POINTER,PROCEDURE,REAL,RECORD,%
-      REPEAT,RETURN,SET,SHORTINT,THEN,TO,TRUE,TYPE,UNTIL,VAR,WHILE,%
-      WITH,ABS,ASH,CAP,CHR,COPY,DEC,ENTIER,EXCL,HALT,INC,INCL,LEN,LONG,%
-      MAX,MIN,NEW,ODD,ORD,SHORT,SIZE},%
-   sensitive,%
-   morecomment=[n]{(*}{*)},%
-   morestring=[d]',%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{OCL}
-%
-% This definition is based on chapter 7 of the OMG UML standard version 1.3:
-% \begin{itemize}
-% \item
-%               \textsc{OMG}:
-%               \textbf{OMG Unified Modeling Language Specification};
-%               {\copyright} 1999 OMG;
-%               Available at \texttt{ftp://ftp.omg.org/pub/docs/ad/99-06-08.pdf}.
-% \end{itemize}%
-% This language is due to \lstthanks{Achim~D.~Brucker}
-% {brucker@informatik.uni-freiburg.de}{2000/08/14}.
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% OCL definition (c) 2000 Achim D. Brucker
-%%
-%% You are allowed to use, modify and distribute this code either under
-%% the terms of the LPPL (version 1.0 or later) or the GPL (version 2.0
-%% or later).
-%%
-%    \end{macrocode}
-% First we define are very decorative style. In the OMG standard only the
-% boolean (infix (?)) operations are highlighted, but I think all OCL-defined
-% operations should be highlighted, because they are \emph{guaranteed} to be
-% side-effect-free (in OCL only side effect free evaluations or path
-% expressions are allowed).
-%    \begin{macrocode}
-\lst@definelanguage[decorative]{OCL}[OMG]{OCL}
-  {otherkeywords={@pre},%
-   morendkeywords={name,attributes,associatoinEnds,operations,%
-      supertypes,allSupertypes,allInstances,oclIsKindOf,oclIsTypeOf,%
-      oclAsType,oclInState,oclIsNew,evaluationType,abs,floor,round,max,%
-      min,div,mod,size,concat,toUpper,toLower,substring,includes,%
-      excludes,count,includesAll,exludesAll,isEmpty,notEmpty,sum,%
-      exists,forAll,isUnique,sortedBy,iterate,union,intersection,%
-      including,excluding,symmetricDifference,select,reject,collect,%
-      asSequence,asBag,asSequence,asSet,append,prepend,subSequence,at,%
-      first,last,true,false,isQuery}%
-  }%
-%    \end{macrocode} 
-% Remark: "isQuery" is not real OCL, but a important attribute of the
-% underlying UML model.
-%
-% The dialect called \texttt{OMG} is a very spare version. If you use
-% this variant with bold style for first and second order keywords you
-% get the look and feel of the OMG standard. First order keywords are the
-% OCL context declarations (see section 7.3 of the OMG standard):
-%    \begin{macrocode}
-\lst@definelanguage[OMG]{OCL}%
-    {morekeywords={context,pre,inv,post},%
-%    \end{macrocode} 
-% Second order keywords are the operation which are defined for type
-% Boolean (see pages 7-34/35 of the OMG standard) and the let-operation
-% (in principle these are the infix operations):
-%    \begin{macrocode}
-    ndkeywords={or,xor,and,not,implies,if,then,else,endif},%
-%    \end{macrocode} 
-% Third order keywords are the basic data types as declared in section 7.4 of
-% the OMG standard:
-%    \begin{macrocode}
-    morekeywords=[3]{Boolean,Integer,Real,String,Set,Sequence,Bag,%
-       OclType,OclAny,OclExpression,Enumeration,Collection,},%
-    sensitive=t,%
-    morecomment=[l]--,%
-    morestring=[d]'%
-   }[keywords,comments,strings]%
-%    \end{macrocode}
-% After a bug report by \lsthelper{Martin~S\"u\ss kraut}{Edon.Myder@web.de}
-% {2003/01/30}{morerdkeywords doesn't exist any more} \texttt{morerdkeywords}
-% has been changed to the correct optional argument \texttt{[3]}.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Octave}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-% As you can read below the definition is due to \lstthanks{Ulrich~G.~Wortmann}
-% {uliw@erdw.ethz.ch}{2002/02/18}{}.
-%    \begin{macrocode}
-%%
-%% Octave definition (c) 2001,2002 Ulrich G. Wortmann
-%%
-\lst@definelanguage{Octave}%
-  {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
-      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
-      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
-      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
-      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
-      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
-      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
-      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
-      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
-      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
-      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
-      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
-      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
-      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
-      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
-      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
-      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,%
-      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
-      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
-      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
-      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
-      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
-      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
-      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
-      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
-      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
-      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
-      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
-      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
-      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
-      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
-      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
-      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
-      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
-      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
-      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
-      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
-      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
-      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
-      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
-      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
-      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
-      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
-      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
-      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
-      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
-      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
-      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
-      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
-      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
-      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
-      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
-      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
-      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
-      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
-      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
-      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
-      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
-      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
-      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
-      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
-      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
-      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
-      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
-      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
-      stderr,stdout,plot,set,endif,wk1write,xlabel,xor,ylabel,zeros,%
-      zlabel,zoom,endwhile,endfunction,printf,case,switch,otherwise,%
-      system,lsode,endfor},%
-   sensitive=f,%
-   morecomment=[l]\#,%
-   morecomment=[l]\#\#,%
-   morestring=[m]',%
-   morestring=[m]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Oz}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-% Thanks to \lstthanks{Andres~Becerra~Sandoval}{abecerra@univalle.edu.co}
-% {2003/10/02} for providing this language definition.
-%    \begin{macrocode}
-%%
-%% Oz definition (c) Andres Becerra Sandoval
-%%
-\lst@definelanguage{Oz}%
-  {morekeywords={andthen,at,attr,case,catch,choice,class,%
-      cond,declare,define,dis,div,else,elsecase,%
-      elseif,end,export,fail,false,feat,finally,%
-      from,fun,functor,if,import,in,local,%
-      lock,meth,mod,not,of,or,orelse,%
-      prepare,proc,prop,raise,require,self,skip,%
-      then,thread,true,try,unit},%
-   sensitive=true,%
-   morecomment=[l]{\%},%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]",%
-   morestring=[d]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Pascal}
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-% Thanks to \lsthelper{Andreas Stephan}{Andreas.Stephan@victoria.de}{1998/04/07}
-% {alpha, byte, pack, unpack} for reporting non-keywords alpha, byte, pack and
-% unpack.
-%    \begin{macrocode}
-\lst@definelanguage[XSC]{Pascal}[Standard]{Pascal}
-  {deletekeywords={alfa,byte,pack,unpack},% 1998 Andreas Stephan
-   morekeywords={dynamic,external,forward,global,module,nil,operator,%
-      priority,sum,type,use,dispose,mark,page,release,cimatrix,%
-      cinterval,civector,cmatrix,complex,cvector,dotprecision,imatrix,%
-      interval,ivector,rmatrix,rvector,string,im,inf,re,sup,chr,comp,%
-      eof,eoln,expo,image,ival,lb,lbound,length,loc,mant,maxlength,odd,%
-      ord,pos,pred,round,rval,sign,substring,succ,trunc,ub,ubound}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal}
-  {morekeywords={asm,constructor,destructor,implementation,inline,%
-      interface,nil,object,shl,shr,string,unit,uses,xor},%
-   morendkeywords={Abs,Addr,ArcTan,Chr,Concat,Copy,Cos,CSeg,DiskFree,%
-      DiskSize,DosExitCode,DosVersion,DSeg,EnvCount,EnvStr,Eof,Eoln,%
-      Exp,FExpand,FilePos,FileSize,Frac,FSearch,GetBkColor,GetColor,%
-      GetDefaultPalette,GetDriverName,GetEnv,GetGraphMode,GetMaxMode,%
-      GetMaxX,GetMaxY,GetModeName,GetPaletteSize,GetPixel,GetX,GetY,%
-      GraphErrorMsg,GraphResult,Hi,ImageSize,InstallUserDriver,%
-      InstallUserFont,Int,IOResult,KeyPressed,Length,Lo,MaxAvail,%
-      MemAvail,MsDos,Odd,Ofs,Ord,OvrGetBuf,OvrGetRetry,ParamCount,%
-      ParamStr,Pi,Pos,Pred,Ptr,Random,ReadKey,Round,SeekEof,SeekEoln,%
-      Seg,SetAspectRatio,Sin,SizeOf,Sound,SPtr,Sqr,Sqrt,SSeg,Succ,%
-      Swap,TextHeight,TextWidth,Trunc,TypeOf,UpCase,WhereX,WhereY,%
-      Append,Arc,Assign,AssignCrt,Bar,Bar3D,BlockRead,BlockWrite,ChDir,%
-      Circle,ClearDevice,ClearViewPort,Close,CloseGraph,ClrEol,ClrScr,%
-      Dec,Delay,Delete,DelLine,DetectGraph,Dispose,DrawPoly,Ellipse,%
-      Erase,Exec,Exit,FillChar,FillEllipse,FillPoly,FindFirst,FindNext,%
-      FloodFill,Flush,FreeMem,FSplit,GetArcCoords,GetAspectRatio,%
-      GetDate,GetDefaultPalette,GetDir,GetCBreak,GetFAttr,%
-      GetFillSettings,GetFTime,GetImage,GetIntVec,GetLineSettings,%
-      GetMem,GetPalette,GetTextSettings,GetTime,GetVerify,%
-      GetViewSettings,GoToXY,Halt,HighVideo,Inc,InitGraph,Insert,%
-      InsLine,Intr,Keep,Line,LineRel,LineTo,LowVideo,Mark,MkDir,Move,%
-      MoveRel,MoveTo,MsDos,New,NormVideo,NoSound,OutText,OutTextXY,%
-      OvrClearBuf,OvrInit,OvrInitEMS,OvrSetBuf,PackTime,PieSlice,%
-      PutImage,PutPixel,Randomize,Rectangle,Release,Rename,%
-      RestoreCrtMode,RmDir,RunError,Sector,Seek,SetActivePage,%
-      SetAllPalette,SetBkColor,SetCBreak,SetColor,SetDate,SetFAttr,%
-      SetFillPattern,SetFillStyle,SetFTime,SetGraphBufSize,%
-      SetGraphMode,SetIntVec,SetLineStyle,SetPalette,SetRGBPalette,%
-      SetTextBuf,SetTextJustify,SetTextStyle,SetTime,SetUserCharSize,%
-      SetVerify,SetViewPort,SetVisualPage,SetWriteMode,Sound,Str,%
-      SwapVectors,TextBackground,TextColor,TextMode,Truncate,%
-      UnpackTime,Val,Window}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[Standard]{Pascal}%
-  {morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
-      do,downto,else,end,false,file,for,function,get,goto,if,in,%
-      integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
-      put,procedure,read,readln,real,record,repeat,reset,rewrite,set,%
-      text,then,to,true,type,unpack,until,var,while,with,write,%
-      writeln},%
-   sensitive=f,%
-   morecomment=[s]{(*}{*)},%
-   morecomment=[s]{\{}{\}},%
-   morestring=[d]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Perl}
-%
-% I got the data from \texttt{http://www.perl.com}. But I wish to thank
-% \lsthelper{Herbert~Weinhandl}{weinhand@grz08u.unileoben.ac.at}{}{} for the
-% book `Learning Perl'.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Perl}%
-  {morekeywords={abs,accept,alarm,atan2,bind,binmode,bless,caller,%
-      chdir,chmod,chomp,chop,chown,chr,chroot,close,closedir,connect,%
-      continue,cos,crypt,dbmclose,dbmopen,defined,delete,die,do,dump,%
-      each,else,elsif,endgrent,endhostent,endnetent,endprotoent,%
-      endpwent,endservent,eof,eval,exec,exists,exit,exp,fcntl,fileno,%
-      flock,for,foreach,fork,format,formline,getc,getgrent,getgrgid,%
-      getgrnam,gethostbyaddr,gethostbyname,gethostent,getlogin,%
-      getnetbyaddr,getnetbyname,getnetent,getpeername,getpgrp,%
-      getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,%
-      getpwent,getpwnam,getpwuid,getservbyname,getservbyport,%
-      getservent,getsockname,getsockopt,glob,gmtime,goto,grep,hex,if,%
-      import,index,int,ioctl,join,keys,kill,last,lc,lcfirst,length,%
-      link,listen,local,localtime,log,lstat,m,map,mkdir,msgctl,msgget,%
-      msgrcv,msgsnd,my,next,no,oct,open,opendir,ord,pack,package,pipe,%
-      pop,pos,print,printf,prototype,push,q,qq,quotemeta,qw,qx,rand,%
-      read,readdir,readlink,recv,redo,ref,rename,require,reset,return,%
-      reverse,rewinddir,rindex,rmdir,s,scalar,seek,seekdir,select,%
-      semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,%
-      setpriority,setprotoent,setpwent,setservent,setsockopt,shift,%
-      shmctl,shmget,shmread,shmwrite,shutdown,sin,sleep,socket,%
-      socketpair,sort,splice,split,sprintf,sqrt,srand,stat,study,sub,%
-      substr,symlink,syscall,sysopen,sysread,system,syswrite,tell,%
-      telldir,tie,tied,time,times,tr,truncate,uc,ucfirst,umask,undef,%
-      unless,unlink,unpack,unshift,untie,until,use,utime,values,vec,%
-      wait,waitpid,wantarray,warn,while,write,y},%
-   sensitive,%
-   morecomment=[l]\#,%
-   morestring=[b]",%
-   morestring=[b]',%
-   MoreSelectCharTable=%
-      \lst@ReplaceInput{\$\#}{\lst@ProcessOther\$\lst@ProcessOther\#}%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{PHP}
-%
-% \lstthanks{Luca Balzerani}{lou@latoserver.it}{2002/04/06,2002/04/16} sent me
-% this language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% PHP definition by Luca Balzerani
-%%
-\lst@definelanguage{PHP}%
-  {morekeywords={%
-  %--- core language
-    ,::,break,case,continue,default,do,else,%
-    elseif,for,foreach,if,include,require,phpinfo,%
-    switch,while,false,FALSE,true,TRUE,%
-  %--- apache functions 
-    apache_lookup_uri,apache_note,ascii2ebcdic,ebcdic2ascii,%
-    virtual,apache_child_terminate,apache_setenv,%
-  %--- array functions 
-    array,array_change_key_case,array_chunk,array_count_values,%
-    array_filter,array_flip,array_fill,array_intersect,%
-    array_keys,array_map,array_merge,array_merge_recursive,%
-    array_pad,array_pop,array_push,array_rand,array_reverse,%
-    array_shift,array_slice,array_splice,array_sum,array_unique,%
-    array_values,array_walk,arsort,asort,compact,count,current,each,%
-    extract,in_array,array_search,key,krsort,ksort,list,natsort,%
-    next,pos,prev,range,reset,rsort,shuffle,sizeof,sort,uasort,%
-    usort,%
-  %--- aspell functions 
-    aspell_new,aspell_check,aspell_check_raw,aspell_suggest,%
-  %--- bc functions 
-    bcadd,bccomp,bcdiv,bcmod,bcmul,bcpow,bcscale,bcsqrt,bcsub,%
-  %--- bzip2 functions 
-    bzclose,bzcompress,bzdecompress,bzerrno,bzerror,bzerrstr,%
-    bzopen,bzread,bzwrite,%
-  %--- calendar functions 
-    JDToGregorian,GregorianToJD,JDToJulian,JulianToJD,JDToJewish,%
-    JDToFrench,FrenchToJD,JDMonthName,JDDayOfWeek,easter_date,%
-    unixtojd,jdtounix,cal_days_in_month,cal_to_jd,cal_from_jd,%
-  %--- ccvs functions 
-    ccvs_init,ccvs_done,ccvs_new,ccvs_add,ccvs_delete,ccvs_auth,%
-    ccvs_reverse,ccvs_sale,ccvs_void,ccvs_status,ccvs_count,%
-    ccvs_report,ccvs_command,ccvs_textvalue,%
-  %--- classobj functions 
-    call_user_method,call_user_method_array,class_exists,get_class,%
-    get_class_vars,get_declared_classes,get_object_vars,%
-    is_a,is_subclass_of,method_exists,%
-  %--- com functions 
-    COM,VARIANT,com_load,com_invoke,com_propget,com_get,com_propput,%
-    com_set,com_addref,com_release,com_isenum,com_load_typelib,%
-  %--- cpdf functions 
-    cpdf_add_annotation,cpdf_add_outline,cpdf_arc,cpdf_begin_text,%
-    cpdf_clip,cpdf_close,cpdf_closepath,cpdf_closepath_fill_stroke,%
-    cpdf_continue_text,cpdf_curveto,cpdf_end_text,cpdf_fill,%
-    cpdf_finalize,cpdf_finalize_page,%
-    cpdf_import_jpeg,cpdf_lineto,cpdf_moveto,cpdf_newpath,cpdf_open,%
-    cpdf_page_init,cpdf_place_inline_image,cpdf_rect,cpdf_restore,%
-    cpdf_rmoveto,cpdf_rotate,cpdf_rotate_text,cpdf_save,%
-    cpdf_scale,cpdf_set_char_spacing,cpdf_set_creator,%
-    cpdf_set_font,cpdf_set_horiz_scaling,cpdf_set_keywords,%
-    cpdf_set_page_animation,cpdf_set_subject,cpdf_set_text_matrix,%
-    cpdf_set_text_rendering,cpdf_set_text_rise,cpdf_set_title,%
-    cpdf_setdash,cpdf_setflat,cpdf_setgray,cpdf_setgray_fill,%
-    cpdf_setlinecap,cpdf_setlinejoin,cpdf_setlinewidth,%
-    cpdf_setrgbcolor,cpdf_setrgbcolor_fill,cpdf_setrgbcolor_stroke,%
-    cpdf_show_xy,cpdf_stringwidth,cpdf_set_font_directories,%
-    cpdf_set_viewer_preferences,cpdf_stroke,cpdf_text,%
-    cpdf_set_action_url,%
-  %--- crack functions 
-    crack_opendict,crack_closedict,crack_check,crack_getlastmessage,%
-  %--- ctype functions 
-    ctype_alnum,ctype_alpha,ctype_cntrl,ctype_digit,ctype_lower,%
-    ctype_print,ctype_punct,ctype_space,ctype_upper,ctype_xdigit,%
-  %--- curl functions 
-    curl_init,curl_setopt,curl_exec,curl_close,curl_version,%
-    curl_error,curl_getinfo,%
-  %--- cybercash functions 
-    cybercash_encr,cybercash_decr,cybercash_base64_encode,%
-  %--- cybermut functions 
-    cybermut_creerformulairecm,cybermut_testmac,%
-  %--- cyrus functions 
-    cyrus_connect,cyrus_authenticate,cyrus_bind,cyrus_unbind,%
-    cyrus_close,%
-  %--- datetime functions 
-    checkdate,date,getdate,gettimeofday,gmdate,gmmktime,gmstrftime,%
-    microtime,mktime,strftime,time,strtotime,%
-  %--- dbase functions 
-    dbase_create,dbase_open,dbase_close,dbase_pack,dbase_add_record,%
-    dbase_delete_record,dbase_get_record,%
-    dbase_numfields,dbase_numrecords,%
-  %--- dba functions 
-    dba_close,dba_delete,dba_exists,dba_fetch,dba_firstkey,%
-    dba_nextkey,dba_popen,dba_open,dba_optimize,dba_replace,%
-  %--- dbm functions 
-    dbmopen,dbmclose,dbmexists,dbmfetch,dbminsert,dbmreplace,%
-    dbmfirstkey,dbmnextkey,dblist,%
-  %--- dbx functions 
-    dbx_close,dbx_connect,dbx_error,dbx_query,dbx_sort,dbx_compare,%
-  %--- dio functions 
-    dio_open,dio_read,dio_write,dio_truncate,dio_stat,dio_seek,%
-    dio_close,%
-  %--- dir functions 
-    chroot,chdir,dir,closedir,getcwd,opendir,readdir,rewinddir,%
-  %--- dotnet functions 
-    dotnet_load,%
-  %--- errorfunc functions 
-    error_log,error_reporting,restore_error_handler,%
-    trigger_error,user_error,%
-  %--- exec functions 
-    escapeshellarg,escapeshellcmd,exec,passthru,system,shell_exec,%
-  %--- fbsql functions 
-    fbsql_affected_rows,fbsql_autocommit,fbsql_change_user,%
-    fbsql_commit,fbsql_connect,fbsql_create_db,fbsql_create_blob,%
-    fbsql_database_password,fbsql_data_seek,fbsql_db_query,%
-    fbsql_drop_db,fbsql_errno,fbsql_error,fbsql_fetch_array,%
-    fbsql_fetch_field,fbsql_fetch_lengths,fbsql_fetch_object,%
-    fbsql_field_flags,fbsql_field_name,fbsql_field_len,%
-    fbsql_field_table,fbsql_field_type,fbsql_free_result,%
-    fbsql_list_dbs,fbsql_list_fields,fbsql_list_tables,%
-    fbsql_num_fields,fbsql_num_rows,fbsql_pconnect,fbsql_query,%
-    fbsql_read_clob,fbsql_result,fbsql_rollback,fbsql_set_lob_mode,%
-    fbsql_start_db,fbsql_stop_db,fbsql_tablename,fbsql_warnings,%
-    fbsql_get_autostart_info,fbsql_hostname,fbsql_password,%
-    fbsql_username,%
-  %--- fdf functions 
-    fdf_open,fdf_close,fdf_create,fdf_save,fdf_get_value,%
-    fdf_next_field_name,fdf_set_ap,fdf_set_status,fdf_get_status,%
-    fdf_get_file,fdf_set_flags,fdf_set_opt,%
-    fdf_set_javascript_action,fdf_set_encoding,fdf_add_template,%
-  %--- filepro functions 
-    filepro,filepro_fieldname,filepro_fieldtype,filepro_fieldwidth,%
-    filepro_fieldcount,filepro_rowcount,%
-  %--- filesystem functions 
-    basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,%
-    diskfreespace,disk_total_space,fclose,feof,fflush,fgetc,fgetcsv,%
-    fgetss,file_get_contents,file,file_exists,fileatime,filectime,%
-    fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,%
-    fopen,fpassthru,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,%
-    set_file_buffer,is_dir,is_executable,is_file,is_link,%
-    is_writable,is_writeable,is_uploaded_file,link,linkinfo,mkdir,%
-    parse_ini_file,pathinfo,pclose,popen,readfile,readlink,rename,%
-    rmdir,stat,lstat,realpath,symlink,tempnam,tmpfile,touch,umask,%
-  %--- fribidi functions 
-    fribidi_log2vis,%
-  %--- ftp functions 
-    ftp_connect,ftp_login,ftp_pwd,ftp_cdup,ftp_chdir,ftp_mkdir,%
-    ftp_nlist,ftp_rawlist,ftp_systype,ftp_pasv,ftp_get,ftp_fget,%
-    ftp_fput,ftp_size,ftp_mdtm,ftp_rename,ftp_delete,ftp_site,%
-    ftp_quit,ftp_exec,ftp_set_option,ftp_get_option,%
-  %--- funchand functions 
-    call_user_func_array,call_user_func,create_function,%
-    func_get_args,func_num_args,function_exists,%
-    register_shutdown_function,register_tick_function,%
-  %--- gettext functions 
-    bindtextdomain,bind_textdomain_codeset,dcgettext,dcngettext,%
-    dngettext,gettext,ngettext,textdomain,%
-  %--- gmp functions 
-    gmp_init,gmp_intval,gmp_strval,gmp_add,gmp_sub,gmp_mul,%
-    gmp_div_r,gmp_div_qr,gmp_div,gmp_mod,gmp_divexact,gmp_cmp,%
-    gmp_com,gmp_abs,gmp_sign,gmp_fact,gmp_sqrt,gmp_sqrtrm,%
-    gmp_pow,gmp_powm,gmp_prob_prime,gmp_gcd,gmp_gcdext,gmp_invert,%
-    gmp_jacobi,gmp_random,gmp_and,gmp_or,gmp_xor,gmp_setbit,%
-    gmp_scan0,gmp_scan1,gmp_popcount,gmp_hamdist,%
-  %--- http functions 
-    header,headers_sent,setcookie,%
-  %--- hw functions 
-    hw_Array2Objrec,hw_Children,hw_ChildrenObj,hw_Close,hw_Connect,%
-    hw_Deleteobject,hw_DocByAnchor,hw_DocByAnchorObj,%
-    hw_Document_BodyTag,hw_Document_Content,hw_Document_SetContent,%
-    hw_ErrorMsg,hw_EditText,hw_Error,hw_Free_Document,hw_GetParents,%
-    hw_GetChildColl,hw_GetChildCollObj,hw_GetRemote,%
-    hw_GetSrcByDestObj,hw_GetObject,hw_GetAndLock,hw_GetText,%
-    hw_GetObjectByQueryObj,hw_GetObjectByQueryColl,%
-    hw_GetChildDocColl,hw_GetChildDocCollObj,hw_GetAnchors,%
-    hw_Mv,hw_Identify,hw_InCollections,hw_Info,hw_InsColl,hw_InsDoc,%
-    hw_InsertObject,hw_mapid,hw_Modifyobject,hw_New_Document,%
-    hw_Output_Document,hw_pConnect,hw_PipeDocument,hw_Root,%
-    hw_Who,hw_getusername,hw_stat,hw_setlinkroot,hw_connection_info,%
-    hw_insertanchors,hw_getrellink,hw_changeobject,%
-  %--- ibase functions 
-    ibase_connect,ibase_pconnect,ibase_close,ibase_query,%
-    ibase_fetch_row,ibase_fetch_object,ibase_field_info,%
-    ibase_free_result,ibase_prepare,ibase_execute,ibase_trans,%
-    ibase_rollback,ibase_timefmt,ibase_num_fields,ibase_blob_add,%
-    ibase_blob_close,ibase_blob_create,ibase_blob_echo,%
-    ibase_blob_import,ibase_blob_info,ibase_blob_open,%
-  %--- icap functions 
-    icap_open,icap_close,icap_fetch_event,icap_list_events,%
-    icap_delete_event,icap_snooze,icap_list_alarms,%
-    icap_rename_calendar,icap_delete_calendar,icap_reopen,%
-  %--- iconv functions 
-    iconv,iconv_get_encoding,iconv_set_encoding,ob_iconv_handler,%
-  %--- ifx functions 
-    ifx_connect,ifx_pconnect,ifx_close,ifx_query,ifx_prepare,ifx_do,%
-    ifx_errormsg,ifx_affected_rows,ifx_getsqlca,ifx_fetch_row,%
-    ifx_fieldtypes,ifx_fieldproperties,ifx_num_fields,ifx_num_rows,%
-    ifx_create_char,ifx_free_char,ifx_update_char,ifx_get_char,%
-    ifx_copy_blob,ifx_free_blob,ifx_get_blob,ifx_update_blob,%
-    ifx_textasvarchar,ifx_byteasvarchar,ifx_nullformat,%
-    ifxus_free_slob,ifxus_close_slob,ifxus_open_slob,%
-    ifxus_seek_slob,ifxus_read_slob,ifxus_write_slob,%
-  %--- iisfunc functions 
-    iis_get_server_by_path,iis_get_server_by_comment,iis_add_server,%
-    iis_set_dir_security,iis_get_dir_security,iis_set_server_rights,%
-    iis_set_script_map,iis_get_script_map,iis_set_app_settings,%
-    iis_stop_server,iis_stop_service,iis_start_service,%
-  %--- image functions 
-    exif_imagetype,exif_read_data,exif_thumbnail,getimagesize,%
-    imagealphablending,imagearc,imagefilledarc,imageellipse,%
-    imagechar,imagecharup,imagecolorallocate,imagecolordeallocate,%
-    imagecolorclosest,imagecolorclosestalpha,imagecolorclosestthwb,%
-    imagecolorexactalpha,imagecolorresolve,imagecolorresolvealpha,%
-    imagecolorset,imagecolorsforindex,imagecolorstotal,%
-    imagecopy,imagecopymerge,imagecopymergegray,imagecopyresized,%
-    imagecreate,imagecreatetruecolor,imagetruecolortopalette,%
-    imagecreatefromgd2,imagecreatefromgd2part,imagecreatefromgif,%
-    imagecreatefrompng,imagecreatefromwbmp,imagecreatefromstring,%
-    imagecreatefromxpm,imagedashedline,imagedestroy,imagefill,%
-    imagefilledrectangle,imagefilltoborder,imagefontheight,%
-    imagegd,imagegd2,imagegif,imagepng,imagejpeg,imagewbmp,%
-    imageline,imageloadfont,imagepalettecopy,imagepolygon,%
-    imagepsencodefont,imagepsfreefont,imagepsloadfont,%
-    imagepsslantfont,imagepstext,imagerectangle,imagesetpixel,%
-    imagesetstyle,imagesettile,imagesetthickness,imagestring,%
-    imagesx,imagesy,imagettfbbox,imageftbbox,imagettftext,%
-    imagetypes,jpeg2wbmp,png2wbmp,iptcembed,read_exif_data,%
-  %--- imap functions 
-    imap_8bit,imap_alerts,imap_append,imap_base64,imap_binary,%
-    imap_bodystruct,imap_check,imap_clearflag_full,imap_close,%
-    imap_delete,imap_deletemailbox,imap_errors,imap_expunge,%
-    imap_fetchbody,imap_fetchheader,imap_fetchstructure,%
-    imap_getmailboxes,imap_getsubscribed,imap_header,%
-    imap_headers,imap_last_error,imap_listmailbox,%
-    imap_mail,imap_mail_compose,imap_mail_copy,imap_mail_move,%
-    imap_mime_header_decode,imap_msgno,imap_num_msg,imap_num_recent,%
-    imap_ping,imap_popen,imap_qprint,imap_renamemailbox,imap_reopen,%
-    imap_rfc822_parse_headers,imap_rfc822_write_address,%
-    imap_search,imap_setacl,imap_set_quota,imap_setflag_full,%
-    imap_status,imap_subscribe,imap_uid,imap_undelete,%
-    imap_utf7_decode,imap_utf7_encode,imap_utf8,imap_thread,%
-  %--- info functions 
-    assert,assert_options,extension_loaded,dl,getenv,get_cfg_var,%
-    get_defined_constants,get_extension_funcs,getmygid,%
-    get_loaded_extensions,get_magic_quotes_gpc,%
-    getlastmod,getmyinode,getmypid,getmyuid,get_required_files,%
-    ini_alter,ini_get,ini_get_all,ini_restore,ini_set,phpcredits,%
-    phpversion,php_logo_guid,php_sapi_name,php_uname,putenv,%
-    set_time_limit,version_compare,zend_logo_guid,zend_version,%
-  %--- ircg functions 
-    ircg_pconnect,ircg_fetch_error_msg,ircg_set_current,ircg_join,%
-    ircg_msg,ircg_notice,ircg_nick,ircg_topic,ircg_channel_mode,%
-    ircg_whois,ircg_kick,ircg_ignore_add,ircg_ignore_del,%
-    ircg_is_conn_alive,ircg_lookup_format_messages,%
-    ircg_set_on_die,ircg_set_file,ircg_get_username,%
-    ircg_nickname_unescape,%
-  %--- java functions 
-    java_last_exception_clear,java_last_exception_get,%
-  %--- ldap functions 
-    ldap_add,ldap_bind,ldap_close,ldap_compare,ldap_connect,%
-    ldap_delete,ldap_dn2ufn,ldap_err2str,ldap_errno,ldap_error,%
-    ldap_first_attribute,ldap_first_entry,ldap_free_result,%
-    ldap_get_dn,ldap_get_entries,ldap_get_option,ldap_get_values,%
-    ldap_list,ldap_modify,ldap_mod_add,ldap_mod_del,%
-    ldap_next_attribute,ldap_next_entry,ldap_read,ldap_rename,%
-    ldap_set_option,ldap_unbind,ldap_8859_to_t61,%
-    ldap_next_reference,ldap_parse_reference,ldap_parse_result,%
-    ldap_sort,ldap_start_tls,ldap_t61_to_8859,%
-  %--- mail functions 
-    mail,ezmlm_hash,%
-  %--- math functions 
-    abs,acos,acosh,asin,asinh,atan,atanh,atan2,base_convert,bindec,%
-    cos,cosh,decbin,dechex,decoct,deg2rad,exp,expm1,floor,%
-    hexdec,hypot,is_finite,is_infinite,is_nan,lcg_value,log,log10,%
-    max,min,mt_rand,mt_srand,mt_getrandmax,number_format,octdec,pi,%
-    rad2deg,rand,round,sin,sinh,sqrt,srand,tan,tanh,%
-  %--- mbstring functions 
-    mb_language,mb_parse_str,mb_internal_encoding,mb_http_input,%
-    mb_detect_order,mb_substitute_character,mb_output_handler,%
-    mb_strlen,mb_strpos,mb_strrpos,mb_substr,mb_strcut,mb_strwidth,%
-    mb_convert_encoding,mb_detect_encoding,mb_convert_kana,%
-    mb_decode_mimeheader,mb_convert_variables,%
-    mb_decode_numericentity,mb_send_mail,mb_get_info,%
-    mb_ereg,mb_eregi,mb_ereg_replace,mb_eregi_replace,mb_split,%
-    mb_ereg_search,mb_ereg_search_pos,mb_ereg_search_regs,%
-    mb_ereg_search_getregs,mb_ereg_search_getpos,%
-  %--- mcal functions 
-    mcal_open,mcal_popen,mcal_reopen,mcal_close,%
-    mcal_rename_calendar,mcal_delete_calendar,mcal_fetch_event,%
-    mcal_append_event,mcal_store_event,mcal_delete_event,%
-    mcal_list_alarms,mcal_event_init,mcal_event_set_category,%
-    mcal_event_set_description,mcal_event_set_start,%
-    mcal_event_set_alarm,mcal_event_set_class,mcal_is_leap_year,%
-    mcal_date_valid,mcal_time_valid,mcal_day_of_week,%
-    mcal_date_compare,mcal_next_recurrence,%
-    mcal_event_set_recur_daily,mcal_event_set_recur_weekly,%
-    mcal_event_set_recur_monthly_wday,mcal_event_set_recur_yearly,%
-    mcal_event_add_attribute,mcal_expunge,mcal_week_of_year,%
-  %--- mcrypt functions 
-    mcrypt_get_cipher_name,mcrypt_get_block_size,%
-    mcrypt_create_iv,mcrypt_cbc,mcrypt_cfb,mcrypt_ecb,mcrypt_ofb,%
-    mcrypt_list_modes,mcrypt_get_iv_size,mcrypt_encrypt,%
-    mcrypt_module_open,mcrypt_module_close,mcrypt_generic_deinit,%
-    mcrypt_generic,mdecrypt_generic,mcrypt_generic_end,%
-    mcrypt_enc_is_block_algorithm_mode,%
-    mcrypt_enc_is_block_mode,mcrypt_enc_get_block_size,%
-    mcrypt_enc_get_supported_key_sizes,mcrypt_enc_get_iv_size,%
-    mcrypt_enc_get_modes_name,mcrypt_module_self_test,%
-    mcrypt_module_is_block_algorithm,mcrypt_module_is_block_mode,%
-    mcrypt_module_get_algo_key_size,%
-  %--- mhash functions 
-    mhash_get_hash_name,mhash_get_block_size,mhash_count,mhash,%
-  %--- misc functions 
-    connection_aborted,connection_status,connection_timeout,%
-    define,defined,die,eval,exit,get_browser,highlight_file,%
-    ignore_user_abort,iptcparse,leak,pack,show_source,sleep,uniqid,%
-    usleep,%
-  %--- mnogosearch functions 
-    udm_add_search_limit,udm_alloc_agent,udm_api_version,%
-    udm_cat_list,udm_clear_search_limits,udm_errno,udm_error,%
-    udm_free_agent,udm_free_ispell_data,udm_free_res,%
-    udm_get_res_field,udm_get_res_param,udm_load_ispell_data,%
-    udm_check_charset,udm_check_stored,udm_close_stored,udm_crc32,%
-  %--- msession functions 
-    msession_connect,msession_disconnect,msession_count,%
-    msession_destroy,msession_lock,msession_unlock,msession_set,%
-    msession_uniq,msession_randstr,msession_find,msession_list,%
-    msession_set_array,msession_listvar,msession_timeout,%
-    msession_getdata,msession_setdata,msession_plugin,%
-  %--- msql functions 
-    msql,msql_affected_rows,msql_close,msql_connect,msql_create_db,%
-    msql_data_seek,msql_dbname,msql_drop_db,msql_dropdb,msql_error,%
-    msql_fetch_field,msql_fetch_object,msql_fetch_row,%
-    msql_field_seek,msql_fieldtable,msql_fieldtype,msql_fieldflags,%
-    msql_free_result,msql_freeresult,msql_list_fields,%
-    msql_list_dbs,msql_listdbs,msql_list_tables,msql_listtables,%
-    msql_num_rows,msql_numfields,msql_numrows,msql_pconnect,%
-    msql_regcase,msql_result,msql_select_db,msql_selectdb,%
-  %--- mssql functions 
-    mssql_close,mssql_connect,mssql_data_seek,mssql_fetch_array,%
-    mssql_fetch_object,mssql_fetch_row,mssql_field_length,%
-    mssql_field_seek,mssql_field_type,mssql_free_result,%
-    mssql_min_error_severity,mssql_min_message_severity,%
-    mssql_num_fields,mssql_num_rows,mssql_pconnect,mssql_query,%
-    mssql_select_db,mssql_bind,mssql_execute,mssql_fetch_assoc,%
-    mssql_guid_string,mssql_init,mssql_rows_affected,%
-  %--- muscat functions 
-    muscat_setup,muscat_setup_net,muscat_give,muscat_get,%
-  %--- mysql functions 
-    mysql_affected_rows,mysql_change_user,mysql_character_set_name,%
-    mysql_connect,mysql_create_db,mysql_data_seek,mysql_db_name,%
-    mysql_drop_db,mysql_errno,mysql_error,mysql_escape_string,%
-    mysql_fetch_assoc,mysql_fetch_field,mysql_fetch_lengths,%
-    mysql_fetch_row,mysql_field_flags,mysql_field_name,%
-    mysql_field_seek,mysql_field_table,mysql_field_type,%
-    mysql_info,mysql_insert_id,mysql_list_dbs,mysql_list_fields,%
-    mysql_list_tables,mysql_num_fields,mysql_num_rows,%
-    mysql_ping,mysql_query,mysql_unbuffered_query,%
-    mysql_result,mysql_select_db,mysql_tablename,mysql_thread_id,%
-    mysql_get_host_info,mysql_get_proto_info,mysql_get_server_info,%
-  %--- network functions 
-    checkdnsrr,closelog,debugger_off,debugger_on,%
-    fsockopen,gethostbyaddr,gethostbyname,gethostbynamel,getmxrr,%
-    getprotobynumber,getservbyname,getservbyport,ip2long,long2ip,%
-    pfsockopen,socket_get_status,socket_set_blocking,%
-    syslog,%
-  %--- nis functions 
-    yp_get_default_domain,yp_order,yp_master,yp_match,yp_first,%
-    yp_errno,yp_err_string,yp_all,yp_cat,%
-  %--- oci8 functions 
-    OCIDefineByName,OCIBindByName,OCILogon,OCIPLogon,OCINLogon,%
-    OCIExecute,OCICommit,OCIRollback,OCINewDescriptor,OCIRowCount,%
-    OCIResult,OCIFetch,OCIFetchInto,OCIFetchStatement,%
-    OCIColumnName,OCIColumnSize,OCIColumnType,OCIServerVersion,%
-    OCINewCursor,OCIFreeStatement,OCIFreeCursor,OCIFreeDesc,%
-    OCIError,OCIInternalDebug,OCICancel,OCISetPrefetch,%
-    OCISaveLobFile,OCISaveLob,OCILoadLob,OCIColumnScale,%
-    OCIColumnTypeRaw,OCINewCollection,OCIFreeCollection,%
-    OCICollAppend,OCICollAssignElem,OCICollGetElem,OCICollMax,%
-    OCICollTrim,%
-  %--- oracle functions 
-    Ora_Bind,Ora_Close,Ora_ColumnName,Ora_ColumnSize,Ora_ColumnType,%
-    Ora_CommitOff,Ora_CommitOn,Ora_Do,Ora_Error,Ora_ErrorCode,%
-    Ora_Fetch,Ora_Fetch_Into,Ora_GetColumn,Ora_Logoff,Ora_Logon,%
-    Ora_Numcols,Ora_Numrows,Ora_Open,Ora_Parse,Ora_Rollback,%
-  %--- outcontrol functions 
-    flush,ob_start,ob_get_contents,ob_get_length,ob_get_level,%
-    ob_flush,ob_clean,ob_end_flush,ob_end_clean,ob_implicit_flush,%
-  %--- ovrimos functions 
-    ovrimos_connect,ovrimos_close,ovrimos_longreadlen,%
-    ovrimos_execute,ovrimos_cursor,ovrimos_exec,ovrimos_fetch_into,%
-    ovrimos_result,ovrimos_result_all,ovrimos_num_rows,%
-    ovrimos_field_name,ovrimos_field_type,ovrimos_field_len,%
-    ovrimos_free_result,ovrimos_commit,ovrimos_rollback,%
-  %--- pcntl functions 
-    pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,%
-    pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,%
-    pcntl_exec,%
-  %--- pcre functions 
-    preg_match,preg_match_all,preg_replace,preg_replace_callback,%
-    preg_quote,preg_grep,Pattern Modifiers,Pattern Syntax,%
-  %--- pdf functions 
-    pdf_add_annotation,pdf_add_bookmark,pdf_add_launchlink,%
-    pdf_add_note,pdf_add_outline,pdf_add_pdflink,pdf_add_thumbnail,%
-    pdf_arc,pdf_arcn,pdf_attach_file,pdf_begin_page,%
-    pdf_begin_template,pdf_circle,pdf_clip,pdf_close,pdf_closepath,%
-    pdf_closepath_stroke,pdf_close_image,pdf_close_pdi,%
-    pdf_concat,pdf_continue_text,pdf_curveto,pdf_delete,%
-    pdf_endpath,pdf_end_pattern,pdf_end_template,pdf_fill,%
-    pdf_findfont,pdf_get_buffer,pdf_get_font,pdf_get_fontname,%
-    pdf_get_image_height,pdf_get_image_width,pdf_get_parameter,%
-    pdf_get_pdi_value,pdf_get_majorversion,pdf_get_minorversion,%
-    pdf_initgraphics,pdf_lineto,pdf_makespotcolor,pdf_moveto,%
-    pdf_open,pdf_open_CCITT,pdf_open_file,pdf_open_gif,%
-    pdf_open_image_file,pdf_open_jpeg,pdf_open_memory_image,%
-    pdf_open_pdi_page,pdf_open_png,pdf_open_tiff,pdf_place_image,%
-    pdf_rect,pdf_restore,pdf_rotate,pdf_save,pdf_scale,pdf_setcolor,%
-    pdf_setflat,pdf_setfont,pdf_setgray,pdf_setgray_fill,%
-    pdf_setlinecap,pdf_setlinejoin,pdf_setlinewidth,pdf_setmatrix,%
-    pdf_setpolydash,pdf_setrgbcolor,pdf_setrgbcolor_fill,%
-    pdf_set_border_color,pdf_set_border_dash,pdf_set_border_style,%
-    pdf_set_duration,pdf_set_font,pdf_set_horiz_scaling,%
-    pdf_set_info_author,pdf_set_info_creator,pdf_set_info_keywords,%
-    pdf_set_info_title,pdf_set_leading,pdf_set_parameter,%
-    pdf_set_text_rendering,pdf_set_text_rise,pdf_set_text_matrix,%
-    pdf_set_word_spacing,pdf_show,pdf_show_boxed,pdf_show_xy,%
-    pdf_stringwidth,pdf_stroke,pdf_translate,%
-  %--- pfpro functions 
-    pfpro_init,pfpro_cleanup,pfpro_process,pfpro_process_raw,%
-  %--- pgsql functions 
-    pg_close,pg_affected_rows,pg_connect,pg_dbname,pg_end_copy,%
-    pg_query,pg_fetch_array,pg_fetch_object,pg_fetch_row,%
-    pg_field_name,pg_field_num,pg_field_prtlen,pg_field_size,%
-    pg_free_result,pg_last_oid,pg_host,pg_last_notice,pg_lo_close,%
-    pg_lo_export,pg_lo_import,pg_lo_open,pg_lo_read,pg_lo_seek,%
-    pg_lo_read_all,pg_lo_unlink,pg_lo_write,pg_num_fields,%
-    pg_options,pg_pconnect,pg_port,pg_put_line,pg_fetch_result,%
-    pg_client_encoding,pg_trace,pg_tty,pg_untrace,pg_get_result,%
-    pg_send_query,pg_cancel_query,pg_connection_busy,%
-    pg_connection_status,pg_copy_from,pg_copy_to,pg_escape_bytea,%
-    pg_result_error,%
-  %--- posix functions 
-    posix_kill,posix_getpid,posix_getppid,posix_getuid,%
-    posix_getgid,posix_getegid,posix_setuid,posix_seteuid,%
-    posix_setegid,posix_getgroups,posix_getlogin,posix_getpgrp,%
-    posix_setpgid,posix_getpgid,posix_getsid,posix_uname,%
-    posix_ctermid,posix_ttyname,posix_isatty,posix_getcwd,%
-    posix_getgrnam,posix_getgrgid,posix_getpwnam,posix_getpwuid,%
-  %--- printer functions 
-    printer_open,printer_abort,printer_close,printer_write,%
-    printer_set_option,printer_get_option,printer_create_dc,%
-    printer_start_doc,printer_end_doc,printer_start_page,%
-    printer_create_pen,printer_delete_pen,printer_select_pen,%
-    printer_delete_brush,printer_select_brush,printer_create_font,%
-    printer_select_font,printer_logical_fontheight,%
-    printer_draw_rectangle,printer_draw_elipse,printer_draw_text,%
-    printer_draw_chord,printer_draw_pie,printer_draw_bmp,%
-  %--- pspell functions 
-    pspell_add_to_personal,pspell_add_to_session,pspell_check,%
-    pspell_config_create,pspell_config_ignore,pspell_config_mode,%
-    pspell_config_repl,pspell_config_runtogether,%
-    pspell_new,pspell_new_config,pspell_new_personal,%
-    pspell_store_replacement,pspell_suggest,%
-  %--- qtdom functions 
-    qdom_tree,qdom_error,%
-  %--- readline functions 
-    readline,readline_add_history,readline_clear_history,%
-    readline_info,readline_list_history,readline_read_history,%
-  %--- recode functions 
-    recode_string,recode,recode_file,%
-  %--- regex functions 
-    ereg,ereg_replace,eregi,eregi_replace,split,spliti,sql_regcase,%
-  %--- sem functions 
-    sem_get,sem_acquire,sem_release,sem_remove,shm_attach,%
-    shm_remove,shm_put_var,shm_get_var,shm_remove_var,ftok,%
-  %--- sesam functions 
-    sesam_connect,sesam_disconnect,sesam_settransaction,%
-    sesam_rollback,sesam_execimm,sesam_query,sesam_num_fields,%
-    sesam_diagnostic,sesam_fetch_result,sesam_affected_rows,%
-    sesam_field_array,sesam_fetch_row,sesam_fetch_array,%
-    sesam_free_result,%
-  %--- session functions 
-    session_start,session_destroy,session_name,session_module_name,%
-    session_id,session_register,session_unregister,session_unset,%
-    session_get_cookie_params,session_set_cookie_params,%
-    session_encode,session_set_save_handler,session_cache_limiter,%
-    session_write_close,%
-  %--- shmop functions 
-    shmop_open,shmop_read,shmop_write,shmop_size,shmop_delete,%
-  %--- snmp functions 
-    snmpget,snmpset,snmpwalk,snmpwalkoid,snmp_get_quick_print,%
-    snmprealwalk,%
-  %--- strings functions 
-    addcslashes,addslashes,bin2hex,chop,chr,chunk_split,%
-    count_chars,crc32,crypt,echo,explode,get_html_translation_table,%
-    hebrev,hebrevc,htmlentities,htmlspecialchars,implode,join,%
-    localeconv,ltrim,md5,md5_file,metaphone,nl_langinfo,nl2br,ord,%
-    print,printf,quoted_printable_decode,quotemeta,str_rot13,rtrim,%
-    setlocale,similar_text,soundex,sprintf,strncasecmp,strcasecmp,%
-    strcmp,strcoll,strcspn,strip_tags,stripcslashes,stripslashes,%
-    strlen,strnatcmp,strnatcasecmp,strncmp,str_pad,strpos,strrchr,%
-    strrev,strrpos,strspn,strstr,strtok,strtolower,strtoupper,%
-    strtr,substr,substr_count,substr_replace,trim,ucfirst,ucwords,%
-    vsprintf,wordwrap,%
-  %--- swf functions 
-    swf_openfile,swf_closefile,swf_labelframe,swf_showframe,%
-    swf_getframe,swf_mulcolor,swf_addcolor,swf_placeobject,%
-    swf_removeobject,swf_nextid,swf_startdoaction,%
-    swf_actiongeturl,swf_actionnextframe,swf_actionprevframe,%
-    swf_actionstop,swf_actiontogglequality,swf_actionwaitforframe,%
-    swf_actiongotolabel,swf_enddoaction,swf_defineline,%
-    swf_definepoly,swf_startshape,swf_shapelinesolid,%
-    swf_shapefillsolid,swf_shapefillbitmapclip,%
-    swf_shapemoveto,swf_shapelineto,swf_shapecurveto,%
-    swf_shapearc,swf_endshape,swf_definefont,swf_setfont,%
-    swf_fontslant,swf_fonttracking,swf_getfontinfo,swf_definetext,%
-    swf_definebitmap,swf_getbitmapinfo,swf_startsymbol,%
-    swf_startbutton,swf_addbuttonrecord,swf_oncondition,%
-    swf_viewport,swf_ortho,swf_ortho2,swf_perspective,swf_polarview,%
-    swf_pushmatrix,swf_popmatrix,swf_scale,swf_translate,swf_rotate,%
-  %--- sybase functions 
-    sybase_affected_rows,sybase_close,sybase_connect,%
-    sybase_fetch_array,sybase_fetch_field,sybase_fetch_object,%
-    sybase_field_seek,sybase_free_result,sybase_get_last_message,%
-    sybase_min_error_severity,sybase_min_message_severity,%
-    sybase_num_fields,sybase_num_rows,sybase_pconnect,sybase_query,%
-    sybase_select_db,%
-  %--- uodbc functions 
-    odbc_autocommit,odbc_binmode,odbc_close,odbc_close_all,%
-    odbc_connect,odbc_cursor,odbc_do,odbc_error,odbc_errormsg,%
-    odbc_execute,odbc_fetch_into,odbc_fetch_row,odbc_fetch_array,%
-    odbc_fetch_object,odbc_field_name,odbc_field_num,%
-    odbc_field_len,odbc_field_precision,odbc_field_scale,%
-    odbc_longreadlen,odbc_num_fields,odbc_pconnect,odbc_prepare,%
-    odbc_result,odbc_result_all,odbc_rollback,odbc_setoption,%
-    odbc_tableprivileges,odbc_columns,odbc_columnprivileges,%
-    odbc_primarykeys,odbc_foreignkeys,odbc_procedures,%
-    odbc_specialcolumns,odbc_statistics,%
-  %--- url functions 
-    base64_decode,base64_encode,parse_url,rawurldecode,rawurlencode,%
-    urlencode,%
-  %--- var functions 
-    doubleval,empty,floatval,gettype,get_defined_vars,%
-    import_request_variables,intval,is_array,is_bool,is_double,%
-    is_int,is_integer,is_long,is_null,is_numeric,is_object,is_real,%
-    is_scalar,is_string,isset,print_r,serialize,settype,strval,%
-    unset,var_dump,var_export,is_callable,%
-  %--- vpopmail functions 
-    vpopmail_add_domain,vpopmail_del_domain,%
-    vpopmail_add_domain_ex,vpopmail_del_domain_ex,%
-    vpopmail_add_user,vpopmail_del_user,vpopmail_passwd,%
-    vpopmail_auth_user,vpopmail_alias_add,vpopmail_alias_del,%
-    vpopmail_alias_get,vpopmail_alias_get_all,vpopmail_error,%
-  %--- w32api functions 
-    w32api_set_call_method,w32api_register_function,%
-    w32api_deftype,w32api_init_dtype,%
-  %--- wddx functions 
-    wddx_serialize_value,wddx_serialize_vars,wddx_packet_start,%
-    wddx_add_vars,wddx_deserialize,%
-  %--- xml functions 
-    xml_parser_create,xml_set_object,xml_set_element_handler,%
-    xml_set_processing_instruction_handler,xml_set_default_handler,%
-    xml_set_notation_decl_handler,%
-    xml_parse,xml_get_error_code,xml_error_string,%
-    xml_get_current_column_number,xml_get_current_byte_index,%
-    xml_parser_free,xml_parser_set_option,xml_parser_get_option,%
-    utf8_encode,xml_parser_create_ns,%
-    xml_set_start_namespace_decl_handler,%
-  %--- xslt functions 
-    xslt_set_log,xslt_create,xslt_errno,xslt_error,xslt_free,%
-    xslt_set_sax_handler,xslt_set_scheme_handler,%
-    xslt_set_base,xslt_set_encoding,xslt_set_sax_handlers,%
-  %--- yaz functions 
-    yaz_addinfo,yaz_close,yaz_connect,yaz_errno,yaz_error,yaz_hits,%
-    yaz_database,yaz_range,yaz_record,yaz_search,yaz_present,%
-    yaz_scan,yaz_scan_result,yaz_ccl_conf,yaz_ccl_parse,%
-    yaz_wait,yaz_sort,%
-  %--- zip functions 
-    zip_close,zip_entry_close,zip_entry_compressedsize,%
-    zip_entry_filesize,zip_entry_name,zip_entry_open,zip_entry_read,%
-    zip_read,%
-  %--- zlib functions 
-    gzclose,gzeof,gzfile,gzgetc,gzgets,gzgetss,gzopen,gzpassthru,%
-    gzread,gzrewind,gzseek,gztell,gzwrite,readgzfile,gzcompress,%
-    gzdeflate,gzinflate,gzencode,},%
-   sensitive,%
-   morecomment=[l]\#,%
-   morecomment=[l]//,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]",%
-   morestring=[b]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Plasm}
-%
-% \lstthanks{Alessio~Pace}{}{2004/09/01} provided the following definition.
-%
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Plasm}%
-  {sensitive=false,%
-   morekeywords={aa,abs,ac,acolor,acos,actor,al,alias,align,and,%
-      animation,animation,appearance,apply,ar,arc,as,asin,assoc,atan,%
-      axialcamera,axialcameras,basehermite,bbox,bbox,bernstein,%
-      bernsteinbasis,bezier,beziercurve,beziermanifold,bezierstripe,%
-      beziersurface,bigger,biggest,bilinearsurface,binormal,%
-      biquadraticsurface,black,blend,blue,bottom,box,brown,bspize,%
-      bspline,bsplinebasis,c,cabinet,camera,cart,case,cat,catch,ceil,%
-      centeredcameras,centralcavalier,char,charseq,choose,circle,%
-      circumference,class,cmap,color,comp,computecoords,cone,%
-      conicalsurface,cons,control,convexcoords,convexhull,coonspatch,%
-      copy,cos,cosh,crease,crosspolytope,cube,cubiccardinal,%
-      cubiccardinalbasis,cubichermite,cubicubspline,cubicubsplinebasis,%
-      cuboid,curl,curvature,curve2cspath,curve2mapvect,cyan,cylinder,%
-      cylindricalsurface,d,deboor,def,depol,depth_sort,depth_test,%
-      derbernstein,derbernsteinbase,derbezier,determinant,difference,%
-      differencepr,dim,dimetric,dirproject,displaygraph,displaynubspline,%
-      displaynurbspline,distl,distr,div,divergence,dodecahedron,dot,down,%
-      dp,drawedges,drawforks,drawtree,ds,dsphere,dump,dumprep,ellipse,%
-      embed,end,eq,ex,exp,explode,export,extract_bodies,extract_polygons,%
-      extract_wires,extrude,extrusion,fact,false,feature,ff,fillcolor,%
-      filter,finitecone,first,flash,flashani,floor,fontcolor,fontheight,%
-      fontspacing,fontwidth,fractalsimplex,frame,frame,frameflash,fromto,%
-      gausscurvature,ge,grad,gradient,gradmap,gray,green,gt,help,hermite,%
-      hermitebasis,hermitesurface,hexahedron,icosahedron,id,idnt,if,in,%
-      inarcs,innerprod,inset,insl,insr,intersection,intersectionpr,%
-      intervals,intmax,intmin,intsto,inv,isa,isanimpol,isbool,ischar,%
-      isclosedshape,iscloseto,isempty,iseven,isfun,isfunvect,isge,isgt,%
-      isint,isintneg,isinto,isintpos,isle,islt,ismat,ismatof,isnat,%
-      isnull,isnum,isnumneg,isnumpos,isodd,isometric,isorthoshape,ispair,%
-      ispoint,ispointseq,ispol,ispoldim,ispolytope,ispurepol,isreal,%
-      isrealneg,isrealpos,isrealvect,isseq,isseqof,isshape,issimplex,%
-      issqrmat,isstring,isvect,iszero,jacobian,join,joints,k,last,le,%
-      left,leftcavalier,len,less,lesseq,lex,lift,light,linecolor,%
-      linesize,list,ln,load,loadlib,loop,lt,lxmy,magenta,map,mapshapes,%
-      markersize,mat,matdotprod,material,mathom,max,mean,meanpoint,med,%
-      merge,mesh,min,minkowski,mirror,mixedprod,mk,mkframe,mkpol,%
-      mkvector,mkversork,mod,model,move,mul,multextrude,mxby,mxmy,mxty,%
-      myfont,n,nat2string,neq,ngon,norm2,normalmap,not,nu_grid,nubspline,%
-      nubsplineknots,nurbspline,nurbsplineknots,octahedron,offset,%
-      onepoint,open,optimize,or,orange,ord,ortho,orthoproject,orthox,%
-      orthoy,orthoz,outarcs,outerloop,outerwarp,pairdiff,parallel,%
-      pascaltriangle,pdiff,pdifference,permutahedron,permutations,%
-      perspective,perspective,pi,pivotop,plane,planemapping,pmap,%
-      points2shape,polar,polyline,polymarker,polypoint,power,powerset,%
-      presort,principalnormal,print,prism,profileprodsurface,%
-      progressivesum,project,projection,purple,pyramid,q,quadarray,%
-      quadmesh,quote,r,raise,range,rationalbezier,rationalblend,%
-      rationalbspline,rationalize,red,rev,reverse,rgbacolor,right,%
-      rightcavalier,ring,rn,rotatedtext,rotationalsurface,rotn,rtail,%
-      ruledsurface,rxmy,s,save,scalarmatprod,scalarvectprod,schlegel2d,%
-      schlegel3d,sdifference,sdifferencepr,segment,sel,setand,setdiff,%
-      setfontcolor,setor,setxor,sex,shape_0,shape_1,shape2points,%
-      shape2pol,shapeclosed,shapecomb,shapediff,shapedist,%
-      shapeinbetweening,shapeinf,shapejoin,shapelen,shapenorm,%
-      shapenormal,shapeprod,shaperot,shapesum,shapesup,shapezero,shift,%
-      showprop,sign,signal,simplex,simplexpile,sin,sinh,size,skeleton,%
-      skew,smaller,smallest,solidifier,solidify,sort,sphere,spline,%
-      splinesampling,splitcells,splitpols,sqr,sqrt,star,string,%
-      stringtokens,struct,sub,svg,sweep,t,tail,tan,tangent,tanh,%
-      tensorprodsurface,tetrahedron,text,texture,textwithattributes,%
-      thinsolid,threepoints,time,tmax,tmin,top,torus,torusmap,trace,%
-      trans,tree,trianglefan,trianglestripe,trimetric,true,truncone,tt,%
-      tube,twopoints,uk,ukpol,ukpolf,union,unionpr,unitvect,unprune,up,%
-      vect2dtoangle,vect2mat,vectdiff,vectnorm,vectprod,vectsum,view,%
-      viewmodel,viewmodel,vrml,warp,warp,where,white,with,xcavalier,xor,%
-      xquadarray,xx,ycavalier,yellow},%
-   moredirectives={loadlib},%
-   otherkeywords={-,+,*,**,/,~,|,..,^,\&,\&\&,\#,\#\#},%
-   morecomment=[s]{\%}{\%},%
-   morestring=[b]',%
-   literate={~}{{$\sim$}}{1} {^}{$\wedge$}{1},%
-  }[keywords,directives,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{PL/I}
-%
-% Found the data in
-% \begin{itemize}
-% \item
-%		\textsc{Bernhard Fischer, Herman Fischer}:
-%		\textbf{Structured Programming in PL/I and PL/C};
-%		Copyright {\copyright} 1976 by Marcel Dekker, Inc.;
-%		ISBN 0-8247-6394-7
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{PL/I}%
-  {morekeywords={ABS,ATAN,AUTOMATIC,AUTO,ATAND,BEGIN,BINARY,BIN,BIT,%
-      BUILTIN,BY,CALL,CHARACTER,CHAR,CHECK,COLUMN,COL,COMPLEX,CPLX,%
-      COPY,COS,COSD,COSH,DATA,DATE,DECIMAL,DEC,DECLARE,DCL,DO,EDIT,%
-      ELSE,END,ENDFILE,ENDPAGE,ENTRY,EXP,EXTERNAL,EXT,FINISH,FIXED,%
-      FIXEDOVERFLOW,FOFL,FLOAT,FORMAT,GET,GO,GOTO,IF,IMAG,INDEX,%
-      INITIAL,INIT,INTERNAL,INT,LABEL,LENGTH,LIKE,LINE,LIST,LOG,LOG2,%
-      LOG10,MAIN,MAX,MIN,MOD,NOCHECK,NOFIXEDOVERFLOW,NOFOFL,NOOVERFLOW,%
-      NOOFL,NOSIZE,NOUNDERFLOW,NOUFL,NOZERODIVIDE,NOZDIV,ON,OPTIONS,%
-      OVERFLOW,OFL,PAGE,PICTURE,PROCEDURE,PROC,PUT,READ,REPEAT,RETURN,%
-      RETURNS,ROUND,SIN,SIND,SINH,SIZE,SKIP,SQRT,STATIC,STOP,STRING,%
-      SUBSTR,SUM,SYSIN,SYSPRINT,TAN,TAND,TANH,THEN,TO,UNDERFLOW,UFL,%
-      VARYING,WHILE,WRITE,ZERODIVIDE,ZDIV},%
-   sensitive=f,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[d]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{POV-Ray}
-%
-% \lstthanks{Berthold~H\"ollmann}{bhoel@starship.python.net}{1999/04/15} sent
-% me the definition. But I removed |blankstring=false| and
-% |flexiblecolumns=true| from the driver since they have nothing to do with a
-% language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% POV definition (c) 1999 Berthold H\"ollmann
-%%
-\lst@definelanguage{POV}%
-  {morekeywords={abs,absorption,acos,acosh,adaptive,adc_bailout,agate,%
-      agate_turb,all,alpha,ambient,ambient_light,angle,aperture,append,%
-      arc_angle,area_light,array,asc,asin,asinh,assumed_gamma,atan,%
-      atan2,atanh,average,background,bezier_spline,bicubic_patch,%
-      black_hole,blob,blue,blur_samples,bounded_by,box,boxed,bozo,%
-      break,brick,brick_size,brightness,brilliance,bumps,bump_map,%
-      bump_size,camera,case,caustics,ceil,checker,chr,clipped_by,clock,%
-      clock_delta,color,color_map,colour,colour_map,component,%
-      composite,concat,cone,confidence,conic_sweep,control0,control1,%
-      cos,cosh,count,crackle,crand,cube,cubic,cubic_spline,cubic_wave,%
-      cylinder,cylindrical,debug,declare,default,defined,degrees,%
-      density,density_file,density_map,dents,difference,diffuse,%
-      dimensions,dimension_size,direction,disc,distance,%
-      distance_maximum,div,eccentricity,else,emission,end,error,%
-      error_bound,exp,extinction,fade_distance,fade_power,falloff,%
-      falloff_angle,false,fclose,file_exists,filter,finish,fisheye,%
-      flatness,flip,floor,focal_point,fog,fog_alt,fog_offset,fog_type,%
-      fopen,frequency,gif,global_settings,gradient,granite,%
-      gray_threshold,green,height_field,hexagon,hf_gray_16,hierarchy,%
-      hollow,hypercomplex,if,ifdef,iff,ifndef,image_map,include,int,%
-      interior,interpolate,intersection,intervals,inverse,ior,irid,%
-      irid_wavelength,jitter,julia_fractal,lambda,lathe,leopard,%
-      light_source,linear_spline,linear_sweep,local,location,log,%
-      looks_like,look_at,low_error_factor,macro,mandel,map_type,marble,%
-      material,material_map,matrix,max,max_intersections,max_iteration,%
-      max_trace_level,media,media_attenuation,media_interaction,merge,%
-      mesh,metallic,min,minimum_reuse,mod,mortar,nearest_count,no,%
-      normal,normal_map,no_shadow,number_of_waves,object,octaves,off,%
-      offset,omega,omnimax,on,once,onion,open,orthographic,panoramic,%
-      perspective,pgm,phase,phong,phong_size,pi,pigment,pigment_map,%
-      planar,plane,png,point_at,poly,polygon,poly_wave,pot,pow,ppm,%
-      precision,prism,pwr,quadratic_spline,quadric,quartic,quaternion,%
-      quick_color,quick_colour,quilted,radial,radians,radiosity,radius,%
-      rainbow,ramp_wave,rand,range,ratio,read,reciprocal,%
-      recursion_limit,red,reflection,reflection_exponent,refraction,%
-      render,repeat,rgb,rgbf,rgbft,rgbt,right,ripples,rotate,roughness,%
-      samples,scale,scallop_wave,scattering,seed,shadowless,sin,%
-      sine_wave,sinh,sky,sky_sphere,slice,slope_map,smooth,%
-      smooth_triangle,sor,specular,sphere,spherical,spiral1,spiral2,%
-      spotlight,spotted,sqr,sqrt,statistics,str,strcmp,strength,strlen,%
-      strlwr,strupr,sturm,substr,superellipsoid,switch,sys,t,tan,tanh,%
-      text,texture,texture_map,tga,thickness,threshold,tightness,tile2,%
-      tiles,torus,track,transform,translate,transmit,triangle,%
-      triangle_wave,true,ttf,turbulence,turb_depth,type,u,%
-      ultra_wide_angle,undef,union,up,use_color,use_colour,use_index,%
-      u_steps,v,val,variance,vaxis_rotate,vcross,vdot,version,vlength,%
-      vnormalize,vrotate,v_steps,warning,warp,water_level,waves,while,%
-      width,wood,wrinkles,write,x,y,yes,z},%
-   moredirectives={break,case,debug,declare,default,else,end,fclose,%
-      fopen,local,macro,read,render,statistics,switch,undef,version,%
-      warning,write},%
-   moredelim=*[directive]\#,%
-   sensitive,%
-   morecomment=[l]//,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[d]",%
-  }[keywords,directives,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Prolog}
-%
-% \lsthelper{Dominique~de~Waleffe}{ddw@miscrit.be}{1997/11/24}{Prolog} mailed
-% me the data for Prolog. He took the keywords from the \textsf{LGrind}
-% language definition file.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Prolog definition (c) 1997 Dominique de Waleffe
-%%
-\lst@definelanguage{Prolog}%
-  {morekeywords={op,mod,abort,ancestors,arg,ascii,ask,assert,asserta,%
-      assertz,atom,atomic,char,clause,close,concat,consult,ed,ef,em,%
-      eof,fail,file,findall,write,functor,getc,integer,is,length,%
-      listing,load,name,nl,nonvar,not,numbervars,op,or,pp,prin,print,%
-      private,prompt,putc,ratom,read,read_from_this_file,rename,repeat,%
-      retract,retractall,save,see,seeing,seen,sh,skip,statistics,%
-      subgoal_of,system,tab,tell,telling,time,told,trace,true,unload,%
-      untrace,var,write},%
-   sensitive=f,%
-   morecomment=[l]\%,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[bd]",%
-   morestring=[bd]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Promela}
-%
-% Thanks to \lstthanks{William~Thimbleby}{-}{1997/11/24}{Promela} for this
-% language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Promela definition (c) 2004 William Thimbleby
-%%
-\lst@definelanguage{Promela}
-  {morekeywords={active,assert,atomic,bit,bool,break,byte,chan,d_step,%
-      Dproctype,do,else,empty,enabled,fi,full,goto,hidden,if,init,int,%
-      len,mtype,nempty,never,nfull,od,of,pcvalue,printf,priority,%
-      proctype,provided,run,short,skip,timeout,typedef,unless,unsigned,%
-      xr,xs,true,false,inline,eval},%
-   moredirectives={define,ifdef,ifndef,if,if,else,endif,undef,include},%
-   moredelim=*[directive]\#,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[b]"%
-  }[keywords,comments,strings,directives]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Python}
-%
-% \lstthanks{Michael~Weber}{mweber@informatik.hu-berlin.de}{1998/12/21} sent me
-% the definition. He got data from \textsc{Mark Lutz}: \textbf{Programming
-% Python}; O'Reilly 1996; ISBN 1-56592-197-6.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Python definition (c) 1998 Michael Weber
-%%
-\lst@definelanguage{Python}%
-  {morekeywords={access,and,break,class,continue,def,del,elif,else,%
-      except,exec,finally,for,from,global,if,import,in,is,lambda,not,%
-      or,pass,print,raise,return,try,while},%
-   sensitive=true,%
-   morecomment=[l]\#,%
-   morecomment=[s]{'''}{'''},% used for documentation text
-   morecomment=[s]{"""}{"""},% added by Philipp Matthias Hahn
-   morestring=[b]',% 
-   morestring=[b]"% 
-  }%
-%    \end{macrocode}
-% \lsthelper{Philipp Matthias Hahn}{pmhahn@titan.lahn.de}{2002/04/18}{}
-% added the third comment. \lsthelper{eRreuR}{rogspr@newdeal.ch}{2002/05/28}
-% {probl\`eme avec "listings" et le langage Python} found a bug using Python
-% and \lsthelper{Nicolas Markey}{markey@lsv.ens-cachan.fr}{2002/05/29}
-% {listings and Python} informed me about the corresponding thread on
-% \texttt{fr.comp.text.tex} and provided the fix---adding \texttt{[b]} to
-% both \texttt{morestring} declarations.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Rexx}
-%
-% \lstthanks{Patrick~TJ~McPhee}{ptjm@interlog.com}{2003/10/24} provided this
-% definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% classic rexx listings definition
-%% by Patrick TJ McPhee 
-%%
-\lst@definelanguage{Rexx}
-  {morekeywords={address,arg,call,do,drop,else,end,exit,if,iterate,%
-                 interpret,leave,nop,numeric,options,otherwise,parse,%
-                 procedure,pull,push,queue,return,say,signal,then,to,%
-                 trace,when},%
-   sensitive=false,%
-   morecomment=[n]{/*}{*/},%
-   morestring=[d]{'},%
-   morestring=[d]{"},%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Reduce}
-%
-% was provided by \lstthanks{Geraint~Paul~Bevan}{geraint@users.sf.net}
-% {2002/10/31}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Reduce definition (c) 2002 Geraint Paul Bevan
-%%
-\lst@definelanguage{Reduce}%
-  {morekeywords={%
-%% reserved identifiers
-	abs,acos,acosh,acot,acoth,acsc,acsch,%
-	adjprec,algebraic,algint,allbranch,allfac,and,%
-	antisymmetric,append,arglength,array,asec,asech,%
-	asin,asinh,atan,atan2,atanh,begin,bfspace,bye,%
-	card_no,ceiling,clear,clearrules,coeff,coeffn,%
-	cofactor,combineexpt,combinelogs,comment,comp,%
-	complex,conj,cons,cont,cos,cosh,cot,coth,cramer,%
-	cref,csc,csch,decompose,define,defn,deg,demo,den,%
-	depend,det,df,difference,dilog,display,div,do,e,%
-	echo,ed,editdef,ei,end,eps,eq,equal,erf,errcont,%
-	evallhseqp,eval_mode,even,evenp,exp,expandlogs,%
-	expr,expt,ezgcd,factor,factorial,factorize,fexpr,%
-	first,fix,fixp,floor,for,forall,foreach,fort,%
-	fort_width,freeof,fullroots,g,gcd,geq,go,goto,%
-	greaterp,high_pow,hypot,i,if,ifactor,impart,in,%
-	index,infinity,infix,input,int,integer,interpol,%
-	intstr,k,korder,lambda,lcm,lcof,length,leq,lessp,%
-	let,lhs,linear,linelength,lisp,list,listargp,%
-	listargs,ln,load,load_package,log,log10,logb,%
-	low_pow,lterm,macro,mainvar,mass,mat,match,%
-	mateigen,matrix,max,mcd,member,memq,min,minus,mkid,%
-	modular,msg,mshell,multiplicities,nat,neq,nero,%
-	nextprime,nil,nodepend,noncom,nonzero,nosplit,%
-	nospur,nullspace,num,numberp,odd,off,on,operator,%
-	or,order,ordp,out,output,part,pause,period,pf,pi,%
-	plus,precedence,precise,precision,pret,pri,primep,%
-	print_precision,procedure,product,quit,quotient,%
-	random,random_new_seed,rank,rat,ratarg,rational,%
-	rationalize,ratpri,real,rederr,reduct,remainder,%
-	remfac,remind,repart,repeat,rest,resultant,retry,%
-	return,reverse,revpri,rhs,rlisp88,%
-	root_multiplicity,round,roundall,roundbf,rounded,%
-	saveas,savestructr,scalar,sec,sech,second,set,%
-	setmod,setq,share,showrules,showtime,shut,sign,sin,%
-	sinh,smacro,solve,solvesingular,spur,sqrt,structr,%
-	sub,sum,symbolic,symmetric,t,tan,tanh,third,time,%
-	times,tp,tra,trace,trfac,trigform,trint,until,%
-	varname,vecdim,vector,weight,when,where,while,%
-	write,ws,wtlevel,%
-%% identifiers with spaces
-%%	for all,for each,go to,such that,%
-	},%
-  sensitive=false,%
-  morecomment=[l]\%,%
-  morecomment=[s]{COMMENT}{;},%
-  morecomment=[s]{COMMENT}{$},%
-  morestring="%
- }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{RSL}
-%
-% Thanks go to \lstthanks{Brian~Christensen}{}{2004/02/15}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% RSL definition (c) 2004 Brian Christensen
-%%
-\lst@definelanguage{RSL}%
-  {morekeywords={Bool,Char,devt_relation,Int,Nat,Real,Text,Unit,abs,any,%
-      as,axiom,card,case,channel,chaos,class,do,dom,elems,else,elsif,end,%
-      extend,false,for,hd,hide,if,in,inds,initialise,int,len,let,local,%
-      object,of,out,post,pre,read,real,rng,scheme,skip,stop,swap,%
-      test_case,theory,then,tl,true,type,until,use,value,variable,while,%
-      with,write},%
-literate=%
-{<}{$<$}{1}%
-{>}{$>$}{1}%
-{[}{$[$}{1}%%
-{]}{$]$}{1}%%
-{^}{{\mbox{$\widehat{\;}$}}}{1}%%
-{'}{{\raisebox{1ex}[1ex][0ex]{\protect\scriptsize$\prime$}}}{1}%%
-{||}{{\mbox{$\parallel$}}}{2}%%
-{|-}{$\vdash$}{1}%%
-{|=|}{{\mbox{$\lceil\!\rceil\!\!\!\!\!\!\;\lfloor\!\rfloor$}}}{1}%%
-{**}{$\uparrow$}{1}%
-{/\\}{$\wedge$}{1}%%
-{inter}{$\cap$}{1}%%
-{-\\}{$\lambda$}{1}%%
-{->}{$\rightarrow$}{1}%%
-{-m->}{{\mbox{$\rightarrow \hspace{-2.5\lst@width} _{m}\;$}}}{1}%
-{-~m->}{{\mbox{$\stackrel{\sim}{\mbox{$\rightarrow\hspace{-2.5\lst@width} _{m}\;$}}$}}}{1}%
-{-~->}{{\mbox{$\stackrel{\sim}{\rightarrow}$}}}{1}%%
-{-set}{\bf{-set}}{4}%%
-{-list}{{$^{\ast}$}}{1}%%
-{-inflist}{$^\omega$}{1}%
-{-infset}{{\mbox{{\bf -infset}}}}{7}%
-{\#}{$\circ$}{1}%
-{:-}{{\raisebox{.4ex}{\tiny $\bullet$}}}{1}%%
-{=}{$=$}{1}%%
-{==}{$==$}{2}%%
-{=>}{$\Rightarrow$}{1}%%
-{\ is\protect\^^M}{{$\;\equiv$}}{2}%
-{\ is\ }{{$\equiv$}}{3}%%
-{\ isin\protect\^^M}{$\;\in$}{2}%%
-{~}{$\sim$}{1}%%
-{~=}{$\neq$}{1}%%
-{~isin}{$\notin$}{1}%%
-{+>}{$\mapsto$}{1}%%
-{++}{}{1}%
-{|^|}{{\mbox{$\lceil\!\rceil$}}}{1}%%
-{\\/}{$\vee$}{1}%%
-{exists}{$\exists$}{1}%%
-{union}{$\cup$}{1}%%
-{>=}{$\geq$}{1}%%
-{><}{$\times$}{1}%%
-{>>}{$\supset$}{1}%
-{>>=}{$\supseteq$}{1}%%
-{<=}{$\leq$}{1}%%
-{<<}{$\subset$}{1}%
-{<.}{$\langle$}{1}%%
-{<<=}{$\subseteq$}{1}%%
-{<->}{$\leftrightarrow$}{1}%%
-{[=}{$\sqsubseteq$}{1}%%
-{\{=}{$\preceq$}{1}%%
-{\ all\protect\^^M}{$\forall$}{2}%%
-{\ all\ }{$\forall$}{3}%%
-{!!}{$\dagger$}{1}%%
-{always}{$\Box$}{1}%%
-{.>}{$\rangle$}{1}%%
-{`alpha}{$\alpha$}{1}%
-{`beta}{$\beta$}{1}%
-{`gamma}{$\gamma$}{1}%
-{`delta}{$\delta$}{1}%
-{`epsilon}{$\epsilon$}{1}%
-{`zeta}{$\zeta$}{1}%
-{`eta}{$\eta$}{1}%
-{`theta}{$\theta$}{1}%
-{`iota}{$\iota$}{1}%
-{`kappa}{$\kappa$}{1}%
-{`mu}{$\mu$}{1}%
-{`nu}{$\nu$}{1}%
-{`xi}{$\xi$}{1}%
-{`pi}{$\pi$}{1}%
-{`rho}{$\rho$}{1}%
-{`sigma}{$\sigma$}{1}%
-{`tau}{$\tau$}{1}%
-{`upsilon}{$\upsilon$}{1}%
-{`phi}{$\phi$}{1}%
-{`chi}{$\chi$}{1}%
-{`psi}{$\psi$}{1}%
-{`omega}{$\omega$}{1}%
-{`Gamma}{$\Gamma$}{1}%
-{`Delta}{$\Delta$}{1}%
-{`Theta}{$\Theta$}{1}%
-{`Lambda}{$\Lambda$}{1}%
-{`Xi}{$\Xi$}{1}%
-{`Pi}{$\Pi$}{1}%
-{`Sigma}{$\Sigma$}{1}%
-{`Upsilon}{$\Upsilon$}{1}%
-{`Phi}{$\Phi$}{1}%
-{`Psi}{$\Psi$}{1}%
-{`Omega}{$\Omega$}{1},%
-   sensitive=true,%
-   morecomment=[l]{--},%
-   morecomment=[s]{/*}{*/}%
-  }[keywords,comments]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Ruby}
-%
-% \lstthanks{Christian~Kaiser}{chk@combit.net}{2003/02/05} provided this
-% definition. \lstthanks{Xavier~Noria}{fxn@hashref.com}{2004/01/11} replaced
-% the keywords with the keywords from the at the time of writing current
-% stable Ruby version.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Ruby}%
-  {morekeywords={__FILE__,__LINE__,BEGIN,END,alias,and,begin,break,%
-      case,class,def,defined?,do,else,elsif,end,ensure,false,for,%
-      if,in,module,next,nil,not,or,redo,rescue,retry,return,self,%
-      super,then,true,undef,unless,until,when,while,yield},%
-   sensitive=true,%
-   morecomment=[l]\#,%
-   morecomment=[l]\#\#,%
-   morecomment=[s]{=BEGIN}{=END},%
-   morestring=[b]',%
-   morestring=[b]",%
-   morestring=[b]/%
-  }[keywords,comments,strings]%
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Scilab}
-%
-% Thanks go to \lstthanks{Jean-Philippe~Grivet}{grivet@cnrs-orleans.fr}
-% {2003/06/02}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Scilab definition (c) 2002,2003 Jean-Philippe Grivet
-%%
-\lst@definelanguage{Scilab}%
-  {morekeywords={abcd,abinv,abort,abs,acoshm,acosh,acosm,acos,addcolor,%
-      addf,addinter,addmenu,add_edge,add_node,adj2sp,adj_lists,aff2ab,%
-      amell,analpf,analyze,ans,apropos,arc_graph,arc_number,argn,arhnk,%
-      arl2,arma2p,armac,armax1,armax,arma,arsimul,artest,articul,ascii,%
-      asinhm,asinh,asinm,asin,atanhm,atanh,atanm,atan,augment,auread,%
-      auwrite,balanc,balreal,bandwr,basename,bdiag,besseli,besselj,%
-      besselk,bessely,best_match,bezout,bifish,bilin,binomial,black,%
-      bloc2exp,bloc2ss,bode,bool2s,boolean,boucle,break,bstap,buttmag,%
-      bvode,cainv,calerf,calfrq,call,canon,casc,case,ccontrg,cdfbet,%
-      cdfbin,cdfchi,cdfchn,cdffnc,cdff,cdfgam,cdfnbn,cdfnor,cdfpoi,%
-      cdft,ceil,center,cepstrum,chaintest,chain_struct,champ1,champ,%
-      chart,chdir,cheb1mag,cheb2mag,check_graph,check_io,chepol,chfact,%
-      chol,chsolve,circuit,classmarkov,clean,clearfun,clearglobal,%
-      clear,close,cls2dls,cmb_lin,cmndred,cmoment,code2str,coeff,coffg,%
-      coff,colcompr,colcomp,colinout,colormap,colregul,companion,comp,%
-      cond,conj,connex,contour2di,contour2d,contourf,contour,%
-      contract_edge,contrss,contr,cont_frm,cont_mat,convex_hull,convol,%
-      convstr,con_nodes,copfac,copy,correl,corr,coshm,cosh,cosm,cos,%
-      cotg,cothm,coth,covar,csim,cspect,ctr_gram,cumprod,cumsum,%
-      curblock,cycle_basis,czt,c_link,dasrt,dassl,datafit,date,dbphi,%
-      dcf,ddp,debug,dec2hex,deff,definedfields,degree,delbpt,%
-      delete_arcs,delete_nodes,delete,delip,delmenu,demos,denom,%
-      derivative,derivat,des2ss,des2tf,determ,detr,det,dft,dhinf,%
-      dhnorm,diag,diary,diff,diophant,dirname,dispbpt,dispfiles,disp,%
-      dlgamma,double,dragrect,drawaxis,drawlater,drawnow,draw,driver,%
-      dscr,dsearch,dsimul,dtsi,dt_ility,duplicate,edge_number,%
-      edit_curv,edit_graph_menus,edit_graph,edit,eigenmarkov,ell1mag,%
-      elseif,else,emptystr,endfunction,end,eqfir,eqiir,equil1,equil,%
-      ereduc,erfcx,erfc,erf,errbar,errcatch,errclear,error,eval3dp,%
-      eval3d,eval,evans,evstr,excel2sci,execstr,exec,exists,exit,expm,%
-      exp,external,eye,fac3d,factors,faurre,fchamp,fcontour2d,fcontour,%
-      fec,feedback,feval,ffilt,fftshift,fft,fgrayplot,figure,fileinfo,%
-      file,filter,findm,findobj,findx0BD,find_freq,find_path,find,%
-      findABCD,findAC,findBD,findBDK,findR,fit_dat,fix,floor,flts,foo,%
-      formatman,format,fort,for,fourplan,fplot2d,fplot3d1,fplot3d,%
-      fprintf,fprintfMat,frep2tf,freq,freson,frexp,frfit,frmag,fscanf,%
-      fscanfMat,fsfirlin,fsolve,fspecg,fstabst,fstair,ftest,ftuneq,%
-      fullrfk,fullrf,full,fun2string,funcprot,functions,function,%
-      funptr,fusee,gainplot,gamitg,gammaln,gamma,gcare,gcd,gcf,%
-      genfac3d,genlib,genmarkov,gen_net,geom3d,geomean,getblocklabel,%
-      getcolor,getcurblock,getcwd,getdate,getd,getenv,getfield,getfont,%
-      getf,getio,getlinestyle,getmark,getpid,getscicosvars,getsymbol,%
-      getvalue,getversion,get_function_path,get,gfare,gfrancis,girth,%
-      givens,glever,glist,global,glue,gpeche,graduate,grand,%
-      graphics_entities,graph_2_mat,graph_center,graph_complement,%
-      graph_diameter,graph_power,graph_simp,graph_sum,graph_union,%
-      graph-list,graycolormap,grayplot,graypolarplot,grep,group,%
-      gr_menu,gschur,gsort,gspec,gstacksize,gtild,g_margin,h2norm,halt,%
-      hamilton,hankelsv,hank,harmean,havewindow,help,hermit,hess,%
-      hex2dec,hilb,hinf,hist3d,histplot,horner,host,hotcolormap,%
-      householder,hrmt,htrianr,hypermat,h_cl,h_inf_st,h_inf,h_norm,%
-      iconvert,icon_edit,ieee,if,iirgroup,iirlp,iir,ilib_build,%
-      ilib_compile,ilib_for_link,ilib_gen_gateway,ilib_gen_loader,%
-      ilib_gen_Make,imag,impl,imrep2ss,imult,im_inv,inistate,input,%
-      int16,int2d,int32,int3d,int8,intc,intdec,integrate,interpln,%
-      interp,intersci,intersect,intg,intl,intppty,intsplin,inttrap,%
-      inttype,int,invr,invsyslin,inv_coeff,inv,iqr,isdef,isdir,isequal,%
-      iserror,isglobal,isinf,isnan,isoview,isreal,is_connex,jmat,%
-      justify,kalm,karmarkar,kernel,keyboard,knapsack,kpure,krac2,%
-      kroneck,kron,lasterror,lattn,lattp,lcf,lcmdiag,lcm,ldivf,ldiv,%
-      leastsq,legends,length,leqr,levin,lev,lex_sort,lft,lgfft,library,%
-      lib,lin2mu,lincos,lindquist,lines,line_graph,linfn,linf,link,%
-      linmeq,linpro,linsolve,linspace,lin,listfiles,list,lmisolver,%
-      lmitool,loadmatfile,loadplots,loadwave,load_graph,load,locate,%
-      log10,log1p,log2,logm,logspace,log,lotest,lqe,lqg2stan,lqg_ltr,%
-      lqg,lqr,lsq,lsslist,lstcat,lstsize,ltitr,ludel,lufact,luget,%
-      lusolve,lu,lyap,macglov,macr2lst,macrovar,macro,mad,make_graph,%
-      make_index,manedit,man,mapsound,markp2ss,matfile2sci,matrix,%
-      mat_2_graph,maxi,max_cap_path,max_clique,max_flow,max,mclearerr,%
-      mclose,meanf,mean,median,meof,mese,mesh2d,mfft,mfile2sci,mgeti,%
-      mgetl,mgetstr,mget,milk_drop,mine,mini,minreal,minss,%
-      min_lcost_cflow,min_lcost_flow1,min_lcost_flow2,min_qcost_flow,%
-      min_weight_tree,min,mlist,mode,modulo,moment,mopen,move,%
-      mps2linpro,mputl,mputstr,mput,mrfit,msd,mseek,mtell,mtlb_load,%
-      mtlb_mode,mtlb_save,mtlb_sparse,mu2lin,mulf,mvvacov,m_circle,%
-      names,nand2mean,nanmax,nanmeanf,nanmean,nanmedian,nanmin,%
-      nanstdev,nansum,narsimul,ndims,nearfloat,nehari,neighbors,%
-      netclose,netwindows,netwindow,newest,newfun,nextpow2,nf3d,nfreq,%
-      nlev,nnz,nodes_2_path,nodes_degrees,node_number,noisegen,norm,%
-      null,numdiff,numer,nyquist,obscont1,obscont,observer,obsvss,%
-      obsv_mat,obs_gram,odedc,odedi,odeoptions,ode_discrete,ode_root,%
-      ode,oldload,oldsave,ones,optim,orth,param3d1,param3d,%
-      paramfplot2d,parrot,part,pathconvert,path_2_nodes,pause,pbig,%
-      pdiv,pen2ea,pencan,penlaur,perctl,perfect_match,pertrans,pfss,%
-      phasemag,phc,pinv,pipe_network,playsnd,plot2d1,plot2d2,plot2d3,%
-      plot2d4,plot2d,plot3d1,plot3d2,plot3d3,plot3d,plotframe,%
-      plotprofile,plot_graph,plot,plzr,pmodulo,pol2des,pol2str,pol2tex,%
-      polarplot,polar,polfact,poly,portr3d,portrait,power,ppol,prbs_a,%
-      predecessors,predef,printf,printing,print,prod,profile,projsl,%
-      projspec,proj,psmall,pspect,pvm_addhosts,pvm_barrier,pvm_bcast,%
-      pvm_bufinfo,pvm_config,pvm_delhosts,pvm_error,pvm_exit,%
-      pvm_f772sci,pvm_getinst,pvm_gettid,pvm_get_timer,pvm_gsize,%
-      pvm_halt,pvm_joingroup,pvm_kill,pvm_lvgroup,pvm_mytid,pvm_parent,%
-      pvm_probe,pvm_recv,pvm_reduce,pvm_sci2f77,pvm_send,pvm_set_timer,%
-      pvm_spawn_independent,pvm_spawn,pvm_start,pvm_tasks,%
-      pvm_tidtohost,pvm,pwd,p_margin,qassign,qr,quapro,quart,quaskro,%
-      quit,randpencil,rand,range,rankqr,rank,rat,rcond,rdivf,read4b,%
-      readb,readc_,readmps,read,real,recur,reglin,regress,remezb,remez,%
-      repfreq,replot,residu,resume,return,riccati,riccsl,ricc,ric_desc,%
-      rlist,roots,rotate,round,routh_t,rowcompr,rowcomp,rowinout,%
-      rowregul,rowshuff,rpem,rref,rtitr,rubberbox,salesman,savewave,%
-      save_graph,save,scaling,scanf,schur,sci2exp,sci2for,sci2map,%
-      sciargs,scicosim,scicos,scifunc_block,sd2sci,secto3d,select,%
-      semidef,sensi,setbpt,seteventhandler,setfield,setmenu,%
-      setscicosvars,set,sfact,sgrid,shortest_path,showprofile,%
-      show_arcs,show_graph,show_nodes,sident,signm,sign,simp_mode,simp,%
-      sincd,sinc,sinc,sinhm,sinh,sinm,sin,size,sm2des,sm2ss,smooth,%
-      solve,sorder,sort,sound,sp2adj,spaninter,spanplus,spantwo,sparse,%
-      spchol,spcompack,specfact,spec,speye,spget,splin,split_edge,%
-      spones,sprand,sprintf,spzeros,sqroot,sqrtm,sqrt,squarewave,%
-      square,srfaur,srkf,ss2des,ss2ss,ss2tf,sscanf,sskf,ssprint,ssrand,%
-      stabil,stacksize,standard_define,standard_draw,standard_input,%
-      standard_origin,standard_output,startup,stdevf,stdev,steadycos,%
-      str2code,strange,strcat,strindex,strings,string,stripblanks,%
-      strong_connex,strong_con_nodes,strsubst,st_deviation,st_ility,%
-      subf,subgraph,subplot,successors,sum,supernode,sva,svd,svplot,%
-      sylm,sylv,sysconv,sysdiag,sysfact,syslin,syssize,systems,system,%
-      systmat,tabul,tangent,tanhm,tanh,tanm,tan,tdinit,testmatrix,%
-      texprint,tf2des,tf2ss,then,thrownan,timer,time_id,titlepage,%
-      tk_getdir,tk_getfile,tlist,toeplitz,tokenpos,tokens,trace,%
-      translatepaths,trans_closure,trans,trfmod,trianfml,tril,trimmean,%
-      trisolve,triu,trzeros,typename,typeof,type,uicontrol,uimenu,%
-      uint16,uint32,uint8,ui_observer,ulink,unglue,union,unique,unix_g,%
-      unix_s,unix_w,unix_x,unix,unobs,unsetmenu,user,varargin,%
-      varargout,variancef,variance,varn,warning,wavread,wavwrite,%
-      wcenter,wfir,what,whereami,whereis,where,while,whos,who_user,who,%
-      wiener,wigner,window,winsid,with_gtk,with_pvm,with_texmacs,%
-      with_tk,writb,write4b,write,xarcs,xarc,xarrows,xaxis,xbasc,%
-      xbasimp,xbasr,xchange,xclear,xclea,xclick,xclip,xdel,xend,xfarcs,%
-      xfarc,xfpolys,xfpoly,xfrect,xgetech,xgetfile,xgetmouse,xget,%
-      xgraduate,xgrid,xinfo,xinit,xlfont,xload,xname,xnumb,xpause,%
-      xpolys,xpoly,xrects,xrect,xrpoly,xs2fig,xs2gif,xs2ppm,xs2ps,%
-      xsave,xsegs,select,xsetech,xsetm,xset,xstringb,xstringl,xstring,%
-      xtape,xtitle,x_choices,x_choose,x_dialog,x_matrix,x_mdialog,%
-      x_message_modeless,x_message,yulewalk,zeropen,zeros,zgrid,zpbutt,%
-      zpch1,zpch2,zpell,mfprintf,mfscanf,mprintf,mscanf,msprintf,%
-      msscanf,mucomp,%
-      ABSBLK_f,AFFICH_f,ANDLOG_f,ANIMXY_f,BIGSOM_f,CLINDUMMY_f,CLKIN_f,%
-      CLKINV_f,CLKOUT_f,CLKOUTV_f,CLKSOM_f,CLKSOMV_f,CLKSPLIT_f,%
-      CLOCK_f,CLR_f,CLSS_f,CONST_f,COSBLK_f,CURV_f,DELAY_f,DELAYV_f,%
-      DEMUX_f,DLR_f,DLRADAPT_f,DLSS_f,EVENTSCOPE_f,EVTDLY_f,EVTGEN_f,%
-      EXPBLK_f,G_make,GAIN_f,GAINBLK_f,GENERAL_f,GENERIC_f,GENSIN_f,%
-      GENSQR_f,HALT_f,IFTHEL_f,IN_f,INTEGRAL_f,INTRP2BLK_f,INTRPLBLK_f,%
-      INVBLK_f,LOGBLK_f,LOOKUP_f,Matplot1,Matplot,MAX_f,MCLOCK_f,%
-      MFCLCK_f,MIN_f,MUX_f,NDcost,NEGTOPOS_f,OUT_f,POSTONEG_f,POWBLK_f,%
-      PROD_f,QUANT_f,RAND_f,READC_f,REGISTER_f,RELAY_f,RFILE_f,%
-      ScilabEval,Sfgrayplot,Sgrayplot,SAMPLEHOLD_f,SAT_f,SAWTOOTH_f,%
-      SCOPE_f,SCOPXY_f,SELECT_f,SINBLK_f,SOM_f,SPLIT_f,STOP_f,SUPER_f,%
-      TANBLK_f,TCLSS_f,TEXT_f,TIME_f,TK_EvalFile,TK_EvalStr,TK_GetVar,%
-      TK_SetVar,TRASH_f,WFILE_f,WRITEC_f,ZCROSS_f,%
-      \%asn,\%helps,\%k,\%sn},%
-   alsoletter=\%,% chmod
-   sensitive,%
-   morecomment=[l]//,%
-   morestring=[b]",%
-   morestring=[m]'%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{SHELXL}
-%
-% Thanks to \lstthanks{Aidan~Philip~Heerdegen}{Aidan.Heerdegen@anu.edu.au}
-% {1999/07/09} for mailing this definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% SHELXL definition (c) 1999 Aidan Philip Heerdegen
-%%
-\lst@definelanguage{SHELXL}%
-  {morekeywords={TITL,CELL,ZERR,LATT,SYMM,SFAC,DISP,UNIT,LAUE,%
-      REM,MORE,TIME,END,HKLF,OMIT,SHEL,BASF,TWIN,EXTI,SWAT,%
-      MERG,SPEC,RESI,MOVE,ANIS,AFIX,HFIX,FRAG,FEND,EXYZ,EADP,%        
-      EQIV,OMIT,CONN,PART,BIND,FREE,DFIX,BUMP,SAME,SADI,CHIV,%
-      FLAT,DELU,SIMU,DEFS,ISOR,SUMP,L.S.,CGLS,SLIM,BLOC,DAMP,%
-      WGHT,FVAR,BOND,CONF,MPLA,RTAB,LIST,ACTA,SIZE,TEMP,WPDB,%
-      FMAP,GRID,PLAN,MOLE},%
-   sensitive=false,%
-   alsoother=_,% Makes the syntax highlighting ignore the underscores
-   morecomment=[l]{! },%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Simula}
-%
-% Took data from
-% \begin{itemize}
-% \item
-%		\textsc{G\"unther Lamprecht}:
-%		\textbf{Introduction to SIMULA 67};
-%		Braunschweig; Wiesbaden: Vieweg, 1981
-% \end{itemize}
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[DEC]{Simula}[67]{Simula}%
-  {morekeywords={and,eq,eqv,ge,gt,hidden,imp,le,long,lt,ne,not,%
-      options,or,protected,short}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[CII]{Simula}[67]{Simula}%
-  {morekeywords={and,equiv,exit,impl,not,or,stop}}%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[67]{Simula}%
-  {morekeywords={activate,after,array,at,before,begin,boolean,%
-      character,class,comment,delay,detach,do,else,end,external,false,%
-      for,go,goto,if,in,inner,inspect,integer,is,label,name,new,none,%
-      notext,otherwise,prior,procedure,qua,reactivate,real,ref,resume,%
-      simset,simulation,step,switch,text,then,this,to,true,until,value,%
-      virtual,when,while},%
-   sensitive=f,%
-   keywordcommentsemicolon={end}{else,end,otherwise,when}{comment},%
-   morestring=[d]",%
-   morestring=[d]'%
-  }[keywords,keywordcomments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{SQL}
-%
-% Data come from \lstthanks{Christian~Haul}
-% {haul@dvs1.informatik.tu-darmstadt.de}{1998/01/09}.
-% \lstthanks{Neil~Conway}{nconway@klamath.dyndns.org}{2002/07/06} added some
-% keywords, ditto \lsthelper{Torsten~Flatter}{Thorsten.Flatter@T-Systems.de}
-% {2002/10/15}{missing keywords}, \lsthelper{Robert~Frank}{rf7@ukc.ac.uk}
-% {2002/11/19}{missing keywords} and \lsthelper{Dirk~Jesko}
-% {jesko@iti.cs.uni-magdeburg.de}{2003/06/03}{extended SQL definition}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% SQL definition (c) 1998 Christian Haul
-%%                (c) 2002 Neil Conway
-%%                (c) 2002 Robert Frank
-%%                (c) 2003 Dirk Jesko
-%%
-\lst@definelanguage{SQL}%
-  {morekeywords={ABSOLUTE,ACTION,ADD,ALLOCATE,ALTER,ARE,AS,ASSERTION,%
-      AT,BETWEEN,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,%
-      CATALOG,CHAR_LENGTH,CHARACTER_LENGTH,CLUSTER,COALESCE,%
-      COLLATE,COLLATION,COLUMN,CONNECT,CONNECTION,CONSTRAINT,%
-      CONSTRAINTS,CONVERT,CORRESPONDING,CREATE,CROSS,CURRENT_DATE,%
-      CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,DAY,DEALLOCATE,%
-      DEC,DEFERRABLE,DEFERED,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,%
-      DISCONNECT,DOMAIN,DROP,ELSE,END,EXEC,EXCEPT,EXCEPTION,EXECUTE,%
-      EXTERNAL,EXTRACT,FALSE,FIRST,FOREIGN,FROM,FULL,GET,GLOBAL,%
-      GRAPHIC,HAVING,HOUR,IDENTITY,IMMEDIATE,INDEX,INITIALLY,INNER,%
-      INPUT,INSENSITIVE,INSERT,INTO,INTERSECT,INTERVAL,%
-      ISOLATION,JOIN,KEY,LAST,LEADING,LEFT,LEVEL,LIMIT,LOCAL,LOWER,%
-      MATCH,MINUTE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL,%
-      NULLIF,OCTET_LENGTH,ON,ONLY,ORDER,ORDERED,OUTER,OUTPUT,OVERLAPS,%
-      PAD,PARTIAL,POSITION,PREPARE,PRESERVE,PRIMARY,PRIOR,READ,%
-      RELATIVE,RESTRICT,REVOKE,RIGHT,ROWS,SCROLL,SECOND,SELECT,SESSION,%
-      SESSION_USER,SIZE,SPACE,SQLSTATE,SUBSTRING,SYSTEM_USER,%
-      TABLE,TEMPORARY,THEN,TIMEZONE_HOUR,%
-      TIMEZONE_MINUTE,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,%
-      TRUE,UNIQUE,UNKNOWN,UPPER,USAGE,USING,VALUE,VALUES,%
-      VARGRAPHIC,VARYING,WHEN,WHERE,WRITE,YEAR,ZONE,%
-      AND,ASC,avg,CHECK,COMMIT,count,DECODE,DESC,DISTINCT,GROUP,IN,% FF
-      LIKE,NUMBER,ROLLBACK,SUBSTR,sum,VARCHAR2,% FF
-      MIN,MAX,UNION,UPDATE,% RF
-      ALL,ANY,CUBE,CUBE,DEFAULT,DELETE,EXISTS,GRANT,OR,RECURSIVE,% DJ
-      ROLE,ROLLUP,SET,SOME,TRIGGER,VIEW},% DJ
-   morendkeywords={BIT,BLOB,CHAR,CHARACTER,CLOB,DATE,DECIMAL,FLOAT,% DJ
-      INT,INTEGER,NUMERIC,SMALLINT,TIME,TIMESTAMP,VARCHAR},% moved here
-   sensitive=false,% DJ
-   morecomment=[l]--,%
-   morecomment=[s]{/*}{*/},%
-   morestring=[d]',%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Tcl/Tk}
-%
-% Tcl/Tk is a very dynamic language. A statical analysis might not be
-% adequate. Nevertheless the following definitions produce the desired
-% result for my programs with a minimum of ``misses''.
-%
-% Data come from
-% \begin{itemize}
-% \item
-%		\textsc{Welch, Brent B.}:
-%		\textbf{Practical Programming in Tcl and Tk};
-%		{\copyright} 1997 Prentice Hall, Inc.;
-%		ISBN 0-13-616830-2.
-% \item
-%		\textsc{Ousterhout, John K.}:
-%		\textbf{Tcl and the Tk Toolkit};
-%		{\copyright} 1997 Addison-Wesley Publishing Company;
-%		ISBN 0-201-6337-X.
-% \end{itemize}
-% \lstthanks{Gerd~Neugebauer}{gerd.neugebauer@gmx.de}{2000/09/16} added support
-% for Tcl/Tk.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Tcl/Tk definition (c) Gerd Neugebauer
-%%
-\lst@definelanguage[tk]{tcl}[]{tcl}%
-  {morekeywords={activate,add,separator,radiobutton,checkbutton,%
-      command,cascade,all,bell,bind,bindtags,button,canvas,canvasx,%
-      canvasy,cascade,cget,checkbutton,config,configu,configur,%
-      configure,clipboard,create,arc,bitmap,image,line,oval,polygon,%
-      rectangle,text,textwindow,curselection,delete,destroy,end,entry,%
-      entrycget,event,focus,font,actual,families,measure,metrics,names,%
-      frame,get,grab,current,release,status,grid,columnconfigure,%
-      rowconfigure,image,image,create,bitmap,photo,delete,height,types,%
-      widt,names,index,insert,invoke,itemconfigure,label,listbox,lower,%
-      menu,menubutton,message,move,option,add,clear,get,readfile,pack,%
-      photo,place,radiobutton,raise,scale,scroll,scrollbar,search,see,%
-      selection,send,stdin,stdout,stderr,tag,bind,text,tk,tkerror,%
-      tkwait,window,variable,visibility,toplevel,unknown,update,winfo,%
-      class,exists,ismapped,parent,reqwidth,reqheight,rootx,rooty,%
-      width,height,wm,aspect,client,command,deiconify,focusmodel,frame,%
-      geometry,group,iconbitmap,iconify,iconmask,iconname,iconposition,%
-      iconwindow,maxsize,minsize,overrideredirect,positionfrom,%
-      protocol,sizefrom,state,title,transient,withdraw,xview,yview,%
-      yposition,%
-      -accelerator,-activebackground,-activeborderwidth,%
-      -activeforeground,-after,-anchor,-arrow,-arrowshape,-aspect,%
-      -async,-background,-before,-bg,-bigincrement,-bitmap,-bordermode,%
-      -borderwidth,-button,-capstyle,-channel,-class,-closeenough,%
-      -colormap,-column,-columnspan,-command,-confine,-container,%
-      -count,-cursor,-data,-default,-detail,-digits,-direction,%
-      -displayof,-disableforeground,-elementborderwidth,-expand,%
-      -exportselection,-extend,-family,-fg,-file,-fill,-focus,-font,%
-      -fontmap,-foreground,-format,-from,-gamma,-global,-height,%
-      -highlightbackground,-highlightcolor,-highlightthickness,-icon,%
-      -image,-in,-insertbackground,-insertborderwidth,-insertofftime,%
-      -insertontime,-imsertwidth,-ipadx,-ipady,-joinstyle,-jump,%
-      -justify,-keycode,-keysym,-label,-lastfor,-length,-maskdata,%
-      -maskfile,-menu,-message,-mode,-offvalue,-onvalue,-orient,%
-      -outlien,-outlinestipple,-overstrike,-override,-padx,-pady,%
-      -pageanchor,-pageheight,-pagewidth,-pagey,-pagey,-palette,%
-      -parent,-place,-postcommand,-relheight,-relief,-relwidth,-relx,%
-      -rely,-repeatdelay,-repeatinterval,-resolution,-root,-rootx,%
-      -rooty,-rotate,-row,-rowspan,-screen,-selectcolor,-selectimage,%
-      -sendevent,-serial,-setgrid,-showvalue,-shrink,-side,-size,%
-      -slant,-sliderlength,-sliderrelief,-smooth,-splinesteps,-state,%
-      -sticky,-stipple,-style,-subsample,-subwindow,-tags,-takefocus,%
-      -tearoff,-tearoffcommand,-text,-textvariable,-tickinterval,-time,%
-      -title,-to,-troughcolor,-type,-underline,-use,-value,-variable,%
-      -visual,-width,-wrap,-wraplength,-x,-xscrollcommand,-y,%
-      -bgstipple,-fgstipple,-lmargin1,-lmargin2,-rmargin,-spacing1,%
-      -spacing2,-spacing3,-tabs,-yscrollcommand,-zoom,%
-      activate,add,addtag,bbox,cget,clone,configure,coords,%
-      curselection,debug,delete,delta,deselect,dlineinfo,dtag,dump,%
-      entrycget,entryconfigure,find,flash,fraction,get,gettags,handle,%
-      icursor,identify,index,insert,invoke,itemcget,itemconfigure,mark,%
-      moveto,own,post,postcascade,postscript,put,redither,ranges,%
-      scale,select,show,tag,type,unpost,xscrollcommand,xview,%
-      yscrollcommand,yview,yposition}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[]{tcl}%
-  {alsoletter={.:,*=&-},%
-   morekeywords={after,append,array,names,exists,anymore,donesearch,%
-      get,nextelement,set,size,startsearch,auto_mkindex,binary,break,%
-      case,catch,cd,clock,close,concat,console,continue,default,else,%
-      elseif,eof,error,eval,exec,-keepnewline,exit,expr,fblocked,%
-      fconfigure,fcopy,file,atime,dirname,executable,exists,extension,%
-      isdirectory,isfile,join,lstat,mtime,owned,readable,readlink,%
-      rootname,size,stat,tail,type,writable,-permissions,-group,-owner,%
-      -archive,-hidden,-readonly,-system,-creator,-type,-force,%
-      fileevent,flush,for,foreach,format,gets,glob,global,history,if,%
-      incr,info,argsbody,cmdcount,commands,complete,default,exists,%
-      globals,level,library,locals,patchlevel,procs,script,tclversion,%
-      vars,interp,join,lappend,lindex,linsert,list,llength,lrange,%
-      lreplace,lsearch,-exact,-regexp,-glob,lsort,-ascii,-integer,%
-      -real,-dictionary,-increasing,-decreasing,-index,-command,load,%
-      namespace,open,package,forget,ifneeded,provide,require,unknown,%
-      vcompare,versions,vsatisfies,pid,proc,puts,-nonewline,pwd,read,%
-      regexp,-indices,regsub,-all,-nocaserename,return,scan,seek,set,%
-      socket,source,split,string,compare,first,index,last,length,match,%
-      range,tolower,toupper,trim,trimleft,trimright,subst,switch,tell,%
-      time,trace,variable,vdelete,vinfo,unknown,unset,uplevel,upvar,%
-      vwait,while,acos,asin,atan,atan2,ceil,cos,cosh,exp,floor,fmod,%
-      hypot,log,log10,pow,sin,sinh,sqrt,tan,tanh,abs,double,int,round%
-      },%
-   morestring=[d]",%
-   MoreSelectCharTable=%
-      \lst@CArgX\#\relax\lst@DefDelimB{}{}%
-          {\ifx\lst@lastother\lstum@backslash
-               \expandafter\@gobblethree
-           \fi}%
-          \lst@BeginComment\lst@commentmode
-          {{\lst@commentstyle}\lst@Lmodetrue}%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-% And after receiving a bug report from \lsthelper{Vitaly A. Repin}
-% {vitaly@radio.hop.stu.neva.ru}{2002/04/08}{undefined control sequence
-% \lst@CommentB} I converted the version 0.21 contents of |MoreSelectCharTable|
-% to version 1.0.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Statistical languages}
-%
-% These languages have been added by \lstthanks{Winfried~Theis}
-% {theis@statistik.uni-dortmund.de}{2000/09/05}. \lstthanks{Robert~Denham}
-% {Robert.Denham@dnr.qld.gov.au}{2001/05/03} contributed the additional
-% string delimiter |'|.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{S}[]{R}{}
-\lst@definelanguage[PLUS]{S}[]{R}{}
-\lst@definelanguage{R}%
-  {keywords={abbreviate,abline,abs,acos,acosh,action,add1,add,%
-      aggregate,alias,Alias,alist,all,anova,any,aov,aperm,append,apply,%
-      approx,approxfun,apropos,Arg,args,array,arrows,as,asin,asinh,%
-      atan,atan2,atanh,attach,attr,attributes,autoload,autoloader,ave,%
-      axis,backsolve,barplot,basename,besselI,besselJ,besselK,besselY,%
-      beta,binomial,body,box,boxplot,break,browser,bug,builtins,bxp,by,%
-      c,C,call,Call,case,cat,category,cbind,ceiling,character,char,%
-      charmatch,check,chol,chol2inv,choose,chull,class,close,cm,codes,%
-      coef,coefficients,co,col,colnames,colors,colours,commandArgs,%
-      comment,complete,complex,conflicts,Conj,contents,contour,%
-      contrasts,contr,control,helmert,contrib,convolve,cooks,coords,%
-      distance,coplot,cor,cos,cosh,count,fields,cov,covratio,wt,CRAN,%
-      create,crossprod,cummax,cummin,cumprod,cumsum,curve,cut,cycle,D,%
-      data,dataentry,date,dbeta,dbinom,dcauchy,dchisq,de,debug,%
-      debugger,Defunct,default,delay,delete,deltat,demo,de,density,%
-      deparse,dependencies,Deprecated,deriv,description,detach,%
-      dev2bitmap,dev,cur,deviance,off,prev,,dexp,df,dfbetas,dffits,%
-      dgamma,dgeom,dget,dhyper,diag,diff,digamma,dim,dimnames,dir,%
-      dirname,dlnorm,dlogis,dnbinom,dnchisq,dnorm,do,dotplot,double,%
-      download,dpois,dput,drop,drop1,dsignrank,dt,dummy,dump,dunif,%
-      duplicated,dweibull,dwilcox,dyn,edit,eff,effects,eigen,else,%
-      emacs,end,environment,env,erase,eval,equal,evalq,example,exists,%
-      exit,exp,expand,expression,External,extract,extractAIC,factor,%
-      fail,family,fft,file,filled,find,fitted,fivenum,fix,floor,for,%
-      For,formals,format,formatC,formula,Fortran,forwardsolve,frame,%
-      frequency,ftable,ftable2table,function,gamma,Gamma,gammaCody,%
-      gaussian,gc,gcinfo,gctorture,get,getenv,geterrmessage,getOption,%
-      getwd,gl,glm,globalenv,gnome,GNOME,graphics,gray,grep,grey,grid,%
-      gsub,hasTsp,hat,heat,help,hist,home,hsv,httpclient,I,identify,if,%
-      ifelse,Im,image,\%in\%,index,influence,measures,inherits,install,%
-      installed,integer,interaction,interactive,Internal,intersect,%
-      inverse,invisible,IQR,is,jitter,kappa,kronecker,labels,lapply,%
-      layout,lbeta,lchoose,lcm,legend,length,levels,lgamma,library,%
-      licence,license,lines,list,lm,load,local,locator,log,log10,log1p,%
-      log2,logical,loglin,lower,lowess,ls,lsfit,lsf,ls,machine,Machine,%
-      mad,mahalanobis,make,link,margin,match,Math,matlines,mat,matplot,%
-      matpoints,matrix,max,mean,median,memory,menu,merge,methods,min,%
-      missing,Mod,mode,model,response,mosaicplot,mtext,mvfft,na,nan,%
-      names,omit,nargs,nchar,ncol,NCOL,new,next,NextMethod,nextn,%
-      nlevels,nlm,noquote,NotYetImplemented,NotYetUsed,nrow,NROW,null,%
-      numeric,\%o\%,objects,offset,old,on,Ops,optim,optimise,optimize,%
-      options,or,order,ordered,outer,package,packages,page,pairlist,%
-      pairs,palette,panel,par,parent,parse,paste,path,pbeta,pbinom,%
-      pcauchy,pchisq,pentagamma,persp,pexp,pf,pgamma,pgeom,phyper,pico,%
-      pictex,piechart,Platform,plnorm,plogis,plot,pmatch,pmax,pmin,%
-      pnbinom,pnchisq,pnorm,points,poisson,poly,polygon,polyroot,pos,%
-      postscript,power,ppoints,ppois,predict,preplot,pretty,Primitive,%
-      print,prmatrix,proc,prod,profile,proj,prompt,prop,provide,%
-      psignrank,ps,pt,ptukey,punif,pweibull,pwilcox,q,qbeta,qbinom,%
-      qcauchy,qchisq,qexp,qf,qgamma,qgeom,qhyper,qlnorm,qlogis,qnbinom,%
-      qnchisq,qnorm,qpois,qqline,qqnorm,qqplot,qr,Q,qty,qy,qsignrank,%
-      qt,qtukey,quantile,quasi,quit,qunif,quote,qweibull,qwilcox,%
-      rainbow,range,rank,rbeta,rbind,rbinom,rcauchy,rchisq,Re,read,csv,%
-      csv2,fwf,readline,socket,real,Recall,rect,reformulate,regexpr,%
-      relevel,remove,rep,repeat,replace,replications,report,require,%
-      resid,residuals,restart,return,rev,rexp,rf,rgamma,rgb,rgeom,R,%
-      rhyper,rle,rlnorm,rlogis,rm,rnbinom,RNGkind,rnorm,round,row,%
-      rownames,rowsum,rpois,rsignrank,rstandard,rstudent,rt,rug,runif,%
-      rweibull,rwilcox,sample,sapply,save,scale,scan,scan,screen,sd,se,%
-      search,searchpaths,segments,seq,sequence,setdiff,setequal,set,%
-      setwd,show,sign,signif,sin,single,sinh,sink,solve,sort,source,%
-      spline,splinefun,split,sqrt,stars,start,stat,stem,step,stop,%
-      storage,strstrheight,stripplot,strsplit,structure,strwidth,sub,%
-      subset,substitute,substr,substring,sum,summary,sunflowerplot,svd,%
-      sweep,switch,symbol,symbols,symnum,sys,status,system,t,table,%
-      tabulate,tan,tanh,tapply,tempfile,terms,terrain,tetragamma,text,%
-      time,title,topo,trace,traceback,transform,tri,trigamma,trunc,try,%
-      ts,tsp,typeof,unclass,undebug,undoc,union,unique,uniroot,unix,%
-      unlink,unlist,unname,untrace,update,upper,url,UseMethod,var,%
-      variable,vector,Version,vi,warning,warnings,weighted,weights,%
-      which,while,window,write,\%x\%,x11,X11,xedit,xemacs,xinch,xor,%
-      xpdrows,xy,xyinch,yinch,zapsmall,zip},%
-   otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},%
-   alsoother={._$},%
-   sensitive,%
-   morecomment=[l]\#,%
-   morestring=[d]",%
-   morestring=[d]'% 2001 Robert Denham
-  }%
-%    \end{macrocode}
-% \lsthelper{Benjamin Janson}{benjamin.janson@gmx.de}{2002/07/09}
-% {prockeywords undefined} got a \texttt{prockeywords undefined} error,
-% which was removed by \lsthelper{Heiko Oberdiek}{oberdiek@uni-freiburg.de}
-% {2002/07/10}{prockeywords -> procnamekeys}.
-%    \begin{macrocode}
-\lst@definelanguage{SAS}%
-  {procnamekeys={proc},%
-   morekeywords={DATA,AND,OR,NOT,EQ,GT,LT,GE,LE,NE,INFILE,INPUT,DO,BY,%
-      TO,SIN,COS,OUTPUT,END,PLOT,RUN,LIBNAME,VAR,TITLE,FIRSTOBS,OBS,%
-      DELIMITER,DLM,EOF,ABS,DIM,HBOUND,LBOUND,MAX,MIN,MOD,SIGN,SQRT,%
-      CEIL,FLOOR,FUZZ,INT,ROUND,TRUNC,DIGAMMA,ERF,ERFC,EXP,GAMMA,%
-      LGAMMA,LOG,LOG2,LOG10,ARCOS,ARSIN,ATAN,COSH,SINH,TANH,TAN,%
-      POISSON,PROBBETA,PROBBNML,PROBCHI,PROBF,PROBGAM,PROBHYPR,%
-      PROBNEGB,PROBNORM,PROBT,BETAINV,CINV,FINV,GAMINV,PROBIT,TINV,CSS,%
-      CV,KURTOSIS,MEAN,NMISS,RANGE,SKEWNESS,STD,STDERR,SUM,USS,NORMAL,%
-      RANBIN,RANCAU,RANEXP,RANGAM,RANNOR,RANPOI,RANTBL,RANTRI,RANUNI,%
-      UNIFORM,IF,THEN,ELSE,WHILE,UNTIL,DROP,KEEP,LABEL,DEFAULT,ARRAY,%
-      MERGE,CARDS,CARDS4,PUT,SET,UPDATE,ABORT,DELETE,DISPLAY,LIST,%
-      LOSTCARD,MISSING,STOP,WHERE,ARRAY,DROP,KEEP,WINDOW,LENGTH,RENAME,%
-      RETAIN,MEANS,UNIVARIATE,SUMMARY,TABULATE,CORR,FREQ,FOOTNOTE,NOTE,%
-      SHOW},%
-   otherkeywords={!,!=,~,$,*,\&,_,/,<,>=,=<,>},%
-   morestring=[d]'%
-   }[keywords,comments,strings,procnames]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{\TeX}
-%
-% I extracted the data from |plain.tex|, |latex.ltx|, and |size10.clo|.
-% \lsthelper{Dr.~Peter~Leibner}{leibner@sta.siemens.de}{1999/11/08}{missing
-% keywords in definition of \LaTeX} reported that some keywords are missing
-% and also added a couple.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}%
-  {moretexcs={AtBeginDocument,AtBeginDvi,AtEndDocument,AtEndOfClass,%
-      AtEndOfPackage,ClassError,ClassInfo,ClassWarning,%
-      ClassWarningNoLine,CurrentOption,DeclareErrorFont,%
-      DeclareFixedFont,DeclareFontEncoding,DeclareFontEncodingDefaults,%
-      DeclareFontFamily,DeclareFontShape,DeclareFontSubstitution,%
-      DeclareMathAccent,DeclareMathAlphabet,DeclareMathAlphabet,%
-      DeclareMathDelimiter,DeclareMathRadical,DeclareMathSizes,%
-      DeclareMathSymbol,DeclareMathVersion,DeclareOldFontCommand,%
-      DeclareOption,DeclarePreloadSizes,DeclareRobustCommand,%
-      DeclareSizeFunction,DeclareSymbolFont,DeclareSymbolFontAlphabet,%
-      DeclareTextAccent,DeclareTextAccentDefault,DeclareTextCommand,%
-      DeclareTextCommandDefault,DeclareTextComposite,%
-      DeclareTextCompositeCommand,DeclareTextFontCommand,%
-      DeclareTextSymbol,DeclareTextSymbolDefault,ExecuteOptions,%
-      GenericError,GenericInfo,GenericWarning,IfFileExists,%
-      InputIfFileExists,LoadClass,LoadClassWithOptions,MessageBreak,%
-      OptionNotUsed,PackageError,PackageInfo,PackageWarning,%
-      PackageWarningNoLine,PassOptionsToClass,PassOptionsToPackage,%
-      ProcessOptionsProvidesClass,ProvidesFile,ProvidesFile,%
-      ProvidesPackage,ProvideTextCommand,RequirePackage,%
-      RequirePackageWithOptions,SetMathAlphabet,SetSymbolFont,%
-      TextSymbolUnavailable,UseTextAccent,UseTextSymbol},%
-   morekeywords={array,center,displaymath,document,enumerate,eqnarray,%
-      equation,flushleft,flushright,itemize,list,lrbox,math,minipage,%
-      picture,sloppypar,tabbing,tabular,trivlist,verbatim}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[LaTeX]{TeX}[common]{TeX}%
-  {moretexcs={a,AA,aa,addcontentsline,addpenalty,addtocontents,%
-      addtocounter,addtolength,addtoversion,addvspace,alph,Alph,and,%
-      arabic,array,arraycolsep,arrayrulewidth,arraystretch,author,%
-      baselinestretch,begin,bezier,bfseries,bibcite,bibdata,bibitem,%
-      bibliography,bibliographystyle,bibstyle,bigskip,boldmath,%
-      botfigrule,bottomfraction,Box,caption,center,CheckCommand,circle,%
-      citation,cite,cleardoublepage,clearpage,cline,columnsep,%
-      columnseprule,columnwidth,contentsline,dashbox,date,dblfigrule,%
-      dblfloatpagefraction,dblfloatsep,dbltextfloatsep,dbltopfraction,%
-      defaultscriptratio,defaultscriptscriptratio,depth,Diamond,%
-      displaymath,document,documentclass,documentstyle,doublerulesep,%
-      em,emph,endarray,endcenter,enddisplaymath,enddocument,%
-      endenumerate,endeqnarray,endequation,endflushleft,endflushright,%
-      enditemize,endlist,endlrbox,endmath,endminipage,endpicture,%
-      endsloppypar,endtabbing,endtabular,endtrivlist,endverbatim,%
-      enlargethispage,ensuremath,enumerate,eqnarray,equation,%
-      evensidemargin,extracolsep,fbox,fboxrule,fboxsep,filecontents,%
-      fill,floatpagefraction,floatsep,flushbottom,flushleft,flushright,%
-      fnsymbol,fontencoding,fontfamily,fontseries,fontshape,fontsize,%
-      fontsubfuzz,footnotemark,footnotesep,footnotetext,footskip,frac,%
-      frame,framebox,fussy,glossary,headheight,headsep,height,hline,%
-      hspace,I,include,includeonly,index,inputlineno,intextsep,%
-      itemindent,itemize,itemsep,iterate,itshape,Join,kill,label,%
-      labelsep,labelwidth,LaTeX,LaTeXe,leadsto,lefteqn,leftmargin,%
-      leftmargini,leftmarginii,leftmarginiii,leftmarginiv,leftmarginv,%
-      leftmarginvi,leftmark,lhd,lim,linebreak,linespread,linethickness,%
-      linewidth,list,listfiles,listfiles,listparindent,lrbox,%
-      makeatletter,makeatother,makebox,makeglossary,makeindex,%
-      makelabel,MakeLowercase,MakeUppercase,marginpar,marginparpush,%
-      marginparsep,marginparwidth,markboth,markright,math,mathbf,%
-      mathellipsis,mathgroup,mathit,mathrm,mathsf,mathsterling,mathtt,%
-      mathunderscore,mathversion,mbox,mdseries,mho,minipage,%
-      multicolumn,multiput,NeedsTeXFormat,newcommand,newcounter,%
-      newenvironment,newfont,newhelp,newlabel,newlength,newline,%
-      newmathalphabet,newpage,newsavebox,newtheorem,nobreakspace,%
-      nobreakspace,nocite,nocorr,nocorrlist,nofiles,nolinebreak,%
-      nonumber,nopagebreak,normalcolor,normalfont,normalmarginpar,%
-      numberline,obeycr,oddsidemargin,oldstylenums,onecolumn,oval,%
-      pagebreak,pagenumbering,pageref,pagestyle,paperheight,paperwidth,%
-      paragraphmark,parbox,parsep,partopsep,picture,poptabs,pounds,%
-      protect,pushtabs,put,qbezier,qbeziermax,r,raggedleft,raisebox,%
-      ref,refstepcounter,renewcommand,renewenvironment,restorecr,%
-      reversemarginpar,rhd,rightmargin,rightmark,rmfamily,roman,Roman,%
-      rootbox,rule,samepage,sbox,scshape,secdef,section,sectionmark,%
-      selectfont,setcounter,settodepth,settoheight,settowidth,sffamily,%
-      shortstack,showoutput,showoverfull,sloppy,sloppypar,slshape,%
-      smallskip,sqsubset,sqsupset,SS,stackrel,stepcounter,stop,stretch,%
-      subparagraphmark,subsectionmark,subsubsectionmark,sum,%
-      suppressfloats,symbol,tabbing,tabbingsep,tabcolsep,tabular,%
-      tabularnewline,textasciicircum,textasciitilde,textbackslash,%
-      textbar,textbf,textbraceleft,textbraceright,textbullet,%
-      textcircled,textcompwordmark,textdagger,textdaggerdbl,textdollar,%
-      textellipsis,textemdash,textendash,textexclamdown,textfloatsep,%
-      textfraction,textgreater,textheight,textit,textless,textmd,%
-      textnormal,textparagraph,textperiodcentered,textquestiondown,%
-      textquotedblleft,textquotedblright,textquoteleft,textquoteright,%
-      textregistered,textrm,textsc,textsection,textsf,textsl,%
-      textsterling,textsuperscript,texttrademark,texttt,textunderscore,%
-      textup,textvisiblespace,textwidth,thanks,thefootnote,thempfn,%
-      thempfn,thempfootnote,thepage,thepage,thicklines,thinlines,%
-      thispagestyle,title,today,topfigrule,topfraction,topmargin,%
-      topsep,totalheight,tracingfonts,trivlist,ttfamily,twocolumn,%
-      typein,typeout,unboldmath,unitlength,unlhd,unrhd,upshape,usebox,%
-      usecounter,usefont,usepackage,value,vector,verb,verbatim,vline,%
-      vspace,width,%
-      normalsize,small,footnotesize,scriptsize,tiny,large,Large,LARGE,%
-      huge,Huge}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[plain]{TeX}[common]{TeX}%
-  {moretexcs={advancepageno,beginsection,bf,bffam,bye,cal,cleartabs,%
-      columns,dosupereject,endinsert,eqalign,eqalignno,fiverm,fivebf,%
-      fivei,fivesy,folio,footline,hang,headline,it,itemitem,itfam,%
-      leqalignno,magnification,makefootline,makeheadline,midinsert,mit,%
-      mscount,nopagenumbers,normalbottom,of,oldstyle,pagebody,%
-      pagecontents,pageinsert,pageno,plainoutput,preloaded,proclaim,rm,%
-      settabs,sevenbf,seveni,sevensy,sevenrm,sl,slfam,supereject,%
-      tabalign,tabs,tabsdone,tabsyet,tenbf,tenex,teni,tenit,tenrm,%
-      tensl,tensy,tentt,textindent,topglue,topins,topinsert,tt,ttfam,%
-      ttraggedright,vfootnote}%
-  }%
-%    \end{macrocode}
-% The following language is only a helper.
-%    \begin{macrocode}
-\lst@definelanguage[common]{TeX}[primitive]{TeX}
-  {moretexcs={active,acute,ae,AE,aleph,allocationnumber,allowbreak,%
-      alpha,amalg,angle,approx,arccos,arcsin,arctan,arg,arrowvert,%
-      Arrowvert,ast,asymp,b,backslash,bar,beta,bgroup,big,Big,bigbreak,%
-      bigcap,bigcirc,bigcup,bigg,Bigg,biggl,Biggl,biggm,Biggm,biggr,%
-      Biggr,bigl,Bigl,bigm,Bigm,bigodot,bigoplus,bigotimes,bigr,Bigr,%
-      bigskip,bigskipamount,bigsqcup,bigtriangledown,bigtriangleup,%
-      biguplus,bigvee,bigwedge,bmod,bordermatrix,bot,bowtie,brace,%
-      braceld,bracelu,bracerd,braceru,bracevert,brack,break,breve,%
-      buildrel,bullet,c,cap,cases,cdot,cdotp,cdots,centering,%
-      centerline,check,chi,choose,circ,clubsuit,colon,cong,coprod,%
-      copyright,cos,cosh,cot,coth,csc,cup,d,dag,dagger,dashv,ddag,%
-      ddagger,ddot,ddots,deg,delta,Delta,det,diamond,diamondsuit,dim,%
-      displaylines,div,do,dospecials,dot,doteq,dotfill,dots,downarrow,%
-      Downarrow,downbracefill,egroup,eject,ell,empty,emptyset,endgraf,%
-      endline,enskip,enspace,epsilon,equiv,eta,exists,exp,filbreak,%
-      flat,fmtname,fmtversion,footins,footnote,footnoterule,forall,%
-      frenchspacing,frown,gamma,Gamma,gcd,ge,geq,gets,gg,goodbreak,%
-      grave,H,hat,hbar,heartsuit,hglue,hideskip,hidewidth,hom,%
-      hookleftarrow,hookrightarrow,hphantom,hrulefill,i,ialign,iff,Im,%
-      imath,in,inf,infty,int,interdisplaylinepenalty,%
-      interfootnotelinepenalty,intop,iota,item,j,jmath,joinrel,jot,%
-      kappa,ker,l,L,lambda,Lambda,land,langle,lbrace,lbrack,lceil,%
-      ldotp,ldots,le,leavevmode,leftarrow,Leftarrow,leftarrowfill,%
-      leftharpoondown,leftharpoonup,leftline,leftrightarrow,%
-      Leftrightarrow,leq,lfloor,lg,lgroup,lhook,lim,liminf,limsup,line,%
-      ll,llap,lmoustache,ln,lnot,log,longleftarrow,Longleftarrow,%
-      longleftrightarrow,Longleftrightarrow,longmapsto,longrightarrow,%
-      Longrightarrow,loop,lor,lq,magstep,magstep,magstephalf,mapsto,%
-      mapstochar,mathhexbox,mathpalette,mathstrut,matrix,max,maxdimen,%
-      medbreak,medskip,medskipamount,mid,min,models,mp,mu,multispan,%
-      nabla,narrower,natural,ne,nearrow,neg,negthinspace,neq,newbox,%
-      newcount,newdimen,newfam,newif,newinsert,newlanguage,newmuskip,%
-      newread,newskip,newtoks,newwrite,next,ni,nobreak,nointerlineskip,%
-      nonfrenchspacing,normalbaselines,normalbaselineskip,%
-      normallineskip,normallineskiplimit,not,notin,nu,null,nwarrow,o,O,%
-      oalign,obeylines,obeyspaces,odot,oe,OE,offinterlineskip,oint,%
-      ointop,omega,Omega,ominus,ooalign,openup,oplus,oslash,otimes,%
-      overbrace,overleftarrow,overrightarrow,owns,P,parallel,partial,%
-      perp,phantom,phi,Phi,pi,Pi,pm,pmatrix,pmod,Pr,prec,preceq,prime,%
-      prod,propto,psi,Psi,qquad,quad,raggedbottom,raggedright,rangle,%
-      rbrace,rbrack,rceil,Re,relbar,Relbar,removelastskip,repeat,%
-      rfloor,rgroup,rho,rhook,rightarrow,Rightarrow,rightarrowfill,%
-      rightharpoondown,rightharpoonup,rightleftharpoons,rightline,rlap,%
-      rmoustache,root,rq,S,sb,searrow,sec,setminus,sharp,showhyphens,%
-      sigma,Sigma,sim,simeq,sin,sinh,skew,slash,smallbreak,smallint,%
-      smallskip,smallskipamount,smash,smile,sp,space,spadesuit,sqcap,%
-      sqcup,sqrt,sqsubseteq,sqsupseteq,ss,star,strut,strutbox,subset,%
-      subseteq,succ,succeq,sum,sup,supset,supseteq,surd,swarrow,t,tan,%
-      tanh,tau,TeX,theta,Theta,thinspace,tilde,times,to,top,tracingall,%
-      triangle,triangleleft,triangleright,u,underbar,underbrace,%
-      uparrow,Uparrow,upbracefill,updownarrow,Updownarrow,uplus,%
-      upsilon,Upsilon,v,varepsilon,varphi,varpi,varrho,varsigma,%
-      vartheta,vdash,vdots,vec,vee,vert,Vert,vglue,vphantom,wedge,%
-      widehat,widetilde,wlog,wp,wr,xi,Xi,zeta}%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage[primitive]{TeX}%
-  {moretexcs={above,abovedisplayshortskip,abovedisplayskip,aftergroup,%
-      abovewithdelims,accent,adjdemerits,advance,afterassignment,atop,%
-      atopwithdelims,badness,baselineskip,batchmode,begingroup,%
-      belowdisplayshortskip,belowdisplayskip,binoppenalty,botmark,box,%
-      boxmaxdepth,brokenpenalty,catcode,char,chardef,cleaders,closein,%
-      closeout,clubpenalty,copy,count,countdef,cr,crcr,csname,day,%
-      deadcycles,def,defaulthyphenchar,defaultskewchar,delcode,%
-      delimiter,delimiterfactor,delimitershortfall,dimen,dimendef,%
-      discretionary,displayindent,displaylimits,displaystyle,%
-      displaywidowpenalty,displaywidth,divide,doublehyphendemerits,dp,%
-      edef,else,emergencystretch,end,endcsname,endgroup,endinput,%
-      endlinechar,eqno,errhelp,errmessage,errorcontextlines,%
-      errorstopmode,escapechar,everycr,everydisplay,everyhbox,everyjob,%
-      everymath,everypar,everyvbox,exhyphenpenalty,expandafter,fam,fi,%
-      finalhypendemerits,firstmark,floatingpenalty,font,fontdimen,%
-      fontname,futurelet,gdef,global,globaldefs,halign,hangafter,%
-      hangindent,hbadness,hbox,hfil,hfill,hfilneg,hfuzz,hoffset,%
-      holdinginserts,hrule,hsize,hskip,hss,ht,hyphenation,hyphenchar,%
-      hyphenpenalty,if,ifcase,ifcat,ifdim,ifeof,iffalse,ifhbox,ifhmode,%
-      ifinner,ifmmode,ifnum,ifodd,iftrue,ifvbox,ifvmode,ifvoid,ifx,%
-      ignorespaces,immediate,indent,input,insert,insertpenalties,%
-      interlinepenalty,jobname,kern,language,lastbox,lastkern,%
-      lastpenalty,lastskip,lccode,leaders,left,lefthyphenmin,leftskip,%
-      leqno,let,limits,linepenalty,lineskip,lineskiplimits,long,%
-      looseness,lower,lowercase,mag,mark,mathaccent,mathbin,mathchar,%
-      mathchardef,mathchoice,mathclose,mathcode,mathinner,mathop,%
-      mathopen,mathord,mathpunct,mathrel,mathsurround,maxdeadcycles,%
-      maxdepth,meaning,medmuskip,message,mkern,month,moveleft,%
-      moveright,mskip,multiply,muskip,muskipdef,newlinechar,noalign,%
-      noboundary,noexpand,noindent,nolimits,nonscript,nonstopmode,%
-      nulldelimiterspace,nullfont,number,omit,openin,openout,or,outer,%
-      output,outputpenalty,over,overfullrule,overline,overwithdelims,%
-      pagedepth,pagefilllstretch,pagefillstretch,pagefilstretch,%
-      pagegoal,pageshrink,pagestretch,pagetotal,par,parfillskip,%
-      parindent,parshape,parskip,patterns,pausing,penalty,%
-      postdisplaypenalty,predisplaypenalty,predisplaysize,pretolerance,%
-      prevdepth,prevgraf,radical,raise,read,relax,relpenalty,right,%
-      righthyphenmin,rightskip,romannumeral,scriptfont,%
-      scriptscriptfont,scriptscriptstyle,scriptspace,scriptstyle,%
-      scrollmode,setbox,setlanguage,sfcode,shipout,show,showbox,%
-      showboxbreadth,showboxdepth,showlists,showthe,skewchar,skip,%
-      skipdef,spacefactor,spaceskip,span,special,splitbotmark,%
-      splitfirstmark,splitmaxdepth,splittopskip,string,tabskip,%
-      textfont,textstyle,the,thickmuskip,thinmuskip,time,toks,toksdef,%
-      tolerance,topmark,topskip,tracingcommands,tracinglostchars,%
-      tracingmacros,tracingonline,tracingoutput,tracingpages,%
-      tracingparagraphs,tracingrestores,tracingstats,uccode,uchyph,%
-      underline,unhbox,unhcopy,unkern,unpenalty,unskip,unvbox,unvcopy,%
-      uppercase,vadjust,valign,vbadness,vbox,vcenter,vfil,vfill,%
-      vfilneg,vfuzz,voffset,vrule,vsize,vskip,vsplit,vss,vtop,wd,%
-      widowpenalty,write,xdef,xleaders,xspaceskip,year},%
-   sensitive,%
-   alsoother={0123456789$_},%
-   morecomment=[l]\%%
-  }[keywords,tex,comments]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{VBScript}
-%
-% \lstthanks{Sonja~Weidmann}{Sonja.Weidmann@sap.com}{2000/01/10}{VBScript}
-% sent me this language definition.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% VBScript definition (c) 2000 Sonja Weidmann
-%%
-\lst@definelanguage{VBScript}%
-  {morekeywords={Call,Case,Const,Dim,Do,Each,Else,End,Erase,Error,Exit,%
-      Explicit,For,Function,If,Loop,Next,On,Option,Private,Public,%
-      Randomize,ReDim,Rem,Select,Set,Sub,Then,Wend,While,Abs,Array,Asc,%
-      Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,%
-      CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,%
-      Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,%
-      FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,%
-      IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,%
-      LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,%
-      MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,%
-      ScriptEngineBuildVersion,ScriptEngineMajorVersion,%
-      ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,%
-      StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,%
-      UBound,UCase,VarType,Weekday,WeekdayName,Year, And,Eqv,Imp,Is,%
-      Mod,Not,Or,Xor,Add,BuildPath,Clear,Close,Copy,CopyFile,%
-      CopyFolder,CreateFolder,CreateTextFile,Delete,DeleteFile,%
-      DeleteFolder,Dictionary,Drive,DriveExists,Drives,Err,Exists,File,%
-      FileExists,FileSystemObject,Files,Folder,FolderExists,Folders,%
-      GetAbsolutePathName,GetBaseName,GetDrive,GetDriveName,%
-      GetExtensionName,GetFile,GetFileName,GetFolder,%
-      GetParentFolderName,GetSpecialFolder,GetTempName,Items,Keys,Move,%
-      MoveFile,MoveFolder,OpenAsTextStream,OpenTextFile,Raise,Read,%
-      ReadAll,ReadLine,Remove,RemoveAll,Skip,SkipLine,TextStream,Write,%
-      WriteBlankLines,WriteLine,Alias,Archive,CDROM,Compressed,%
-      Directory,Fixed,ForAppending,ForReading,ForWriting,Hidden,Normal,%
-      RAMDisk,ReadOnly,Remote,Removable,System,SystemFolder,%
-      TemporaryFolder,TristateFalse,TristateTrue,TristateUseDefault,%
-      Unknown,Volume,WindowsFolder,vbAbortRetryIgnore,%
-      vbApplicationModal,vbArray,vbBinaryCompare,vbBlack,vbBlue,%
-      vbBoolean,vbByte,vbCr,vbCrLf,vbCritical,vbCurrency,vbCyan,%
-      vbDataObject,vbDate,vbDecimal,vbDefaultButton1,vbDefaultButton2,%
-      vbDefaultButton3,vbDefaultButton4,vbDouble,vbEmpty,vbError,%
-      vbExclamation,vbFirstFourDays,vbFirstFullWeek,vbFirstJan1,%
-      vbFormFeed,vbFriday,vbGeneralDate,vbGreen,vbInformation,%
-      vbInteger,vbLf,vbLong,vbLongDate,vbLongTime,vbMagenta,vbMonday,%
-      vbNewLine,vbNull,vbNullChar,vbNullString,vbOKC,ancel,vbOKOnly,%
-      vbObject,vbObjectError,vbQuestion,vbRed,vbRetryCancel,vbSaturday,%
-      vbShortDate,vbShortTime,vbSingle,vbString,vbSunday,vbSystemModal,%
-      vbTab,vbTextCompare,vbThursday,vbTuesday,vbUseSystem,%
-      vbUseSystemDayOfWeek,vbVariant,vbVerticalTab,vbWednesday,vbWhite,%
-      vbYellow,vbYesNo,vbYesNoCancel},%
-   sensitive=f,%
-   morecomment=[l]',%
-   morestring=[d]"%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{Verilog}
-%
-% Thanks to \lstthanks{Cameron H. G. Wright}{c.h.g.wright@ieee.org}{2003/04/30}
-% for providing the definition. After a bug report by \lsthelper{George
-% M.~Georgiou}{georgiou@csci.csusb.edu}{2004/02/05}{directives not detected} I
-% changed the declaration of directives to use normal keywords.
-% \begingroup
-%    \begin{macrocode}
-%<*lang3>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% Verilog definition (c) 2003 Cameron H. G. Wright 
-%%   Based on the IEEE 1364-2001 Verilog HDL standard
-%%   Ref: S. Palnitkar, "Verilog HDL: A Guide to Digital Design and Synthesis,"
-%%        Prentice Hall, 2003. ISBN: 0-13-044911-3
-%%
-\lst@definelanguage{Verilog}%
-  {morekeywords={% reserved keywords
-      always,and,assign,automatic,begin,buf,bufif0,bufif1,case,casex,%
-      casez,cell,cmos,config,deassign,default,defparam,design,disable,%
-      edge,else,end,endcase,endconfig,endfunction,endgenerate,%
-      endmodule,endprimitive,endspecify,endtable,endtask,event,for,%
-      force,forever,fork,function,generate,genvar,highz0,highz1,if,%
-      ifnone,incdir,include,initial,inout,input,instance,integer,join,%
-      large,liblist,library,localparam,macromodule,medium,module,nand,%
-      negedge,nmos,nor,noshowcancelled,not,notif0,notif1,or,output,%
-      parameter,pmos,posedge,primitive,pull0,pull1,pulldown,pullup,%
-      pulsestyle_onevent,pulsestyle_ondetect,rcmos,real,realtime,reg,%
-      release,repeat,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,%
-      showcancelled,signed,small,specify,specparam,strong0,strong1,%
-      supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,%
-      tri1,triand,trior,trireg,unsigned,use,vectored,wait,wand,weak0,%
-      weak1,while,wire,wor,xnor,xor},%
-   morekeywords=[2]{% system tasks and functions
-      $bitstoreal,$countdrivers,$display,$fclose,$fdisplay,$fmonitor,%
-      $fopen,$fstrobe,$fwrite,$finish,$getpattern,$history,$incsave,%
-      $input,$itor,$key,$list,$log,$monitor,$monitoroff,$monitoron,%
-      $nokey},%
-   morekeywords=[3]{% compiler directives
-      `accelerate,`autoexpand_vectornets,`celldefine,`default_nettype,%
-      `define,`else,`elsif,`endcelldefine,`endif,`endprotect,%
-      `endprotected,`expand_vectornets,`ifdef,`ifndef,`include,%
-      `no_accelerate,`noexpand_vectornets,`noremove_gatenames,%
-      `nounconnected_drive,`protect,`protected,`remove_gatenames,%
-      `remove_netnames,`resetall,`timescale,`unconnected_drive},%
-   alsoletter=\`,%
-   sensitive,%
-   morecomment=[s]{/*}{*/},%
-   morecomment=[l]//,% nonstandard
-   morestring=[b]"%
-  }[keywords,comments,strings]% 
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{VHDL}
-%
-% This language is due to \lstthanks{Kai~Wollenweber}{kai@ece.wpi.edu}
-% {1997/11/04}{VHDL}. I've done conversion to version 0.19 only.
-% \lsthelper{Gaurav Aggarwal}{gaurav@ics.uci.edu}{1998/04/02}{sensitive=f}
-% reported that VHDL is case insensitive and \lsthelper{Arnaud~Tisserand}
-% {2003/02/17}{missing keywords: disconnect, elif, with} added three
-% keywords.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% VHDL definition (c) 1997 Kai Wollenweber
-%%
-\lst@definelanguage{VHDL}%
-  {morekeywords={ALL,ARCHITECTURE,ABS,AND,ASSERT,ARRAY,AFTER,ALIAS,%
-      ACCESS,ATTRIBUTE,BEGIN,BODY,BUS,BLOCK,BUFFER,CONSTANT,CASE,%
-      COMPONENT,CONFIGURATION,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,%
-      FUNCTION,FOR,FILE,GENERIC,GENERATE,GUARDED,GROUP,IF,IN,INOUT,IS,%
-      INERTIAL,IMPURE,LIBRARY,LOOP,LABEL,LITERAL,LINKAGE,MAP,MOD,NOT,%
-      NOR,NAND,NULL,NEXT,NEW,OUT,OF,OR,OTHERS,ON,OPEN,PROCESS,PORT,%
-      PACKAGE,PURE,PROCEDURE,POSTPONED,RANGE,REM,ROL,ROR,REPORT,RECORD,%
-      RETURN,REGISTER,REJECT,SIGNAL,SUBTYPE,SLL,SRL,SLA,SRA,SEVERITY,%
-      SELECT,THEN,TYPE,TRANSPORT,TO,USE,UNITS,UNTIL,VARIABLE,WHEN,WAIT,%
-      WHILE,XOR,XNOR,%
-      DISCONNECT,ELIF,WITH},% Arnaud Tisserand
-   sensitive=f,% 1998 Gaurav Aggarwal
-   morecomment=[l]--,%
-   morestring=[d]{"}%
-  }[keywords,comments,strings]%
-%    \end{macrocode}
-% The VHDL-AMS dialect has been added by \lstthanks{Steffen~Klupsch}
-% {steffen@vlsi.informatik.tu-darmstadt.de}{2001/10/05}.
-%    \begin{macrocode}
-%%
-%% VHDL-AMS definition (c) Steffen Klupsch
-%%
-\lst@definelanguage[AMS]{VHDL}[]{VHDL}%
-  {morekeywords={ACROSS,ARRAY,BREAK,DISCONNECT,NATURE,NOISE,PORT,%
-      PROCEDURAL,QUANTITY,SHARED,SPECTRUM,SUBNATURE,TERMINAL,THROUGH,%
-      TOLERANCE,UNAFFACTED,UNITS}}
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{VRML}
-%
-% This language is due to \lstthanks{Oliver~Baum}{oli.baum@web.de}{2001/07/10}
-% {VRML}.
-% \begingroup
-%    \begin{macrocode}
-%<*lang2>
-%    \end{macrocode}
-%    \begin{macrocode}
-%%
-%% VRML definition (c) 2001 Oliver Baum
-%%
-\lst@definelanguage[97]{VRML}
-  {morekeywords={DEF,EXTERNPROTO,FALSE,IS,NULL,PROTO,ROUTE,TO,TRUE,USE,%
-      eventIn,eventOut,exposedField,field,Introduction,Anchor,%
-      Appearance,AudioClip,Background,Billboard,Box,Collision,Color,%
-      ColorInterpolator,Cone,Coordinate,CoordinateInterpolator,%
-      Cylinder,CylinderSensor,DirectionalLight,ElevationGrid,Extrusion,%
-      Fog,FontStyle,Group,ImageTexture,IndexedFaceSet,IndexedLineSet,%
-      Inline,LOD,Material,MovieTexture,NavigationInfo,Normal,%
-      NormalInterpolator,OrientationInterpolator,PixelTexture,%
-      PlaneSensor,PointLight,PointSet,PositionInterpolator,%
-      ProximitySensor,ScalarInterpolator,Script,Shape,Sound,Sphere,%
-      SphereSensor,SpotLight,Switch,Text,TextureCoordinate,%
-      TextureTransform,TimeSensor,TouchSensor,Transform,Viewpoint,%
-      VisibilitySensor,WorldInfo},%
-   morecomment=[l]\#,% bug: starts comment in the first column
-   morestring=[b]"%
-  }[keywords,comments,strings]
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-% \subsection{XML et al}
-%
-% \lstthanks{Bernhard~Walle}{bernhard@bwalle.de}{2003/11/22} provided the
-% following two definitions.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{XSLT}[]{XML}%
-  {morekeywords={%
-     % main elements
-     xsl:stylesheet,xsl:transform,%
-     % childs of the main element
-     xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,xsl:import,%
-     xsl:include,xsl:key,xsl:namespace-alias,xsl:output,xsl:param,%
-     xsl:preserve-space,xsl:strip-space,xsl:template,xsl:variable,%
-     % 21 directives
-     xsl:apply-imports,xsl:apply-templates,xsl:attribute,%
-     xsl:call-template,xsl:choose,xsl:comment,xsl:copy,xsl:copy-of,%
-     xsl:element,xsl:fallback,xsl:for-each,xsl:if,xsl:message,%
-     xsl:number,xsl:otherwise,xsl:processing-instruction,xsl:text,%
-     xsl:value-of,xsl:variable,xsl:when,xsl:with-param},%
-   alsodigit={-},%
-  }%
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{Ant}[]{XML}%
-  {morekeywords={%
-     project,target,patternset,include,exclude,excludesfile,includesfile,filterset,%
-     filter,filtersfile,libfileset,custom,classpath,fileset,none,depend,mapper,%
-     filename,not,date,contains,selector,depth,or,and,present,majority,size,dirset,%
-     filelist,pathelement,path,param,filterreader,extension,filterchain,linecontainsregexp,%
-     regexp,classconstants,headfilter,tabstospaces,striplinebreaks,tailfilter,stripjavacomments,%
-     expandproperties,linecontains,replacetokens,token,striplinecomments,comment,prefixlines,%
-     classfileset,rootfileset,root,description,xmlcatalog,entity,dtd,substitution,%
-     extensionSet,propertyfile,entry,vsscheckin,sql,transaction,cvspass,csc,%
-     dirname,wlrun,wlclasspath,p4label,replaceregexp,get,jjtree,sleep,jarlib,%
-     dependset,targetfileset,srcfileset,srcfilelist,targetfilelist,zip,zipgroupfileset,zipfileset,%
-     patch,jspc,webapp,style,test,arg,jvmarg,sysproperty,testlet,env,tstamp,%
-     format,unwar,vsshistory,icontract,cvschangelog,user,p4submit,ccmcheckin,%
-     p4change,bzip2,vssadd,javadoc,bottom,source,doctitle,header,excludepackage,bootclasspath,%
-     doclet,taglet,packageset,sourcepath,link,footer,package,group,title,tag,%
-     translate,signjar,vajload,vajproject,jarlib,extensionset,WsdlToDotnet,buildnumber,%
-     jpcovmerge,tomcat,ejbjar,weblogictoplink,jboss,borland,weblogic,iplanet,jonas,%
-     support,websphere,wasclasspath,war,manifest,attribute,section,metainf,lib,%
-     classes,webinf,rename,sequential,serverdeploy,generic,property,move,%
-     copydir,cccheckin,wljspc,fixcrlf,sosget,pathconvert,map,record,p4sync,exec,%
-     p4edit,maudit,rulespath,searchpath,antlr,netrexxc,jpcovreport,reference,filters,%
-     coveragepath,execon,targetfile,srcfile,ccmcheckout,ant,xmlvalidate,xslt,%
-     iplanet,ccmcheckintask,gzip,native2ascii,starteam,ear,archives,input,%
-     rmic,extdirs,compilerarg,checksum,mail,bcc,message,cc,to,from,loadfile,vsscheckout,%
-     stylebook,soscheckin,mimemail,stlabel,gunzip,concat,cab,touch,parallel,splash,%
-     antcall,cccheckout,typedef,p4have,xmlproperty,copy,tomcat,antstructure,ccmcreatetask,%
-     rpm,delete,replace,replacefilter,replacetoken,replacevalue,mmetrics,waitfor,isfalse,%
-     equals,available,filepath,os,filesmatch,istrue,isset,socket,http,uptodate,srcfiles,%
-     untar,loadproperties,echoproperties,vajexport,stcheckout,bunzip2,copyfile,vsscreate,%
-     ejbc,unjar,tomcat,wsdltodotnet,mkdir,condition,cvs,commandline,marker,argument,%
-     tempfile,junitreport,report,taskdef,echo,ccupdate,java,renameext,vsslabel,basename,%
-     javadoc2,vsscp,tar,tarfileset,tomcat,vajimport,setproxy,wlstop,p4counter,ilasm,%
-     soscheckout,apply,ccuncheckout,jarlib,location,url,cvstagdiff,jlink,mergefiles,%
-     addfiles,javacc,pvcs,pvcsproject,jarlib,options,depends,chmod,jar,sound,fail,%
-     success,mparse,blgenclient,genkey,dname,javah,class,ccmreconfigure,unzip,javac,%
-     src,p4add,soslabel,jpcoverage,triggers,method,vssget,deltree,ddcreator},
-   deletekeywords={default},%
-  }
-%    \end{macrocode}
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-% This is my first attempt to support XML. It is from 2000/07/18.
-% \begingroup
-%    \begin{macrocode}
-%<*lang1>
-%    \end{macrocode}
-%    \begin{macrocode}
-\lst@definelanguage{XML}%
-  {keywords={,CDATA,DOCTYPE,ATTLIST,termdef,ELEMENT,EMPTY,ANY,ID,%
-      IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION,%
-      INCLUDE,IGNORE,SYSTEM,PUBLIC,NDATA,PUBLIC,%
-      PCDATA,REQUIRED,IMPLIED,FIXED,%%% preceded by #
-      xml,xml:space,xml:lang,version,standalone,default,preserve},%
-   alsoother=$,%
-   alsoletter=:,%
-   tag=**[s]<>,%
-   morestring=[d]",% ??? doubled
-   morestring=[d]',% ??? doubled
-   MoreSelectCharTable=%
-      \lst@CArgX--\relax\lst@DefDelimB{}{}%
-          {\ifnum\lst@mode=\lst@tagmode\else
-               \expandafter\@gobblethree
-           \fi}%
-          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
-      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
-          \lst@EndComment\lst@commentmode
-      \lst@CArgX[CDATA[\relax\lst@CDef{}%
-          {\ifnum\lst@mode=\lst@tagmode
-               \expandafter\lst@BeginCDATA
-           \else \expandafter\lst@CArgEmpty
-           \fi}%
-          \@empty
-      \lst@CArgX]]\relax\lst@CDef{}%
-          {\ifnum\lst@mode=\lst@GPmode
-               \expandafter\lst@EndComment
-           \else \expandafter\lst@CArgEmpty
-           \fi}%
-          \@empty
-  }[keywords,comments,strings,html]%
-%    \end{macrocode}
-% And after receiving a bug report from \lsthelper{Michael~Niedermair}
-% {m.g.n@gmx.de}{2002/04/07}{undefined control sequence \lst@commentmode} I
-% converted the version 0.21 contents of |MoreSelectCharTable| to version 1.0.
-%    \begin{macrocode}
-%
-%    \end{macrocode}
-% \endgroup
-%
-%
-%^^A \setcounter{IndexColumns}{2}
-%^^A \PrintIndex
-%
-%
-% \Finale
-%
-\endinput
diff --git a/Master/texmf-dist/source/latex/listings/lstdrvrs.dtx b/Master/texmf-dist/source/latex/listings/lstdrvrs.dtx
new file mode 100644
index 00000000000..fbee3980ec5
--- /dev/null
+++ b/Master/texmf-dist/source/latex/listings/lstdrvrs.dtx
@@ -0,0 +1,6380 @@
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+    \DocInput{lstdrvrs.dtx}
+\end{document}
+%
+% \fi
+%
+%
+% \DoNotIndex{\[,\{,\},\],\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
+% \DoNotIndex{\`,\,,\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
+% \DoNotIndex{\askforoverwritefalse,\askforoverwritetrue,\batchfile}
+% \DoNotIndex{\begin,\def,\else,\@empty,\end,\endpreamble,\expandafter}
+% \DoNotIndex{\fi,\file,\from,\gdef,\generate,\ifnum,\ifx,\input}
+% \DoNotIndex{\keepsilent,\lccode,\let,\lowercase,\preamble,\relax}
+% \DoNotIndex{\undefined}
+%
+%
+% \title{Language, Style and Format drivers\\ for \textsf{Listings 1.3}\\ {\large by Carsten Heinz and individual authors:}}
+% \author{\InputIfFileExists{lstdrvrs.tmp}{}{}}
+% \date{}
+%
+% \maketitle
+%
+% \newwrite\authors \immediate\openout\authors lstdrvrs.tmp\relax
+% \gdef\lstthanks#1#2#3{#1\global\let\lstthanks\lstthanksb\lstwrite{#1}}
+% \gdef\lstthanksb#1#2#3{#1\lstwrite{\string\and\space#1}}
+% \gdef\lstwrite#1{\begingroup\let~\space\def\"{\string\"}\def\'{\string\'}\immediate\write\authors{#1}\endgroup}
+%
+% \newcommand*\lsthelper[4]{#1}
+%
+%
+% \section{Installation and configuration}
+%
+% \begingroup
+%    \begin{macrocode}
+%% The listings package is copyright 1996--2004 Carsten Heinz, and 
+%% continued maintenance on the package is copyright 2006--2007 Brooks Moses.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007 any individual author listed in this file.
+%%
+%% This file is distributed under the terms of the LaTeX Project Public
+%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
+%% Either version 1.3 or, at your option, any later version.
+%%
+%% This file is completely free and comes without any warranty.
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Brooks Moses at .
+%%
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+%    \begin{macrocode}
+%<*install>
+\input docstrip
+\preamble
+\endpreamble
+
+\ifToplevel{
+\usedir{tex/latex/listings}
+\keepsilent
+\askonceonly
+}
+
+
+\generate{
+    \file{lstlang1.sty}{\from{lstdrvrs.dtx}{lang1}}
+    \file{lstlang2.sty}{\from{lstdrvrs.dtx}{lang2}}
+    \file{lstlang3.sty}{\from{lstdrvrs.dtx}{lang3}}
+}
+
+
+\ifToplevel{
+\Msg{*}
+\Msg{* You probably need to move all created `.sty' and `.cfg'}
+\Msg{* files into a directory searched by TeX.}
+\Msg{*}
+\Msg{* Run `lstdrvrs.dtx' through LaTeX2e to get the documentation.}
+\Msg{*}
+}
+
+\endbatchfile
+%
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+%    \begin{macrocode}
+%<*config>
+%    \end{macrocode}
+% \endgroup
+% We mainly define default dialects.
+%    \begin{macrocode}
+\ProvidesFile{listings.cfg}[2004/09/05 1.3 listings configuration]
+\def\lstlanguagefiles
+    {lstlang0.sty,lstlang1.sty,lstlang2.sty,lstlang3.sty}
+\lstset{defaultdialect=[R/3 6.10]ABAP,
+        defaultdialect=[2005]Ada,
+        defaultdialect=[68]Algol,
+        defaultdialect=[gnu]Awk,
+        defaultdialect=[ANSI]C,
+        defaultdialect=[light]Caml,
+        defaultdialect=[1985]Cobol,
+	defaultdialect=[WinXP]command.com,
+        defaultdialect=[ISO]C++,
+        defaultdialect=[95]Fortran,
+        defaultdialect=[5.2]Mathematica,
+        defaultdialect=[OMG]OCL,
+        defaultdialect=[Standard]Pascal,
+        defaultdialect=[67]Simula,
+        defaultdialect=[plain]TeX,
+        defaultdialect=[97]VRML}
+\lstalias[]{TclTk}[tk]{tcl}
+%    \end{macrocode}
+% And now some shortcuts for the ABAP versions (provided by Knut Lickert).
+% I (Knut) think the leading R/2, R/3 is not necessary (The support for R/2
+% is finished). The version number with letter is important for the
+% runtime-system, but the programming language should be the same
+% for each version.
+%    \begin{macrocode}
+\lstalias[6.1]{ABAP}[R/3 6.10]{ABAP}
+\lstalias[3.1]{ABAP}[R/3 3.1C]{ABAP}
+\lstalias[4.6]{ABAP}[R/3 4.6C]{ABAP}
+%    \end{macrocode}
+% \begingroup
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%    \begin{macrocode}
+%<+lang1>\ProvidesFile{lstlang1.sty}
+%<+lang2>\ProvidesFile{lstlang2.sty}
+%<+lang3>\ProvidesFile{lstlang3.sty}
+%<-config>    [2004/09/05 1.3 listings language file]
+%    \end{macrocode}
+%
+%
+% \section{Language drivers}
+%
+%
+% \subsection{Abap}
+%
+% \lstthanks{Knut Lickert}{knut.lickert@gmx.de}{2000/08/01,2001/12/29,2002/04/11}
+% added support for Abap.\footnote{In this section `I' is Knut Lickert.}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Abap definition by Knut Lickert
+%%
+%    \end{macrocode}
+%
+% There are some other new commands in release 6.10.
+% They will follow later, but up to now I don't work
+% with 6.10.
+%
+%    \begin{macrocode}
+\lst@definelanguage[R/3 6.10]{ABAP}[R/3 4.6C]{ABAP}%
+  {morekeywords={try,endtry},%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[R/3 4.6C]{ABAP}[R/3 3.1]{ABAP}%
+  {morekeywords={method,ref,class,create,object,%
+        methods,endmethod,private,protected,public,section,%
+        catch,system-exceptions,endcatch,%
+        },%
+   moreprocnamekeys={class},%
+   literate={->}{{$\rightarrow$}}1{=>}{{$\Rightarrow$}}1,%
+  }[keywords,comments,strings,procnames]
+%    \end{macrocode}
+% Yes there are also some more releases in R/3 (2.1\ldots), but I
+% know them not really. So let's start with R/3~3.1.
+%    \begin{macrocode}
+\lst@definelanguage[R/3 3.1]{ABAP}[R/2 5.0]{ABAP}{}%
+%    \end{macrocode}
+% As I remember all this commands exists in R/2. Many commands are
+% new in R/2~5.0 (compared with R/2 4.3). But as I am not using
+% R/2~4.3 any more, I start with R/2~5.0.
+%    \begin{macrocode}
+\lst@definelanguage[R/2 5.0]{ABAP}%
+  {sensitive=f,%
+   procnamekeys={report,program,form,function,module},%
+   morekeywords={*,add,after,alias,analyzer,and,append,appending,area,assign,at,%
+        authority-check,before,binary,blank,break-point,calendar,call,%
+        case,change,changing,check,clear,cnt,co,collect,commit,common,%
+        component,compute,condense,corresponding,cos,cp,cs,currency-conversion,%
+        cursor,data,database,dataset,decimals,define,delete,deleting,dequeue,%
+        describe,detail,dialog,directory,div,divide,do,documentation,%
+        during,dynpro,else,end-of-page,end-of-selection,endat,endcase,%
+        enddo,endfor,endform,endif,endloop,endmodule,endselect,%
+        endwhile,enqueue,exceptions,exit,exp,export,exporting,extract,%
+        field,fields,field-groups,field-symbols,find,for,form,format,free,%
+        from,function,generating,get,giving,hide,id,if,import,%
+        importing,in,incl,include,initial,initialization,input,insert,%
+        interrupt,into,is,language,leave,leading,left-justified,like,line,lines,line-count,
+        line-selection,list-processing,load,local,log,logfile,loop,%
+        margin,mark,mask,memory,menue,message,mod,modify,module,move,%
+        move-text,multiply,na,new,new-line,new-page,no-gaps,np,ns,%
+        number,obligatory,occurs,of,on,or,others,output,parameter,%
+        parameters,parts,perform,pf-status,places,position,process,%
+        raise,raising,ranges,read,refresh,refresh-dynpro,reject,remote,%
+        replace,report,reserve,reset,restart,right-justified,run,screen,scroll,search,%
+        segments,select,select-options,selection-screen,set,shift,sin,%
+        single,sqrt,start-of-selection,statement,structure,submit,%
+        subtract,summary,summing,suppress,system,table,tables,task,%
+        text,time,to,top-of-page,trace,transaction,transfer,%
+        transfer-dynpro,translate,type,unpack,update,user-command,%
+        using,value,when,where,while,window,with,workfile,write,},%
+   morecomment=[l]",%
+   morecomment=[f][commentstyle][0]*,%
+   morestring=[d]'%
+  }[keywords,comments,strings,procnames]
+%    \end{macrocode}
+% This section for R/2~4.3 is not really maintained. It is just what I remember
+% of the past.
+%    \begin{macrocode}
+\lst@definelanguage[R/2 4.3]{ABAP}[R/2 5.0]{ABAP}%
+  {deletekeywords={function,importing,exporting,changing,exceptions,%
+        raise,raising}%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ACSL}
+%
+% This language was provided by \lstthanks{Andreas~Matthias}{amat@kabsi.at}
+% {2000/03/21}. I'm sorry for forgetting to add this language for a long time.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ACSL definition (c) 2000 by Andreas Matthias
+%%
+\lst@definelanguage{ACSL}[90]{Fortran}%
+   {morekeywords={algorithm,cinterval,constant,derivative,discrete,%
+         dynamic,errtag,initial,interval,maxterval,minterval,%
+         merror,xerror,nsteps,procedural,save,schedule,sort,%
+         table,terminal,termt,variable},%
+    sensitive=false,%
+    morecomment=[l]!%
+   }[keywords, comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Ada}
+%
+% Data come from
+% \begin{itemize}
+% \item
+%		\textsc{Barnes, John Gilbert Presslie}:
+%		\textbf{Programming in Ada plus language reference manual};
+%		{\copyright} 1991 Addison-Wesley Publishing Company, Inc.;
+%		ISBN 0-201-56539-0.
+% \end{itemize}
+% \lstthanks{Torsten~Neuer}{tneuer@inwise.de}{1998/11/23} added support for
+% Ada 95. I changed the definition to reduce the required string memory.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Ada 95 definition (c) Torsten Neuer
+%%
+%% Ada 2005 definition (c) 2006 Santiago Urue\~{n}a Pascual
+%%                              
+%%
+\lst@definelanguage[2005]{Ada}[95]{Ada}%
+  {morekeywords={interface,overriding,synchronized}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[95]{Ada}[83]{Ada}%
+  {morekeywords={abstract,aliased,protected,requeue,tagged,until}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[83]{Ada}%
+  {morekeywords={abort,abs,accept,access,all,and,array,at,begin,body,%
+      case,constant,declare,delay,delta,digits,do,else,elsif,end,entry,%
+      exception,exit,for,function,generic,goto,if,in,is,limited,loop,%
+      mod,new,not,null,of,or,others,out,package,pragma,private,%
+      procedure,raise,range,record,rem,renames,return,reverse,select,%
+      separate,subtype,task,terminate,then,type,use,when,while,with,%
+      xor},%
+   sensitive=f,%
+   morecomment=[l]--,%
+   morestring=[m]",% percent not defined as stringizer so far
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Algol}
+%
+% Data come from
+% \begin{itemize}
+% \item
+%		\textsc{Uwe Pape}:
+%		\textbf{Programmieren in ALGOL 60};
+%		{\copyright} 1973 Carl Hanser Verlag M\"unchen;
+%		ISBN 3-446-11605-2
+% \item
+%		\textsc{Frank G.\ Pagan}:
+%		\textbf{A practical guide to ALGOL 68};
+%		{\copyright} 1976 by John Wiley $\&$ Sohn Ltd.;
+%		ISBN 0-471-65746-8 (Cloth); ISBN 0-471-65747-6 (Pbk).
+% \end{itemize}
+% The definition of Algol 68 doesn't support comments enclosed by \rlap{/}c.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[68]{Algol}%
+% ??? should 'i' be a keyword
+  {morekeywords={abs,and,arg,begin,bin,bits,bool,by,bytes,case,channel,%
+      char,co,comment,compl,conj,divab,do,down,elem,elif,else,empty,%
+      end,entier,eq,esac,exit,false,fi,file,flex,for,format,from,ge,%
+      goto,gt,heap,if,im,in,int,is,isnt,le,leng,level,loc,long,lt,lwb,%
+      minusab,mod,modab,mode,ne,nil,not,od,odd,of,op,or,ouse,out,over,%
+      overab,par,plusab,plusto,pr,pragmat,prio,proc,re,real,ref,repr,%
+      round,sema,shl,short,shorten,shr,sign,skip,string,struct,then,%
+      timesab,to,true,union,up,upb,void,while},%
+   sensitive=f,% ???
+   morecomment=[s]{\#}{\#},%
+   keywordcomment={co,comment}%
+  }[keywords,comments,keywordcomments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[60]{Algol}%
+  {morekeywords={array,begin,Boolean,code,comment,div,do,else,end,%
+      false,for,goto,if,integer,label,own,power,procedure,real,step,%
+      string,switch,then,true,until,value,while},%
+   sensitive=f,% ???
+   keywordcommentsemicolon={end}{else,end}{comment}%
+  }[keywords,keywordcomments]%
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Assembler}
+%
+% Credits go to \lstthanks{Michael~Franke}{-}{2006/05/13}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%%
+%% Motorola 68K definition (c) 2006 Michael Franke
+%%
+\lst@definelanguage[Motorola68k]{Assembler}%
+ {morekeywords={ABCD,ADD,%
+ADDA,ADDI,ADDQ,ADDX,AND,ANDI,ASL,ASR,BCC,BLS,BCS,BLT,BEQ,BMI,BF,BNE,BGE,BPL,%
+BGT,BT,BHI,BVC,BLE,BVS,BCHG,BCLR,BRA,BSET,BSR,BTST,CHK,CLR,CMP,CMPA,CMPI,CMPM,%
+DBCC,DBLS,DBCS,DBLT,DBEQ,DBMI,DBF,DBNE,DBGE,DBPL,DBGT,DBT,DBHI,DBVC,DBLE,DBVS,DIVS,%
+DIVU,EOR,EORI,EXG,EXT,ILLEGAL,JMP,JSR,LEA,LINK,LSL,LSR,MOVE,MOVEA,MOVEM,MOVEP,MOVEQ,%
+MULS,MULU,NBCD,NEG,NEGX,NOP,NOT,OR,ORI,PEA,RESET,ROL,ROR,ROXL,ROXR,RTE,RTR,RTS,SBCD,%
+SCC,SLS,SCS,SLT,SEQ,SMI,SF,SNE,SGE,SPL,SGT,ST,SHI,SVC,SLE,SVS,STOP,SUB,SUBA,SUBI,SUBQ,%
+SUBX,SWAP,TAS,TRAP,TRAPV,TST,UNLK},%
+   sensitive=false,%
+   morecomment=[l]*,%
+   morecomment=[l];%
+   }[keywords,comments,strings]
+%
+%    \end{macrocode}
+%
+% Credits go to \lstthanks{Andrew~Zabolotny}{zap@cobra.ru}{2002/07/05}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%%
+%% x86masm definition (c) 2002 Andrew Zabolotny
+%%
+\lst@definelanguage[x86masm]{Assembler}%
+  {morekeywords={al,ah,ax,eax,bl,bh,bx,ebx,cl,ch,cx,ecx,dl,dh,dx,edx,%
+      si,esi,di,edi,bp,ebp,sp,esp,cs,ds,es,ss,fs,gs,cr0,cr1,cr2,cr3,%
+      db0,db1,db2,db3,db4,db5,db6,db7,tr0,tr1,tr2,tr3,tr4,tr5,tr6,tr7,%
+      st,aaa,aad,aam,aas,adc,add,and,arpl,bound,bsf,bsr,bswap,bt,btc,%
+      btr,bts,call,cbw,cdq,clc,cld,cli,clts,cmc,cmp,cmps,cmpsb,cmpsw,%
+      cmpsd,cmpxchg,cwd,cwde,daa,das,dec,div,enter,hlt,idiv,imul,in,%
+      inc,ins,int,into,invd,invlpg,iret,ja,jae,jb,jbe,jc,jcxz,jecxz,%
+      je,jg,jge,jl,jle,jna,jnae,jnb,jnbe,jnc,jne,jng,jnge,jnl,jnle,%
+      jno,jnp,jns,jnz,jo,jp,jpe,jpo,js,jz,jmp,lahf,lar,lea,leave,lgdt,%
+      lidt,lldt,lmsw,lock,lods,lodsb,lodsw,lodsd,loop,loopz,loopnz,%
+      loope,loopne,lds,les,lfs,lgs,lss,lsl,ltr,mov,movs,movsb,movsw,%
+      movsd,movsx,movzx,mul,neg,nop,not,or,out,outs,pop,popa,popad,%
+      popf,popfd,push,pusha,pushad,pushf,pushfd,rcl,rcr,rep,repe,%
+      repne,repz,repnz,ret,retf,rol,ror,sahf,sal,sar,sbb,scas,seta,%
+      setae,setb,setbe,setc,sete,setg,setge,setl,setle,setna,setnae,%
+      setnb,setnbe,setnc,setne,setng,setnge,setnl,setnle,setno,setnp,%
+      setns,setnz,seto,setp,setpe,setpo,sets,setz,sgdt,shl,shld,shr,%
+      shrd,sidt,sldt,smsw,stc,std,sti,stos,stosb,stosw,stosd,str,sub,%
+      test,verr,verw,wait,wbinvd,xadd,xchg,xlatb,xor,fabs,fadd,fbld,%
+      fbstp,fchs,fclex,fcom,fcos,fdecstp,fdiv,fdivr,ffree,fiadd,ficom,%
+      fidiv,fidivr,fild,fimul,fincstp,finit,fist,fisub,fisubr,fld,fld1,%
+      fldl2e,fldl2t,fldlg2,fldln2,fldpi,fldz,fldcw,fldenv,fmul,fnop,%
+      fpatan,fprem,fprem1,fptan,frndint,frstor,fsave,fscale,fsetpm,%
+      fsin,fsincos,fsqrt,fst,fstcw,fstenv,fstsw,fsub,fsubr,ftst,fucom,%
+      fwait,fxam,fxch,fxtract,fyl2x,fyl2xp1,f2xm1},%
+   morekeywords=[2]{.align,.alpha,assume,byte,code,comm,comment,.const,%
+      .cref,.data,.data?,db,dd,df,dosseg,dq,dt,dw,dword,else,end,endif,%
+      endm,endp,ends,eq,equ,.err,.err1,.err2,.errb,.errdef,.errdif,%
+      .erre,.erridn,.errnb,.errndef,.errnz,event,exitm,extrn,far,%
+      .fardata,.fardata?,fword,ge,group,gt,high,if,if1,if2,ifb,ifdef,%
+      ifdif,ife,ifidn,ifnb,ifndef,include,includelib,irp,irpc,label,%
+      .lall,le,length,.lfcond,.list,local,low,lt,macro,mask,mod,.model,%
+      name,ne,near,offset,org,out,page,proc,ptr,public,purge,qword,.%
+      radix,record,rept,.sall,seg,segment,.seq,.sfcond,short,size,%
+      .stack,struc,subttl,tbyte,.tfcond,this,title,type,.type,width,%
+      word,.xall,.xcref,.xlist},%
+   alsoletter=.,alsodigit=?,%
+   sensitive=f,%
+   morestring=[b]",%
+   morestring=[b]',%
+   morecomment=[l];%
+   }[keywords,comments,strings]
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Awk}
+%
+% Thanks to \lstthanks{Dr.~Christoph~Giess}{Ch.Giess@gmx.de}{2003/07/15} for
+% providing these definitions.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%%
+%% awk definitions (c) Christoph Giess
+%%
+\lst@definelanguage[gnu]{Awk}[POSIX]{Awk}%
+  {morekeywords={and,asort,bindtextdomain,compl,dcgettext,gensub,%
+      lshift,mktime,or,rshift,strftime,strtonum,systime,xor,extension}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[POSIX]{Awk}%
+  {keywords={BEGIN,END,close,getline,next,nextfile,print,printf,%
+      system,fflush,atan2,cos,exp,int,log,rand,sin,sqrt,srand,gsub,%
+      index,length,match,split,sprintf,strtonum,sub,substr,tolower,%
+      toupper,if,while,do,for,break,continue,delete,exit,function,%
+      return},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Basic}
+%
+% Credits go to \lstthanks{Robert Frank}{rf7@ukc.ac.uk}{2002/07/05}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%%
+%% Visual Basic definition (c) 2002 Robert Frank
+%%
+\lst@definelanguage[Visual]{Basic}
+  {morekeywords={Abs,Array,Asc,AscB,AscW,Atn,Avg,CBool,CByte,CCur,%
+      CDate,CDbl,Cdec,Choose,Chr,ChrB,ChrW,CInt,CLng,Command,Cos,%
+      Count,CreateObject,CSng,CStr,CurDir,CVar,CVDate,CVErr,Date,%
+      DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,DDB,Dir,%
+      DoEvents,Environ,EOF,Error,Exp,FileAttr,FileDateTime,FileLen,%
+      Fix,Format,FreeFile,FV,GetAllStrings,GetAttr,%
+      GetAutoServerSettings,GetObject,GetSetting,Hex,Hour,IIf,%
+      IMEStatus,Input,InputB,InputBox,InStr,InstB,Int,Integer,IPmt,%
+      IsArray,IsDate,IsEmpty,IsError,IsMissing,IsNull,IsNumeric,%
+      IsObject,LBound,LCase,Left,LeftB,Len,LenB,LoadPicture,Loc,LOF,%
+      Log,Ltrim,Max,Mid,MidB,Min,Minute,MIRR,Month,MsgBox,Now,NPer,%
+      NPV,Oct,Partition,Pmt,PPmt,PV,QBColor,Rate,RGB,Right,RightB,Rnd,%
+      Rtrim,Second,Seek,Sgn,Shell,Sin,SLN,Space,Spc,Sqr,StDev,StDevP,%
+      Str,StrComp,StrConv,String,Switch,Sum,SYD,Tab,Tan,Time,Timer,%
+      TimeSerial,TimeValue,Trim,TypeName,UBound,Ucase,Val,Var,VarP,%
+      VarType,Weekday,Year},% functions
+   morekeywords=[2]{Accept,Activate,Add,AddCustom,AddFile,AddFromFile,%
+      AddFromTemplate,AddItem,AddNew,AddToAddInToolbar,%
+      AddToolboxProgID,Append,AppendChunk,Arrange,Assert,AsyncRead,%
+      BatchUpdate,BeginTrans,Bind,Cancel,CancelAsyncRead,CancelBatch,%
+      CancelUpdate,CanPropertyChange,CaptureImage,CellText,CellValue,%
+      Circle,Clear,ClearFields,ClearSel,ClearSelCols,Clone,Close,Cls,%
+      ColContaining,ColumnSize,CommitTrans,CompactDatabase,Compose,%
+      Connect,Copy,CopyQueryDef,CreateDatabase,CreateDragImage,%
+      CreateEmbed,CreateField,CreateGroup,CreateIndex,CreateLink,%
+      CreatePreparedStatement,CreatePropery,CreateQuery,%
+      CreateQueryDef,CreateRelation,CreateTableDef,CreateUser,%
+      CreateWorkspace,Customize,Delete,DeleteColumnLabels,%
+      DeleteColumns,DeleteRowLabels,DeleteRows,DoVerb,Drag,Draw,Edit,%
+      EditCopy,EditPaste,EndDoc,EnsureVisible,EstablishConnection,%
+      Execute,ExtractIcon,Fetch,FetchVerbs,Files,FillCache,Find,%
+      FindFirst,FindItem,FindLast,FindNext,FindPrevious,Forward,%
+      GetBookmark,GetChunk,GetClipString,GetData,GetFirstVisible,%
+      GetFormat,GetHeader,GetLineFromChar,GetNumTicks,GetRows,%
+      GetSelectedPart,GetText,GetVisibleCount,GoBack,GoForward,Hide,%
+      HitTest,HoldFields,Idle,InitializeLabels,InsertColumnLabels,%
+      InsertColumns,InsertObjDlg,InsertRowLabels,InsertRows,Item,%
+      KillDoc,Layout,Line,LinkExecute,LinkPoke,LinkRequest,LinkSend,%
+      Listen,LoadFile,LoadResData,LoadResPicture,LoadResString,%
+      LogEvent,MakeCompileFile,MakeReplica,MoreResults,Move,MoveData,%
+      MoveFirst,MoveLast,MoveNext,MovePrevious,NavigateTo,NewPage,%
+      NewPassword,NextRecordset,OLEDrag,OnAddinsUpdate,OnConnection,%
+      OnDisconnection,OnStartupComplete,Open,OpenConnection,%
+      OpenDatabase,OpenQueryDef,OpenRecordset,OpenResultset,OpenURL,%
+      Overlay,PaintPicture,Paste,PastSpecialDlg,PeekData,Play,Point,%
+      PopulatePartial,PopupMenu,Print,PrintForm,PropertyChanged,Pset,%
+      Quit,Raise,RandomDataFill,RandomFillColumns,RandomFillRows,%
+      rdoCreateEnvironment,rdoRegisterDataSource,ReadFromFile,%
+      ReadProperty,Rebind,ReFill,Refresh,RefreshLink,RegisterDatabase,%
+      Reload,Remove,RemoveAddInFromToolbar,RemoveItem,Render,%
+      RepairDatabase,Reply,ReplyAll,Requery,ResetCustom,%
+      ResetCustomLabel,ResolveName,RestoreToolbar,Resync,Rollback,%
+      RollbackTrans,RowBookmark,RowContaining,RowTop,Save,SaveAs,%
+      SaveFile,SaveToFile,SaveToolbar,SaveToOle1File,Scale,ScaleX,%
+      ScaleY,Scroll,Select,SelectAll,SelectPart,SelPrint,Send,%
+      SendData,Set,SetAutoServerSettings,SetData,SetFocus,SetOption,%
+      SetSize,SetText,SetViewport,Show,ShowColor,ShowFont,ShowHelp,%
+      ShowOpen,ShowPrinter,ShowSave,ShowWhatsThis,SignOff,SignOn,Size,%
+      Span,SplitContaining,StartLabelEdit,StartLogging,Stop,%
+      Synchronize,TextHeight,TextWidth,ToDefaults,TwipsToChartPart,%
+      TypeByChartType,Update,UpdateControls,UpdateRecord,UpdateRow,%
+      Upto,WhatsThisMode,WriteProperty,ZOrder},% methods
+   morekeywords=[3]{AccessKeyPress,AfterAddFile,AfterChangeFileName,%
+      AfterCloseFile,AfterColEdit,AfterColUpdate,AfterDelete,%
+      AfterInsert,AfterLabelEdit,AfterRemoveFile,AfterUpdate,%
+      AfterWriteFile,AmbienChanged,ApplyChanges,Associate,%
+      AsyncReadComplete,AxisActivated,AxisLabelActivated,%
+      AxisLabelSelected,AxisLabelUpdated,AxisSelected,%
+      AxisTitleActivated,AxisTitleSelected,AxisTitleUpdated,%
+      AxisUpdated,BeforeClick,BeforeColEdit,BeforeColUpdate,%
+      BeforeConnect,BeforeDelete,BeforeInsert,BeforeLabelEdit,%
+      BeforeLoadFile,BeforeUpdate,ButtonClick,ButtonCompleted,%
+      ButtonGotFocus,ButtonLostFocus,Change,ChartActivated,%
+      ChartSelected,ChartUpdated,Click,ColEdit,Collapse,ColResize,%
+      ColumnClick,Compare,ConfigChageCancelled,ConfigChanged,%
+      ConnectionRequest,DataArrival,DataChanged,DataUpdated,DblClick,%
+      Deactivate,DeviceArrival,DeviceOtherEvent,DeviceQueryRemove,%
+      DeviceQueryRemoveFailed,DeviceRemoveComplete,DeviceRemovePending,%
+      DevModeChange,Disconnect,DisplayChanged,Dissociate,%
+      DoGetNewFileName,Done,DonePainting,DownClick,DragDrop,DragOver,%
+      DropDown,EditProperty,EnterCell,EnterFocus,Event,ExitFocus,%
+      Expand,FootnoteActivated,FootnoteSelected,FootnoteUpdated,%
+      GotFocus,HeadClick,InfoMessage,Initialize,IniProperties,%
+      ItemActivated,ItemAdded,ItemCheck,ItemClick,ItemReloaded,%
+      ItemRemoved,ItemRenamed,ItemSeletected,KeyDown,KeyPress,KeyUp,%
+      LeaveCell,LegendActivated,LegendSelected,LegendUpdated,%
+      LinkClose,LinkError,LinkNotify,LinkOpen,Load,LostFocus,%
+      MouseDown,MouseMove,MouseUp,NodeClick,ObjectMove,%
+      OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,%
+      OLESetData,OLEStartDrag,OnAddNew,OnComm,Paint,PanelClick,%
+      PanelDblClick,PathChange,PatternChange,PlotActivated,%
+      PlotSelected,PlotUpdated,PointActivated,PointLabelActivated,%
+      PointLabelSelected,PointLabelUpdated,PointSelected,%
+      PointUpdated,PowerQuerySuspend,PowerResume,PowerStatusChanged,%
+      PowerSuspend,QueryChangeConfig,QueryComplete,QueryCompleted,%
+      QueryTimeout,QueryUnload,ReadProperties,Reposition,%
+      RequestChangeFileName,RequestWriteFile,Resize,ResultsChanged,%
+      RowColChange,RowCurrencyChange,RowResize,RowStatusChanged,%
+      SelChange,SelectionChanged,SendComplete,SendProgress,%
+      SeriesActivated,SeriesSelected,SeriesUpdated,SettingChanged,%
+      SplitChange,StateChanged,StatusUpdate,SysColorsChanged,%
+      Terminate,TimeChanged,TitleActivated,TitleSelected,%
+      TitleActivated,UnboundAddData,UnboundDeleteRow,%
+      UnboundGetRelativeBookmark,UnboundReadData,UnboundWriteData,%
+      Unload,UpClick,Updated,Validate,ValidationError,WillAssociate,%
+      WillChangeData,WillDissociate,WillExecute,WillUpdateRows,%
+      WithEvents,WriteProperties},% VB-events
+   morekeywords=[4]{AppActivate,Base,Beep,Call,Case,ChDir,ChDrive,%
+      Const,Declare,DefBool,DefByte,DefCur,DefDate,DefDbl,DefDec,%
+      DefInt,DefLng,DefObj,DefSng,DefStr,Deftype,DefVar,DeleteSetting,%
+      Dim,Do,Else,ElseIf,End,Enum,Erase,Event,Exit,Explicit,FileCopy,%
+      For,ForEach,Friend,Function,Get,GoSub,GoTo,If,Implements,Kill,%
+      Let,LineInput,Lock,Lset,MkDir,Name,Next,OnError,On,Option,%
+      Private,Property,Public,Put,RaiseEvent,Randomize,ReDim,Rem,%
+      Reset,Resume,Return,RmDir,Rset,SavePicture,SaveSetting,%
+      SendKeys,SetAttr,Static,Sub,Then,Type,Unlock,Wend,While,Width,%
+      With,Write},% statements
+   sensitive=false,%
+   keywordcomment=rem,%
+   MoreSelectCharTable=\def\lst@BeginKC@{% chmod
+      \lst@ResetToken
+      \lst@BeginComment\lst@GPmode{{\lst@commentstyle}%
+                       \lst@Lmodetrue\lst@modetrue}\@empty},%
+   morecomment=[l]{'},%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   }[keywords,comments,strings,keywordcomments]
+%
+%    \end{macrocode}
+% Thanks to \lsthelper{Jonathan~de~Halleux}{dehalleux@pelikhan.com}
+% {2002/12/27}{missing comma} for reporting a missing comma after
+% \texttt{MoreSelectCharTable}, which was the cause of a problem
+% reported by \lsthelper{Robert~Frank}{rf7@ukc.ac.uk}{2002/10/27}
+% {indention with language={[Visual]Basic} in optional argument}.
+% \lsthelper{Martina~Hansel}{Martina.Hansel@fhtw-berlin.de}{2003/05/29}
+% {missing comma} also found the bug and the fix.
+% \endgroup
+%
+%
+% \subsection{Clean}
+%
+% Thanks to \lstthanks{Jos\'e~Romildo~Malaquias}{romildo@iceb.ufop.br}{2000/08/08}.
+% \lsthelper{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}{2001/10/12}{missing comma}
+% found a missing comma
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%%
+%% Clean definition (c) 1999 Jos\'e Romildo Malaquias
+%%
+%% Clean 1.3 :  some standard functional language: pure, lazy,
+%%              polymorphic type system, modules, type classes,
+%%              garbage collection, functions as first class citizens
+%%
+\lst@definelanguage{Clean}%
+  {otherkeywords={:,::,=,:==,=:,=>,->,<-,<-:,\{,\},\{|,|\},\#,\#!,|,\&,%
+      [,],!,.,\\\\,;,_},%
+   morekeywords={from,definition,implementation,import,module,system,%
+      case,code,if,in,let,let!,of,where,with,infix,infixl,infixr},%
+   morendkeywords={True,False,Start,Int,Real,Char,Bool,String,World,%
+      File,ProcId},%
+   sensitive,%
+   morecomment=[l]//,% missing comma: Markus Pahlow
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Corba IDL}
+%
+% This language definition is due to \lstthanks{Jens~T.~Berger~Thielemann}
+% {jensthi@ifi.uio.no}{1999/11/28}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%%
+%% Corba IDL definition (c) 1999 Jens T. Berger Thielemann
+%%
+\lst@definelanguage[CORBA]{IDL}%
+  {morekeywords={any,attribute,boolean,case,char,const,context,default,%
+      double,enum,exception,fixed,float,in,inout,interface,long,module,%
+      native,Object,octet,oneway,out,raises,readonly,sequence,short,%
+      string,struct,switch,typedef,union,unsigned,void,wchar,wstring,%
+      FALSE,TRUE},%
+   sensitive,%
+   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
+      include,pragma,undef,warning},%
+   moredelim=*[directive]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings,directives]%
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{C, C++, et al}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% For compatibility the `ANSI' language is defined in terms of ISO.
+%    \begin{macrocode}
+\lst@definelanguage[ANSI]{C++}[ISO]{C++}{}%
+%    \end{macrocode}
+% \lstthanks{Michael Piefel}{piefel@informatik.hu-berlin.de}{2001/11/21}
+% suggested some more changes and added GNU C++.
+%    \begin{macrocode}
+\lst@definelanguage[GNU]{C++}[ISO]{C++}%
+  {morekeywords={__attribute__,__extension__,__restrict,__restrict__,%
+      typeof,__typeof__},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[Visual]{C++}[ISO]{C++}%
+  {morekeywords={__asm,__based,__cdecl,__declspec,dllexport,%
+      dllimport,__except,__fastcall,__finally,__inline,__int8,__int16,%
+      __int32,__int64,naked,__stdcall,thread,__try,__leave},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[ISO]{C++}[ANSI]{C}%
+  {morekeywords={and,and_eq,asm,bad_cast,bad_typeid,bitand,bitor,bool,%
+      catch,class,compl,const_cast,delete,dynamic_cast,explicit,export,%
+      false,friend,inline,mutable,namespace,new,not,not_eq,operator,or,%
+      or_eq,private,protected,public,reinterpret_cast,static_cast,%
+      template,this,throw,true,try,typeid,type_info,typename,using,%
+      virtual,wchar_t,xor,xor_eq},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+% Objective-C is due to \lstthanks{Detlev~Dr\"oge}
+%{droege@informatik.uni-koblenz.de}{1997/11/04}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Objective-C definition (c) 1997 Detlev Droege 
+%%
+\lst@definelanguage[Objective]{C}[ANSI]{C}
+  {morekeywords={bycopy,id,in,inout,oneway,out,self,super,%
+      @class,@defs,@encode,@end,@implementation,@interface,@private,%
+      @protected,@protocol,@public,@selector},%
+   moredirectives={import}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \lstthanks{J\"org~Viermann}{}{2004/07/17} provided the keywords for Handel-C.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Handel-C definition, refer http://www.celoxica.com
+%%
+\lst@definelanguage[Handel]{C}[ANSI]{C}
+  {morekeywords={assert,chan,chanin,chanout,clock,delay,expr,external,%
+      external_divide,family,ifselect,in,inline,interface,internal,%
+      internal_divid,intwidth,let,macro,mpram,par,part,prialt,proc,ram,%
+      releasesema,reset,rom,select,sema,set,seq,shared,signal,try,%
+      reset,trysema,typeof,undefined,width,with,wom},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[ANSI]{C}%
+  {morekeywords={auto,break,case,char,const,continue,default,do,double,%
+      else,enum,extern,float,for,goto,if,int,long,register,return,%
+      short,signed,sizeof,static,struct,switch,typedef,union,unsigned,%
+      void,volatile,while},%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,% nonstandard
+   morestring=[b]",%
+   morestring=[b]',%
+   moredelim=*[directive]\#,%
+   moredirectives={define,elif,else,endif,error,if,ifdef,ifndef,line,%
+      include,pragma,undef,warning}%
+  }[keywords,comments,strings,directives]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% Thanks go to \lstthanks{Martin~Brodbeck}{Martin.Brodbeck@gmx.de}{2002/03/17}.
+%    \begin{macrocode}
+%%
+%% C-Sharp definition (c) 2002 Martin Brodbeck
+%%
+\lst@definelanguage[Sharp]{C}%
+  {morekeywords={abstract,base,bool,break,byte,case,catch,char,checked,%
+      class,const,continue,decimal,default,delegate,do,double,else,%
+      enum,event,explicit,extern,false,finally,fixed,float,for,foreach,%
+      goto,if,implicit,in,int,interface,internal,is,lock,long,%
+      namespace,new,null,object,operator,out,override,params,private,%
+      protected,public,readonly,ref,return,sbyte,sealed,short,sizeof,%
+      static,string,struct,switch,this,throw,true,try,typeof,uint,%
+      ulong,unchecked,unsafe,ushort,using,virtual,void,while,%
+      as,volatile,stackalloc},% Kai K\"ohne
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,%
+   morestring=[b]"
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Caml and Objective Caml}
+%
+% \lstthanks{Patrick~Cousot}{Patrick.Cousot@wanadoo.fr}{1999/01/09} mailed me
+% the definition. \lsthelper{Tom~Hirschowitz}{tom.hirschowitz@inria.fr}
+% {2003/05/27}{missing keywords: object, ref} added two keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% (Objective) Caml definition (c) 1999 Patrick Cousot
+%%
+%% Objective CAML and Caml light are freely available, together with a
+%% reference manual, at URL ftp.inria.fr/lang/caml-light for the Unix,
+%% Windows and Macintosh OS operating systems.
+%%
+\lst@definelanguage[Objective]{Caml}[light]{Caml}
+  {deletekeywords={not,prefix,value,where},%
+   morekeywords={assert,asr,class,closed,constraint,external,false,%
+      functor,include,inherit,land,lazy,lor,lsl,lsr,lxor,method,mod,%
+      module,new,open,parser,private,sig,struct,true,val,virtual,when,%
+      object,ref},% TH
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[light]{Caml}
+  {morekeywords={and,as,begin,do,done,downto,else,end,exception,for,%
+      fun,function,if,in,let,match,mutable,not,of,or,prefix,rec,then,%
+      to,try,type,value,where,while,with},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[b]",%
+   moredelim=*[directive]\#,%
+   moredirectives={open,close,include}%
+  }[keywords,comments,strings,directives]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Common Intermediate Language}
+%
+% This langauge definition for CIL (Common Intermediate Language, part 
+% of Microsoft's .NET interface) was provided by
+% \lsthelper{Olaf~Conradi}{-}{2006/08/23}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lstdefinelanguage{CIL}%
+  {morekeywords=[1]{assembly,beforefieldinit,class,default,cdecl,cil,corflags,%
+                    culture,custom,data,entrypoint,fastcall,field,file,%
+                    hidebysig,hash,il,imagebase,locals,managed,marshall,%
+                    maxstack,mresource,method,module,namespace,publickey,%
+                    stdcall,subsystem,thiscall,unmanaged,vararg,ver,vtfixup,%
+                   % types
+                    bool,char,float32,float64,int,int8,int16,int32,%
+                    int64,method,native,object,string,modopt,modreq,pinned,%
+                    typedref,valuetype,unsigned,void,%
+                   % defining types
+                    abstract,ansi,auto,autochar,beforefieldinit,boxed,class,%
+                    explicit,extends,implements,interface,famandassem,family,%
+                    famorassem,inherits,nested,override,pack,private,property,%
+                    public,rtspecialname,sealed,sequential,serializable,size,%
+                    specialname,static,unicode,%
+                   % postfix
+                    algorithm,alignment,extern,init,from,nometadata,with},%
+  morekeywords=[2]{add,and,arglist,beq,bge,bgt,ble,blt,bne,br,break,brfalse,%
+                    brtrue,call,calli,ceq,cgt,ckfinite,clt,conv,cpblk,div,%
+                    dup,endfilter,endfinally,initblk,jmp,ldarg,ldarga,ldc,%
+                    ldftn,ldind,ldloc,ldloca,ldnull,leave,localloc,mul,neg,%
+                    nop,not,or,pop,rem,ret,shl,shr,starg,stind,stloc,sub,%
+                    switch,xor,%
+                   % prefix
+                    tail,unaligned,volatile,%
+                   % postfix
+                    un,s,ovf,%
+                   % object
+                    box,callvirt,castclass,cpobj,cctor,ctor,initobj,isinst,%
+                    ldelem,ldelema,ldfld,ldflda,ldlen,ldobj,ldsfld,ldsflda,%
+                    ldstr,ldtoken,ldvirtftn,mkrefany,newarr,newobj,refanytype,%
+                    refanyval,rethrow,sizeof,stelem,stfld,stobj,stsfld,throw,%
+                    unbox},%
+  sensitive=true,%
+  morecomment=[l]{//},%
+  morestring=[b]"%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Cobol}
+%
+% Keywords are not marked if their names are broken by EOL, for example DEBUG-
+% CONTENTS. Sometimes portions of a string are not printed as a string.
+% This happens if the double quote is not doubled to insert a quote,
+% e.g.~|""bad" cobol"| won't be printed correctly.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[ibm]{Cobol}[1985]{Cobol}%
+  {morekeywords={ADDRESS,BEGINNING,COMP-3,COMP-4,COMPUTATIONAL,%
+      COMPUTATIONAL-3,COMPUTATIONAL-4,DISPLAY-1,EGCS,EJECT,ENDING,%
+      ENTRY,GOBACK,ID,MORE-LABELS,NULL,NULLS,PASSWORD,RECORDING,%
+      RETURN-CODE,SERVICE,SKIP1,SKIP2,SKIP3,SORT-CONTROL,SORT-RETURN,%
+      SUPPRESS,TITLE,WHEN-COMPILED},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[1985]{Cobol}[1974]{Cobol}%
+  {morekeywords={ALPHABET,ALPHABETIC-LOWER,ALPHABETIC-UPPER,%
+      ALPHANUMERIC,ALPHANUMERIC-EDITED,ANY,CLASS,COMMON,CONTENT,%
+      CONTINUE,DAY-OF-WEEK,END-ADD,END-CALL,END-COMPUTE,END-DELETE,%
+      END-DIVIDE,END-EVALUATE,END-IF,END-MULTIPLY,END-PERFORM,END-READ,%
+      END-RECEIVE,END-RETURN,END-REWRITE,END-SEARCH,END-START,%
+      END-STRING,END-SUBTRACT,END-UNSTRING,END-WRITE,EVALUATE,EXTERNAL,%
+      FALSE,GLOBAL,INITIALIZE,NUMERIC-EDITED,ORDER,OTHER,%
+      PACKED-DECIMAL,PADDING,PURGE,REFERENCE,RELOAD,REPLACE,STANDARD-1,%
+      STANDARD-2,TEST,THEN,TRUE},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[1974]{Cobol}%
+  {morekeywords={ACCEPT,ACCESS,ADD,ADVANCING,AFTER,ALL,ALPHABETIC,ALSO,%
+      ALTER,ALTERNATE,AND,ARE,AREA,AREAS,ASCENDING,ASSIGN,AT,AUTHOR,%
+      BEFORE,BINARY,BLANK,BLOCK,BOTTOM,BY,CALL,CANCEL,CD,CF,CH,%
+      CHARACTER,CHARACTERS,CLOCK-UNITS,CLOSE,COBOL,CODE,CODE-SET,%
+      COLLATING,COLUMN,COMMA,COMMUNICATION,COMP,COMPUTE,CONFIGURATION,%
+      CONTAINS,CONTROL,CONTROLS,CONVERTING,COPY,CORR,CORRESPONDING,%
+      COUNT,CURRENCY,DATA,DATE,DATE-COMPILED,DATE-WRITTEN,DAY,DE,%
+      DEBUG-CONTENTS,DEGUB-ITEM,DEBUG-LINE,DEBUG-NAME,DEBUG-SUB1,%
+      DEBUG-SUB2,DEBUG-SUB3,DEBUGGING,DECIMAL-POINT,DECLARATIVES,%
+      DELETE,DELIMITED,DELIMITER,DEPENDING,DESCENDING,DESTINATION,%
+      DETAIL,DISABLE,DISPLAY,DIVIDE,DIVISION,DOWN,DUPLICATES,DYNAMIC,%
+      EGI,ELSE,EMI,ENABLE,END,END-OF-PAGE,ENTER,ENVIRONMENT,EOP,EQUAL,%
+      ERROR,ESI,EVERY,EXCEPTION,EXIT,EXTEND,FD,FILE,FILE-CONTROL,%
+      FILLER,FINAL,FIRST,FOOTING,FOR,FROM,GENERATE,GIVING,GO,GREATER,%
+      GROUP,HEADING,HIGH-VALUE,HIGH-VALUES,I-O,I-O-CONTROL,%
+      IDENTIFICATION,IF,IN,INDEX,INDEXED,INDICATE,INITIAL,INITIATE,%
+      INPUT,INPUT-OUTPUT,INSPECT,INSTALLATION,INTO,INVALID,IS,JUST,%
+      JUSTIFIED,KEY,LABEL,LAST,LEADING,LEFT,LENGTH,LESS,LIMIT,LIMITS,%
+      LINAGE,LINAGE-COUNTER,LINE,LINE-COUNTER,LINES,LINKAGE,LOCK,%
+      LOW-VALUE,LOW-VALUES,MEMORY,MERGE,MESSAGE,MODE,MODULES,MOVE,%
+      MULTIPLE,MULTIPLY,NATIVE,NEGATIVE,NEXT,NO,NOT,NUMBER,NUMERIC,%
+      OBJECT-COMPUTER,OCCURS,OF,OFF,OMITTED,ON,OPEN,OPTIONAL,OR,%
+      ORGANIZATION,OUTPUT,OVERFLOW,PAGE,PAGE-COUNTER,PERFORM,PF,PH,PIC,%
+      PICTURE,PLUS,POINTER,POSITION,PRINTING,POSITIVE,PRINTING,%
+      PROCEDURE,PROCEDURES,PROCEED,PROGRAM,PROGRAM-ID,QUEUE,QUOTE,%
+      QUOTES,RANDOM,RD,READ,RECEIVE,RECORD,RECORDING,RECORDS,REDEFINES,%
+      REEL,REFERENCES,RELATIVE,RELEASE,REMAINDER,REMOVAL,RENAMES,%
+      REPLACING,REPORT,REPORTING,REPORTS,RERUN,RESERVE,RESET,RETURN,%
+      REVERSED,REWIND,REWRITE,RF,RH,RIGHT,ROUNDED,RUN,SAME,SD,SEARCH,%
+      SECTION,SECURITY,SEGMENT,SEGMENT-LIMIT,SELECT,SEND,SENTENCE,%
+      SEPARATE,SEQUENCE,SEQUENTIAL,SET,SIGN,SIZE,SORT,SORT-MERGE,%
+      SOURCE,SOURCE-COMPUTER,SPACE,SPACES,SPECIAL-NAMES,STANDARD,START,%
+      STATUS,STOP,STRING,SUB-QUEUE-1,SUB-QUEUE-2,SUB-QUEUE-3,SUBTRACT,%
+      SUM,SYMBOLIC,SYNC,SYNCHRONIZED,TABLE,TALLYING,TAPE,TERMINAL,%
+      TERMINATE,TEXT,THAN,THROUGH,THRU,TIME,TIMES,TO,TOP,TRAILING,TYPE,%
+      UNIT,UNSTRING,UNTIL,UP,UPON,USAGE,USE,USING,VALUE,VALUES,VARYING,%
+      WHEN,WITH,WORDS,WORKING-STORAGE,WRITE,ZERO,ZEROES,ZEROS},%
+   alsodigit=-,%
+   sensitive=f,% ???
+   morecomment=[f][commentstyle][6]*,%
+   morestring=[d]"% ??? doubled
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% \texttt{commentstyle} (not the surrounding brackets) have been added after
+% a bug report by \lsthelper{Stephen Reindl}{Stephen.Reindl@vodafone.de}
+% {2002/05/28}{no commentstyle in Cobol}.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Comal 80}
+%
+% The data is from
+% \begin{itemize}
+% \item
+%		\textsc{Borge R. Christensen}:
+%		\textbf{Strukturierte Programmierung mit COMAL 80} [aus dem
+%		D\"anischen \"ubertragen und bearbeitet von Margarete Kragh];
+%		2., verb.\ Auflage -- M\"unchen; Wien: Oldenburg, 1985;
+%		ISBN 3-486-26902-X.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Comal 80}%
+  {morekeywords={AND,AUTO,CASE,DATA,DEL,DIM,DIV,DO,ELSE,ENDCASE,ENDIF,%
+      ENDPROC,ENDWHILE,EOD,EXEC,FALSE,FOR,GOTO,IF,INPUT,INT,LIST,LOAD,%
+      MOD,NEW,NEXT,NOT,OF,OR,PRINT,PROC,RANDOM,RENUM,REPEAT,RND,RUN,%
+      SAVE,SELECT,STOP,TAB,THEN,TRUE,UNTIL,WHILE,ZONE},%
+   sensitive=f,% ???
+   morecomment=[l]//,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{COMMAND.COM Batch Files}
+%
+% This definition for DOS and Windows batch files is from
+% \lstthanks{Stephan Hennig}{-}{2006/10/11}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[WinXP]{command.com}%
+  {morekeywords={assoc,at,attrib,bootcfg,break,cacls,call,cd,chcp,chdir,%
+      chkdsk,chkntfs,cls,cmd,cmdextversion,color,comp,compact,convert,copy,%
+      date,defined,del,dir,diskcomp,diskcopy,do,doskey,echo,else,endlocal,%
+      erase,errorlevel,exist,exit,fc,find,findstr,for,format,ftype,goto,%
+      graftabl,help,if,in,label,md,mkdir,mode,more,move,not,off,path,%
+      pause,popd,print,prompt,pushd,rd,recover,ren,rename,replace,rmdir,%
+      set,setlocal,shift,sort,start,subst,time,title,tree,type,ver,%
+      verify,vol,xcopy},%
+   sensitive=false,%
+   alsoother={@},%
+   alsoletter={\%~:-/},%
+   morecomment=[l]{rem},%
+   morecomment=[l]{reM},%
+   morecomment=[l]{rEm},%
+   morecomment=[l]{rEM},%
+   morecomment=[l]{Rem},%
+   morecomment=[l]{ReM},%
+   morecomment=[l]{REm},%
+   morecomment=[l]{REM},%
+   morestring=[d]"%
+}[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Comsol Multiphysics}
+%
+% Comsol Multiphysics (Prior to version 3.2 known as Femlab) can be used 
+% standalone or as an extension to MatLab.  This definition is due to
+% \lstthanks{Martin~Heller}{-}{2006/05/10}.
+%
+% Unfortunately, there is a conflict in that Comsol is case-insensitive,
+% whereas Matlab is case-sensitive; \textsf{listings} does not
+% currently support different case-sensitivities in the same listing.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Comsol}%
+  {morekeywords={%
+      adaption,arc1,arc2,arrayr,assemble,asseminit,beziercurve2,block2,%
+      block3,bsplinecurve2,bsplinecurve3,bsplinesurf3,bypassplot,cardg,%
+      ccoeffgroup,chamfer,checkgeom,circ1,circ2,coeff2cell,comsol,%
+      cone2,cone3,Contents,createhexes,createprisms,createquads,csgbl2,%
+      csgbl3,csgcmpbz,csgimplbz,csginitaux,csginitnr,csgproputil,%
+      csgrbconv,csgunique3,csguniquep,csgversion,csgvvovl,curve2,%
+      curve3,cylinder2,cylinder3,dat2str,defastget,display,drawgetobj,%
+      drawreobj,drawsetobj,dst,duplicate,dxflayers,dxfread,dxfwrite,%
+      econe2,econe3,eigloop,elcconstr,elcplbnd,elcplextr,elcplproj,%
+      elcplscalar,elempty,elemreobj,eleqc,eleqw,elevate,elgeom,ellip1,%
+      ellip2,ellipsoid2,ellipsoid3,ellipsoidgen_fl23,elmat,elovar,%
+      elpconstr,elshape,elvar,elvarm,embed,extrude,face3,faceprim3,%
+      fastsetop,fem2jxfem,femblocksu,femdiff,femeig,femexport,femgui,%
+      femimport,femiter,femlab,femlin,femmesh,femmeshexp,femnlin,%
+      femplot,femsfun,femsim,femsimlowlevel,femsimserver,femsol,%
+      femsolver,femstate,femstruct,femtime,femwave,festyle,fieldnames,%
+      fillet,fl1d,fl2d,fl3d,flaction,flafun,flappconvert,flappobj,%
+      flaxisequal,flbase,flbinary,flc1hs,flc2hs,flcanpnt,flcell2draw,%
+      flclear,flcolorbar,flcompact,flconeplot,flcontour2mesh,%
+      flcontour2meshaux,flconvreact,flconvreact1d,flconvreact2d,%
+      flconvreact3d,flcyl,fldc1hs,fldc2hs,fldegree,fldegreer3,%
+      fldegreet3,fldimvarsget,fldisp,fldraw2cell,fldrawnow,fldsmhs,%
+      fldsmsign,flevalmat,flexch,flexchprop,flfastgeom,flform,flgc,%
+      flgcbo,flgdconv,flgeom2cellstr,flgeomadj,flgeomarcize,flgeomec,%
+      flgeomed,flgeomepol,flgeomes,flgeomfc,flgeomfd,flgeomfdp,%
+      flgeomff1,flgeomff2,flgeomfn,flgeomfs,flgeomgetlocalsys,%
+      flgeominit,flgeominitprop,flgeomitransform,flgeomloft,flgeommesh,%
+      flgeomnbs,flgeomnes,flgeomnmr,flgeomnv,flgeompsinv,flgeomrmsing,%
+      flgeomrotp,flgeomsd,flgeomsdim,flgeomse,flgeomsf2,flgeomspm,%
+      flgeomtransform,flgeomud,flgeomvtx,flgetdraw,flheat,flheat1d,%
+      flheat2d,flheat3d,flhelmholtz,flhelmholtz1d,flhelmholtz2d,%
+      flhelmholtz3d,flim2curve,flinterp1,fliscont,flismember,%
+      flisnumeric,fljaction,fllaplace,fllaplace1d,fllaplace2d,%
+      fllaplace3d,flload,flloadfl,flloadmatfile,flloadmfile,%
+      fllobj2cellstr,flmakeevalstr,flmapsoljac,flmat2str,flmatch,%
+      flmesh2spline,flmesh2splineaux,flml65setup,flngdof,flnull,%
+      flnullorth,flpde,flpdeac,flpdec,flpdec1d,flpdec2d,flpdec3d,%
+      flpdedc,flpdedc2d,flpdedc3d,flpdedf,flpdedf1d,flpdedf2d,%
+      flpdedf3d,flpdees,flpdees2d,flpdees3d,flpdeg,flpdeg1d,flpdeg2d,%
+      flpdeg3d,flpdeht,flpdeht1d,flpdeht2d,flpdeht3d,flpdems,flpdems2d,%
+      flpdems3d,flpdens,flpdens2d,flpdens3d,flpdepn,flpdeps,flpdesm3d,%
+      flpdew,flpdew1d,flpdew2d,flpdew3d,flpdewb,flpdewb1d,flpdewb2d,%
+      flpdewb3d,flpdewc,flpdewc1d,flpdewc2d,flpdewc3d,flpdewe,%
+      flpdewe3d,flpdewp,flpdewp2d,flpdewp3d,flplot,flpoisson,%
+      flpoisson1d,flpoisson2d,flpoisson3d,flpric2,flpric3,flreobj,%
+      flreport,flresolvepath,flsave,flschrodinger,flschrodinger1d,%
+      flschrodinger2d,flschrodinger3d,flsde,flsdp,flsdt,flsetalpha,%
+      flsetdraw,flsmhs,flsmsign,flspnull,fltherm_cond1,fltrg,flversion,%
+      flversions,flverver,flwave,flwave1d,flwave2d,flwave3d,%
+      flwriteghist,formstr,gdsread,gencyl2,gencyl3,genextrude,%
+      genextrudeaux,geom,geom0,geom0get,geom1,geom1get,geom2,geom2get,%
+      geom3,geom3get,geom3j2m,geom3m2j,geomaddlblmargin,geomanalyze,%
+      geomarrayr,geomassign,geomcoerce,geomcomp,geomconnect,geomcopy,%
+      geomcsg,geomdel,geomedit,geomexport,geomfile,geomget,%
+      geomgetlabels,geomgetwrkpln,geomimport,geominfo,geominfoaux,%
+      geomlblplot,geomload,geomnumparse,geomobject,geomparse,geomplot,%
+      geomplot1,geomplot2,geomplot3,geomposition,geomproputil,%
+      geomreconstruct,geomreobj,geomserver,geomspline,geomsurf,%
+      geomupdate,get,getfemgeom,getisocurve,getjptr,getmesh,getsdim,%
+      getvmatrixexch,handlesolnumstr,helix1,helix2,helix3,hexahedron2,%
+      hexahedron3,histfrommat,idst,igesread,importplotdata,isempty,%
+      isfield,isfunc,isscript,javaclass,jproputil,jptr2geom,jptrgeom1,%
+      jptrgeom1_fl23,jptrgeom2,jptrgeom2_fl23,jptrgeom3,jptrgeom3_fl23,%
+      keiter,line1,line2,loadobj,loft,matlabinterpdata,mesh2geom,%
+      meshassign,meshcaseadd,meshcasedel,meshcaseutil,meshcheck,%
+      meshembed,meshenrich,meshenrich1,meshenrich2,meshenrich3,%
+      meshexport,meshextend,meshextrude,meshget,meshimport,meshinit,%
+      meshintegrate,meshmap,meshoptim,meshparse,meshplot,meshplot1,%
+      meshplot2,meshplot3,meshplotproputil,meshpoi,meshproputil,%
+      meshptplot,meshqual,meshrefine,meshrevolve,meshsmooth,%
+      meshsmooth2,meshsweep,meshvolume,minus,mirror,mkreflparams,%
+      mmsolve,modetype,move,moveglobalfields,mphproputil,mtimes,%
+      multiphysics,mypostinterp,notscript,onlyelsconstr,outassign,%
+      paramgeom,pde2draw,pde2equ,pde2fem,pde2geom,pdeblxpd,plus,point1,%
+      point2,point3,poisson,poly1,poly2,postanim,postapplysettings,%
+      postarrow,postarrowbnd,postcolorbar,postcont,postcontdomind,%
+      postcoord,postcopyprop,postcrossplot,postdistrprops,posteval,%
+      postflow,postfnd,postgeomplot,postgetfem,postgetstylecolor,%
+      postglobaleval,postglobalplot,postgp,postinit,postint,postinterp,%
+      postiso,postlin,postmakecontcol,postmax,postmaxmin,postmin,%
+      postmkcontbar,postmknormexpr,postmovie,postnewplot,%
+      postoldmaxminprops,postpd2pm,postplot,postplotconstants,%
+      postpm2pd,postprinc,postprincbnd,postprocgui,postproputil,%
+      postslice,postsurf,posttet,posttitle,print2file,pyramid2,%
+      pyramid3,rect1,rect2,restorefields,revolve,rmfield,rotate,%
+      rotmatrix,scale,serialize,set,setmesh,sh2str,sharg_2_5,shbub,%
+      shdisc,shdiv,shherm,shlag,shvec,simplecoerce,simreobj,slblocks,%
+      solassign,solid0,solid1,solid2,solid3,solidprim3,solproputil,%
+      solsize,solveraddcases,sphere2,sphere3,spiceimport,splineaux,%
+      split,splittoprim,square1,square2,stlread,submode,submodes,%
+      subsasgn,subsref,tangent,taucs,tetrahedron2,tetrahedron3,%
+      tobsplines,torus2,torus3,transform,update,updateassoc,%
+      updateassocinfo,updatefem,updateguistruct,updateobj,vrmlread,%
+      xmeshinfo,xmeshinit},%
+   sensitive=false,%
+   morecomment=[l]\%,%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{bash, csh, and sh}
+%
+% csh is from \lstthanks{Kai~Below}{below@tu-harburg.de}{1998/09/21},
+% but he pointed out that some keywords are probably missing.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% csh definition (c) 1998 Kai Below
+%%
+\lst@definelanguage{csh}
+  {morekeywords={alias,awk,cat,echo,else,end,endif,endsw,exec,exit,%
+      foreach,glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
+      set,setenv,shift,source,switch,then,time,while,umask,unalias,%
+      unset,wait,while,@,env,argv,child,home,ignoreeof,noclobber,%
+      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
+      sqrt,BEGIN,END},%
+   morecomment=[l]\#,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% Thanks to \lstthanks{Riccardo~Murri}{riccardo.murri@gmx.it}{2003/09/24}
+% for the following two definitions.
+%    \begin{macrocode}
+%%
+%% bash,sh definition (c) 2003 Riccardo Murri 
+%%
+\lst@definelanguage{bash}[]{sh}%
+  {morekeywords={alias,bg,bind,builtin,command,compgen,complete,%
+      declare,disown,enable,fc,fg,history,jobs,et,local,logout,printf,%
+      pushd,popd,select,set,suspend,shopt,source,times,type,typeset,%
+      ulimit,unalias,wait},%
+  }%
+\lst@definelanguage{sh}%
+  {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,else,%
+      env,eval,exec,expr,exit,export,false,fi,for,function,getopts,%
+      hash,history,if,kill,nice,nohup,ps,pwd,read,readonly,return,%
+      sed,shift,test,then,times,trap,true,umask,unset,until,while},%
+   morecomment=[l]\#,%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Delphi}
+%
+% I took the data from Delphi 1.0 (?) online help.
+% \lstthanks{Christian~Gudrian}{chrigu@kawo1.rwth-aachen.de}{2001/08/16}
+% provided the `double slash' comment.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Delphi}%
+  {morekeywords={and,as,asm,array,begin,case,class,const,constructor,%
+      destructor,div,do,downto,else,end,except,exports,file,finally,%
+      for,function,goto,if,implementation,in,inherited,inline,%
+      initialization,interface,is,label,library,mod,nil,not,object,of,%
+      or,packed,procedure,program,property,raise,record,repeat,set,%
+      shl,shr,string,then,to,try,type,unit,until,uses,var,while,with,%
+      xor,%
+      absolute,abstract,assembler,at,cdecl,default,dynamic,export,%
+      external,far,forward,index,name,near,nodefault,on,override,%
+      private,protected,public,published,read,resident,storedDir,%
+      virtual,write},%
+   morendkeywords={Abs,AddExitProc,Addr,AllocMem,AnsiCompareStr,%
+      AnsiCompareText,AnsiLowerCase,AnsiUpperCase,Append,AppendStr,%
+      ArcTan,AssignCrt,Assigned,AssignFile,BlockRead,BlockWrite,Break,%
+      ChangeFileExt,ChDir,Chr,CloseFile,ClrEol,ClrScr,Concat,Continue,%
+      Copy,Cos,CSeg,CursorTo,Date,DateTimeToFileDate,DateTimeToStr,%
+      DateTimeToString,DateToStr,DayOfWeek,Dec,DecodeDate,DecodeTime,%
+      Delete,DeleteFile,DiskFree,DiskSize,Dispose,DisposeStr,%
+      DoneWinCrt,DSeg,EncodeDate,EncodeTime,Eof,Eoln,Erase,Exclude,%
+      Exit,Exp,ExpandFileName,ExtractFileExt,ExtractFileName,%
+      ExtractFilePath,FileAge,FileClose,FileDateToDateTime,FileExists,%
+      FileGetAttr,FileGetDate,FileOpen,FilePos,FileRead,FileSearch,%
+      FileSeek,FileSetAttr,FileSetDate,FileSize,FillChar,FindClose,%
+      FindFirst,FindNext,FloatToDecimal,FloatToStrF,FloatToStr,%
+      FloatToText,FloatToTextFmt,Flush,FmtLoadStr,FmtStr,Format,%
+      FormatBuf,FormatDateTime,FormatFloat,Frac,Free,FreeMem,GetDir,%
+      GetMem,GotoXY,Halt,Hi,High,Inc,Include,InitWinCrt,Insert,Int,%
+      IntToHex,IntToStr,IOResult,IsValidIdent,KeyPressed,Length,Ln,Lo,%
+      LoadStr,Low,LowerCase,MaxAvail,MemAvail,MkDir,Move,New,NewStr,%
+      Now,Odd,Ofs,Ord,ParamCount,ParamStr,Pi,Pos,Pred,Ptr,Random,%
+      Randomize,Read,ReadBuf,ReadKey,Readln,ReAllocMem,Rename,%
+      RenameFile,Reset,Rewrite,RmDir,Round,RunError,ScrollTo,Seek,%
+      SeekEof,SeekEoln,Seg,SetTextBuf,Sin,SizeOf,SPtr,Sqr,Sqrt,SSeg,%
+      Str,StrCat,StrComp,StrCopy,StrDispose,StrECopy,StrEnd,StrFmt,%
+      StrLCat,StrIComp,StrLComp,StrLCopy,StrLen,StrLFmt,StrLIComp,%
+      StrLower,StrMove,StrNew,StrPas,StrPCopy,StrPos,StrScan,StrRScan,%
+      StrToDate,StrToDateTime,StrToFloat,StrToInt,StrToIntDef,%
+      StrToTime,StrUpper,Succ,Swap,TextToFloat,Time,TimeToStr,%
+      TrackCursor,Trunc,Truncate,TypeOf,UpCase,UpperCase,Val,WhereX,%
+      WhereY,Write,WriteBuf,WriteChar,Writeln},%
+   sensitive=f,%
+   morecomment=[s]{(*}{*)},%
+   morecomment=[s]{\{}{\}},%
+   morecomment=[l]{//},% 2001 Christian Gudrian
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Eiffel}
+%
+% Data is from
+% \begin{itemize}
+% \item
+%       \textsc{Bertrand Meyer}: \textbf{Eiffel: the language};
+%       Prentice Hall International (UK) Ldt, 1992;
+%       ISBN 0-13-247925-7.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Eiffel}%
+  {morekeywords={alias,all,and,as,BIT,BOOLEAN,CHARACTER,check,class,%
+      creation,Current,debug,deferred,do,DOUBLE,else,elseif,end,%
+      ensure,expanded,export,external,false,feature,from,frozen,if,%
+      implies,indexing,infix,inherit,inspect,INTEGER,invariant,is,%
+      like,local,loop,NONE,not,obsolete,old,once,or,POINTER,prefix,%
+      REAL,redefine,rename,require,rescue,Result,retry,select,%
+      separate,STRING,strip,then,true,undefine,unique,until,variant,%
+      when,xor},%
+   sensitive,%
+   morecomment=[l]--,%
+   morestring=[d]",%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% The key=value \texttt{stringtest=false} has been removed after a bug
+% report from \lsthelper{Xavier~Cr\'egut}{cregut@enseeiht.fr}{2002/09/09}
+% {stringtest no more part of package}.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Elan}
+%
+% The data come from
+% \begin{itemize}
+% \item
+%		\textsc{Leo~H.~Klingen, Jochen Liedtke}:
+%		\textbf{Programmieren mit ELAN};
+%		B.G.\ Teubner, Stuttgart 1983; ISBN 3-519-02507-8.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Elan}%
+  {morekeywords={ABS,AND,BOOL,CAND,CASE,CAT,COLUMNS,CONCR,CONJ,CONST,%
+      COR,DECR,DEFINES,DET,DIV,DOWNTO,ELIF,ELSE,END,ENDIF,ENDOP,%
+      ENDPACKET,ENDPROC,ENDREP,ENDSELECT,FALSE,FI,FILE,FOR,FROM,IF,%
+      INCR,INT,INV,LEAVE,LENGTH,LET,MOD,NOT,OF,OP,OR,OTHERWISE,PACKET,%
+      PROC,REAL,REP,REPEAT,ROW,ROWS,SELECT,SIGN,STRUCT,SUB,TEXT,THEN,%
+      TRANSP,TRUE,TYPE,UNTIL,UPTO,VAR,WHILE,WITH,XOR,%
+      maxint,sign,abs,min,max,random,initializerandom,subtext,code,%
+      replace,text,laenge,pos,compress,change,maxreal,smallreal,floor,%
+      pi,e,ln,log2,log10,sqrt,exp,tan,tand,sin,sind,cos,cosd,arctan,%
+      arctand,int,real,lastconversionok,put,putline,line,page,get,%
+      getline,input,output,sequentialfile,maxlinelaenge,reset,eof,%
+      close,complexzero,complexone,complexi,complex,realpart,imagpart,%
+      dphi,phi,vector,norm,replace,matrix,idn,row,column,sub,%
+      replacerow,replacecolumn,replaceelement,transp,errorsstop,stop},%
+   sensitive,%
+   morestring=[d]"%
+  }[keywords,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Erlang}
+%
+% Thanks to \lstthanks{Daniel~Gazard}{gazard_d@epita.fr}{2003/05/31}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Erlang definition (c) 2003 Daniel Gazard
+%%
+\lst@definelanguage{erlang}%
+  {morekeywords={abs,after,and,apply,atom,atom_to_list,band,binary,%
+      binary_to_list,binary_to_term,bor,bsl,bsr,bxor,case,catch,%
+      date,div,element,erase,end,exit,export,float,float_to_list,%
+      get,halt,hash,hd,if,info,import,integer,integer_to_list,%
+      length,link,list,list_to_atom,list_to_float,list_to_integer,%
+      list_to_tuple,module,node,nodes,now,of,or,pid,port,ports,%
+      processes,put,receive,reference,register,registered,rem,%
+      round,self,setelement,size,spawn,throw,time,tl,trace,trunc,%
+      tuple,tuple_to_list,unlink,unregister,whereis,error,false,%
+      infinity,nil,ok,true,undefined,when},%
+   otherkeywords={->,!,[,],\{,\}},%
+   morecomment=[l]\%,%
+   morestring=[b]",%
+   morestring=[b]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Euphoria}
+%
+% \lstthanks{Detlef~Reimers}{dreimers@aol.com}{1998/08/30} sent me the language
+% definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Euphoria definition (c) 1998 Detlef Reimers
+%%
+\lst@definelanguage{Euphoria}%
+% for Euphoria 2.0, Rapid Deployment Software, Kanada
+  {morekeywords={abort,and,and_bits,append,arctan,atom,by,call,%
+      call_proc,call_func,c_proc,c_func,clear_screen,close,%
+      command_line,compare,constant,cos,do,date,else,elsif,end,exit,%
+      find,floor,for,function,getc,getenv,get_key,gets,global,%
+      get_pixel,if,include,integer,length,log,match,machine_func,%
+      machine_proc,mem_copy,mem_set,not,not_bits,or,object,open,%
+      or_bits,procedure,puts,position,prepend,print,printf,power,peek,%
+      poke,pixel,poke4,peek4s,peek4u,return,rand,repeat,remainder,%
+      routine_id,sequence,sqrt,sin,system,sprintf,then,type,to,time,%
+      trace,tan,while,with,without,xor,xor_bits},%
+   sensitive,%
+   morecomment=[l]--,%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Fortran}
+%
+% Took things from
+% \begin{itemize}
+% \item
+%		\textsc{Karl Hans M\"uller}:
+%		\textbf{Fortran 77: Programmierungsanleitung};
+%		3., v\"ollig neu bearb.\ Aufl.\ -- Mannheim; Wien; Z\"urich:
+%		Bibliographisches Institut, 1984;
+%		ISBN 3-411-05804-8
+% \item
+%       \textsc{Thomas Michel}: \textbf{Fortran 90: Lehr-- und Handbuch};
+%       Mannheim; Leipzig; Wien; Z\"urich: BI-Wiss.-Verlag, 1994;
+%       ISBN 3-411-16861-7.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% \lsthelper{Denis Girou}{Denis.Girou@idris.fr}{1998/07/26}{Fortran 95=90}
+% proposed to have Fortran 95 and Fortran 90 to be equivalent.
+%    \begin{macrocode}
+\lst@definelanguage[90]{Fortran}[95]{Fortran}{}
+%    \end{macrocode}
+% There is no |morecomment=[f]| in Fortran 90 since otherwise CONTAINS could
+% start a comment. This problem was reported by \lsthelper{Magne Rudshaug}
+% {magne@ife.no}{1998/01/09}{no morecomment=[f] in Fortran 90}.
+% Moreover the keyword INCLUDE is due to him.
+%    \begin{macrocode}
+\lst@definelanguage[95]{Fortran}[77]{Fortran}%
+  {deletekeywords=SAVE,%
+   morekeywords={ACTION,ADVANCE,ALLOCATE,ALLOCATABLE,ASSIGNMENT,CASE,%
+      CONTAINS,CYCLE,DEALLOCATE,DEFAULT,DELIM,EXIT,INCLUDE,IN,NONE,IN,%
+      OUT,INTENT,INTERFACE,IOLENGTH,KIND,LEN,MODULE,NAME,NAMELIST,NMT,%
+      NULLIFY,ONLY,OPERATOR,OPTIONAL,OUT,PAD,POINTER,POSITION,PRIVATE,%
+      PUBLIC,READWRITE,RECURSIVE,RESULT,SELECT,SEQUENCE,SIZE,STAT,%
+      TARGET,USE,WHERE,WHILE,BLOCKDATA,DOUBLEPRECISION,%
+      ENDBLOCKDATA,ENDFILE,ENDFUNCTION,ENDINTERFACE,%
+      ENDMODULE,ENDPROGRAM,ENDSELECT,ENDSUBROUTINE,ENDTYPE,ENDWHERE,%
+      INOUT,SELECTCASE},%
+   deletecomment=[f],% no fixed comment line: 1998 Magne Rudshaug
+   morecomment=[l]!%
+  }%
+%    \end{macrocode}
+% As proposed by \lsthelper{J\"orn Wilms}{wilms@rocinante.colorado.edu}
+% {1997/07/07}{Fortran with \lstsensitivefalse} keywords are \emph{not} case
+% sensitive.  Also, note that Fortran 77 (and fixed-format source in later
+% versions) allows space in keywords; thus, this list contains some of the
+% more common variants (e.g., `GO TO' and `GOTO').
+%    \begin{macrocode}
+\lst@definelanguage[77]{Fortran}%
+  {morekeywords={ACCESS,ASSIGN,BACKSPACE,BLANK,BLOCK,CALL,CHARACTER,%
+      CLOSE,COMMON,COMPLEX,CONTINUE,DATA,DIMENSION,DIRECT,DO,DOUBLE,%
+      ELSE,ELSEIF,END,ENDIF,ENDDO,ENTRY,EOF,EQUIVALENCE,ERR,EXIST,EXTERNAL,%
+      FILE,FMT,FORM,FORMAT,FORMATTED,FUNCTION,GO,TO,GOTO,IF,IMPLICIT,%
+      INQUIRE,INTEGER,INTRINSIC,IOSTAT,LOGICAL,NAMED,NEXTREC,NUMBER,%
+      OPEN,OPENED,PARAMETER,PAUSE,PRECISION,PRINT,PROGRAM,READ,REAL,%
+      REC,RECL,RETURN,REWIND,SEQUENTIAL,STATUS,STOP,SUBROUTINE,THEN,%
+      TYPE,UNFORMATTED,UNIT,WRITE,SAVE},%
+   sensitive=f,%% not Fortran-77 standard, but allowed in Fortran-95 %%
+   morecomment=[f]*,%
+   morecomment=[f]C,%
+   morecomment=[f]c,%
+   morestring=[d]",%% not Fortran-77 standard, but allowed in Fortran-95 %%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Guarded Command Language (GCL)}
+%
+% As you can read below, \lstthanks{Mark~van~Eijk}{mark@luon.net}{2002/10/30}
+% provided this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Guarded Command Language (GCL)  definition
+%% (c) 2002 Mark van Eijk
+%%
+\lst@definelanguage{GCL}%
+  {morekeywords={const,con,var,array,of,skip,if,fi,do,od,div,mod},%
+   literate={|[}{\ensuremath{|\hskip -0.1em[}}2%
+            {]|}{\ensuremath{]\hskip -0.1em|}}2%
+	    {[]}{\ensuremath{[\hskip -0.1em]}}2%
+	    {->}{\ensuremath{\rightarrow}~}2%
+	    {==}{\ensuremath{\equiv}~}2%
+	    {>=}{\ensuremath{\geq}~}2%
+	    {<=}{\ensuremath{\leq}~}2%
+	    {/\\}{\ensuremath{\land}~}2%
+	    {\\/}{\ensuremath{\lor}~}2%
+	    {!}{\ensuremath{\lnot}}1%
+	    {!=}{\ensuremath{\neq}~}2%
+	    {max}{\ensuremath{\uparrow}}1%
+	    {min}{\ensuremath{\downarrow}}1,%
+   sensitive=f,%
+   morecomment=[s]{\{}{\}},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Gnuplot}
+%
+% Thanks to \lsthelper{Dr.~Christoph~Giess}{Ch.Giess@gmx.de}{2003/07/15}{} for
+% providing this definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%%
+%% gnuplot definition (c) Christoph Giess
+%%
+\lst@definelanguage{Gnuplot}%
+  {keywords={abs,acos,acosh,arg,asin,asinh,atan,atan2,atanh,besj0,%
+       besj1,besy0,besy1,ceil,cos,cosh,erf,erfc,exp,floor,gamma,ibeta,%
+       inverf,igamma,imag,invnorm,int,lgamma,log,log10,norm,rand,real,%
+       sgn,sin,sinh,sqrt,tan,tanh,column,tm_hour,tm_mday,tm_min,tm_mon,%
+       tm_sec,tm_wday,tm_yday,tm_year,valid,cd,call,clear,exit,fit,%
+       help,if,load,pause,plot,print,pwd,quit,replot,reread,reset,save,%
+       set,show,shell,splot,test,update,angles,arrow,autoscale,border,%
+       boxwidth,clabel,clip,cntrparam,contour,data,dgrid3d,dummy,%
+       format,function,functions,grid,hidden3d,isosamples,key,keytitle,%
+       label,logscale,mapping,offsets,output,parametric,pointsize,%
+       polar,rrange,samples,size,style,surface,terminal,tics,time,%
+       timefmt,title,trange,urange,variables,view,vrange,xdata,xlabel,%
+       xmargin,xrange,xtics,mxtics,mytics,xdtics,xmtics,xzeroaxis,%
+       ydata,ylabel,yrange,ytics,ydtics,ymtics,yzeroaxis,zdata,zero,%
+       zeroaxis,zlabel,zrange,ztics,zdtics,zmtics,timefm,using,title,%
+       with,index,every,thru,smooth},%
+   sensitive,%
+   comment=[l]\#,%
+   morestring=[b]",%
+   morestring=[b]',%
+  }[keywords,comments,strings]%
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Haskell}
+%
+% Thanks to \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de}{1999/11/18} for
+% providing the new definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Haskell98 as implemented in Hugs98. See http://www.haskell.org
+%% All keywords from Prelude and Standard Libraries
+%% (c) 1999 Peter Bartke
+%%
+\lst@definelanguage{Haskell}%
+  {otherkeywords={=>},%
+   morekeywords={abstype,if,then,else,case,class,data,default,deriving,%
+      hiding,if,in,infix,infixl,infixr,import,instance,let,module,%
+      newtype,of,qualified,type,where,do,AbsoluteSeek,AppendMode,%
+      Array,BlockBuffering,Bool,BufferMode,Char,Complex,Double,Either,%
+      FilePath,Float,Int,Integer,IO,IOError,Ix,LineBuffering,Maybe,%
+      Ordering,NoBuffering,ReadMode,ReadWriteMode,ReadS,RelativeSeek,%
+      SeekFromEnd,SeekMode,ShowS,StdGen,String,Void,Bounded,Enum,Eq,%
+      Eval,ExitCode,exitFailure,exitSuccess,Floating,Fractional,%
+      Functor,Handle,HandlePosn,IOMode,Integral,List,Monad,MonadPlus,%
+      MonadZero,Num,Numeric,Ord,Random,RandomGen,Ratio,Rational,Read,%
+      Real,RealFloat,RealFrac,Show,System,Prelude,EQ,False,GT,Just,%
+      Left,LT,Nothing,Right,WriteMode,True,abs,accum,accumArray,%
+      accumulate,acos,acosh,all,and,any,ap,appendFile,applyM,%
+      approxRational,array,asTypeOf,asin,asinh,assocs,atan,atan2,atanh,%
+      bounds,bracket,bracket_,break,catch,catMaybes,ceiling,chr,cis,%
+      compare,concat,concatMap,conjugate,const,cos,cosh,curry,cycle,%
+      decodeFloat,delete,deleteBy,deleteFirstsBy,denominator,%
+      digitToInt,div,divMod,drop,dropWhile,either,elem,elems,elemIndex,%
+      elemIndices,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,%
+      enumFromTo,error,even,exitFailure,exitWith,exp,exponent,fail,%
+      filter,filterM,find,findIndex,findIndices,flip,floatDigits,%
+      floatRadix,floatRange,floatToDigits,floor,foldl,foldM,foldl1,%
+      foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,%
+      fromIntegral,fromJust,fromMaybe,fromRat,fromRational,%
+      fromRealFrac,fst,gcd,genericLength,genericTake,genericDrop,%
+      genericSplitAt,genericIndex,genericReplicate,getArgs,getChar,%
+      getContents,getEnv,getLine,getProgName,getStdGen,getStdRandom,%
+      group,groupBy,guard,hClose,hFileSize,hFlush,hGetBuffering,%
+      hGetChar,hGetContents,hGetLine,hGetPosn,hIsClosed,hIsEOF,hIsOpen,%
+      hIsReadable,hIsSeekable,hIsWritable,hLookAhead,hPutChar,hPutStr,%
+      hPutStrLn,hPrint,hReady,hSeek,hSetBuffering,hSetPosn,head,%
+      hugsIsEOF,hugsHIsEOF,hugsIsSearchErr,hugsIsNameErr,%
+      hugsIsWriteErr,id,ioError,imagPart,index,indices,init,inits,%
+      inRange,insert,insertBy,interact,intersect,intersectBy,%
+      intersperse,intToDigit,ioeGetErrorString,ioeGetFileName,%
+      ioeGetHandle,isAlreadyExistsError,isAlreadyInUseError,isAlpha,%
+      isAlphaNum,isAscii,isControl,isDenormalized,isDoesNotExistError,%
+      isDigit,isEOF,isEOFError,isFullError,isHexDigit,isIEEE,%
+      isIllegalOperation,isInfinite,isJust,isLower,isNaN,%
+      isNegativeZero,isNothing,isOctDigit,isPermissionError,isPrefixOf,%
+      isPrint,isSpace,isSuffixOf,isUpper,isUserError,iterate,ixmap,%
+      join,last,lcm,length,lex,lexDigits,lexLitChar,liftM,liftM2,%
+      liftM3,liftM4,liftM5,lines,listArray,listToMaybe,log,logBase,%
+      lookup,magnitude,makePolar,map,mapAccumL,mapAccumR,mapAndUnzipM,%
+      mapM,mapM_,mapMaybe,max,maxBound,maximum,maximumBy,maybe,%
+      maybeToList,min,minBound,minimum,minimumBy,mkPolar,mkStdGen,%
+      mplus,mod,msum,mzero,negate,next,newStdGen,not,notElem,nub,nubBy,%
+      null,numerator,odd,openFile,or,ord,otherwise,partition,phase,pi,%
+      polar,pred,print,product,properFraction,putChar,putStr,putStrLn,%
+      quot,quotRem,random,randomIO,randomR,randomRIO,randomRs,randoms,%
+      rangeSize,read,readDec,readFile,readFloat,readHex,readInt,readIO,%
+      readList,readLitChar,readLn,readParen,readOct,readSigned,reads,%
+      readsPrec,realPart,realToFrac,recip,rem,repeat,replicate,return,%
+      reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,%
+      sequence_,setStdGen,show,showChar,showEFloat,showFFloat,%
+      showFloat,showGFloat,showInt,showList,showLitChar,showParen,%
+      showSigned,showString,shows,showsPrec,significand,signum,sin,%
+      sinh,snd,sort,sortBy,span,split,splitAt,sqrt,stderr,stdin,stdout,%
+      strict,subtract,succ,sum,system,tail,tails,take,takeWhile,tan,%
+      tanh,toEnum,toInt,toInteger,toLower,toRational,toUpper,transpose,%
+      truncate,try,uncurry,undefined,unfoldr,union,unionBy,unless,%
+      unlines,until,unwords,unzip,unzip3,unzip4,unzip5,unzip6,unzip7,%
+      userError,when,words,writeFile,zero,zip,zip3,zip4,zip5,zip6,zip7,%
+      zipWith,zipWithM,zipWithM_,zipWith3,zipWith4,zipWith5,zipWith6,%
+      zipWith7},%
+   sensitive,%
+   morecomment=[l]--,%
+   morecomment=[n]{\{-}{-\}},%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{HTML}
+%
+% I'm quite the opposite of a HTML wizard. In particular this is true for the
+% defined keywords. \lstthanks{Matthias~Bethke}{-}{2003/09/01} helped me out
+% and extended the list.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{HTML}%
+  {morekeywords={A,ABBR,ACRONYM,ADDRESS,APPLET,AREA,B,BASE,BASEFONT,%
+      BDO,BIG,BLOCKQUOTE,BODY,BR,BUTTON,CAPTION,CENTER,CITE,CODE,COL,%
+      COLGROUP,DD,DEL,DFN,DIR,DIV,DL,DOCTYPE,DT,EM,FIELDSET,FONT,FORM,%
+      FRAME,FRAMESET,HEAD,HR,H1,H2,H3,H4,H5,H6,HTML,I,IFRAME,IMG,INPUT,%
+      INS,ISINDEX,KBD,LABEL,LEGEND,LH,LI,LINK,LISTING,MAP,META,MENU,%
+      NOFRAMES,NOSCRIPT,OBJECT,OPTGROUP,OPTION,P,PARAM,PLAINTEXT,PRE,%
+      OL,Q,S,SAMP,SCRIPT,SELECT,SMALL,SPAN,STRIKE,STRING,STRONG,STYLE,%
+      SUB,SUP,TABLE,TBODY,TD,TEXTAREA,TFOOT,TH,THEAD,TITLE,TR,TT,U,UL,%
+      VAR,XMP,%
+      accesskey,action,align,alink,alt,archive,axis,background,bgcolor,%
+      border,cellpadding,cellspacing,charset,checked,cite,class,classid,%
+      code,codebase,codetype,color,cols,colspan,content,coords,data,%
+      datetime,defer,disabled,dir,event,error,for,frameborder,headers,%
+      height,href,hreflang,hspace,http-equiv,id,ismap,label,lang,link,%
+      longdesc,marginwidth,marginheight,maxlength,media,method,multiple,%
+      name,nohref,noresize,noshade,nowrap,onblur,onchange,onclick,%
+      ondblclick,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,%
+      profile,readonly,onmousemove,onmouseout,onmouseover,onmouseup,%
+      onselect,onunload,rel,rev,rows,rowspan,scheme,scope,scrolling,%
+      selected,shape,size,src,standby,style,tabindex,text,title,type,%
+      units,usemap,valign,value,valuetype,vlink,vspace,width,xmlns},%
+   tag=**[s]<>,%
+   sensitive=f,%
+   morestring=[d]",% ??? doubled
+%    \end{macrocode}
+% Now we take care of comments.
+% We don't enter comment mode if we aren't inside |<>|.
+%    \begin{macrocode}
+   MoreSelectCharTable=%
+      \lst@CArgX--\relax\lst@DefDelimB{}{}%
+          {\ifnum\lst@mode=\lst@tagmode\else
+               \expandafter\@gobblethree
+           \fi}%
+          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
+      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
+          \lst@EndComment\lst@commentmode
+  }[keywords,comments,strings,html]%
+%    \end{macrocode}
+% \lsthelper{Peter~Biechele}{peter.biechele@physik.uni-freiburg.de}
+% {1999/07/01}{! Missing $\}$ inserted} reported a problem which was due to
+% missing |\@empty| in value of |SelectCharTable|. And after receiving a bug
+% report from \lsthelper{Jochen Schneider}{jschneider@ds3.etech.haw-hamburg.de}
+% {2002/04/05}{use of \lst@thestyle doesn't match its definition} I converted
+% the version 0.21 contents of |MoreSelectCharTable| to version 1.0.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{IDL}
+%
+% The definition is from \lstthanks{J\"urgen~Heim}
+% {heim@astro.uni-tuebingen.de}{1998/07/27}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% IDL definition (c) 1998 Juergen Heim
+%%
+\lst@definelanguage{IDL}%
+  {morekeywords={and,begin,case,common,do,else,end,endcase,endelse,%
+      endfor,endif,endrep,endwhile,eq,for,function,ge,goto,gt,if,le,lt,%
+      mod,ne,not,of,on_ioerror,or,pro,repeat,return,then,until,while,%
+      xor,on_error,openw,openr,openu,print,printf,printu,plot,read,%
+      readf,readu,writeu,stop},%
+   sensitive=f,%
+   morecomment=[l];,%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Inform}
+%
+% Thanks to \lstthanks{Jonathan~Sauer}{jonathan.sauer@gmx.de}{2003/11/10}
+% for this language definition. \lsthelper{Ulrike Fischer}{-}{2004/04/21}
+% {Bug in listings.sty} pointed out that |\lstdefinelanguage| should be
+% |\lst@definelanguage|.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Inform definition (c) 2003 Jonathan Sauer
+%%
+\lst@definelanguage{inform}{%
+    % Language keywords
+    morekeywords={breakdo,else,false,for,has,hasnt,if,%
+                in,indirect,jump,notin,nothing,NULL,objectloop,ofclass,%
+                private,property,provides,return,rfalse,rtrue,self,string,%
+                switch,to,true,until,while,with,%
+                creature,held,multiexcept,multiheld,multiinside,noun,number,%
+                scope,topic},%
+    %
+    % Inform functions
+    morekeywords=[2]{box,child,children,font,give,inversion,metaclass,move,%
+                new_line,parent,print,print_ret,read,remove,restore,sibling,%
+                save,spaces,quit,style,bold,underline,reverse,roman remaining,%
+                create,destroy,recreate,copy},%
+    %
+    % Inform definitions
+    morekeywords=[3]{Attribute,Array,Class,Constant,Default,End,Endif,Extend,%
+                Global,Ifdef,Iffalse,Ifndef,Ifnot,Iftrue,Include,Object,%
+                Property,Verb,Release,Serial,Statusline},%
+    %
+    % Library attributes
+    morekeywords=[4]{absent,animate,clothing,concealed,container,door,edible,%
+                enterable,female,general,light,lockable locked,male,moved,%
+                neuter,on,open,openable,pluralname,proper,scenery,scored,%
+                static,supporter,switchable,talkable,transparent,visited,%
+                workflag,worn},%
+    %
+    % Libary properties
+    morekeywords=[5]{n_to,s_to,e_to,w_to,ne_to,nw_to,se_to,sw_to,in_to,%
+                out_to,u_to,d_to,add_to_scope,after,article,articles,before,%
+                cant_go,capacity,daemon,describe,description,door_dir,door_to,%
+                each_turn,found_in,grammar,initial,inside_description,invent,%
+                life,list_together,name number,orders,parse_name,plural,%
+                react_after,react_before,short_name,short_name_indef,time_left,%
+                time_out,when_closed,when_open,when_on,when_off,%
+                with_key}, 
+    %
+    % Library routines
+    morekeywords=[6]{Achieved,AfterRoutines,AllowPushDir,Banner,ChangePlayer,%
+                CommonAncestor,DictionaryLookup,GetGNAOfObject,HasLightSource,%
+                IndirectlyContains,IsSeeThrough,Locale,LoopOverScope,LTI_Insert,%
+                MoveFloatingObjects,NextWord,NextWordStopped,NounDomain,%
+                ObjectIsUntouchable OffersLight,ParseToken,PlaceInScope,PlayerTo,%
+                PronounNotice,PronounValue,ScopeWithin,SetPronoun,SetTime,%
+                StartDaemon,StartTimer,StopDaemon,StopTimer,TestScope,TryNumber,%
+                UnsignedCompare,WordAddress,WordInProperty,WordLength,%
+                WriteListFrom,YesOrNo},%
+    %
+    % Library,entry points
+    morekeywords=[7]{AfterLife,AfterPrompt,Amusing,BeforeParsing,ChooseObjects,%
+                DarkToDark,DeathMessage,GamePostRoutine GamePreRoutine,%
+                Initialise,InScope,LookRoutine,NewRoom,ParseNoun,ParseNumber,%
+                ParserError,PrintRank,PrintTaskName,PrintVerb,TimePasses,%
+                UnknownVerb},%
+    %
+    % Library constants
+    morekeywords=[8]{NEWLINE_BIT,INDENT_BIT,FULLINV_BIT,ENGLISH_BIT,RECURSE_BIT,%
+                ALWAYS_BIT,TERSE_BIT,PARTINV_BIT,DEFART_BIT,WORKFLAG_BIT,%
+                ISARE_BIT,CONCEAL_BIT},%
+    %
+    % Library,meta actions
+    morekeywords=[9]{Pronouns,Quit,Restart,Restore,Save,Verify,ScriptOn,ScriptOff,%
+                NotifyOn,NotifyOff,Places,Objects,Score,FullScore,Version,LMode1,%
+                LMode2,Lmode3},%
+    %
+    % Library,main actions
+    morekeywords=[10]{Close,Disrobe,Drop,Eat,Empty,EmptyT,Enter,Examine,Exit,GetOff,%
+                Give,Go,GoIn,Insert,Inv,InvTall,InvWide,Lock,Look,Open,PutOn,Remove,%
+                Search,Show,SwitchOff,SwitchOn,Take,Transfer,Unlock VagueGo,%
+                Wear},%
+    %
+    % Library,stub actions
+    morekeywords=[11]{Answer,Ask,AskFor,Attack,Blow,Burn,Buy,Climb,Consult,Cut,Dig,%
+                Drink,Fill,Jump,JumpOver,Kiss,Listen,LookUnder,Mild,No,Pray,Pull,%
+                Push,PushDir,Rub,Set,SetTo,Sing,Sleep,Smell,,Sleep,Smell,Sorry,%
+                Squeeze,Strong,Swim,Swing,Taste,Tell,Think,ThrowAt,Tie,Touch,Turn,%
+                Wait,Wake,WakeOther,Wave,WaveHands,Yes},%
+    %
+    otherkeywords={->,-->},%
+    sensitive=false,%
+    morestring=[d]{"},%
+    morecomment=[l]{!}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Java}
+%
+% \lstthanks{Robert~Wenner}{robert.wenner@gmx.de}{2003/03/27} sent in the
+% first of the following two definitions.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% AspectJ definition (c) Robert Wenner
+%%
+\lst@definelanguage[AspectJ]{Java}[]{Java}%
+  {morekeywords={%
+      adviceexecution,after,args,around,aspect,aspectOf,before,%
+      call,cflow,cflowbelow,%
+% declare error,declare parents,declare precedence,
+% declare soft,declare warning,
+      execution,get,handler,if,initialization,issingleton,pointcut,%
+      percflow,percflowbelow,perthis,pertarget,preinitialization,%
+      privileged,proceed,returning,set,staticinitialization,strictfp,%
+      target,this,thisEnclosingJoinPoint,thisJoinPoint,throwing,%
+      within,withincode},%
+   MoreSelectCharTable=%
+     \lst@DefSaveDef{`.}\lst@umdot{\lst@umdot\global\let\lst@derefop\@empty}%
+     \ifx\lst@derefinstalled\@empty\else
+        \global\let\lst@derefinstalled\@empty
+\lst@AddToHook{Output}%
+{\lst@ifkeywords
+    \ifx\lst@derefop\@empty
+       \global\let\lst@derefop\relax
+       \ifx\lst@thestyle\lst@gkeywords@sty
+          \ifx\lst@currstyle\relax
+             \let\lst@thestyle\lst@identifierstyle
+          \else
+             \let\lst@thestyle\lst@currstyle
+          \fi
+       \fi
+    \fi
+ \fi}
+\lst@AddToHook{BOL}{\global\let\lst@derefop\relax}%
+\lst@AddTo\lst@ProcessSpace{\global\let\lst@derefop\relax}%
+     \fi
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+% Got data from \texttt{http://java.sun.com}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Java}%
+  {morekeywords={abstract,boolean,break,byte,case,catch,char,class,%
+      const,continue,default,do,double,else,extends,false,final,%
+      finally,float,for,goto,if,implements,import,instanceof,int,%
+      interface,label,long,native,new,null,package,private,protected,%
+      public,return,short,static,super,switch,synchronized,this,throw,%
+      throws,transient,true,try,void,volatile,while},%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]',%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% \lsthelper{Herbert Voss}{Herbert.Voss@alumni.TU-Berlin.de}{2002/07/30}
+% {missing keyword label} added the keyword \texttt{label}.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+% \lstthanks{Martine~Gautier}{Martine.Gautier@loria.fr}{2004/03/30} made the
+% following contribution.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ByteCodeJava definition (c) 2004 Martine Gautier
+%%
+\lst@definelanguage{JVMIS}%
+  {morekeywords={aaload,astore,aconst_null,aload,aload_0,aload_1,%
+      aload_2,aload_3,anewarray,areturn,arraylength,astore,astore_0,%
+      astore_1,astore_2,astore_3,athrow,baload,bastore,bipush,caload,%
+      castore,checkcast,d2f,d2i,d2l,dadd,daload,dastore,dcmpg,dcmpl,%
+      dconst_0,dconst_1,ddiv,dload,dload_0,dload_1,dload_2,dload_3,%
+      dmul,dneg,drem,dreturn,dstore,dstore_0,dstore_1,dstore_2,%
+      dstore_3,dsub,dup,dup_x1,dup_x2,dup2,dup2_x1,dup2_x2,f2d,%
+      f2i,f2l,fadd,faload,fastore,fcmpg,fcmpl,fconst_0,fconst_1,%
+      fconst_2,fdiv,fload,fload_0,fload_1,fload_2,fload_3,fmul,%
+      fneg,frem,freturn,fstore,fstore_0,fstore_1,fstore_2,fstore_3,%
+      fsub,getfield,getstatic,goto,goto_w,i2b,i2c,i2d,i2f,i2l,i2s,%
+      iadd,iaload,iand,iastore,iconst_0,iconst_1,iconst_2,iconst_3,%
+      iconst_4,iconst_5,idiv,if_acmpeq,if_acmpne,if_icmpeq,if_icmpne,%
+      if_icmplt,if_cmpge,if_cmpgt,if_cmple,ifeq,ifne,iflt,ifge,ifgt,%
+      ifle,ifnonnull,ifnull,iinc,iload,iload_0,iload_1,iload_2,%
+      iload_3,imul,ineg,instanceof,invokeinterface,invokespecial,%
+      invokestatic,invokevirtual,ior,irem,ireturn,ishl,ishr,istore,%
+      istore_0,istore_1,istore_2,istore_3,isub,iushr,ixor,jsr,jsr_w,%
+      l2d,l2f,l2i,ladd,laload,land,lastore,lcmp,lconst_0,lconst_1,%
+      ldc,ldc_w,ldc2_w,ldiv,lload,lload_0,lload_1,lload_2,lload_3,%
+      lmul,lneg,lookupswitch,lor,lrem,lreturn,lshl,lshr,lstore,%
+      lstore_0,lstore_1,lstore_2,lstore_3,lsub,lushr,lxor,%
+      monitorenter,monitorexit,multianewarray,new,newarray,nop,pop,%
+      pop2,putfield,putstatic,ret,return,saload,sastore,sipush,swap,%
+      tableswitch,wide,limit,locals,stack},%
+  }[keywords]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ksh}
+%
+% Thanks to \lstthanks{Jeffrey Ratcliffe}{Jeffrey.Ratcliffe@m.eads.net}
+% {2002/02/21} for this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{ksh}
+  {morekeywords={alias,awk,cat,echo,else,elif,fi,exec,exit,%
+      for,in,do,done,select,case,esac,while,until,function,%
+      time,export,cd,eval,fc,fg,kill,let,pwd,read,return,rm,%
+      glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,%
+      set,setenv,shift,source,switch,then,umask,unalias,%
+      unset,wait,@,env,argv,child,home,ignoreeof,noclobber,%
+      noglob,nomatch,path,prompt,shell,status,verbose,print,printf,%
+      sqrt,BEGIN,END},%
+   morecomment=[l]\#,%
+   morestring=[d]",%
+   morestring=[d]',%
+   morestring=[d]`%
+  }[keywords,comments,strings]%
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \lsthelper{Herbert Voss}{Herbert.Voss@alumni.TU-Berlin.de}{2002/10/28}
+% {[Fwd: Re: Probleme mit Paket listings bei ksh]} suggested to add the
+% string delimiter |`|.
+% \endgroup
+%
+%
+% \subsection{Lingo}
+%
+% Thanks to \lstthanks{Mark Schade}{-}{2006/07/26} for this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Lingo}
+  {morekeywords={abort,after,and,before,do,down,halt,me,new,not,of,%
+      on,or,otherwise,pass,put,result,return,set,tell,the,then,to,with,%
+      repeat,while,case,if,else,true,false,global,property,\_global,\_key,%
+      \_mouse,\_movie,\_player,\_sound,\_system,abbr,abbrev,abbreviated,abs,%
+      actionsenabled,activateapplication,activatewindow,active3drenderer,%
+      activecastlib,activewindow,actorlist,add,addat,addbackdrop,addcamera,%
+      addchild,addmodifier,addoverlay,addprop,addtoworld,addvertex,alert,%
+      alerthook,alignment,allowcustomcaching,allowgraphicmenu,allowsavelocal,%
+      allowtransportcontrol,allowvolumecontrol,allowzooming,alphathreshold,%
+      ambient,ambientcolor,ancestor,angle,anglebetween,animationenabled,%
+      antialias,antialiasthreshold,append,applicationname,applicationpath,%
+      appminimize,atan,attenuation,attributevalue,auto,autoblend,automask,%
+      autotab,axisangle,back,backcolor,backdrop,backgroundcolor,backspace,%
+      beep,beepon,beginrecording,beginsprite,beveldepth,beveltype,bgcolor,%
+      bias,bitand,bitmap,bitmapsizes,bitnot,bitor,bitrate,bitspersample,%
+      bitxor,blend,blendconstant,blendconstantlist,blendfactor,blendfunction,%
+      blendfunctionlist,blendlevel,blendrange,blendsource,blendsourcelist,%
+      blendtime,bone,bonesplayer,border,both,bottom,bottomcap,bottomradius,%
+      bottomspacing,boundary,boundingsphere,box,boxdropshadow,boxtype,%
+      breakconnection,breakloop,brightness,broadcastprops,browsername,%
+      buffersize,build,buttonsenabled,buttonstyle,buttontype,bytesstreamed,%
+      boolean,cachedocverify,cachesize,call,callancestor,camera,cameracount,%
+      cameraposition,camerarotation,cancelidleload,castlib,castlibnum,%
+      castmemberlist,center,centerregpoint,centerstage,changearea,channelcount,%
+      char,characterset,charpostoloc,chars,charspacing,chartonum,%
+      checkboxaccess,checkboxtype,checkmark,checknetmessages,child,chunksize,%
+      clearatrender,clearcache,clearerror,clearframe,clearglobals,clearvalue,%
+      clickloc,clickmode,clickon,clone,clonedeep,clonemodelfromcastmember,%
+      clonemotionfromcastmember,close,closed,closewindow,closexlib,collision,%
+      collisiondata,collisionnormal,color,world,colorbuffer,colorbufferdepth,%
+      colordepth,colorlist,colorrange,colors,colorsteps,commanddown,comments,%
+      compressed,connecttonetserver,constrainh,constraint,constrainv,,%
+      continue,controldown,controller,copypixels,copyrightinfo,copyto,%
+      copytoclipboard,cos,count,cpuhogticks,creaseangle,creases,[contains],%
+      createfolder,createmask,creatematte,creationdate,creator,crop,cross,%
+      crossproduct,cuepassed,cuepointnames,cuepointtimes,currentloopstate,%
+      currentspritenum,currenttime,cursor,cursorsize,curve,cylinder,ate,day,%
+      deactivateapplication,deactivatewindow,debug,debugplaybackenabled,%
+      decaymode,defaultrect,defaultrectmode,delay,delete,deleteall,deleteat,%
+      deletecamera,deletefolder,deleteframe,deletegroup,deletelight,%
+      deletemodel,deletemodelresource,deletemotion,deleteone,deleteprop,%
+      deleteshader,deletetexture,deletevertex,density,depth,depthbufferdepth,%
+      desktoprectlist,diffuse,diffusecolor,diffuselightmap,%
+      digitalvideotimescale,digitalvideotype,direction,directionalcolor,%
+      directionalpreset,directtostage,disableimagingtransformation,displayface,%
+      displaymode,distanceto,distribution,dither,done,doneparsing,dot,%
+      dotproduct,doubleclick,downloadnetthing,drag,draw,drawrect,dropshadow,%
+      duplicate,duplicateframe,duration,editable,editshortcutsenabled,%
+      elapsedtime,emissive,emitter,empty,emulatemultibuttonmouse,enabled,%
+      enablehotspot,end,endangle,endcolor,endframe,endrecording,endsprite,%
+      endtime,enter,enterframe,environment,erase,error,eventpassmode,%
+      exchange,exists,exit,exitframe,exitlock,exp,externalevent,%
+      externalparamcount,externalparamname,externalparamvalue,extractalpha,%
+      extrude3d,face,fadein,fadeout,fadeto,far,field,fieldofview,filename,%
+      fill,fillcolor,fillcycles,filldirection,filled,fillmode,filloffset,%
+      fillscale,findempty,findlabel,findpos,findposnear,finishidleload,%
+      firstindent,fixedlinespace,fixedrate,fixstagesize,flashrect,flashtostage,%
+      flat,fliph,flipv,float,floatp,floatprecision,flush,flushinputevents,%
+      fog,folderchar,font,fontsize,fontstyle,forecolor,forget,frame,%
+      framecount,framelabel,framepalette,framerate,frameready,framescript,%
+      framesound1,framesound2,framestohms,frametempo,frametransition,freeblock,%
+      freebytes,fromcastmember,fromimageobject,front,frontwindow,%
+      generatenormals,getaprop,getat,getbehaviordescription,getbehaviortooltip,%
+      getboneid,geterror,geterrorstring,gethardwareinfo,gethotspotrect,getlast,%
+      getlatestnetid,getnetaddresscookie,getneterrorstring,getnetmessage,%
+      getnetoutgoingbytes,getnettext,getnormalized,getnthfilenameinfolder,%
+      getnumberwaitingnetmessages,getone,getpeerconnectionlist,getpixel,%
+      getplaylist,getpos,getpref,getprop,getpropat,getpropertydescriptionlist,%
+      getrendererservices,getstreamstatus,gettemppath,getworldtransform,globals,%
+      glossmap,go,gotoframe,gotonetmovie,gotonetpage,gradienttype,gravity,%
+      group,handler,handlers,height,heightvertices,high,highlightpercentage,%
+      highlightstrength,hilite,hither,hittest,hmstoframes,hold,hotspot,html,%
+      hyperlink,hyperlinkclicked,hyperlinkrange,hyperlinks,hyperlinkstate,%
+      id3tags,identity,idle,idlehandlerperiod,idleloaddone,idleloadmode,%
+      idleloadperiod,idleloadtag,idlereadchunksize,ilk,image,imagecompression,%
+      imageenabled,imagequality,immovable,importfileinto,inflate,ink,inker,%
+      inlineimeenabled,insertbackdrop,insertframe,insertoverlay,inside,%
+      installmenu,instance,integer,integerp,interface,interpolate,%
+      interpolateto,intersect,index,interval,inverse,invert,invertmask,%
+      isbusy,isinworld,isoktoattach,ispastcuepoint,item,itemdelimiter,kerning,%
+      kerningthreshold,key,keyboardfocussprite,keycode,keydown,keydownscript,%
+      keyframeplayer,keypressed,keyup,keyupscript,label,labellist,last,%
+      lastchannel,lastclick,lastevent,lastframe,lastkey,lastroll,left,%
+      leftindent,length,lengthvertices,level,lifetime,light,line,linearlist,%
+      linecolor,linecount,linedirection,lineheight,lineoffset,linepostolocv,%
+      linesize,linkas,linked,list,listp,loaded,loadfile,loc,loch,locked,%
+      locktranslation,loctocharpos,locv,locvtolinepos,locz,lod,log,long,%
+      loop,loopcount,loopendtime,loopsremaining,loopstarttime,machinetype,%
+      magnitude,map,mapImageToStage,mapmembertostage,mapstagetomember,margin,%
+      marker,markerlist,mask,max,maxinteger,maxspeed,mci,media,mediaready,%
+      member,membernum,members,memorysize,menu,mesh,meshdeform,milliseconds,%
+      min,minspeed,modal,mode,model,modela,modelb,modelresource,%
+      modelsunderloc,modelsunderray,modelunderloc,modified,modifiedby,%
+      modifieddate,modifier,modifiers,month,mostrecentcuepoint,motion,%
+      mousechar,mousedown,mousedownscript,mouseenter,mouseh,mouseitem,%
+      mouseleave,mouselevel,mouseline,mouseloc,mousemember,mouseoverbutton,%
+      mouseup,mouseupoutside,mouseupscript,mousev,mousewithin,mouseword,move,%
+      moveablesprite,movetoback,movetofront,movevertex,movevertexhandle,%
+      movewindow,movie,movieaboutinfo,moviecopyrightinfo,moviefilefreesize,%
+      moviefilesize,moviefileversion,movieimagecompression,movieimagequality,%
+      moviename,moviepath,movierate,movietime,moviextralist,mpeglayer,%
+      multiply,multisound,name,near,nearfiltering,neighbor,netabort,netdone,%
+      neterror,netlastmoddate,netmime,netpresent,netstatus,nettextresult,%
+      netthrottleticks,newcamera,newcurve,newgroup,newlight,newmesh,newmodel,%
+      newmodelresource,newmotion,newshader,newtexture,next,none,normalize,%
+      normallist,normals,nothing,notify,nudge,number,numchannels,%
+      numparticles,numsegments,numtochar,objectp,offset,open,openresfile,%
+      openwindow,openxlib,optiondown,organizationname,originalfont,originh,%
+      originmode,originpoint,originv,orthoheight,overlay,pageheight,palette,%
+      palettemapping,paletteref,paletteindex,pan,paragraph,param,paramcount,%
+      parent,parsestring,particle,pasteclipboardinto,path,pathname,%
+      pathstrength,pattern,pause,pausedatstart,pausestate,percentplayed,%
+      percentstreamed,period,perpendicularto,persistent,pi,picture,picturep,%
+      plane,platform,play,playbackmode,playfile,playing,playlist,playnext,%
+      playrate,point,pointat,pointatorientation,pointinhyperlink,%
+      pointofcontact,pointtochar,pointtoitem,pointtoline,pointtoparagraph,%
+      pointtoword,position,positionreset,posterframe,postnettext,power,%
+      preferred3drenderer,preload,preloadbuffer,preloadeventabort,preloadmember,%
+      preloadmode,preloadmovie,preloadnetthing,preloadram,preloadtime,%
+      premultiply,prepareframe,preparemovie,prerotate,prescale,pretranslate,%
+      previous,primitives,printfrom,productversion,projection,projectionangle,%
+      propList,proxyserver,pttohotspotid,puppet,puppetpalette,puppetsound,%
+      puppetsprite,puppettempo,puppettransition,purgepriority,%
+      qtregisteraccesskey,qtunregisteraccesskey,quad,quality,queue,quit,quote,%
+      radius,ramneeded,random,randomseed,randomvector,rateshift,rawnew,read,%
+      readvalue,recordfont,rect,ref,reflectionmap,reflectivity,region,%
+      registerforevent,registerscript,regpoint,regpointvertex,removebackdrop,%
+      removefromworld,removelast,removemodifier,removeoverlay,rename,renderer,%
+      rendererdevicelist,renderformat,renderstyle,resetworld,resizewindow,%
+      resolution,resolve,resolvea,resolveb,resource,restart,resume,%
+      reverttoworlddefaults,rewind,rgb,rgba4444,rgba5550,rgba5551,rgba5650,%
+      rgba8880,rgba8888,right,rightindent,rightmousedown,rightmouseup,%
+      rollover,romanlingo,rootlock,rootnode,rotate,rotation,rotationreset,%
+      rtf,runmode,runpropertydialog,safeplayer,samplecount,samplerate,%
+      samplesize,save,savedlocal,savemovie,scale,scalemode,score,scorecolor,%
+      scoreselection,script,scriptexecutionstyle,scriptinstancelist,scriptlist,%
+      scriptnum,scriptsenabled,scripttext,scripttype,scrollbyline,scrollbypage,%
+      scrolltop,sds,searchcurrentfolder,searchpath,searchpaths,seconds,%
+      selectedtext,selection,selend,selstart,sendallsprites,sendevent,%
+      sendnetmessage,sendsprite,serialnumber,setalpha,setaprop,setat,%
+      setcollisioncallback,setflashproperty,setnetbufferlimits,%
+      setnetmessagehandler,setpixel,setplaylist,setpref,setprop,setscriptlist,%
+      settrackenabled,setvariable,shader,shaderlist,shadowpercentage,%
+      shadowstrength,shapetype,shiftdown,shininess,shockwave3d,short,%
+      showglobals,showlocals,showprops,showresfile,showxlib,shutdown,%
+      silhouettes,sin,size,sizerange,skew,sleep,smoothness,sort,sound,%
+      soundbusy,soundchannel,sounddevice,sounddevicelist,soundenabled,%
+      soundkeepdevice,soundlevel,soundmixmedia,source,sourcerect,space,%
+      specular,specularcolor,specularlightmap,sphere,spotangle,spotdecay,%
+      sprite,spritenum,spritespacetoworldspace,sqrt,stage,stagebottom,%
+      stagecolor,stageleft,stageright,stagetoflash,stagetop,standard,%
+      startangle,startframe,startmovie,starttime,starttimer,state,static,%
+      status,stepframe,stilldown,stop,stopevent,stopmovie,stoptime,stream,%
+      streammode,streamname,streamsize,streamstatus,string,stringp,%
+      strokecolor,strokewidth,style,subdivision,sweep,swing,switchcolordepth,%
+      symbol,symbolp,systemdate,tab,tabcount,tabs,tan,target,%
+      tellstreamstatus,tension,text,texture,texturecoordinatelist,%
+      texturecoordinates,texturelayer,texturelist,texturemember,texturemode,%
+      texturemodelist,texturerenderformat,texturerepeat,texturerepeatlist,%
+      texturetransform,texturetransformlist,texturetype,thumbnail,ticks,tilt,%
+      time,timeout,timeouthandler,timeoutkeydown,timeoutlapsed,timeoutlength,%
+      timeoutlist,timeoutmouse,timeoutplay,timeoutscript,timer,timescale,%
+      title,titlevisible,toon,top,topcap,topradius,topspacing,trace,%
+      traceload,tracelogfile,trackcount,trackenabled,tracknextkeytime,%
+      tracknextsampletime,trackpreviouskeytime,trackprevioussampletime,%
+      trackstarttime,trackstoptime,tracktext,tracktype,trails,transform,%
+      transitiontype,translate,triggercallback,trimwhitespace,tunneldepth,%
+      tweened,tweenmode,type,[transparent],union,unload,unloadmember,%
+      unloadmovie,unregisterallevents,update,updateframe,updatelock,%
+      updatemovieenabled,updatestage,url,usealpha,usediffusewithtexture,%
+      usefastquads,usehypertextstyles,uselineoffset,userdata,username,value,%
+      vector,version,vertex,vertexlist,vertices,video,videoforwindowspresent,%
+      viewh,viewpoint,viewscale,viewv,visibility,visible,void,voidp,volume,%
+      volumeinfo,wait,waitfornetconnection,warpmode,width,widthvertices,wind,%
+      window,windowlist,windowpresent,windowtype,word,wordwrap,world,%
+      worldposition,worldspacetospritespace,worldtransform,wraptransform,%
+      wraptransformlist,write,writevalue,,xaxis,xtra,xtralist,xtras,,yaxis,%
+      year,yon,zaxis,zoombox,zoomwindow,repeat,Conditional,Boolean,TypeDef,%
+      Statement,Operator,String,Comment,Identifier,Special,x,y,z}
+   sensitive=false,
+   morecomment=[l]{--},
+   morestring=[b]",
+  }[keywords,comments,strings]%
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Lisp, AutoLisp}
+%
+% Most data are from
+% \begin{itemize}
+% \item
+%		\textsc{Guy Steele}:
+%		\textbf{Common Lisp};
+%		Copyright 1990 by Digital Equipment Corporation;
+%		ISBN 1-55558-042-4.
+% \end{itemize}
+% Thanks to \lsthelper{Aslak Raanes}{araanes@ifi.ntnu.no}{1997/11/24}{single
+% comment in Lisp} for the `single comment' delimiters. The keywords are the
+% `one-word' functions and macros of Common Lisp, i.e.~words not containing a
+% minus. But I left out the \texttt{caaaar}, \ldots{} functions.
+% If anyone types them in, I'd like to get them.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Lisp}%
+  {morekeywords={abort,abs,acons,acos,acosh,adjoin,alphanumericp,alter,%
+      append,apply,apropos,aref,arrayp,ash,asin,asinh,assoc,atan,atanh,%
+      atom,bit,boole,boundp,break,butlast,byte,catenate,ceiling,cerror,%
+      char,character,characterp,choose,chunk,cis,close,clrhash,coerce,%
+      collect,commonp,compile,complement,complex,complexp,concatenate,%
+      conjugate,cons,consp,constantp,continue,cos,cosh,cotruncate,%
+      count,delete,denominator,describe,directory,disassemble,%
+      documentation,dpb,dribble,ed,eighth,elt,enclose,endp,eq,eql,%
+      equal,equalp,error,eval,evalhook,evenp,every,exp,expand,export,%
+      expt,fboundp,fceiling,fdefinition,ffloor,fifth,fill,find,first,%
+      float,floatp,floor,fmakunbound,format,fourth,fround,ftruncate,%
+      funcall,functionp,gatherer,gcd,generator,gensym,gentemp,get,getf,%
+      gethash,identity,imagpart,import,inspect,integerp,intern,%
+      intersection,tively,isqrt,keywordp,last,latch,lcm,ldb,ldiff,%
+      length,list,listen,listp,load,log,logand,logbitp,logcount,logeqv,%
+      logior,lognand,lognor,lognot,logtest,logxor,macroexpand,%
+      makunbound,map,mapc,mapcan,mapcar,mapcon,maphash,mapl,maplist,%
+      mask,max,member,merge,min,mingle,minusp,mismatch,mod,namestring,%
+      nbutlast,nconc,nintersection,ninth,not,notany,notevery,nreconc,%
+      nreverse,nsublis,nsubst,nth,nthcdr,null,numberp,numerator,nunion,%
+      oddp,open,packagep,pairlis,pathname,pathnamep,phase,plusp,%
+      position,positions,pprint,previous,princ,print,proclaim,provide,%
+      random,rassoc,rational,rationalize,rationalp,read,readtablep,%
+      realp,realpart,reduce,rem,remhash,remove,remprop,replace,require,%
+      rest,revappend,reverse,room,round,rplaca,rplacd,sbit,scan,schar,%
+      search,second,series,set,seventh,shadow,signal,signum,sin,sinh,%
+      sixth,sleep,some,sort,split,sqrt,streamp,string,stringp,sublis,%
+      subseq,subseries,subsetp,subst,substitute,subtypep,svref,sxhash,%
+      symbolp,tailp,tan,tanh,tenth,terpri,third,truename,truncate,%
+      typep,unexport,unintern,union,until,values,vector,vectorp,warn,%
+      write,zerop,and,assert,case,ccase,cond,ctypecase,decf,declaim,%
+      defclass,defconstant,defgeneric,defmacro,defmethod,defpackage,%
+      defparameter,defsetf,defstruct,deftype,defun,defvar,do,dolist,%
+      dotimes,ecase,encapsulated,etypecase,flet,formatter,gathering,%
+      incf,iterate,labels,let,locally,loop,macrolet,mapping,or,pop,%
+      producing,prog,psetf,psetq,push,pushnew,remf,return,rotatef,%
+      setf,shiftf,step,time,trace,typecase,unless,untrace,when},%
+   sensitive,% ???
+   alsodigit=-,%
+   morecomment=[l];,%
+   morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+% \lstthanks{Stefan Lagotzki}{info@lagotzki.de}{2001/10/28} warned me to
+% define this as a lisp dialect \ldots
+%    \begin{macrocode}
+%%
+%% AutoLISP/VisualLISP - Stefan Lagotzki, info@lagotzki.de
+%%
+\lst@definelanguage[Auto]{Lisp}%
+  {morekeywords={abs,acad_colordlg,acad_helpdlg,acad_strlsort,%
+      action_tile,add_list,alert,alloc,and,angle,angtof,angtos,append,%
+      apply,arx,arxload,arxunload,ascii,assoc,atan,atof,atoi,atom,%
+      atoms-family,autoarxload,autoload,Boole,boundp,caddr,cadr,car,%
+      cdr,chr,client_data_tile,close,command,cond,cons,cos,cvunit,%
+      defun,defun-q,defun-q-list-ref,defun-q-list-set,dictadd,dictnext,%
+      dictremove,dictrename,dictsearch,dimx_tile,dimy_tile,distance,%
+      distof,done_dialog,end_image,end_list,entdel,entget,entlast,%
+      entmake,entmakex,entmod,entnext,entsel,entupd,eq,equal,*error*,%
+      eval,exit,exp,expand,expt,fill_image,findfile,fix,float,foreach,%
+      function,gc,gcd,get_attr,get_tile,getangle,getcfg,getcname,%
+      getcorner,getdist,getenv,getfiled,getint,getkword,getorient,%
+      getpoint,getreal,getstring,getvar,graphscr,grclear,grdraw,grread,%
+      grtext,grvecs,handent,help,if,initdia,initget,inters,itoa,lambda,%
+      last,layoutlist,length,list,listp,load,load_dialog,log,logand,%
+      logior,lsh,mapcar,max,mem,member,menucmd,menugroup,min,minusp,%
+      mode_tile,namedobjdict,nentsel,nentselp,new_dialog,not,nth,%
+      null,numberp,open,or,osnap,polar,prin1,princ,print,progn,prompt,%
+      quit,quote,read,read-char,read-line,redraw,regapp,rem,repeat,%
+      reverse,rtos,set,set_tile,setcfg,setenv,setfunhelp,setq,%
+      setvar,setview,sin,slide_image,snvalid,sqrt,ssadd,ssdel,ssget,%
+      ssgetfirst,sslength,ssmemb,ssname,ssnamex,sssetfirst,startapp,%
+      start_dialog,start_image,start_list,strcase,strcat,strlen,subst,%
+      substr,tablet,tblnext,tblobjname,tblsearch,term_dialog,terpri,%
+      textbox,textpage,textscr,trace,trans,type,unload_dialog,untrace,%
+      vector_image,ver,vl-acad-defun,vl-acad-undefun,vl-arx-import,%
+      vl-bb-ref,vl-bb-set,vl-catch-all-apply,%
+      vl-catch-all-error-message,vl-catch-all-error-p,vl-cmdf,vl-consp,%
+      vl-directory-files,vl-doc-export,vl-doc-import,vl-doc-ref,%
+      vl-doc-set,vl-every,vl-exit-with-error,vl-exit-with-value,%
+      vl-file-copy,vl-file-delete,vl-file-directory-p,vl-file-rename,%
+      vl-file-size,vl-file-systime,vl-filename-base,%
+      vl-filename-directory,vl-filename-extension,vl-filename-mktemp,%
+      vl-get-resource,vl-list*,vl-list->string,%
+      vl-list-exported-functions,vl-list-length,vl-list-loaded-vlx,%
+      vl-load-all,vl-load-com,vl-load-reactors,vl-member-if,%
+      vl-member-if-not,vl-position,vl-prin1-to-string,%
+      vl-princ-to-string,vl-propagate,vl-registry-delete,%
+      vl-registry-descendents,vl-registry-read,vl-registry-write,%
+      vl-remove,vl-remove-if,vl-remove-if-not,vl-some,vl-sort,%
+      vl-sort-i,vl-string->list,vl-string-elt,vl-string-left-trim,%
+      vl-string-mismatch,vl-string-position,vl-string-right-trim,%
+      vl-string-search,vl-string-subst,vl-string-translate,%
+      vl-string-trim,vl-symbol-name,vl-symbol-value,vl-symbolp,%
+      vl-unload-vlx,vl-vbaload,vl-vbarun,vl-vlx-loaded-p,vlax-3D-point,%
+      vlax-add-cmd,vlax-create-object,vlax-curve-getArea,%
+      vlax-curve-getDistAtParam,vlax-curve-getDistAtPoint,%
+      vlax-curve-getEndParam,vlax-curve-getEndPoint,%
+      vlax-curve-getParamAtDist,vlax-curve-getParamAtPoint,%
+      vlax-curve-getPointAtDist,vlax-curve-getPointAtParam,%
+      vlax-curve-getStartParam,vlax-curve-getStartPoint,%
+      vlax-curve-isClosed,vlax-curve-isPeriodic,vlax-curve-isPlanar,%
+      vlax-curve-getClosestPointTo,%
+      vlax-curve-getClosestPointToProjection,vlax-curve-getFirstDeriv,%
+      vlax-curve-getSecondDeriv,vlax-dump-object,%
+      vlax-ename->vla-object,vlax-erased-p,vlax-for,%
+      vlax-get-acad-object,vlax-get-object,vlax-get-or-create-object,%
+      vlax-get-property,vlax-import-type-library,vlax-invoke-method,%
+      vlax-ldata-delete,vlax-ldata-get,vlax-ldata-list,vlax-ldata-put,%
+      vlax-ldata-test,vlax-make-safearray,vlax-make-variant,%
+      vlax-map-collection,vlax-method-applicable-p,%
+      vlax-object-released-p,vlax-product-key,%
+      vlax-property-available-p,vlax-put-property,vlax-read-enabled-p,%
+      vlax-release-object,vlax-remove-cmd,vlax-safearray-fill,%
+      vlax-safearray-get-dim,vlax-safearray-get-element,%
+      vlax-safearray-get-l-bound,vlax-safearray-get-u-bound,%
+      vlax-safearray-put-element,vlax-safearray-type,%
+      vlax-safearray->list,vlax-tmatrix,vlax-typeinfo-available-p,%
+      vlax-variant-change-type,vlax-variant-type,vlax-variant-value,%
+      vlax-vla-object->ename,vlax-write-enabled-p,vlisp-compile,%
+      vlr-acdb-reactor,vlr-add,vlr-added-p,vlr-beep-reaction,%
+      vlr-command-reactor,vlr-current-reaction-name,vlr-data,%
+      vlr-data-set,vlr-deepclone-reactor,vlr-docmanager-reactor,%
+      vlr-dwg-reactor,vlr-dxf-reactor,vlr-editor-reactor,%
+      vlr-insert-reactor,vlr-linker-reactor,vlr-lisp-reactor,%
+      vlr-miscellaneous-reactor,vlr-mouse-reactor,vlr-notification,%
+      vlr-object-reactor,vlr-owner-add,vlr-owner-remove,vlr-owners,%
+      vlr-pers,vlr-pers-list,vlr-pers-p,vlr-pers-release,%
+      vlr-reaction-names,vlr-reaction-set,vlr-reactions,vlr-reactors,%
+      vlr-remove,vlr-remove-all,vlr-set-notification,%
+      vlr-sysvar-reactor,vlr-toolbar-reactor,vlr-trace-reaction,%
+      vlr-type,vlr-types,vlr-undo-reactor,vlr-wblock-reactor,%
+      vlr-window-reactor,vlr-xref-reactor,vports,wcmatch,while,%
+      write-char,write-line,xdroom,xdsize,zerop},%
+   alsodigit=->,%
+   otherkeywords={1+,1-},%
+   sensitive=false,% 
+   morecomment=[l];,%
+   morecomment=[l];;,%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Logo}
+%
+% I don't know where the keywords are from and what kind of Logo it is.
+% Help me!
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Logo}%
+% ??? {end,unix} also keywords
+  {morekeywords={and,atan,arctan,both,break,bf,bl,butfirst,butlast,%
+      cbreak, close,co,continue,cos,count,clearscreen,cs,debquit,%
+      describe,diff,difference,ed,edit,either,emptyp,equalp,er,erase,%
+      errpause,errquit,fifp,filefprint,fifty,fileftype,fip,fileprint,%
+      fird,fileread,fity,filetype,fiwd,fileword,f,first,or,fp,fprint,%
+      fput,fty,ftype,full,fullscreen,go,bye,goodbye,gprop,greaterp,%
+      help,if,iff,iffalse,ift,iftrue,nth,item,keyp,llast,lessp,list,%
+      local,lput,make,max,maximum,memberp,memtrace,min,minimum,namep,%
+      not,numberp,oflush,openr,openread,openw,openwrite,op,output,%
+      pause,plist,pots,pow,pprop,pps,pr,print,product,quotient,random,%
+      rc,readchar,rl,readlist,remprop,repcount,repeat,request,rnd,run,%
+      se,sentence,sentencep,setc,setcolor,setipause,setqpause,po,show,%
+      sin,split,splitscreen,sqrt,stop,sum,test,text,textscreen,thing,%
+      to,tone,top,toplevel,type,untrace,wait,word,wordp,yaccdebug,is,%
+      mod,remainder,trace,zerop,back,bk,bto,btouch,fd,forward,fto,%
+      ftouch,getpen,heading,hit,hitoot,ht,hideturtle,loff,lampoff,lon,%
+      lampon,lt,left,lot,lotoot,lto,ltouch,penc,pencolor,pd,pendown,pe,%
+      penerase,penmode,pu,penup,px,penreverse,rt,right,rto,rtouch,%
+      scrunch,seth,setheading,setscrun,setscrunch,setxy,shownp,st,%
+      showturtle,towardsxy,clean,wipeclean,xcor,ycor,tur,turtle,%
+      display,dpy},%
+   sensitive=f% ???
+  }[keywords]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Make}
+%
+% \lstthanks{Rolf~Niepraschk}{niepraschk@ptb.de}{2000/01/10} sent me the new
+% definitions. \lstthanks{Markus~Pahlow}{pahlowm@mar.dfo-mpo.gc.ca}{2001/10/12}
+% found a missing comma and added some keywords, which improve the highlighting
+% with |makemacrouse=true| (but I haven't tested this).
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Make definitions (c) 2000 Rolf Niepraschk
+%%
+\lst@definelanguage[gnu]{make}%
+  {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*,%
+      @,^,<,\%,+,?,*,% Markus Pahlow
+      export,unexport,include,override,define,ifdef,ifneq,ifeq,else,%
+      endif,vpath,subst,patsubst,strip,findstring,filter,filter-out,%
+      sort,dir,notdir,suffix,basename,addsuffix,addprefix,join,word,%
+      words,firstword,wildcard,shell,origin,foreach,%
+      @D,@F,*D,*F,\%D,\%F,
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Matlab}
+%
+% I took the keywords from \texttt{http://www.utexas.edu/math/Matlab/Manual},
+% but I removed the keywords |i|, |j| and |tmp|---the change was proposed by
+% \lsthelper{Kai Below}{below@tu-harburg.de}{1998/09/21}{Matlab: keywords
+% i,j,tmp removed}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Matlab}%
+  {morekeywords={gt,lt,gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
+      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
+      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
+      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
+      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
+      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
+      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
+      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
+      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
+      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
+      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
+      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
+      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
+      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
+      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
+      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
+      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,error,%
+      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
+      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
+      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
+      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
+      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
+      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
+      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
+      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
+      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
+      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
+      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
+      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
+      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
+      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
+      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
+      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
+      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
+      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
+      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
+      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
+      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
+      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
+      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
+      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
+      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
+      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
+      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
+      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
+      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
+      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
+      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
+      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
+      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
+      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
+      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
+      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
+      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
+      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
+      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
+      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
+      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
+      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
+      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
+      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
+      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
+      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
+      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
+      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
+      wk1write,xlabel,xor,ylabel,zeros,zlabel,zoom},%
+   sensitive,%
+   morecomment=[l]\%,%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Mathematica}
+%
+% \lstthanks{Michael Wiese}{wiese@itwm.uni-kl.de}{1999/02/25} typed in all the
+% keywords for the 1.0 and 3.0 versions.
+% \lstthanks{Oliver~Ruebenkoenig}{-}{2006/07/17} wrote a script to generate
+% the lists for the 5.2 version.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[5.2]{Mathematica}[3.0]{Mathematica}%%
+  {morekeywords={Above,AbsoluteOptions,AbsoluteTiming,AccountingForm,%
+      AccuracyGoal,Active,ActiveItem,AddOnHelpPath,%
+      AdjustmentBox,AdjustmentBoxOptions,After,AiryAiPrime,%
+      AlgebraicRulesData,Algebraics,Alias,AlignmentMarker,%
+      AllowInlineCells,AllowScriptLevelChange,Analytic,AnimationCycleOffset,%
+      AnimationCycleRepetitions,AnimationDirection,AnimationDisplayTime,ApartSquareFree,%
+      AppellF1,ArgumentCountQ,ArrayDepth,ArrayPlot,%
+      ArrayQ,ArrayRules,AspectRatioFixed,Assuming,%
+      Assumptions,AutoDelete,AutoEvaluateEvents,AutoGeneratedPackage,%
+      AutoIndent,AutoIndentSpacings,AutoItalicWords,AutoloadPath,%
+      AutoOpenNotebooks,AutoOpenPalettes,AutoScroll,AutoSpacing,%
+      AutoStyleOptions,Axis,BackgroundTasksSettings,Backsubstitution,%
+      Backward,Baseline,Before,BeginDialogPacket,%
+      BeginFrontEndInteractionPacket,Below,BezoutMatrix,BinaryFormat,%
+      BinaryGet,BinaryRead,BinaryReadList,BinaryWrite,%
+      BitAnd,BitNot,BitOr,BitXor,%
+      Black,BlankForm,Blue,Boole,%
+      Booleans,Bottom,Bounds,Box,%
+      BoxBaselineShift,BoxData,BoxDimensions,BoxFormFormatTypes,%
+      BoxFrame,BoxMargins,BoxRegion,Brown,%
+      Buchberger,Button,ButtonBox,ButtonBoxOptions,%
+      ButtonCell,ButtonContents,ButtonData,ButtonEvaluator,%
+      ButtonExpandable,ButtonFrame,ButtonFunction,ButtonMargins,%
+      ButtonMinHeight,ButtonNote,ButtonNotebook,ButtonSource,%
+      ButtonStyle,ButtonStyleMenuListing,ByteOrdering,CallPacket,%
+      CarmichaelLambda,Cell,CellAutoOverwrite,CellBaseline,%
+      CellBoundingBox,CellBracketOptions,CellContents,CellDingbat,%
+      CellEditDuplicate,CellElementsBoundingBox,CellElementSpacings,CellEvaluationDuplicate,%
+      CellFrame,CellFrameColor,CellFrameLabelMargins,CellFrameLabels,%
+      CellFrameMargins,CellGroup,CellGroupData,CellGrouping,%
+      CellGroupingRules,CellHorizontalScrolling,CellLabel,CellLabelAutoDelete,%
+      CellLabelMargins,CellLabelPositioning,CellMargins,CellObject,%
+      CellOpen,CellPasswords,CellPrint,CellSize,%
+      CellStyle,CellTags,CellularAutomaton,Center,%
+      CharacterEncoding,CharacterEncodingsPath,CharacteristicPolynomial,CharacterRange,%
+      CheckAll,CholeskyDecomposition,Clip,ClipboardNotebook,%
+      Closed,ClosingAutoSave,CoefficientArrays,CoefficientDomain,%
+      CofactorExpansion,ColonForm,ColorFunctionScaling,ColorRules,%
+      ColorSelectorSettings,Column,ColumnAlignments,ColumnLines,%
+      ColumnsEqual,ColumnSpacings,ColumnWidths,CommonDefaultFormatTypes,%
+      CompileOptimizations,CompletionsListPacket,Complexes,ComplexityFunction,%
+      Compose,ComposeSeries,ConfigurationPath,ConjugateTranspose,%
+      Connect,ConsoleMessage,ConsoleMessagePacket,ConsolePrint,%
+      ContentsBoundingBox,ContextToFileName,ContinuedFraction,ConversionOptions,%
+      ConversionRules,ConvertToBitmapPacket,ConvertToPostScript,ConvertToPostScriptPacket,%
+      Copyable,CoshIntegral,CounterAssignments,CounterBox,%
+      CounterBoxOptions,CounterEvaluator,CounterFunction,CounterIncrements,%
+      CounterStyle,CounterStyleMenuListing,CreatePalettePacket,Cross,%
+      CurrentlySpeakingPacket,Cyan,CylindricalDecomposition,DampingFactor,%
+      DataRange,Debug,DebugTag,Decimal,%
+      DedekindEta,DefaultDuplicateCellStyle,DefaultFontProperties,DefaultFormatType,%
+      DefaultFormatTypeForStyle,DefaultInlineFormatType,DefaultInputFormatType,
+      DefaultNaturalLanguage,%
+      DefaultNewCellStyle,DefaultNewInlineCellStyle,DefaultNotebook,DefaultOutputFormatType,%
+      DefaultStyleDefinitions,DefaultTextFormatType,DefaultTextInlineFormatType,DefaultValues,%
+      DefineExternal,DegreeLexicographic,DegreeReverseLexicographic,Deletable,%
+      DeleteContents,DeletionWarning,DelimiterFlashTime,DelimiterMatching,%
+      Delimiters,DependentVariables,DiacriticalPositioning,DialogLevel,%
+      DifferenceOrder,DigitCharacter,DigitCount,DiracDelta,%
+      Direction,DirectoryName,DisableConsolePrintPacket,DiscreteDelta,%
+      DisplayAnimation,DisplayEndPacket,DisplayFlushImagePacket,DisplayForm,%
+      DisplayPacket,DisplayRules,DisplaySetSizePacket,DisplayString,%
+      DivisionFreeRowReduction,DOSTextFormat,DoubleExponential,DoublyInfinite,%
+      Down,DragAndDrop,DrawHighlighted,DualLinearProgramming,%
+      DumpGet,DumpSave,Edit,Editable,%
+      EditButtonSettings,EditCellTagsSettings,EditDefinition,EditIn,%
+      Element,EliminationOrder,EllipticExpPrime,EllipticNomeQ,%
+      EllipticReducedHalfPeriods,EllipticThetaPrime,Empty,EnableConsolePrintPacket,%
+      Encoding,EndAdd,EndDialogPacket,EndFrontEndInteractionPacket,%
+      EndOfLine,EndOfString,Enter,EnterExpressionPacket,%
+      EnterTextPacket,EqualColumns,EqualRows,EquatedTo,%
+      Erfi,ErrorBox,ErrorBoxOptions,ErrorNorm,%
+      ErrorPacket,ErrorsDialogSettings,Evaluatable,EvaluatePacket,%
+      EvaluationCell,EvaluationCompletionAction,EvaluationMonitor,EvaluationNotebook,%
+      Evaluator,EvaluatorNames,EventEvaluator,ExactNumberQ,%
+      ExactRootIsolation,Except,ExcludedForms,Exists,%
+      ExitDialog,ExponentPosition,ExponentStep,Export,%
+      ExportAutoReplacements,ExportPacket,ExportString,ExpressionPacket,%
+      ExpToTrig,Extension,ExternalCall,ExternalDataCharacterEncoding,%
+      Extract,Fail,FEDisableConsolePrintPacket,FEEnableConsolePrintPacket,%
+      Fibonacci,File,FileFormat,FileInformation,%
+      FileName,FileNameDialogSettings,FindFit,FindInstance,%
+      FindMaximum,FindSettings,FitAll,FlushPrintOutputPacket,%
+      Font,FontColor,FontFamily,FontName,%
+      FontPostScriptName,FontProperties,FontReencoding,FontSize,%
+      FontSlant,FontSubstitutions,FontTracking,FontVariations,%
+      FontWeight,ForAll,FormatRules,FormatTypeAutoConvert,%
+      FormatValues,FormBox,FormBoxOptions,Forward,%
+      ForwardBackward,FourierCosTransform,FourierParameters,FourierSinTransform,%
+      FourierTransform,FractionalPart,FractionBox,FractionBoxOptions,%
+      FractionLine,FrameBox,FrameBoxOptions,FresnelC,%
+      FresnelS,FromContinuedFraction,FromDigits,FrontEndExecute,%
+      FrontEndObject,FrontEndStackSize,FrontEndToken,FrontEndTokenExecute,%
+      FrontEndVersion,Full,FullAxes,FullSimplify,%
+      FunctionExpand,FunctionInterpolation,GaussKronrod,GaussPoints,%
+      GenerateBitmapCaches,GenerateConditions,GeneratedCell,GeneratedParameters,%
+      Generic,GetBoundingBoxSizePacket,GetContext,GetFileName,%
+      GetFrontEndOptionsDataPacket,GetLinebreakInformationPacket,%
+      GetMenusPacket,GetPageBreakInformationPacket,%
+      Glaisher,GlobalPreferences,GlobalSession,Gradient,%
+      GraphicsData,GraphicsGrouping,Gray,Green,%
+      Grid,GridBaseline,GridBox,GridBoxOptions,%
+      GridCreationSettings,GridDefaultElement,GridFrame,GridFrameMargins,%
+      GroupPageBreakWithin,HarmonicNumber,Hash,HashTable,%
+      HeadCompose,HelpBrowserLookup,HelpBrowserNotebook,HelpBrowserSettings,%
+      HessenbergDecomposition,Hessian,HoldAllComplete,HoldComplete,%
+      HoldPattern,Horizontal,HorizontalForm,HorizontalScrollPosition,%
+      HTMLSave,Hypergeometric0F1Regularized,Hypergeometric1F1Regularized,%
+      Hypergeometric2F1Regularized,%
+      HypergeometricPFQ,HypergeometricPFQRegularized,HyperlinkCreationSettings,Hyphenation,%
+      HyphenationOptions,IgnoreCase,ImageCache,ImageCacheValid,%
+      ImageMargins,ImageOffset,ImageRangeCache,ImageRegion,%
+      ImageResolution,ImageRotated,ImageSize,Import,%
+      ImportAutoReplacements,ImportString,IncludeFileExtension,IncludeSingularTerm,%
+      IndentingNewlineSpacings,IndentMaxFraction,IndexCreationOptions,Inequality,%
+      InexactNumberQ,InexactNumbers,Inherited,InitializationCell,%
+      InitializationCellEvaluation,InitializationCellWarning,%
+      InlineCounterAssignments,InlineCounterIncrements,%
+      InlineRules,InputAliases,InputAutoFormat,InputAutoReplacements,%
+      InputGrouping,InputNamePacket,InputNotebook,InputPacket,%
+      InputSettings,InputStringPacket,InputToBoxFormPacket,InputToInputForm,%
+      InputToStandardForm,InsertionPointObject,IntegerExponent,IntegerPart,%
+      Integers,Interactive,Interlaced,InterpolationOrder,%
+      InterpolationPoints,InterpolationPrecision,InterpretationBox,%
+      InterpretationBoxOptions,%
+      InterpretTemplate,InterruptSettings,Interval,IntervalIntersection,%
+      IntervalMemberQ,IntervalUnion,InverseBetaRegularized,InverseEllipticNomeQ,%
+      InverseErf,InverseErfc,InverseFourierCosTransform,
+      InverseFourierSinTransform,%
+      InverseFourierTransform,InverseGammaRegularized,InverseJacobiCD,%
+      InverseJacobiCN,%
+      InverseJacobiCS,InverseJacobiDC,InverseJacobiDN,InverseJacobiDS,%
+      InverseJacobiNC,InverseJacobiND,InverseJacobiNS,InverseJacobiSC,%
+      InverseJacobiSD,InverseLaplaceTransform,InverseWeierstrassP,InverseZTransform,%
+      Jacobian,JacobiCD,JacobiCN,JacobiCS,%
+      JacobiDC,JacobiDN,JacobiDS,JacobiNC,%
+      JacobiND,JacobiNS,JacobiSC,JacobiSD,%
+      JordanDecomposition,K,Khinchin,KleinInvariantJ,%
+      KroneckerDelta,Language,LanguageCategory,LaplaceTransform,%
+      Larger,Launch,LayoutInformation,Left,%
+      LetterCharacter,Lexicographic,LicenseID,LimitsPositioning,%
+      LimitsPositioningTokens,LinearSolveFunction,LinebreakAdjustments,LineBreakWithin,%
+      LineForm,LineIndent,LineSpacing,LineWrapParts,%
+      LinkActivate,LinkClose,LinkConnect,LinkConnectedQ,%
+      LinkCreate,LinkError,LinkFlush,LinkHost,%
+      LinkInterrupt,LinkLaunch,LinkMode,LinkObject,%
+      LinkOpen,LinkOptions,LinkPatterns,LinkProtocol,%
+      LinkRead,LinkReadHeld,LinkReadyQ,Links,%
+      LinkWrite,LinkWriteHeld,ListConvolve,ListCorrelate,%
+      Listen,ListInterpolation,ListQ,LiteralSearch,%
+      LongestMatch,LongForm,Loopback,LUBackSubstitution,%
+      LUDecomposition,MachineID,MachineName,MachinePrecision,%
+      MacintoshSystemPageSetup,Magenta,Magnification,MakeBoxes,%
+      MakeExpression,MakeRules,Manual,MatchLocalNameQ,%
+      MathematicaNotation,MathieuC,MathieuCharacteristicA,MathieuCharacteristicB,%
+      MathieuCharacteristicExponent,MathieuCPrime,MathieuS,MathieuSPrime,%
+      MathMLForm,MathMLText,MatrixRank,Maximize,%
+      MaxIterations,MaxPlotPoints,MaxPoints,MaxRecursion,%
+      MaxStepFraction,MaxSteps,MaxStepSize,Mean,%
+      Median,MeijerG,MenuPacket,MessageOptions,%
+      MessagePacket,MessagesNotebook,MetaCharacters,Method,%
+      MethodOptions,Minimize,MinRecursion,MinSize,%
+      Mode,ModularLambda,MonomialOrder,MonteCarlo,%
+      Most,MousePointerNote,MultiDimensional,MultilaunchWarning,%
+      MultilineFunction,MultiplicativeOrder,Multiplicity,Nand,%
+      NeedCurrentFrontEndPackagePacket,NeedCurrentFrontEndSymbolsPacket,%
+      NestedScriptRules,NestWhile,%
+      NestWhileList,NevilleThetaC,NevilleThetaD,NevilleThetaN,%
+      NevilleThetaS,Newton,Next,NHoldAll,%
+      NHoldFirst,NHoldRest,NMaximize,NMinimize,%
+      NonAssociative,NonPositive,Nor,Norm,%
+      NormalGrouping,NormalSelection,NormFunction,Notebook,%
+      NotebookApply,NotebookAutoSave,NotebookClose,NotebookConvert,%
+      NotebookConvertSettings,NotebookCreate,NotebookCreateReturnObject,NotebookDefault,%
+      NotebookDelete,NotebookDirectory,NotebookFind,NotebookFindReturnObject,%
+      NotebookGet,NotebookGetLayoutInformationPacket,NotebookGetMisspellingsPacket,%
+      NotebookInformation,%
+      NotebookLocate,NotebookObject,NotebookOpen,NotebookOpenReturnObject,%
+      NotebookPath,NotebookPrint,NotebookPut,NotebookPutReturnObject,%
+      NotebookRead,NotebookResetGeneratedCells,Notebooks,NotebookSave,%
+      NotebookSaveAs,NotebookSelection,NotebookSetupLayoutInformationPacket,%
+      NotebooksMenu,%
+      NotebookWrite,NotElement,NProductExtraFactors,NProductFactors,%
+      NRoots,NSumExtraTerms,NSumTerms,NumberMarks,%
+      NumberMultiplier,NumberString,NumericFunction,NumericQ,%
+      NValues,Offset,OLEData,OneStepRowReduction,%
+      Open,OpenFunctionInspectorPacket,OpenSpecialOptions,OptimizationLevel,%
+      OptionInspectorSettings,OptionQ,OptionsPacket,OptionValueBox,%
+      OptionValueBoxOptions,Orange,Ordering,Oscillatory,%
+      OutputAutoOverwrite,OutputFormData,OutputGrouping,OutputMathEditExpression,%
+      OutputNamePacket,OutputToOutputForm,OutputToStandardForm,Over,%
+      Overflow,Overlaps,Overscript,OverscriptBox,%
+      OverscriptBoxOptions,OwnValues,PadLeft,PadRight,%
+      PageBreakAbove,PageBreakBelow,PageBreakWithin,PageFooterLines,%
+      PageFooters,PageHeaderLines,PageHeaders,PalettePath,%
+      PaperWidth,ParagraphIndent,ParagraphSpacing,ParameterVariables,%
+      ParentConnect,ParentForm,Parenthesize,PasteBoxFormInlineCells,%
+      Path,PatternTest,PeriodicInterpolation,Pick,%
+      Piecewise,PiecewiseExpand,Pink,Pivoting,%
+      PixelConstrained,Placeholder,Plain,Plot3Matrix,%
+      PointForm,PolynomialForm,PolynomialReduce,Polynomials,%
+      PowerModList,Precedence,PreferencesPath,PreserveStyleSheet,%
+      Previous,PrimaryPlaceholder,Primes,PrincipalValue,%
+      PrintAction,PrintingCopies,PrintingOptions,PrintingPageRange,%
+      PrintingStartingPageNumber,PrintingStyleEnvironment,PrintPrecision,%
+      PrivateCellOptions,%
+      PrivateEvaluationOptions,PrivateFontOptions,PrivateNotebookOptions,PrivatePaths,%
+      ProductLog,PromptForm,Purple,Quantile,%
+      QuasiMonteCarlo,QuasiNewton,RadicalBox,RadicalBoxOptions,%
+      RandomSeed,RationalFunctions,Rationals,RawData,%
+      RawMedium,RealBlockForm,Reals,Reap,%
+      Red,Refine,Refresh,RegularExpression,%
+      Reinstall,Release,Removed,RenderingOptions,%
+      RepeatedString,ReplaceList,Rescale,ResetMenusPacket,%
+      Resolve,ResumePacket,ReturnExpressionPacket,ReturnInputFormPacket,%
+      ReturnPacket,ReturnTextPacket,Right,Root,%
+      RootReduce,RootSum,Row,RowAlignments,%
+      RowBox,RowLines,RowMinHeight,RowsEqual,%
+      RowSpacings,RSolve,RuleCondition,RuleForm,%
+      RulerUnits,Saveable,SaveAutoDelete,ScreenRectangle,%
+      ScreenStyleEnvironment,ScriptBaselineShifts,ScriptLevel,ScriptMinSize,%
+      ScriptRules,ScriptSizeMultipliers,ScrollingOptions,ScrollPosition,%
+      Second,SectionGrouping,Selectable,SelectedNotebook,%
+      Selection,SelectionAnimate,SelectionCell,SelectionCellCreateCell,%
+      SelectionCellDefaultStyle,SelectionCellParentStyle,SelectionCreateCell,%
+      SelectionDuplicateCell,%
+      SelectionEvaluate,SelectionEvaluateCreateCell,SelectionMove,SelectionSetStyle,%
+      SelectionStrategy,SendFontInformationToKernel,SequenceHold,SequenceLimit,%
+      SeriesCoefficient,SetBoxFormNamesPacket,SetEvaluationNotebook,%
+      SetFileLoadingContext,%
+      SetNotebookStatusLine,SetOptionsPacket,SetSelectedNotebook,%
+      SetSpeechParametersPacket,%
+      SetValue,ShortestMatch,ShowAutoStyles,ShowCellBracket,%
+      ShowCellLabel,ShowCellTags,ShowClosedCellArea,ShowContents,%
+      ShowCursorTracker,ShowGroupOpenCloseIcon,ShowPageBreaks,ShowSelection,%
+      ShowShortBoxForm,ShowSpecialCharacters,ShowStringCharacters,%
+      ShrinkWrapBoundingBox,%
+      SingleLetterItalics,SingularityDepth,SingularValueDecomposition,%
+      SingularValueList,%
+      SinhIntegral,Smaller,Socket,SolveDelayed,%
+      SoundAndGraphics,Sow,Space,SpaceForm,%
+      SpanAdjustments,SpanCharacterRounding,SpanLineThickness,SpanMaxSize,%
+      SpanMinSize,SpanningCharacters,SpanSymmetric,Sparse,%
+      SparseArray,SpeakTextPacket,SpellingDictionaries,SpellingDictionariesPath,%
+      SpellingOptions,SpellingSuggestionsPacket,Spherical,Split,%
+      SqrtBox,SqrtBoxOptions,StandardDeviation,StandardForm,%
+      StartingStepSize,StartOfLine,StartOfString,StartupSound,%
+      StepMonitor,StieltjesGamma,StoppingTest,StringCases,%
+      StringCount,StringExpression,StringFreeQ,StringQ,%
+      StringReplaceList,StringReplacePart,StringSplit,StripBoxes,%
+      StripWrapperBoxes,StructuredSelection,StruveH,StruveL,%
+      StyleBox,StyleBoxAutoDelete,StyleBoxOptions,StyleData,%
+      StyleDefinitions,StyleForm,StyleMenuListing,StyleNameDialogSettings,%
+      StylePrint,StyleSheetPath,Subresultants,SubscriptBox,%
+      SubscriptBoxOptions,Subsets,Subsuperscript,SubsuperscriptBox,%
+      SubsuperscriptBoxOptions,SubtractFrom,SubValues,SugarCube,%
+      SuperscriptBox,SuperscriptBoxOptions,SuspendPacket,SylvesterMatrix,%
+      SymbolName,Syntax,SyntaxForm,SyntaxPacket,%
+      SystemException,SystemHelpPath,SystemStub,Tab,%
+      TabFilling,TabSpacings,TagBox,TagBoxOptions,%
+      TaggingRules,TagStyle,TargetFunctions,TemporaryVariable,%
+      TensorQ,TeXSave,TextAlignment,TextBoundingBox,%
+      TextData,TextJustification,TextLine,TextPacket,%
+      TextParagraph,TextRendering,TextStyle,ThisLink,%
+      TimeConstraint,TimeVariable,TitleGrouping,ToBoxes,%
+      ToColor,ToFileName,Toggle,ToggleFalse,%
+      Tolerance,TooBig,Top,ToRadicals,%
+      Total,Tr,TraceAction,TraceInternal,%
+      TraceLevel,TraditionalForm,TraditionalFunctionNotation,TraditionalNotation,%
+      TraditionalOrder,TransformationFunctions,TransparentColor,Trapezoidal,%
+      TrigExpand,TrigFactor,TrigFactorList,TrigReduce,%
+      TrigToExp,Tuples,UnAlias,Underflow,%
+      Underoverscript,UnderoverscriptBox,UnderoverscriptBoxOptions,Underscript,%
+      UnderscriptBox,UnderscriptBoxOptions,UndocumentedTestFEParserPacket,%
+      UndocumentedTestGetSelectionPacket,%
+      UnitStep,Up,URL,Using,%
+      V2Get,Value,ValueBox,ValueBoxOptions,%
+      ValueForm,Variance,Verbatim,Verbose,%
+      VerboseConvertToPostScriptPacket,VerifyConvergence,VerifySolutions,Version,%
+      VersionNumber,Vertical,VerticalForm,ViewPointSelectorSettings,%
+      Visible,VisibleCell,WeierstrassHalfPeriods,WeierstrassInvariants,%
+      WeierstrassSigma,WeierstrassZeta,White,Whitespace,%
+      WhitespaceCharacter,WindowClickSelect,WindowElements,WindowFloating,%
+      WindowFrame,WindowFrameElements,WindowMargins,WindowMovable,%
+      WindowSize,WindowTitle,WindowToolbars,WindowWidth,%
+      WordBoundary,WordCharacter,WynnDegree,XMLElement},%
+   morendkeywords={$,$AddOnsDirectory,$AnimationDisplayFunction,%
+      $AnimationFunction,%
+      $Assumptions,$BaseDirectory,$BoxForms,$ByteOrdering,%
+      $CharacterEncoding,$ConditionHold,$CurrentLink,$DefaultPath,%
+      $ExportEncodings,$ExportFormats,$FormatType,$FrontEnd,%
+      $HistoryLength,$HomeDirectory,$ImportEncodings,$ImportFormats,%
+      $InitialDirectory,$InstallationDate,$InstallationDirectory,%
+      $InterfaceEnvironment,%
+      $LaunchDirectory,$LicenseExpirationDate,$LicenseID,$LicenseProcesses,%
+      $LicenseServer,$MachineDomain,$MaxExtraPrecision,$MaxLicenseProcesses,%
+      $MaxNumber,$MaxPiecewiseCases,$MaxPrecision,$MaxRootDegree,%
+      $MinNumber,$MinPrecision,$NetworkLicense,$NumberMarks,%
+      $Off,$OutputForms,$ParentLink,$ParentProcessID,%
+      $PasswordFile,$PathnameSeparator,$PreferencesDirectory,$PrintForms,%
+      $PrintLiteral,$ProcessID,$ProcessorType,$ProductInformation,%
+      $ProgramName,$PSDirectDisplay,$RandomState,$RasterFunction,%
+      $RootDirectory,$SetParentLink,$SoundDisplay,$SuppressInputFormHeads,%
+      $SystemCharacterEncoding,$SystemID,$TemporaryPrefix,$TextStyle,%
+      $TopDirectory,$TraceOff,$TraceOn,$TracePattern,%
+      $TracePostAction,$TracePreAction,$UserAddOnsDirectory,$UserBaseDirectory,%
+      $UserName,Constant,Flat,HoldAll,%
+      HoldAllComplete,HoldFirst,HoldRest,Listable,%
+      Locked,NHoldAll,NHoldFirst,NHoldRest,%
+      NumericFunction,OneIdentity,Orderless,Protected,%
+      ReadProtected,SequenceHold},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Mathematica definitions (c) 1999 Michael Wiese
+%%
+\lst@definelanguage[3.0]{Mathematica}[1.0]{Mathematica}%
+  {morekeywords={Abort,AbortProtect,AbsoluteDashing,AbsolutePointSize,%
+      AbsoluteThickness,AbsoluteTime,AccountingFormAiry,AiPrime,AiryBi,%
+      AiryBiPrime,Alternatives,AnchoredSearch,AxesEdge,AxesOrigin,%
+      AxesStyle,Background,BetaRegularized,BoxStyle,C,CheckAbort,%
+      Circle,ClebschGordan,CMYKColor,ColorFunction,ColorOutput,Compile,%
+      Compiled,CompiledFunction,ComplexExpand,ComposeList,Composition,%
+      ConstrainedMax,ConstrainedMin,Contexts,ContextToFilename,%
+      ContourLines,Contours,ContourShading,ContourSmoothing,%
+      ContourStyle,CopyDirectory,CopyFile,CosIntegral,CreateDirectory,%
+      Cuboid,Date,DeclarePackage,DefaultColor,DefaultFont,Delete,%
+      DeleteCases,DeleteDirectory,DeleteFile,Dialog,DialogIndent,%
+      DialogProlog,DialogSymbols,DigitQ,Directory,DirectoryStack,Disk,%
+      Dispatch,DownValues,DSolve,Encode,Epilog,Erfc,Evaluate,%
+      ExponentFunction,FaceGrids,FileByteCount,FileDate,FileNames,%
+      FileType,Find,FindList,FixedPointList,FlattenAt,Fold,FoldList,%
+      Frame,FrameLabel,FrameStyle,FrameTicks,FromCharacterCode,%
+      FromDate,FullGraphics,FullOptions,GammaRegularized,%
+      GaussianIntegers,GraphicsArray,GraphicsSpacing,GridLines,%
+      GroebnerBasis,Heads,HeldPart,HomeDirectory,Hue,IgnoreCases,%
+      InputStream,Install,InString,IntegerDigits,InterpolatingFunction,%
+      InterpolatingPolynomial,Interpolation,Interrupt,InverseFunction,%
+      InverseFunctions,JacobiZeta,LetterQ,LinearProgramming,ListPlay,%
+      LogGamma,LowerCaseQ,MachineNumberQ,MantissaExponent,MapIndexed,%
+      MapThread,MatchLocalNames,MatrixExp,MatrixPower,MeshRange,%
+      MeshStyle,MessageList,Module,NDSolve,NSolve,NullRecords,%
+      NullWords,NumberFormat,NumberPadding,NumberSigns,OutputStream,%
+      PaddedForm,ParentDirectory,Pause,Play,PlayRange,PlotRegion,%
+      PolygonIntersections,PolynomialGCD,PolynomialLCM,PolynomialMod,%
+      PostScript,PowerExpand,PrecisionGoal,PrimePi,Prolog,%
+      QRDecomposition,Raster,RasterArray,RealDigits,Record,RecordLists,%
+      RecordSeparators,ReleaseHold,RenameDirectory,RenameFile,%
+      ReplaceHeldPart,ReplacePart,ResetDirectory,Residue,%
+      RiemannSiegelTheta,RiemannSiegelZ,RotateLabel,SameTest,%
+      SampleDepth,SampledSoundFunction,SampledSoundList,SampleRate,%
+      SchurDecomposition,SessionTime,SetAccuracy,SetDirectory,%
+      SetFileDate,SetPrecision,SetStreamPosition,Shallow,SignPadding,%
+      SinIntegral,SixJSymbol,Skip,Sound,SpellingCorrection,%
+      SphericalRegion,Stack,StackBegin,StackComplete,StackInhibit,%
+      StreamPosition,Streams,StringByteCount,StringConversion,%
+      StringDrop,StringInsert,StringPosition,StringReplace,%
+      StringReverse,StringTake,StringToStream,SurfaceColor,%
+      SyntaxLength,SyntaxQ,TableAlignments,TableDepth,%
+      TableDirections,TableHeadings,TableSpacing,ThreeJSymbol,TimeUsed,%
+      TimeZone,ToCharacterCode,ToDate,ToHeldExpression,TokenWords,%
+      ToLowerCase,ToUpperCase,Trace,TraceAbove,TraceBackward,%
+      TraceDepth,TraceDialog,TraceForward,TraceOff,TraceOn,%
+      TraceOriginal,TracePrint,TraceScan,Trig,Unevaluated,Uninstall,%
+      UnsameQ,UpperCaseQ,UpValues,ViewCenter,ViewVertical,With,Word,%
+      WordSearch,WordSeparators},%
+   morendkeywords={Stub,Temporary,$Aborted,$BatchInput,$BatchOutput,%
+      $CreationDate,$DefaultFont,$DumpDates,$DumpSupported,$Failed,%
+      $Input,$Inspector,$IterationLimit,$Language,$Letters,$Linked,%
+      $LinkSupported,$MachineEpsilon,$MachineID,$MachineName,%
+      $MachinePrecision,$MachineType,$MaxMachineNumber,$MessageList,%
+      $MessagePrePrint,$MinMachineNumber,$ModuleNumber,$NewMessage,%
+      $NewSymbol,$Notebooks,$OperatingSystem,$Packages,$PipeSupported,%
+      $PreRead,$ReleaseNumber,$SessionID,$SoundDisplayFunction,%
+      $StringConversion,$StringOrder,$SyntaxHandler,$TimeUnit,%
+      $VersionNumber}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[1.0]{Mathematica}%
+  {morekeywords={Abs,Accuracy,AccurayGoal,AddTo,AiryAi,AlgebraicRules,%
+      AmbientLight,And,Apart,Append,AppendTo,Apply,ArcCos,ArcCosh,%
+      ArcCot,ArcCoth,ArcCsc,ArcCsch,ArcSec,ArcSech,ArcSin,ArcSinh,%
+      ArcTan,ArcTanh,Arg,ArithmeticGeometricMean,Array,AspectRatio,%
+      AtomQ,Attributes,Axes,AxesLabel,BaseForm,Begin,BeginPackage,%
+      BernoulliB,BesselI,BesselJ,BesselK,BesselY,Beta,Binomial,Blank,%
+      BlankNullSequence,BlankSequence,Block,Boxed,BoxRatios,Break,Byte,%
+      ByteCount,Cancel,Cases,Catch,Ceiling,CForm,Character,Characters,%
+      ChebyshevT,ChebyshevU,Check,Chop,Clear,ClearAll,ClearAttributes,%
+      ClipFill,Close,Coefficient,CoefficientList,Collect,ColumnForm,%
+      Complement,Complex,CompoundExpression,Condition,Conjugate,%
+      Constants,Context,Continuation,Continue,ContourGraphics,%
+      ContourPlot,Cos,Cosh,Cot,Coth,Count,Csc,Csch,Cubics,Cyclotomic,%
+      D,Dashing,Decompose,Decrement,Default,Definition,Denominator,%
+      DensityGraphics,DensityPlot,Depth,Derivative,Det,DiagonalMatrix,%
+      DigitBlock,Dimensions,DirectedInfinity,Display,DisplayFunction,%
+      Distribute,Divide,DivideBy,Divisors,DivisorSigma,Do,Dot,Drop,Dt,%
+      Dump,EdgeForm,Eigensystem,Eigenvalues,Eigenvectors,Eliminate,%
+      EllipticE,EllipticExp,EllipticF,EllipticK,EllipticLog,EllipticPi,%
+      EllipticTheta,End,EndPackage,EngineeringForm,Environment,Equal,%
+      Erf,EulerE,EulerPhi,EvenQ,Exit,Exp,Expand,ExpandAll,%
+      ExpandDenominator,ExpandNumerator,ExpIntegralE,ExpIntegralEi,%
+      Exponent,Expression,ExtendedGCD,FaceForm,Factor,FactorComplete,%
+      Factorial,Factorial2,FactorInteger,FactorList,FactorSquareFree,%
+      FactorSquareFreeList,FactorTerms,FactorTermsList,FindMinimum,%
+      FindRoot,First,Fit,FixedPoint,Flatten,Floor,FontForm,For,Format,%
+      FormatType,FortranForm,Fourier,FreeQ,FullDefinition,FullForm,%
+      Function,Gamma,GCD,GegenbauerC,General,Get,Goto,Graphics,%
+      Graphics3D,GrayLevel,Greater,GreaterEqual,Head,HermiteH,%
+      HiddenSurface,Hold,HoldForm,Hypergeometric0F1,Hypergeometric1F1,%
+      Hypergeometric2F1,HypergeometricU,Identity,IdentityMatrix,If,Im,%
+      Implies,In,Increment,Indent,Infix,Information,Inner,Input,%
+      InputForm,InputString,Insert,Integer,IntegerQ,Integrate,%
+      Intersection,Inverse,InverseFourier,InverseJacobiSN,%
+      InverseSeries,JacobiAmplitude,JacobiP,JacobiSN,JacobiSymbol,Join,%
+      Label,LaguerreL,Last,LatticeReduce,LCM,LeafCount,LegendreP,%
+      LegendreQ,LegendreType,Length,LerchPhi,Less,LessEqual,Level,%
+      Lighting,LightSources,Limit,Line,LinearSolve,LineBreak,List,%
+      ListContourPlot,ListDensityPlot,ListPlot,ListPlot3D,Literal,Log,%
+      LogicalExpand,LogIntegral,MainSolve,Map,MapAll,MapAt,MatchQ,%
+      MatrixForm,MatrixQ,Max,MaxBend,MaxMemoryUsed,MemberQ,%
+      MemoryConstrained,MemoryInUse,Mesh,Message,MessageName,Messages,%
+      Min,Minors,Minus,Mod,Modulus,MoebiusMu,Multinomial,N,NameQ,Names,%
+      NBernoulliB,Needs,Negative,Nest,NestList,NIntegrate,%
+      NonCommutativeMultiply,NonConstants,NonNegative,Normal,Not,%
+      NProduct,NSum,NullSpace,Number,NumberForm,NumberPoint,NumberQ,%
+      NumberSeparator,Numerator,O,OddQ,Off,On,OpenAppend,OpenRead,%
+      OpenTemporary,OpenWrite,Operate,Optional,Options,Or,Order,%
+      OrderedQ,Out,Outer,OutputForm,PageHeight,PageWidth,%
+      ParametricPlot,ParametricPlot3D,Part,Partition,PartitionsP,%
+      PartitionsQ,Pattern,Permutations,Plot,Plot3D,PlotDivision,%
+      PlotJoined,PlotLabel,PlotPoints,PlotRange,PlotStyle,Pochhammer,%
+      Plus,Point,PointSize,PolyGamma,Polygon,PolyLog,PolynomialQ,%
+      PolynomialQuotient,PolynomialRemainder,Position,Positive,Postfix,%
+      Power,PowerMod,PrecedenceForm,Precision,PreDecrement,Prefix,%
+      PreIncrement,Prepend,PrependTo,Prime,PrimeQ,Print,PrintForm,%
+      Product,Protect,PseudoInverse,Put,PutAppend,Quartics,Quit,%
+      Quotient,Random,Range,Rational,Rationalize,Raw,Re,Read,ReadList,%
+      Real,Rectangle,Reduce,Remove,RenderAll,Repeated,RepeatedNull,%
+      Replace,ReplaceAll,ReplaceRepeated,Rest,Resultant,Return,Reverse,%
+      RGBColor,Roots,RotateLeft,RotateRight,Round,RowReduce,Rule,%
+      RuleDelayed,Run,RunThrough,SameQ,Save,Scaled,Scan,ScientificForm,%
+      Sec,Sech,SeedRandom,Select,Sequence,SequenceForm,Series,%
+      SeriesData,Set,SetAttributes,SetDelayed,SetOptions,Shading,Share,%
+      Short,Show,Sign,Signature,Simplify,Sin,SingularValues,Sinh,%
+      Skeleton,Slot,SlotSequence,Solve,SolveAlways,Sort,%
+      SphericalHarmonicY,Splice,Sqrt,StirlingS1,StirlingS2,String,%
+      StringBreak,StringForm,StringJoin,StringLength,StringMatchQ,%
+      StringSkeleton,Subscript,Subscripted,Subtract,SubtractForm,Sum,%
+      Superscript,SurfaceGraphics,Switch,Symbol,Table,TableForm,TagSet,%
+      TagSetDelayed,TagUnset,Take,Tan,Tanh,ToString,TensorRank,TeXForm,%
+      Text,TextForm,Thickness,Thread,Through,Throw,Ticks,%
+      TimeConstrained,Times,TimesBy,Timing,ToExpression,Together,%
+      ToRules,ToString,TotalHeight,TotalWidth,Transpose,TreeForm,TrueQ,%
+      Unequal,Union,Unique,Unprotect,Unset,Update,UpSet,UpSetDelayed,%
+      ValueQ,Variables,VectorQ,ViewPoint,WeierstrassP,%
+      WeierstrassPPrime,Which,While,WorkingPrecision,Write,WriteString,%
+      Xor,ZeroTest,Zeta},%
+   morendkeywords={All,Automatic,Catalan,ComplexInfinity,Constant,%
+      Degree,E,EndOfFile,EulerGamma,False,Flat,GoldenRatio,HoldAll,%
+      HoldFirst,HoldRest,I,Indeterminate,Infinity,Listable,Locked,%
+      Modular,None,Null,OneIdentity,Orderless,Pi,Protected,%
+      ReadProtected,True,$CommandLine,$Context,$ContextPath,$Display,%
+      $DisplayFunction,$Echo,$Epilog,$IgnoreEOF,$Line,$Messages,%
+      $Output,$Path,$Post,$Pre,$PrePrint,$RecursionLimit,$System,%
+      $Urgent,$Version},%
+   sensitive,%
+   morecomment=[s]{(*}{*)},%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Mercury}
+%
+% \lstthanks{Dominique~de~Waleffe}{ddw@miscrit.be}{1997/11/24} mailed me the
+% data and \lstthanks{Ralph~Becket}{rbeck@microsoft.com}{2001/05/01} extended
+% the definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Mercury definition (c) 1997 Dominique de Waleffe
+%% Extended (c) 2001 Ralph Becket
+%%
+\lst@definelanguage{Mercury}%
+  {otherkeywords={::,->,-->,--->,:-,==,=>,<=,<=>},%
+   morekeywords={module,include_module,import_module,interface,%
+      end_module,implementation,mode,is,failure,semidet,nondet,det,%
+      multi,erroneous,inst,in,out,di,uo,ui,type,typeclass,instance,%
+      where,with_type,pred,func,lambda,impure,semipure,if,then,else,%
+      some,all,not,true,fail,pragma,memo,no_inline,inline,loop_check,%
+      minimal_model,fact_table,type_spec,terminates,does_not_terminate,%
+      check_termination,promise_only_solution,unsafe_promise_unique,%
+      source_file,obsolete,import,export,c_header_code,c_code,%
+      foreign_code,foreign_proc,may_call_mercury,will_not_call_mercury,%
+      thread_safe,not_thread_safe},%
+   sensitive=t,%
+   morecomment=[l]\%,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[bd]",%
+   morestring=[bd]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{MetaPost}
+%
+% \lstthanks{Uwe~Siart}{uwe.siart@ei.tum.de}{2003/03/28} provided the
+% keywords for a previous version. The current language definition comes
+% from \lstthanks{Brooks~Moses}{}{2004/08/07}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% MetaPost definition (c) 2004 Brooks Moses
+%%   This definition is based on the language specifications
+%%   contained in the _User's Manual for Metapost_, with the core
+%%   language enhancements that are described in the _Drawing
+%%   Graphs with MetaPost_ documentation.
+%%
+\lst@definelanguage{MetaPost}%
+  {% keywords[1] = MetaPost primitives (not found in following tables)
+   morekeywords={end,begingroup,endgroup,beginfig,endfig,def,vardef,%
+      primary,secondary,tertiary,primarydef,secondarydef,tertiarydef,%
+      expr,suffix,text,enddef,if,fi,else,elseif,for,forsuffixes,%
+      forever,endfor,upto,downto,stop,until,tension,controls,on,off,%
+      btex,etex,within,input},
+   % keywords[2] = Operators (Tables 6-9 in MetaPost User's manual)
+   morekeywords=[2]{abs,and,angle,arclength,arctime,ASCII,bbox,bluepart,%
+      boolean,bot,ceiling,center,char,color,cosd,cutafter,cutbefore,%
+      cycle,decimal,dir,direction,directionpoint,directiontime,div,%
+      dotprod,floor,fontsize,greenpart,hex,infont,intersectionpoint,%
+      intersectiontimes,inverse,known,length,lft,llcorner,lrcorner,%
+      makepath,makepen,mexp,mlog,mod,normaldeviate,not,numeric,oct,%
+      odd,or,pair,path,pen,penoffset,picture,point,postcontrol,%
+      precontrol,redpart,reverse,rotated,round,rt,scaled,shifted,%
+      sind,slanted,sqrt,str,string,subpath,substring,top,transform,%
+      transformed,ulcorner,uniformdeviate,unitvector,unknown,%
+      urcorner,whatever,xpart,xscaled,xxpart,xypart,ypart,yscaled,%
+      yxpart,yypart,zscaled,of,reflectedabout,rotatedaround,ulft,urt,%
+      llft,lrt,readfrom,write,stroked,filled,textual,clipped,bounded,%
+      pathpart,penpart,dashpart,textpart,fontpart},%
+   % keywords[3] = Commands (Table 10)
+   morekeywords=[3]{addto,clip,cutdraw,draw,drawarrow,drawdblarrow,%
+      fill,filldraw,interim,let,loggingall,newinternal,pickup,%
+      save,setbounds,shipout,show,showdependencies,showtoken,%
+      showvariable,special,tracingall,tracingnone,undraw,unfill,%
+      unfilldraw,to,also,contour,doublepath,withcolor,withpen,%
+      dashed,randomseed},%
+   % keywords[4] = Function-Like Macros (Table 11)
+   morekeywords=[4]{boxit,boxjoin,bpath,buildcycle,circleit,dashpattern,%
+      decr,dotlabel,dotlabels,drawboxed,drawboxes,drawoptions,%
+      drawunboxed,fixpos,fixsize,incr,interpath,label,labels,max,min,pic,%
+      thelabel,z,image},%
+   % keywords[5] = Internal and Predefined Variables (Tables 3, 4)
+   morekeywords=[5]{ahangle,ahlength,bboxmargin,charcode,circmargin,%
+      day,defaultdx,defaultdy,defaultpen,defaultscale,labeloffset,%
+      linecap,linejoin,miterlimit,month,pausing,prologues,showstopping,%
+      time,tracingcapsules,tracingchoices,tracingcommands,%
+      tracingequations,tracinglostchars,tracingmacros,tracingonline,%
+      tracingoutput,tracingrestores,tracingspecs,tracingstats,%
+      tracingtitles,truecorners,warningcheck,year},
+   morekeywords=[5]{background,currentpen,currentpicture,cuttings,%
+      defaultfont},%
+   % keywords[6] = Predefined Constants (Table 5)
+   morekeywords=[6]{beveled,black,blue,bp,butt,cc,cm,dd,ditto,down,%
+      epsilon,evenly,false,fullcircle,green,halfcircle,identity,%
+      in,infinity,left,mitered,mm,nullpicture,origin,pc,pencircle,%
+      pt,quartercircle,red,right,rounded,squared,true,unitsquare,%
+      up,white,withdots},
+   sensitive=false,%
+   alsoother={0123456789$},%
+   morecomment=[l]\%,%
+   morestring=[mf]{input\ },%
+   morestring=[b]"%
+  }[keywords,comments,strings,mf]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Miranda}
+%
+% Thanks to \lstthanks{Peter~Bartke}{bartke@inf.fu-berlin.de}{1999/01/30}
+% for providing the definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Miranda definition (c) 1998 Peter Bartke
+%% 
+%% Miranda: pure lazy functional language with polymorphic type system,
+%%          garbage collection and functions as first class citizens
+%%
+\lst@definelanguage{Miranda}%
+  {morekeywords={abstype,div,if,mod,otherwise,readvals,show,type,where,%
+     with,bool,char,num,sys_message,False,True,Appendfile,Closefile,%
+     Exit,Stderr,Stdout,System,Tofile,\%include,\%export,\%free,%
+     \%insert,abs,and,arctan,cjustify,code,concat,const,converse,cos,%
+     decode,digit,drop,dropwhile,entier,error,exp,filemode,filter,%
+     foldl,foldl1,foldr,foldr1,force,fst,getenv,hd,hugenum,id,index,%
+     init,integer,iterate,last,lay,layn,letter,limit,lines,ljustify,%
+     log,log10,map,map2,max,max2,member,merge,min,min2,mkset,neg,%
+     numval,or,pi,postfix,product,read,rep,repeat,reverse,rjustify,%
+     scan,seq,showfloat,shownum,showscaled,sin,snd,sort,spaces,sqrt,%
+     subtract,sum,system,take,takewhile,tinynum,tl,transpose,undef,%
+     until,zip2,zip3,zip4,zip5,zip6,zip},%
+   sensitive,%
+   morecomment=[l]||,%
+   morestring=[b]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+%
+% \subsection{Mizar}
+%
+% As you can read below, \lstthanks{Adam~Grabowski}{adam@mizar.org}
+% {2003/03/29} provided this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Mizar definition (c) 2003 Adam Grabowski
+%%
+%% Mizar is freely available at URL www.mizar.org for the Linux x86,
+%% Solaris x86, and Windows operating systems.
+%%
+\lst@definelanguage{Mizar}%
+  {otherkeywords={->,(\#,\#),.=),\&},%
+   morekeywords={vocabulary,constructors,$1,$1,$2,$3,$4,$5,$6,$7,$8,%
+      @proof,according,aggregate,and,antonym,as,associativity,assume,%
+      asymmetry,attr,be,begin,being,by,canceled,case,cases,cluster,%
+      clusters,coherence,commutativity,compatibility,connectedness,%
+      consider,consistency,constructors,contradiction,correctness,def,%
+      deffunc,define,definition,definitions,defpred,end,environ,equals,%
+      ex,exactly,existence,for,from,func,given,hence,hereby,holds,%
+      idempotence,if,iff,implies,involutiveness,irreflexivity,is,it,%
+      let,means,mode,non,not,notation,now,of,or,otherwise,over,per,%
+      pred,prefix,projectivity,proof,provided,qua,reconsider,redefine,%
+      reflexivity,requirements,reserve,scheme,schemes,section,selector,%
+      set,st,struct,such,suppose,symmetry,synonym,take,that,the,then,%
+      theorem,theorems,thesis,thus,to,transitivity,uniqueness,%
+      vocabulary,where},%
+   sensitive=t,%
+   morecomment=[l]::%
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ML}
+%
+% Thanks to \lstthanks{Torben~Hoffmann}{toho@it.dtu.dk}{1999/02/18} for
+% providing the definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% ML definition (c) 1999 Torben Hoffmann
+%%
+\lst@definelanguage{ML}%
+  {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,%
+       eqtype,exception,fn,fun,functor,handle,if,in,include,infix,%
+       infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,%
+       signature,struct,structure,then,type,val,with,withtype,while},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Modula-2}
+%
+% Took data from
+% \begin{itemize}
+% \item
+%       \textsc{Niklaus Wirth}: \textbf{Programmieren in Modula-2},
+%       \"Ubers.\ Guido Pfeiffer;
+%       2.\ Auflage -- Berlin; Heidelberg; New York; London; Paris; Tokyo;
+%               Hong Kong: Springer, 1991;
+%       ISBN 3-540-51689-1.
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Modula-2}%
+  {morekeywords={AND,ARRAY,BEGIN,BY,CASE,CONST,DIV,DO,ELSE,ELSIF,END,%
+      EXIT,EXPORT,FOR,FROM,IF,IMPLEMENTATION,IMPORT,IN,MOD,MODULE,NOT,%
+      OF,OR,POINTER,PROCEDURE,QUALIFIED,RECORD,REPEAT,RETURN,SET,THEN,%
+      TYPE,UNTIL,VAR,WHILE,WITH,ABS,BITSET,BOOLEAN,CAP,CARDINAL,CHAR,%
+      CHR,DEC,EXCL,FALSE,FLOAT,HALT,HIGH,INC,INCL,INTEGER,LONGCARD,%
+      LONGINT,LONGREAL,MAX,MIN,NIL,ODD,ORD,PROC,REAL,SIZE,TRUE,TRUNC,%
+      VAL,DEFINITION,LOOP},% added keywords due to Peter Bartke 99/07/22
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{MuPAD}
+%
+% This definition was provided by \lstthanks{Christopher~Creutzig}
+% {ccr@mupad.de}{2002/10/15}. Again thanks to \lsthelper{Ulrike Fischer}
+% {-}{2004/04/23}{Re: Bug in listings.sty} for pointing to a missing |@|
+% in |\lstdefinelanguage|.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{MuPAD}{%
+   morekeywords={end,next,break,if,then,elif,else,end_if,case,end_case,%
+      otherwise,for,from,to,step,downto,in,end_for,while,end_while,%
+      repeat,until,end_repeat,or,and,not,xor,div,mod,union,minus,%
+      intersect,subset,proc,begin,end_proc,domain,end_domain,category,%
+      end_category,axiom,end_axiom,quit,delete,frame},%
+   morekeywords=[2]{NIL,FAIL,TRUE,FALSE,UNKNOWN,I,RD_INF,RD_NINF,%
+      RD_NAN,name,local,option,save,inherits,of,do},%
+   otherkeywords={\%if,?,!,:=,<,>,=,<=,<>,>=,==>,<=>,::,..,...,->,%
+      @,@@,\$},%
+   sensitive=true,%
+   morecomment=[l]{//},%
+   morecomment=[n]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[d]{`}%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{NASTRAN}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+% The definition is from \lsthelper{Jeffrey Ratcliffe}
+% {Jeffrey.Ratcliffe@m.eads.net}{2002/02/21}{}---except the
+% \texttt{MoreSelectCharTable} part which simulates the keyword
+% \texttt{BEGIN BULK}.
+%    \begin{macrocode}
+\lst@definelanguage{NASTRAN}
+  {morekeywords={ENDDATA},%
+   morecomment=[l]$,%
+   MoreSelectCharTable=%
+        \lst@CArgX BEGIN\ BULK\relax\lst@CDef{}%
+        {\lst@ifmode\else \ifnum\lst@length=\z@
+             \lst@EnterMode{\lst@GPmode}{\lst@modetrue
+                  \let\lst@currstyle\lst@gkeywords@sty}%
+         \fi \fi}%
+        {\ifnum\lst@mode=\lst@GPmode
+             \lst@XPrintToken \lst@LeaveMode
+         \fi}%
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Oberon-2}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Oberon-2}%
+  {morekeywords={ARRAY,BEGIN,BOOLEAN,BY,CASE,CHAR,CONST,DIV,DO,ELSE,%
+      ELSIF,END,EXIT,FALSE,FOR,IF,IMPORT,IN,INTEGER,IS,LONGINT,%
+      LONGREAL,LOOP,MOD,MODULE,NIL,OF,OR,POINTER,PROCEDURE,REAL,RECORD,%
+      REPEAT,RETURN,SET,SHORTINT,THEN,TO,TRUE,TYPE,UNTIL,VAR,WHILE,%
+      WITH,ABS,ASH,CAP,CHR,COPY,DEC,ENTIER,EXCL,HALT,INC,INCL,LEN,LONG,%
+      MAX,MIN,NEW,ODD,ORD,SHORT,SIZE},%
+   sensitive,%
+   morecomment=[n]{(*}{*)},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{OCL}
+%
+% This definition is based on chapter 7 of the OMG UML standard version 1.3:
+% \begin{itemize}
+% \item
+%               \textsc{OMG}:
+%               \textbf{OMG Unified Modeling Language Specification};
+%               {\copyright} 1999 OMG;
+%               Available at \texttt{ftp://ftp.omg.org/pub/docs/ad/99-06-08.pdf}.
+% \end{itemize}%
+% This language is due to \lstthanks{Achim~D.~Brucker}
+% {brucker@informatik.uni-freiburg.de}{2000/08/14}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% OCL definition (c) 2000 Achim D. Brucker
+%%
+%% You are allowed to use, modify and distribute this code either under
+%% the terms of the LPPL (version 1.0 or later) or the GPL (version 2.0
+%% or later).
+%%
+%    \end{macrocode}
+% First we define are very decorative style. In the OMG standard only the
+% boolean (infix (?)) operations are highlighted, but I think all OCL-defined
+% operations should be highlighted, because they are \emph{guaranteed} to be
+% side-effect-free (in OCL only side effect free evaluations or path
+% expressions are allowed).
+%    \begin{macrocode}
+\lst@definelanguage[decorative]{OCL}[OMG]{OCL}
+  {otherkeywords={@pre},%
+   morendkeywords={name,attributes,associatoinEnds,operations,%
+      supertypes,allSupertypes,allInstances,oclIsKindOf,oclIsTypeOf,%
+      oclAsType,oclInState,oclIsNew,evaluationType,abs,floor,round,max,%
+      min,div,mod,size,concat,toUpper,toLower,substring,includes,%
+      excludes,count,includesAll,exludesAll,isEmpty,notEmpty,sum,%
+      exists,forAll,isUnique,sortedBy,iterate,union,intersection,%
+      including,excluding,symmetricDifference,select,reject,collect,%
+      asSequence,asBag,asSequence,asSet,append,prepend,subSequence,at,%
+      first,last,true,false,isQuery}%
+  }%
+%    \end{macrocode} 
+% Remark: "isQuery" is not real OCL, but a important attribute of the
+% underlying UML model.
+%
+% The dialect called \texttt{OMG} is a very spare version. If you use
+% this variant with bold style for first and second order keywords you
+% get the look and feel of the OMG standard. First order keywords are the
+% OCL context declarations (see section 7.3 of the OMG standard):
+%    \begin{macrocode}
+\lst@definelanguage[OMG]{OCL}%
+    {morekeywords={context,pre,inv,post},%
+%    \end{macrocode} 
+% Second order keywords are the operation which are defined for type
+% Boolean (see pages 7-34/35 of the OMG standard) and the let-operation
+% (in principle these are the infix operations):
+%    \begin{macrocode}
+    ndkeywords={or,xor,and,not,implies,if,then,else,endif},%
+%    \end{macrocode} 
+% Third order keywords are the basic data types as declared in section 7.4 of
+% the OMG standard:
+%    \begin{macrocode}
+    morekeywords=[3]{Boolean,Integer,Real,String,Set,Sequence,Bag,%
+       OclType,OclAny,OclExpression,Enumeration,Collection,},%
+    sensitive=t,%
+    morecomment=[l]--,%
+    morestring=[d]'%
+   }[keywords,comments,strings]%
+%    \end{macrocode}
+% After a bug report by \lsthelper{Martin~S\"u\ss kraut}{Edon.Myder@web.de}
+% {2003/01/30}{morerdkeywords doesn't exist any more} \texttt{morerdkeywords}
+% has been changed to the correct optional argument \texttt{[3]}.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Octave}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% As you can read below the definition is due to \lstthanks{Ulrich~G.~Wortmann}
+% {uliw@erdw.ethz.ch}{2002/02/18}{}.  Additions due to \lstthanks{Sebastian~%
+% Schubert}{-}{2006/05/11}.
+%    \begin{macrocode}
+%%
+%% Octave definition (c) 2001,2002 Ulrich G. Wortmann
+%%
+\lst@definelanguage{Octave}%
+  {morekeywords={gt,lt,amp,abs,acos,acosh,acot,acoth,acsc,acsch,%
+      all,angle,ans,any,asec,asech,asin,asinh,atan,atan2,atanh,auread,%
+      auwrite,axes,axis,balance,bar,bessel,besselk,bessely,beta,%
+      betainc,betaln,blanks,bone,break,brighten,capture,cart2pol,%
+      cart2sph,caxis,cd,cdf2rdf,cedit,ceil,chol,cla,clabel,clc,clear,%
+      clf,clock,close,colmmd,Colon,colorbar,colormap,ColorSpec,colperm,%
+      comet,comet3,compan,compass,computer,cond,condest,conj,contour,%
+      contour3,contourc,contrast,conv,conv2,cool,copper,corrcoef,cos,%
+      cosh,cot,coth,cov,cplxpair,cputime,cross,csc,csch,csvread,%
+      csvwrite,cumprod,cumsum,cylinder,date,dbclear,dbcont,dbdown,%
+      dbquit,dbstack,dbstatus,dbstep,dbstop,dbtype,dbup,ddeadv,ddeexec,%
+      ddeinit,ddepoke,ddereq,ddeterm,ddeunadv,deblank,dec2hex,deconv,%
+      del2,delete,demo,det,diag,diary,diff,diffuse,dir,disp,dlmread,%
+      dlmwrite,dmperm,dot,drawnow,echo,eig,ellipj,ellipke,else,elseif,%
+      end,engClose,engEvalString,engGetFull,engGetMatrix,engOpen,%
+      engOutputBuffer,engPutFull,engPutMatrix,engSetEvalCallback,%
+      engSetEvalTimeout,engWinInit,eps,erf,erfc,erfcx,erfinv,%
+      errorbar,etime,etree,eval,exist,exp,expint,expm,expo,eye,fclose,%
+      feather,feof,ferror,feval,fft,fft2,fftshift,fgetl,fgets,figure,%
+      fill,fill3,filter,filter2,find,findstr,finite,fix,flag,fliplr,%
+      flipud,floor,flops,fmin,fmins,fopen,for,format,fplot,fprintf,%
+      fread,frewind,fscanf,fseek,ftell,full,function,funm,fwrite,fzero,%
+      gallery,gamma,gammainc,gammaln,gca,gcd,gcf,gco,get,getenv,%
+      getframe,ginput,global,gplot,gradient,gray,graymon,grid,griddata,%
+      gtext,hadamard,hankel,help,hess,hex2dec,hex2num,hidden,hilb,hist,%
+      hold,home,hostid,hot,hsv,hsv2rgb,if,ifft,ifft2,imag,image,%
+      imagesc,Inf,info,input,int2str,interp1,interp2,interpft,inv,%
+      invhilb,isempty,isglobal,ishold,isieee,isinf,isletter,isnan,%
+      isreal,isspace,issparse,isstr,jet,keyboard,kron,lasterr,lcm,%
+      legend,legendre,length,lin2mu,line,linspace,load,log,log10,log2,%
+      loglog,logm,logspace,lookfor,lower,ls,lscov,lu,magic,matClose,%
+      matDeleteMatrix,matGetDir,matGetFp,matGetFull,matGetMatrix,%
+      matGetNextMatrix,matGetString,matlabrc,matlabroot,matOpen,%
+      matPutFull,matPutMatrix,matPutString,max,mean,median,menu,mesh,%
+      meshc,meshgrid,meshz,mexAtExit,mexCallMATLAB,mexdebug,%
+      mexErrMsgTxt,mexEvalString,mexFunction,mexGetFull,mexGetMatrix,%
+      mexGetMatrixPtr,mexPrintf,mexPutFull,mexPutMatrix,mexSetTrapFlag,%
+      min,more,movie,moviein,mu2lin,mxCalloc,mxCopyCharacterToPtr,%
+      mxCopyComplex16ToPtr,mxCopyInteger4ToPtr,mxCopyPtrToCharacter,%
+      mxCopyPtrToComplex16,mxCopyPtrToInteger4,mxCopyPtrToReal8,%
+      mxCopyReal8ToPtr,mxCreateFull,mxCreateSparse,mxCreateString,%
+      mxFree,mxFreeMatrix,mxGetIr,mxGetJc,mxGetM,mxGetN,mxGetName,%
+      mxGetNzmax,mxGetPi,mxGetPr,mxGetScalar,mxGetString,mxIsComplex,%
+      mxIsFull,mxIsNumeric,mxIsSparse,mxIsString,mxIsTypeDouble,%
+      mxSetIr,mxSetJc,mxSetM,mxSetN,mxSetName,mxSetNzmax,mxSetPi,%
+      mxSetPr,NaN,nargchk,nargin,nargout,newplot,nextpow2,nnls,nnz,%
+      nonzeros,norm,normest,null,num2str,nzmax,ode23,ode45,orient,orth,%
+      pack,pascal,patch,path,pause,pcolor,pi,pink,pinv,plot,plot3,%
+      pol2cart,polar,poly,polyder,polyeig,polyfit,polyval,polyvalm,%
+      pow2,print,printopt,prism,prod,pwd,qr,qrdelete,qrinsert,quad,%
+      quad8,quit,quiver,qz,rand,randn,randperm,rank,rat,rats,rbbox,%
+      rcond,real,realmax,realmin,refresh,rem,reset,reshape,residue,%
+      return,rgb2hsv,rgbplot,rootobject,roots,rose,rosser,rot90,rotate,%
+      round,rref,rrefmovie,rsf2csf,save,saxis,schur,sec,sech,semilogx,%
+      semilogy,set,setstr,shading,sign,sin,sinh,size,slice,sort,sound,%
+      spalloc,sparse,spaugment,spconvert,spdiags,specular,speye,spfun,%
+      sph2cart,sphere,spinmap,spline,spones,spparms,sprandn,sprandsym,%
+      sprank,sprintf,spy,sqrt,sqrtm,sscanf,stairs,startup,std,stem,%
+      str2mat,str2num,strcmp,strings,strrep,strtok,subplot,subscribe,%
+      subspace,sum,surf,surface,surfc,surfl,surfnorm,svd,symbfact,%
+      symmmd,symrcm,tan,tanh,tempdir,tempname,terminal,text,tic,title,%
+      toc,toeplitz,trace,trapz,tril,triu,type,uicontrol,uigetfile,%
+      uimenu,uiputfile,unix,unwrap,upper,vander,ver,version,view,%
+      viewmtx,waitforbuttonpress,waterfall,wavread,wavwrite,what,%
+      whatsnew,which,while,white,whitebg,who,whos,wilkinson,wk1read,%
+      stderr,stdout,plot,set,endif,wk1write,xlabel,xor,ylabel,zeros,%
+      zlabel,zoom,endwhile,endfunction,printf,case,switch,otherwise,%
+      system,lsode,endfor,error,ones,oneplot,__gnuplot_set__,do,until},%
+   sensitive=t,%
+   morecomment=[l]\#,%
+   morecomment=[l]\#\#,%
+   morecomment=[l]\%,%
+   morestring=[m]',%
+   morestring=[m]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Oz}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+% Thanks to \lstthanks{Andres~Becerra~Sandoval}{abecerra@univalle.edu.co}
+% {2003/10/02} for providing this language definition.
+%    \begin{macrocode}
+%%
+%% Oz definition (c) Andres Becerra Sandoval
+%%
+\lst@definelanguage{Oz}%
+  {morekeywords={andthen,at,attr,case,catch,choice,class,%
+      cond,declare,define,dis,div,else,elsecase,%
+      elseif,end,export,fail,false,feat,finally,%
+      from,fun,functor,if,import,in,local,%
+      lock,meth,mod,not,of,or,orelse,%
+      prepare,proc,prop,raise,require,self,skip,%
+      then,thread,true,try,unit},%
+   sensitive=true,%
+   morecomment=[l]{\%},%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Pascal}
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+% Thanks to \lsthelper{Andreas Stephan}{Andreas.Stephan@victoria.de}{1998/04/07}
+% {alpha, byte, pack, unpack} for reporting non-keywords alpha, byte, pack and
+% unpack.
+%    \begin{macrocode}
+\lst@definelanguage[XSC]{Pascal}[Standard]{Pascal}
+  {deletekeywords={alfa,byte,pack,unpack},% 1998 Andreas Stephan
+   morekeywords={dynamic,external,forward,global,module,nil,operator,%
+      priority,sum,type,use,dispose,mark,page,release,cimatrix,%
+      cinterval,civector,cmatrix,complex,cvector,dotprecision,imatrix,%
+      interval,ivector,rmatrix,rvector,string,im,inf,re,sup,chr,comp,%
+      eof,eoln,expo,image,ival,lb,lbound,length,loc,mant,maxlength,odd,%
+      ord,pos,pred,round,rval,sign,substring,succ,trunc,ub,ubound}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[Borland6]{Pascal}[Standard]{Pascal}
+  {morekeywords={asm,constructor,destructor,implementation,inline,%
+      interface,nil,object,shl,shr,string,unit,uses,xor},%
+   morendkeywords={Abs,Addr,ArcTan,Chr,Concat,Copy,Cos,CSeg,DiskFree,%
+      DiskSize,DosExitCode,DosVersion,DSeg,EnvCount,EnvStr,Eof,Eoln,%
+      Exp,FExpand,FilePos,FileSize,Frac,FSearch,GetBkColor,GetColor,%
+      GetDefaultPalette,GetDriverName,GetEnv,GetGraphMode,GetMaxMode,%
+      GetMaxX,GetMaxY,GetModeName,GetPaletteSize,GetPixel,GetX,GetY,%
+      GraphErrorMsg,GraphResult,Hi,ImageSize,InstallUserDriver,%
+      InstallUserFont,Int,IOResult,KeyPressed,Length,Lo,MaxAvail,%
+      MemAvail,MsDos,Odd,Ofs,Ord,OvrGetBuf,OvrGetRetry,ParamCount,%
+      ParamStr,Pi,Pos,Pred,Ptr,Random,ReadKey,Round,SeekEof,SeekEoln,%
+      Seg,SetAspectRatio,Sin,SizeOf,Sound,SPtr,Sqr,Sqrt,SSeg,Succ,%
+      Swap,TextHeight,TextWidth,Trunc,TypeOf,UpCase,WhereX,WhereY,%
+      Append,Arc,Assign,AssignCrt,Bar,Bar3D,BlockRead,BlockWrite,ChDir,%
+      Circle,ClearDevice,ClearViewPort,Close,CloseGraph,ClrEol,ClrScr,%
+      Dec,Delay,Delete,DelLine,DetectGraph,Dispose,DrawPoly,Ellipse,%
+      Erase,Exec,Exit,FillChar,FillEllipse,FillPoly,FindFirst,FindNext,%
+      FloodFill,Flush,FreeMem,FSplit,GetArcCoords,GetAspectRatio,%
+      GetDate,GetDefaultPalette,GetDir,GetCBreak,GetFAttr,%
+      GetFillSettings,GetFTime,GetImage,GetIntVec,GetLineSettings,%
+      GetMem,GetPalette,GetTextSettings,GetTime,GetVerify,%
+      GetViewSettings,GoToXY,Halt,HighVideo,Inc,InitGraph,Insert,%
+      InsLine,Intr,Keep,Line,LineRel,LineTo,LowVideo,Mark,MkDir,Move,%
+      MoveRel,MoveTo,MsDos,New,NormVideo,NoSound,OutText,OutTextXY,%
+      OvrClearBuf,OvrInit,OvrInitEMS,OvrSetBuf,PackTime,PieSlice,%
+      PutImage,PutPixel,Randomize,Rectangle,Release,Rename,%
+      RestoreCrtMode,RmDir,RunError,Sector,Seek,SetActivePage,%
+      SetAllPalette,SetBkColor,SetCBreak,SetColor,SetDate,SetFAttr,%
+      SetFillPattern,SetFillStyle,SetFTime,SetGraphBufSize,%
+      SetGraphMode,SetIntVec,SetLineStyle,SetPalette,SetRGBPalette,%
+      SetTextBuf,SetTextJustify,SetTextStyle,SetTime,SetUserCharSize,%
+      SetVerify,SetViewPort,SetVisualPage,SetWriteMode,Sound,Str,%
+      SwapVectors,TextBackground,TextColor,TextMode,Truncate,%
+      UnpackTime,Val,Window}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[Standard]{Pascal}%
+  {morekeywords={alfa,and,array,begin,boolean,byte,case,char,const,div,%
+      do,downto,else,end,false,file,for,function,get,goto,if,in,%
+      integer,label,maxint,mod,new,not,of,or,pack,packed,page,program,%
+      put,procedure,read,readln,real,record,repeat,reset,rewrite,set,%
+      text,then,to,true,type,unpack,until,var,while,with,write,%
+      writeln},%
+   sensitive=f,%
+   morecomment=[s]{(*}{*)},%
+   morecomment=[s]{\{}{\}},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Perl}
+%
+% I got the data from \texttt{http://www.perl.com}. But I wish to thank
+% \lsthelper{Herbert~Weinhandl}{weinhand@grz08u.unileoben.ac.at}{}{} for the
+% book `Learning Perl'.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Perl}%
+  {morekeywords={abs,accept,alarm,atan2,bind,binmode,bless,caller,%
+      chdir,chmod,chomp,chop,chown,chr,chroot,close,closedir,connect,%
+      continue,cos,crypt,dbmclose,dbmopen,defined,delete,die,do,dump,%
+      each,else,elsif,endgrent,endhostent,endnetent,endprotoent,%
+      endpwent,endservent,eof,eval,exec,exists,exit,exp,fcntl,fileno,%
+      flock,for,foreach,fork,format,formline,getc,getgrent,getgrgid,%
+      getgrnam,gethostbyaddr,gethostbyname,gethostent,getlogin,%
+      getnetbyaddr,getnetbyname,getnetent,getpeername,getpgrp,%
+      getppid,getpriority,getprotobyname,getprotobynumber,getprotoent,%
+      getpwent,getpwnam,getpwuid,getservbyname,getservbyport,%
+      getservent,getsockname,getsockopt,glob,gmtime,goto,grep,hex,if,%
+      import,index,int,ioctl,join,keys,kill,last,lc,lcfirst,length,%
+      link,listen,local,localtime,log,lstat,m,map,mkdir,msgctl,msgget,%
+      msgrcv,msgsnd,my,next,no,oct,open,opendir,ord,pack,package,pipe,%
+      pop,pos,print,printf,prototype,push,q,qq,quotemeta,qw,qx,rand,%
+      read,readdir,readlink,recv,redo,ref,rename,require,reset,return,%
+      reverse,rewinddir,rindex,rmdir,s,scalar,seek,seekdir,select,%
+      semctl,semget,semop,send,setgrent,sethostent,setnetent,setpgrp,%
+      setpriority,setprotoent,setpwent,setservent,setsockopt,shift,%
+      shmctl,shmget,shmread,shmwrite,shutdown,sin,sleep,socket,%
+      socketpair,sort,splice,split,sprintf,sqrt,srand,stat,study,sub,%
+      substr,symlink,syscall,sysopen,sysread,system,syswrite,tell,%
+      telldir,tie,tied,time,times,tr,truncate,uc,ucfirst,umask,undef,%
+      unless,unlink,unpack,unshift,untie,until,use,utime,values,vec,%
+      wait,waitpid,wantarray,warn,while,write,y},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morestring=[b]",%
+   morestring=[b]',%
+   MoreSelectCharTable=%
+      \lst@ReplaceInput{\$\#}{\lst@ProcessOther\$\lst@ProcessOther\#}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PHP}
+%
+% \lstthanks{Luca Balzerani}{lou@latoserver.it}{2002/04/06,2002/04/16} sent me
+% this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% PHP definition by Luca Balzerani
+%%
+\lst@definelanguage{PHP}%
+  {morekeywords={%
+  %--- core language
+    ,::,break,case,continue,default,do,else,%
+    elseif,for,foreach,if,include,require,phpinfo,%
+    switch,while,false,FALSE,true,TRUE,%
+  %--- apache functions 
+    apache_lookup_uri,apache_note,ascii2ebcdic,ebcdic2ascii,%
+    virtual,apache_child_terminate,apache_setenv,%
+  %--- array functions 
+    array,array_change_key_case,array_chunk,array_count_values,%
+    array_filter,array_flip,array_fill,array_intersect,%
+    array_keys,array_map,array_merge,array_merge_recursive,%
+    array_pad,array_pop,array_push,array_rand,array_reverse,%
+    array_shift,array_slice,array_splice,array_sum,array_unique,%
+    array_values,array_walk,arsort,asort,compact,count,current,each,%
+    extract,in_array,array_search,key,krsort,ksort,list,natsort,%
+    next,pos,prev,range,reset,rsort,shuffle,sizeof,sort,uasort,%
+    usort,%
+  %--- aspell functions 
+    aspell_new,aspell_check,aspell_check_raw,aspell_suggest,%
+  %--- bc functions 
+    bcadd,bccomp,bcdiv,bcmod,bcmul,bcpow,bcscale,bcsqrt,bcsub,%
+  %--- bzip2 functions 
+    bzclose,bzcompress,bzdecompress,bzerrno,bzerror,bzerrstr,%
+    bzopen,bzread,bzwrite,%
+  %--- calendar functions 
+    JDToGregorian,GregorianToJD,JDToJulian,JulianToJD,JDToJewish,%
+    JDToFrench,FrenchToJD,JDMonthName,JDDayOfWeek,easter_date,%
+    unixtojd,jdtounix,cal_days_in_month,cal_to_jd,cal_from_jd,%
+  %--- ccvs functions 
+    ccvs_init,ccvs_done,ccvs_new,ccvs_add,ccvs_delete,ccvs_auth,%
+    ccvs_reverse,ccvs_sale,ccvs_void,ccvs_status,ccvs_count,%
+    ccvs_report,ccvs_command,ccvs_textvalue,%
+  %--- classobj functions 
+    call_user_method,call_user_method_array,class_exists,get_class,%
+    get_class_vars,get_declared_classes,get_object_vars,%
+    is_a,is_subclass_of,method_exists,%
+  %--- com functions 
+    COM,VARIANT,com_load,com_invoke,com_propget,com_get,com_propput,%
+    com_set,com_addref,com_release,com_isenum,com_load_typelib,%
+  %--- cpdf functions 
+    cpdf_add_annotation,cpdf_add_outline,cpdf_arc,cpdf_begin_text,%
+    cpdf_clip,cpdf_close,cpdf_closepath,cpdf_closepath_fill_stroke,%
+    cpdf_continue_text,cpdf_curveto,cpdf_end_text,cpdf_fill,%
+    cpdf_finalize,cpdf_finalize_page,%
+    cpdf_import_jpeg,cpdf_lineto,cpdf_moveto,cpdf_newpath,cpdf_open,%
+    cpdf_page_init,cpdf_place_inline_image,cpdf_rect,cpdf_restore,%
+    cpdf_rmoveto,cpdf_rotate,cpdf_rotate_text,cpdf_save,%
+    cpdf_scale,cpdf_set_char_spacing,cpdf_set_creator,%
+    cpdf_set_font,cpdf_set_horiz_scaling,cpdf_set_keywords,%
+    cpdf_set_page_animation,cpdf_set_subject,cpdf_set_text_matrix,%
+    cpdf_set_text_rendering,cpdf_set_text_rise,cpdf_set_title,%
+    cpdf_setdash,cpdf_setflat,cpdf_setgray,cpdf_setgray_fill,%
+    cpdf_setlinecap,cpdf_setlinejoin,cpdf_setlinewidth,%
+    cpdf_setrgbcolor,cpdf_setrgbcolor_fill,cpdf_setrgbcolor_stroke,%
+    cpdf_show_xy,cpdf_stringwidth,cpdf_set_font_directories,%
+    cpdf_set_viewer_preferences,cpdf_stroke,cpdf_text,%
+    cpdf_set_action_url,%
+  %--- crack functions 
+    crack_opendict,crack_closedict,crack_check,crack_getlastmessage,%
+  %--- ctype functions 
+    ctype_alnum,ctype_alpha,ctype_cntrl,ctype_digit,ctype_lower,%
+    ctype_print,ctype_punct,ctype_space,ctype_upper,ctype_xdigit,%
+  %--- curl functions 
+    curl_init,curl_setopt,curl_exec,curl_close,curl_version,%
+    curl_error,curl_getinfo,%
+  %--- cybercash functions 
+    cybercash_encr,cybercash_decr,cybercash_base64_encode,%
+  %--- cybermut functions 
+    cybermut_creerformulairecm,cybermut_testmac,%
+  %--- cyrus functions 
+    cyrus_connect,cyrus_authenticate,cyrus_bind,cyrus_unbind,%
+    cyrus_close,%
+  %--- datetime functions 
+    checkdate,date,getdate,gettimeofday,gmdate,gmmktime,gmstrftime,%
+    microtime,mktime,strftime,time,strtotime,%
+  %--- dbase functions 
+    dbase_create,dbase_open,dbase_close,dbase_pack,dbase_add_record,%
+    dbase_delete_record,dbase_get_record,%
+    dbase_numfields,dbase_numrecords,%
+  %--- dba functions 
+    dba_close,dba_delete,dba_exists,dba_fetch,dba_firstkey,%
+    dba_nextkey,dba_popen,dba_open,dba_optimize,dba_replace,%
+  %--- dbm functions 
+    dbmopen,dbmclose,dbmexists,dbmfetch,dbminsert,dbmreplace,%
+    dbmfirstkey,dbmnextkey,dblist,%
+  %--- dbx functions 
+    dbx_close,dbx_connect,dbx_error,dbx_query,dbx_sort,dbx_compare,%
+  %--- dio functions 
+    dio_open,dio_read,dio_write,dio_truncate,dio_stat,dio_seek,%
+    dio_close,%
+  %--- dir functions 
+    chroot,chdir,dir,closedir,getcwd,opendir,readdir,rewinddir,%
+  %--- dotnet functions 
+    dotnet_load,%
+  %--- errorfunc functions 
+    error_log,error_reporting,restore_error_handler,%
+    trigger_error,user_error,%
+  %--- exec functions 
+    escapeshellarg,escapeshellcmd,exec,passthru,system,shell_exec,%
+  %--- fbsql functions 
+    fbsql_affected_rows,fbsql_autocommit,fbsql_change_user,%
+    fbsql_commit,fbsql_connect,fbsql_create_db,fbsql_create_blob,%
+    fbsql_database_password,fbsql_data_seek,fbsql_db_query,%
+    fbsql_drop_db,fbsql_errno,fbsql_error,fbsql_fetch_array,%
+    fbsql_fetch_field,fbsql_fetch_lengths,fbsql_fetch_object,%
+    fbsql_field_flags,fbsql_field_name,fbsql_field_len,%
+    fbsql_field_table,fbsql_field_type,fbsql_free_result,%
+    fbsql_list_dbs,fbsql_list_fields,fbsql_list_tables,%
+    fbsql_num_fields,fbsql_num_rows,fbsql_pconnect,fbsql_query,%
+    fbsql_read_clob,fbsql_result,fbsql_rollback,fbsql_set_lob_mode,%
+    fbsql_start_db,fbsql_stop_db,fbsql_tablename,fbsql_warnings,%
+    fbsql_get_autostart_info,fbsql_hostname,fbsql_password,%
+    fbsql_username,%
+  %--- fdf functions 
+    fdf_open,fdf_close,fdf_create,fdf_save,fdf_get_value,%
+    fdf_next_field_name,fdf_set_ap,fdf_set_status,fdf_get_status,%
+    fdf_get_file,fdf_set_flags,fdf_set_opt,%
+    fdf_set_javascript_action,fdf_set_encoding,fdf_add_template,%
+  %--- filepro functions 
+    filepro,filepro_fieldname,filepro_fieldtype,filepro_fieldwidth,%
+    filepro_fieldcount,filepro_rowcount,%
+  %--- filesystem functions 
+    basename,chgrp,chmod,chown,clearstatcache,copy,delete,dirname,%
+    diskfreespace,disk_total_space,fclose,feof,fflush,fgetc,fgetcsv,%
+    fgetss,file_get_contents,file,file_exists,fileatime,filectime,%
+    fileinode,filemtime,fileowner,fileperms,filesize,filetype,flock,%
+    fopen,fpassthru,fputs,fread,fscanf,fseek,fstat,ftell,ftruncate,%
+    set_file_buffer,is_dir,is_executable,is_file,is_link,%
+    is_writable,is_writeable,is_uploaded_file,link,linkinfo,mkdir,%
+    parse_ini_file,pathinfo,pclose,popen,readfile,readlink,rename,%
+    rmdir,stat,lstat,realpath,symlink,tempnam,tmpfile,touch,umask,%
+  %--- fribidi functions 
+    fribidi_log2vis,%
+  %--- ftp functions 
+    ftp_connect,ftp_login,ftp_pwd,ftp_cdup,ftp_chdir,ftp_mkdir,%
+    ftp_nlist,ftp_rawlist,ftp_systype,ftp_pasv,ftp_get,ftp_fget,%
+    ftp_fput,ftp_size,ftp_mdtm,ftp_rename,ftp_delete,ftp_site,%
+    ftp_quit,ftp_exec,ftp_set_option,ftp_get_option,%
+  %--- funchand functions 
+    call_user_func_array,call_user_func,create_function,%
+    func_get_args,func_num_args,function_exists,%
+    register_shutdown_function,register_tick_function,%
+  %--- gettext functions 
+    bindtextdomain,bind_textdomain_codeset,dcgettext,dcngettext,%
+    dngettext,gettext,ngettext,textdomain,%
+  %--- gmp functions 
+    gmp_init,gmp_intval,gmp_strval,gmp_add,gmp_sub,gmp_mul,%
+    gmp_div_r,gmp_div_qr,gmp_div,gmp_mod,gmp_divexact,gmp_cmp,%
+    gmp_com,gmp_abs,gmp_sign,gmp_fact,gmp_sqrt,gmp_sqrtrm,%
+    gmp_pow,gmp_powm,gmp_prob_prime,gmp_gcd,gmp_gcdext,gmp_invert,%
+    gmp_jacobi,gmp_random,gmp_and,gmp_or,gmp_xor,gmp_setbit,%
+    gmp_scan0,gmp_scan1,gmp_popcount,gmp_hamdist,%
+  %--- http functions 
+    header,headers_sent,setcookie,%
+  %--- hw functions 
+    hw_Array2Objrec,hw_Children,hw_ChildrenObj,hw_Close,hw_Connect,%
+    hw_Deleteobject,hw_DocByAnchor,hw_DocByAnchorObj,%
+    hw_Document_BodyTag,hw_Document_Content,hw_Document_SetContent,%
+    hw_ErrorMsg,hw_EditText,hw_Error,hw_Free_Document,hw_GetParents,%
+    hw_GetChildColl,hw_GetChildCollObj,hw_GetRemote,%
+    hw_GetSrcByDestObj,hw_GetObject,hw_GetAndLock,hw_GetText,%
+    hw_GetObjectByQueryObj,hw_GetObjectByQueryColl,%
+    hw_GetChildDocColl,hw_GetChildDocCollObj,hw_GetAnchors,%
+    hw_Mv,hw_Identify,hw_InCollections,hw_Info,hw_InsColl,hw_InsDoc,%
+    hw_InsertObject,hw_mapid,hw_Modifyobject,hw_New_Document,%
+    hw_Output_Document,hw_pConnect,hw_PipeDocument,hw_Root,%
+    hw_Who,hw_getusername,hw_stat,hw_setlinkroot,hw_connection_info,%
+    hw_insertanchors,hw_getrellink,hw_changeobject,%
+  %--- ibase functions 
+    ibase_connect,ibase_pconnect,ibase_close,ibase_query,%
+    ibase_fetch_row,ibase_fetch_object,ibase_field_info,%
+    ibase_free_result,ibase_prepare,ibase_execute,ibase_trans,%
+    ibase_rollback,ibase_timefmt,ibase_num_fields,ibase_blob_add,%
+    ibase_blob_close,ibase_blob_create,ibase_blob_echo,%
+    ibase_blob_import,ibase_blob_info,ibase_blob_open,%
+  %--- icap functions 
+    icap_open,icap_close,icap_fetch_event,icap_list_events,%
+    icap_delete_event,icap_snooze,icap_list_alarms,%
+    icap_rename_calendar,icap_delete_calendar,icap_reopen,%
+  %--- iconv functions 
+    iconv,iconv_get_encoding,iconv_set_encoding,ob_iconv_handler,%
+  %--- ifx functions 
+    ifx_connect,ifx_pconnect,ifx_close,ifx_query,ifx_prepare,ifx_do,%
+    ifx_errormsg,ifx_affected_rows,ifx_getsqlca,ifx_fetch_row,%
+    ifx_fieldtypes,ifx_fieldproperties,ifx_num_fields,ifx_num_rows,%
+    ifx_create_char,ifx_free_char,ifx_update_char,ifx_get_char,%
+    ifx_copy_blob,ifx_free_blob,ifx_get_blob,ifx_update_blob,%
+    ifx_textasvarchar,ifx_byteasvarchar,ifx_nullformat,%
+    ifxus_free_slob,ifxus_close_slob,ifxus_open_slob,%
+    ifxus_seek_slob,ifxus_read_slob,ifxus_write_slob,%
+  %--- iisfunc functions 
+    iis_get_server_by_path,iis_get_server_by_comment,iis_add_server,%
+    iis_set_dir_security,iis_get_dir_security,iis_set_server_rights,%
+    iis_set_script_map,iis_get_script_map,iis_set_app_settings,%
+    iis_stop_server,iis_stop_service,iis_start_service,%
+  %--- image functions 
+    exif_imagetype,exif_read_data,exif_thumbnail,getimagesize,%
+    imagealphablending,imagearc,imagefilledarc,imageellipse,%
+    imagechar,imagecharup,imagecolorallocate,imagecolordeallocate,%
+    imagecolorclosest,imagecolorclosestalpha,imagecolorclosestthwb,%
+    imagecolorexactalpha,imagecolorresolve,imagecolorresolvealpha,%
+    imagecolorset,imagecolorsforindex,imagecolorstotal,%
+    imagecopy,imagecopymerge,imagecopymergegray,imagecopyresized,%
+    imagecreate,imagecreatetruecolor,imagetruecolortopalette,%
+    imagecreatefromgd2,imagecreatefromgd2part,imagecreatefromgif,%
+    imagecreatefrompng,imagecreatefromwbmp,imagecreatefromstring,%
+    imagecreatefromxpm,imagedashedline,imagedestroy,imagefill,%
+    imagefilledrectangle,imagefilltoborder,imagefontheight,%
+    imagegd,imagegd2,imagegif,imagepng,imagejpeg,imagewbmp,%
+    imageline,imageloadfont,imagepalettecopy,imagepolygon,%
+    imagepsencodefont,imagepsfreefont,imagepsloadfont,%
+    imagepsslantfont,imagepstext,imagerectangle,imagesetpixel,%
+    imagesetstyle,imagesettile,imagesetthickness,imagestring,%
+    imagesx,imagesy,imagettfbbox,imageftbbox,imagettftext,%
+    imagetypes,jpeg2wbmp,png2wbmp,iptcembed,read_exif_data,%
+  %--- imap functions 
+    imap_8bit,imap_alerts,imap_append,imap_base64,imap_binary,%
+    imap_bodystruct,imap_check,imap_clearflag_full,imap_close,%
+    imap_delete,imap_deletemailbox,imap_errors,imap_expunge,%
+    imap_fetchbody,imap_fetchheader,imap_fetchstructure,%
+    imap_getmailboxes,imap_getsubscribed,imap_header,%
+    imap_headers,imap_last_error,imap_listmailbox,%
+    imap_mail,imap_mail_compose,imap_mail_copy,imap_mail_move,%
+    imap_mime_header_decode,imap_msgno,imap_num_msg,imap_num_recent,%
+    imap_ping,imap_popen,imap_qprint,imap_renamemailbox,imap_reopen,%
+    imap_rfc822_parse_headers,imap_rfc822_write_address,%
+    imap_search,imap_setacl,imap_set_quota,imap_setflag_full,%
+    imap_status,imap_subscribe,imap_uid,imap_undelete,%
+    imap_utf7_decode,imap_utf7_encode,imap_utf8,imap_thread,%
+  %--- info functions 
+    assert,assert_options,extension_loaded,dl,getenv,get_cfg_var,%
+    get_defined_constants,get_extension_funcs,getmygid,%
+    get_loaded_extensions,get_magic_quotes_gpc,%
+    getlastmod,getmyinode,getmypid,getmyuid,get_required_files,%
+    ini_alter,ini_get,ini_get_all,ini_restore,ini_set,phpcredits,%
+    phpversion,php_logo_guid,php_sapi_name,php_uname,putenv,%
+    set_time_limit,version_compare,zend_logo_guid,zend_version,%
+  %--- ircg functions 
+    ircg_pconnect,ircg_fetch_error_msg,ircg_set_current,ircg_join,%
+    ircg_msg,ircg_notice,ircg_nick,ircg_topic,ircg_channel_mode,%
+    ircg_whois,ircg_kick,ircg_ignore_add,ircg_ignore_del,%
+    ircg_is_conn_alive,ircg_lookup_format_messages,%
+    ircg_set_on_die,ircg_set_file,ircg_get_username,%
+    ircg_nickname_unescape,%
+  %--- java functions 
+    java_last_exception_clear,java_last_exception_get,%
+  %--- ldap functions 
+    ldap_add,ldap_bind,ldap_close,ldap_compare,ldap_connect,%
+    ldap_delete,ldap_dn2ufn,ldap_err2str,ldap_errno,ldap_error,%
+    ldap_first_attribute,ldap_first_entry,ldap_free_result,%
+    ldap_get_dn,ldap_get_entries,ldap_get_option,ldap_get_values,%
+    ldap_list,ldap_modify,ldap_mod_add,ldap_mod_del,%
+    ldap_next_attribute,ldap_next_entry,ldap_read,ldap_rename,%
+    ldap_set_option,ldap_unbind,ldap_8859_to_t61,%
+    ldap_next_reference,ldap_parse_reference,ldap_parse_result,%
+    ldap_sort,ldap_start_tls,ldap_t61_to_8859,%
+  %--- mail functions 
+    mail,ezmlm_hash,%
+  %--- math functions 
+    abs,acos,acosh,asin,asinh,atan,atanh,atan2,base_convert,bindec,%
+    cos,cosh,decbin,dechex,decoct,deg2rad,exp,expm1,floor,%
+    hexdec,hypot,is_finite,is_infinite,is_nan,lcg_value,log,log10,%
+    max,min,mt_rand,mt_srand,mt_getrandmax,number_format,octdec,pi,%
+    rad2deg,rand,round,sin,sinh,sqrt,srand,tan,tanh,%
+  %--- mbstring functions 
+    mb_language,mb_parse_str,mb_internal_encoding,mb_http_input,%
+    mb_detect_order,mb_substitute_character,mb_output_handler,%
+    mb_strlen,mb_strpos,mb_strrpos,mb_substr,mb_strcut,mb_strwidth,%
+    mb_convert_encoding,mb_detect_encoding,mb_convert_kana,%
+    mb_decode_mimeheader,mb_convert_variables,%
+    mb_decode_numericentity,mb_send_mail,mb_get_info,%
+    mb_ereg,mb_eregi,mb_ereg_replace,mb_eregi_replace,mb_split,%
+    mb_ereg_search,mb_ereg_search_pos,mb_ereg_search_regs,%
+    mb_ereg_search_getregs,mb_ereg_search_getpos,%
+  %--- mcal functions 
+    mcal_open,mcal_popen,mcal_reopen,mcal_close,%
+    mcal_rename_calendar,mcal_delete_calendar,mcal_fetch_event,%
+    mcal_append_event,mcal_store_event,mcal_delete_event,%
+    mcal_list_alarms,mcal_event_init,mcal_event_set_category,%
+    mcal_event_set_description,mcal_event_set_start,%
+    mcal_event_set_alarm,mcal_event_set_class,mcal_is_leap_year,%
+    mcal_date_valid,mcal_time_valid,mcal_day_of_week,%
+    mcal_date_compare,mcal_next_recurrence,%
+    mcal_event_set_recur_daily,mcal_event_set_recur_weekly,%
+    mcal_event_set_recur_monthly_wday,mcal_event_set_recur_yearly,%
+    mcal_event_add_attribute,mcal_expunge,mcal_week_of_year,%
+  %--- mcrypt functions 
+    mcrypt_get_cipher_name,mcrypt_get_block_size,%
+    mcrypt_create_iv,mcrypt_cbc,mcrypt_cfb,mcrypt_ecb,mcrypt_ofb,%
+    mcrypt_list_modes,mcrypt_get_iv_size,mcrypt_encrypt,%
+    mcrypt_module_open,mcrypt_module_close,mcrypt_generic_deinit,%
+    mcrypt_generic,mdecrypt_generic,mcrypt_generic_end,%
+    mcrypt_enc_is_block_algorithm_mode,%
+    mcrypt_enc_is_block_mode,mcrypt_enc_get_block_size,%
+    mcrypt_enc_get_supported_key_sizes,mcrypt_enc_get_iv_size,%
+    mcrypt_enc_get_modes_name,mcrypt_module_self_test,%
+    mcrypt_module_is_block_algorithm,mcrypt_module_is_block_mode,%
+    mcrypt_module_get_algo_key_size,%
+  %--- mhash functions 
+    mhash_get_hash_name,mhash_get_block_size,mhash_count,mhash,%
+  %--- misc functions 
+    connection_aborted,connection_status,connection_timeout,%
+    define,defined,die,eval,exit,get_browser,highlight_file,%
+    ignore_user_abort,iptcparse,leak,pack,show_source,sleep,uniqid,%
+    usleep,%
+  %--- mnogosearch functions 
+    udm_add_search_limit,udm_alloc_agent,udm_api_version,%
+    udm_cat_list,udm_clear_search_limits,udm_errno,udm_error,%
+    udm_free_agent,udm_free_ispell_data,udm_free_res,%
+    udm_get_res_field,udm_get_res_param,udm_load_ispell_data,%
+    udm_check_charset,udm_check_stored,udm_close_stored,udm_crc32,%
+  %--- msession functions 
+    msession_connect,msession_disconnect,msession_count,%
+    msession_destroy,msession_lock,msession_unlock,msession_set,%
+    msession_uniq,msession_randstr,msession_find,msession_list,%
+    msession_set_array,msession_listvar,msession_timeout,%
+    msession_getdata,msession_setdata,msession_plugin,%
+  %--- msql functions 
+    msql,msql_affected_rows,msql_close,msql_connect,msql_create_db,%
+    msql_data_seek,msql_dbname,msql_drop_db,msql_dropdb,msql_error,%
+    msql_fetch_field,msql_fetch_object,msql_fetch_row,%
+    msql_field_seek,msql_fieldtable,msql_fieldtype,msql_fieldflags,%
+    msql_free_result,msql_freeresult,msql_list_fields,%
+    msql_list_dbs,msql_listdbs,msql_list_tables,msql_listtables,%
+    msql_num_rows,msql_numfields,msql_numrows,msql_pconnect,%
+    msql_regcase,msql_result,msql_select_db,msql_selectdb,%
+  %--- mssql functions 
+    mssql_close,mssql_connect,mssql_data_seek,mssql_fetch_array,%
+    mssql_fetch_object,mssql_fetch_row,mssql_field_length,%
+    mssql_field_seek,mssql_field_type,mssql_free_result,%
+    mssql_min_error_severity,mssql_min_message_severity,%
+    mssql_num_fields,mssql_num_rows,mssql_pconnect,mssql_query,%
+    mssql_select_db,mssql_bind,mssql_execute,mssql_fetch_assoc,%
+    mssql_guid_string,mssql_init,mssql_rows_affected,%
+  %--- muscat functions 
+    muscat_setup,muscat_setup_net,muscat_give,muscat_get,%
+  %--- mysql functions 
+    mysql_affected_rows,mysql_change_user,mysql_character_set_name,%
+    mysql_connect,mysql_create_db,mysql_data_seek,mysql_db_name,%
+    mysql_drop_db,mysql_errno,mysql_error,mysql_escape_string,%
+    mysql_fetch_assoc,mysql_fetch_field,mysql_fetch_lengths,%
+    mysql_fetch_row,mysql_field_flags,mysql_field_name,%
+    mysql_field_seek,mysql_field_table,mysql_field_type,%
+    mysql_info,mysql_insert_id,mysql_list_dbs,mysql_list_fields,%
+    mysql_list_tables,mysql_num_fields,mysql_num_rows,%
+    mysql_ping,mysql_query,mysql_unbuffered_query,%
+    mysql_result,mysql_select_db,mysql_tablename,mysql_thread_id,%
+    mysql_get_host_info,mysql_get_proto_info,mysql_get_server_info,%
+  %--- network functions 
+    checkdnsrr,closelog,debugger_off,debugger_on,%
+    fsockopen,gethostbyaddr,gethostbyname,gethostbynamel,getmxrr,%
+    getprotobynumber,getservbyname,getservbyport,ip2long,long2ip,%
+    pfsockopen,socket_get_status,socket_set_blocking,%
+    syslog,%
+  %--- nis functions 
+    yp_get_default_domain,yp_order,yp_master,yp_match,yp_first,%
+    yp_errno,yp_err_string,yp_all,yp_cat,%
+  %--- oci8 functions 
+    OCIDefineByName,OCIBindByName,OCILogon,OCIPLogon,OCINLogon,%
+    OCIExecute,OCICommit,OCIRollback,OCINewDescriptor,OCIRowCount,%
+    OCIResult,OCIFetch,OCIFetchInto,OCIFetchStatement,%
+    OCIColumnName,OCIColumnSize,OCIColumnType,OCIServerVersion,%
+    OCINewCursor,OCIFreeStatement,OCIFreeCursor,OCIFreeDesc,%
+    OCIError,OCIInternalDebug,OCICancel,OCISetPrefetch,%
+    OCISaveLobFile,OCISaveLob,OCILoadLob,OCIColumnScale,%
+    OCIColumnTypeRaw,OCINewCollection,OCIFreeCollection,%
+    OCICollAppend,OCICollAssignElem,OCICollGetElem,OCICollMax,%
+    OCICollTrim,%
+  %--- oracle functions 
+    Ora_Bind,Ora_Close,Ora_ColumnName,Ora_ColumnSize,Ora_ColumnType,%
+    Ora_CommitOff,Ora_CommitOn,Ora_Do,Ora_Error,Ora_ErrorCode,%
+    Ora_Fetch,Ora_Fetch_Into,Ora_GetColumn,Ora_Logoff,Ora_Logon,%
+    Ora_Numcols,Ora_Numrows,Ora_Open,Ora_Parse,Ora_Rollback,%
+  %--- outcontrol functions 
+    flush,ob_start,ob_get_contents,ob_get_length,ob_get_level,%
+    ob_flush,ob_clean,ob_end_flush,ob_end_clean,ob_implicit_flush,%
+  %--- ovrimos functions 
+    ovrimos_connect,ovrimos_close,ovrimos_longreadlen,%
+    ovrimos_execute,ovrimos_cursor,ovrimos_exec,ovrimos_fetch_into,%
+    ovrimos_result,ovrimos_result_all,ovrimos_num_rows,%
+    ovrimos_field_name,ovrimos_field_type,ovrimos_field_len,%
+    ovrimos_free_result,ovrimos_commit,ovrimos_rollback,%
+  %--- pcntl functions 
+    pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus,%
+    pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,%
+    pcntl_exec,%
+  %--- pcre functions 
+    preg_match,preg_match_all,preg_replace,preg_replace_callback,%
+    preg_quote,preg_grep,Pattern Modifiers,Pattern Syntax,%
+  %--- pdf functions 
+    pdf_add_annotation,pdf_add_bookmark,pdf_add_launchlink,%
+    pdf_add_note,pdf_add_outline,pdf_add_pdflink,pdf_add_thumbnail,%
+    pdf_arc,pdf_arcn,pdf_attach_file,pdf_begin_page,%
+    pdf_begin_template,pdf_circle,pdf_clip,pdf_close,pdf_closepath,%
+    pdf_closepath_stroke,pdf_close_image,pdf_close_pdi,%
+    pdf_concat,pdf_continue_text,pdf_curveto,pdf_delete,%
+    pdf_endpath,pdf_end_pattern,pdf_end_template,pdf_fill,%
+    pdf_findfont,pdf_get_buffer,pdf_get_font,pdf_get_fontname,%
+    pdf_get_image_height,pdf_get_image_width,pdf_get_parameter,%
+    pdf_get_pdi_value,pdf_get_majorversion,pdf_get_minorversion,%
+    pdf_initgraphics,pdf_lineto,pdf_makespotcolor,pdf_moveto,%
+    pdf_open,pdf_open_CCITT,pdf_open_file,pdf_open_gif,%
+    pdf_open_image_file,pdf_open_jpeg,pdf_open_memory_image,%
+    pdf_open_pdi_page,pdf_open_png,pdf_open_tiff,pdf_place_image,%
+    pdf_rect,pdf_restore,pdf_rotate,pdf_save,pdf_scale,pdf_setcolor,%
+    pdf_setflat,pdf_setfont,pdf_setgray,pdf_setgray_fill,%
+    pdf_setlinecap,pdf_setlinejoin,pdf_setlinewidth,pdf_setmatrix,%
+    pdf_setpolydash,pdf_setrgbcolor,pdf_setrgbcolor_fill,%
+    pdf_set_border_color,pdf_set_border_dash,pdf_set_border_style,%
+    pdf_set_duration,pdf_set_font,pdf_set_horiz_scaling,%
+    pdf_set_info_author,pdf_set_info_creator,pdf_set_info_keywords,%
+    pdf_set_info_title,pdf_set_leading,pdf_set_parameter,%
+    pdf_set_text_rendering,pdf_set_text_rise,pdf_set_text_matrix,%
+    pdf_set_word_spacing,pdf_show,pdf_show_boxed,pdf_show_xy,%
+    pdf_stringwidth,pdf_stroke,pdf_translate,%
+  %--- pfpro functions 
+    pfpro_init,pfpro_cleanup,pfpro_process,pfpro_process_raw,%
+  %--- pgsql functions 
+    pg_close,pg_affected_rows,pg_connect,pg_dbname,pg_end_copy,%
+    pg_query,pg_fetch_array,pg_fetch_object,pg_fetch_row,%
+    pg_field_name,pg_field_num,pg_field_prtlen,pg_field_size,%
+    pg_free_result,pg_last_oid,pg_host,pg_last_notice,pg_lo_close,%
+    pg_lo_export,pg_lo_import,pg_lo_open,pg_lo_read,pg_lo_seek,%
+    pg_lo_read_all,pg_lo_unlink,pg_lo_write,pg_num_fields,%
+    pg_options,pg_pconnect,pg_port,pg_put_line,pg_fetch_result,%
+    pg_client_encoding,pg_trace,pg_tty,pg_untrace,pg_get_result,%
+    pg_send_query,pg_cancel_query,pg_connection_busy,%
+    pg_connection_status,pg_copy_from,pg_copy_to,pg_escape_bytea,%
+    pg_result_error,%
+  %--- posix functions 
+    posix_kill,posix_getpid,posix_getppid,posix_getuid,%
+    posix_getgid,posix_getegid,posix_setuid,posix_seteuid,%
+    posix_setegid,posix_getgroups,posix_getlogin,posix_getpgrp,%
+    posix_setpgid,posix_getpgid,posix_getsid,posix_uname,%
+    posix_ctermid,posix_ttyname,posix_isatty,posix_getcwd,%
+    posix_getgrnam,posix_getgrgid,posix_getpwnam,posix_getpwuid,%
+  %--- printer functions 
+    printer_open,printer_abort,printer_close,printer_write,%
+    printer_set_option,printer_get_option,printer_create_dc,%
+    printer_start_doc,printer_end_doc,printer_start_page,%
+    printer_create_pen,printer_delete_pen,printer_select_pen,%
+    printer_delete_brush,printer_select_brush,printer_create_font,%
+    printer_select_font,printer_logical_fontheight,%
+    printer_draw_rectangle,printer_draw_elipse,printer_draw_text,%
+    printer_draw_chord,printer_draw_pie,printer_draw_bmp,%
+  %--- pspell functions 
+    pspell_add_to_personal,pspell_add_to_session,pspell_check,%
+    pspell_config_create,pspell_config_ignore,pspell_config_mode,%
+    pspell_config_repl,pspell_config_runtogether,%
+    pspell_new,pspell_new_config,pspell_new_personal,%
+    pspell_store_replacement,pspell_suggest,%
+  %--- qtdom functions 
+    qdom_tree,qdom_error,%
+  %--- readline functions 
+    readline,readline_add_history,readline_clear_history,%
+    readline_info,readline_list_history,readline_read_history,%
+  %--- recode functions 
+    recode_string,recode,recode_file,%
+  %--- regex functions 
+    ereg,ereg_replace,eregi,eregi_replace,split,spliti,sql_regcase,%
+  %--- sem functions 
+    sem_get,sem_acquire,sem_release,sem_remove,shm_attach,%
+    shm_remove,shm_put_var,shm_get_var,shm_remove_var,ftok,%
+  %--- sesam functions 
+    sesam_connect,sesam_disconnect,sesam_settransaction,%
+    sesam_rollback,sesam_execimm,sesam_query,sesam_num_fields,%
+    sesam_diagnostic,sesam_fetch_result,sesam_affected_rows,%
+    sesam_field_array,sesam_fetch_row,sesam_fetch_array,%
+    sesam_free_result,%
+  %--- session functions 
+    session_start,session_destroy,session_name,session_module_name,%
+    session_id,session_register,session_unregister,session_unset,%
+    session_get_cookie_params,session_set_cookie_params,%
+    session_encode,session_set_save_handler,session_cache_limiter,%
+    session_write_close,%
+  %--- shmop functions 
+    shmop_open,shmop_read,shmop_write,shmop_size,shmop_delete,%
+  %--- snmp functions 
+    snmpget,snmpset,snmpwalk,snmpwalkoid,snmp_get_quick_print,%
+    snmprealwalk,%
+  %--- strings functions 
+    addcslashes,addslashes,bin2hex,chop,chr,chunk_split,%
+    count_chars,crc32,crypt,echo,explode,get_html_translation_table,%
+    hebrev,hebrevc,htmlentities,htmlspecialchars,implode,join,%
+    localeconv,ltrim,md5,md5_file,metaphone,nl_langinfo,nl2br,ord,%
+    print,printf,quoted_printable_decode,quotemeta,str_rot13,rtrim,%
+    setlocale,similar_text,soundex,sprintf,strncasecmp,strcasecmp,%
+    strcmp,strcoll,strcspn,strip_tags,stripcslashes,stripslashes,%
+    strlen,strnatcmp,strnatcasecmp,strncmp,str_pad,strpos,strrchr,%
+    strrev,strrpos,strspn,strstr,strtok,strtolower,strtoupper,%
+    strtr,substr,substr_count,substr_replace,trim,ucfirst,ucwords,%
+    vsprintf,wordwrap,%
+  %--- swf functions 
+    swf_openfile,swf_closefile,swf_labelframe,swf_showframe,%
+    swf_getframe,swf_mulcolor,swf_addcolor,swf_placeobject,%
+    swf_removeobject,swf_nextid,swf_startdoaction,%
+    swf_actiongeturl,swf_actionnextframe,swf_actionprevframe,%
+    swf_actionstop,swf_actiontogglequality,swf_actionwaitforframe,%
+    swf_actiongotolabel,swf_enddoaction,swf_defineline,%
+    swf_definepoly,swf_startshape,swf_shapelinesolid,%
+    swf_shapefillsolid,swf_shapefillbitmapclip,%
+    swf_shapemoveto,swf_shapelineto,swf_shapecurveto,%
+    swf_shapearc,swf_endshape,swf_definefont,swf_setfont,%
+    swf_fontslant,swf_fonttracking,swf_getfontinfo,swf_definetext,%
+    swf_definebitmap,swf_getbitmapinfo,swf_startsymbol,%
+    swf_startbutton,swf_addbuttonrecord,swf_oncondition,%
+    swf_viewport,swf_ortho,swf_ortho2,swf_perspective,swf_polarview,%
+    swf_pushmatrix,swf_popmatrix,swf_scale,swf_translate,swf_rotate,%
+  %--- sybase functions 
+    sybase_affected_rows,sybase_close,sybase_connect,%
+    sybase_fetch_array,sybase_fetch_field,sybase_fetch_object,%
+    sybase_field_seek,sybase_free_result,sybase_get_last_message,%
+    sybase_min_error_severity,sybase_min_message_severity,%
+    sybase_num_fields,sybase_num_rows,sybase_pconnect,sybase_query,%
+    sybase_select_db,%
+  %--- uodbc functions 
+    odbc_autocommit,odbc_binmode,odbc_close,odbc_close_all,%
+    odbc_connect,odbc_cursor,odbc_do,odbc_error,odbc_errormsg,%
+    odbc_execute,odbc_fetch_into,odbc_fetch_row,odbc_fetch_array,%
+    odbc_fetch_object,odbc_field_name,odbc_field_num,%
+    odbc_field_len,odbc_field_precision,odbc_field_scale,%
+    odbc_longreadlen,odbc_num_fields,odbc_pconnect,odbc_prepare,%
+    odbc_result,odbc_result_all,odbc_rollback,odbc_setoption,%
+    odbc_tableprivileges,odbc_columns,odbc_columnprivileges,%
+    odbc_primarykeys,odbc_foreignkeys,odbc_procedures,%
+    odbc_specialcolumns,odbc_statistics,%
+  %--- url functions 
+    base64_decode,base64_encode,parse_url,rawurldecode,rawurlencode,%
+    urlencode,%
+  %--- var functions 
+    doubleval,empty,floatval,gettype,get_defined_vars,%
+    import_request_variables,intval,is_array,is_bool,is_double,%
+    is_int,is_integer,is_long,is_null,is_numeric,is_object,is_real,%
+    is_scalar,is_string,isset,print_r,serialize,settype,strval,%
+    unset,var_dump,var_export,is_callable,%
+  %--- vpopmail functions 
+    vpopmail_add_domain,vpopmail_del_domain,%
+    vpopmail_add_domain_ex,vpopmail_del_domain_ex,%
+    vpopmail_add_user,vpopmail_del_user,vpopmail_passwd,%
+    vpopmail_auth_user,vpopmail_alias_add,vpopmail_alias_del,%
+    vpopmail_alias_get,vpopmail_alias_get_all,vpopmail_error,%
+  %--- w32api functions 
+    w32api_set_call_method,w32api_register_function,%
+    w32api_deftype,w32api_init_dtype,%
+  %--- wddx functions 
+    wddx_serialize_value,wddx_serialize_vars,wddx_packet_start,%
+    wddx_add_vars,wddx_deserialize,%
+  %--- xml functions 
+    xml_parser_create,xml_set_object,xml_set_element_handler,%
+    xml_set_processing_instruction_handler,xml_set_default_handler,%
+    xml_set_notation_decl_handler,%
+    xml_parse,xml_get_error_code,xml_error_string,%
+    xml_get_current_column_number,xml_get_current_byte_index,%
+    xml_parser_free,xml_parser_set_option,xml_parser_get_option,%
+    utf8_encode,xml_parser_create_ns,%
+    xml_set_start_namespace_decl_handler,%
+  %--- xslt functions 
+    xslt_set_log,xslt_create,xslt_errno,xslt_error,xslt_free,%
+    xslt_set_sax_handler,xslt_set_scheme_handler,%
+    xslt_set_base,xslt_set_encoding,xslt_set_sax_handlers,%
+  %--- yaz functions 
+    yaz_addinfo,yaz_close,yaz_connect,yaz_errno,yaz_error,yaz_hits,%
+    yaz_database,yaz_range,yaz_record,yaz_search,yaz_present,%
+    yaz_scan,yaz_scan_result,yaz_ccl_conf,yaz_ccl_parse,%
+    yaz_wait,yaz_sort,%
+  %--- zip functions 
+    zip_close,zip_entry_close,zip_entry_compressedsize,%
+    zip_entry_filesize,zip_entry_name,zip_entry_open,zip_entry_read,%
+    zip_read,%
+  %--- zlib functions 
+    gzclose,gzeof,gzfile,gzgetc,gzgets,gzgetss,gzopen,gzpassthru,%
+    gzread,gzrewind,gzseek,gztell,gzwrite,readgzfile,gzcompress,%
+    gzdeflate,gzinflate,gzencode,},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]",%
+   morestring=[b]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Plasm}
+%
+% \lstthanks{Alessio~Pace}{}{2004/09/01} provided the following definition.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Plasm}%
+  {sensitive=false,%
+   morekeywords={aa,abs,ac,acolor,acos,actor,al,alias,align,and,%
+      animation,animation,appearance,apply,ar,arc,as,asin,assoc,atan,%
+      axialcamera,axialcameras,basehermite,bbox,bbox,bernstein,%
+      bernsteinbasis,bezier,beziercurve,beziermanifold,bezierstripe,%
+      beziersurface,bigger,biggest,bilinearsurface,binormal,%
+      biquadraticsurface,black,blend,blue,bottom,box,brown,bspize,%
+      bspline,bsplinebasis,c,cabinet,camera,cart,case,cat,catch,ceil,%
+      centeredcameras,centralcavalier,char,charseq,choose,circle,%
+      circumference,class,cmap,color,comp,computecoords,cone,%
+      conicalsurface,cons,control,convexcoords,convexhull,coonspatch,%
+      copy,cos,cosh,crease,crosspolytope,cube,cubiccardinal,%
+      cubiccardinalbasis,cubichermite,cubicubspline,cubicubsplinebasis,%
+      cuboid,curl,curvature,curve2cspath,curve2mapvect,cyan,cylinder,%
+      cylindricalsurface,d,deboor,def,depol,depth_sort,depth_test,%
+      derbernstein,derbernsteinbase,derbezier,determinant,difference,%
+      differencepr,dim,dimetric,dirproject,displaygraph,displaynubspline,%
+      displaynurbspline,distl,distr,div,divergence,dodecahedron,dot,down,%
+      dp,drawedges,drawforks,drawtree,ds,dsphere,dump,dumprep,ellipse,%
+      embed,end,eq,ex,exp,explode,export,extract_bodies,extract_polygons,%
+      extract_wires,extrude,extrusion,fact,false,feature,ff,fillcolor,%
+      filter,finitecone,first,flash,flashani,floor,fontcolor,fontheight,%
+      fontspacing,fontwidth,fractalsimplex,frame,frame,frameflash,fromto,%
+      gausscurvature,ge,grad,gradient,gradmap,gray,green,gt,help,hermite,%
+      hermitebasis,hermitesurface,hexahedron,icosahedron,id,idnt,if,in,%
+      inarcs,innerprod,inset,insl,insr,intersection,intersectionpr,%
+      intervals,intmax,intmin,intsto,inv,isa,isanimpol,isbool,ischar,%
+      isclosedshape,iscloseto,isempty,iseven,isfun,isfunvect,isge,isgt,%
+      isint,isintneg,isinto,isintpos,isle,islt,ismat,ismatof,isnat,%
+      isnull,isnum,isnumneg,isnumpos,isodd,isometric,isorthoshape,ispair,%
+      ispoint,ispointseq,ispol,ispoldim,ispolytope,ispurepol,isreal,%
+      isrealneg,isrealpos,isrealvect,isseq,isseqof,isshape,issimplex,%
+      issqrmat,isstring,isvect,iszero,jacobian,join,joints,k,last,le,%
+      left,leftcavalier,len,less,lesseq,lex,lift,light,linecolor,%
+      linesize,list,ln,load,loadlib,loop,lt,lxmy,magenta,map,mapshapes,%
+      markersize,mat,matdotprod,material,mathom,max,mean,meanpoint,med,%
+      merge,mesh,min,minkowski,mirror,mixedprod,mk,mkframe,mkpol,%
+      mkvector,mkversork,mod,model,move,mul,multextrude,mxby,mxmy,mxty,%
+      myfont,n,nat2string,neq,ngon,norm2,normalmap,not,nu_grid,nubspline,%
+      nubsplineknots,nurbspline,nurbsplineknots,octahedron,offset,%
+      onepoint,open,optimize,or,orange,ord,ortho,orthoproject,orthox,%
+      orthoy,orthoz,outarcs,outerloop,outerwarp,pairdiff,parallel,%
+      pascaltriangle,pdiff,pdifference,permutahedron,permutations,%
+      perspective,perspective,pi,pivotop,plane,planemapping,pmap,%
+      points2shape,polar,polyline,polymarker,polypoint,power,powerset,%
+      presort,principalnormal,print,prism,profileprodsurface,%
+      progressivesum,project,projection,purple,pyramid,q,quadarray,%
+      quadmesh,quote,r,raise,range,rationalbezier,rationalblend,%
+      rationalbspline,rationalize,red,rev,reverse,rgbacolor,right,%
+      rightcavalier,ring,rn,rotatedtext,rotationalsurface,rotn,rtail,%
+      ruledsurface,rxmy,s,save,scalarmatprod,scalarvectprod,schlegel2d,%
+      schlegel3d,sdifference,sdifferencepr,segment,sel,setand,setdiff,%
+      setfontcolor,setor,setxor,sex,shape_0,shape_1,shape2points,%
+      shape2pol,shapeclosed,shapecomb,shapediff,shapedist,%
+      shapeinbetweening,shapeinf,shapejoin,shapelen,shapenorm,%
+      shapenormal,shapeprod,shaperot,shapesum,shapesup,shapezero,shift,%
+      showprop,sign,signal,simplex,simplexpile,sin,sinh,size,skeleton,%
+      skew,smaller,smallest,solidifier,solidify,sort,sphere,spline,%
+      splinesampling,splitcells,splitpols,sqr,sqrt,star,string,%
+      stringtokens,struct,sub,svg,sweep,t,tail,tan,tangent,tanh,%
+      tensorprodsurface,tetrahedron,text,texture,textwithattributes,%
+      thinsolid,threepoints,time,tmax,tmin,top,torus,torusmap,trace,%
+      trans,tree,trianglefan,trianglestripe,trimetric,true,truncone,tt,%
+      tube,twopoints,uk,ukpol,ukpolf,union,unionpr,unitvect,unprune,up,%
+      vect2dtoangle,vect2mat,vectdiff,vectnorm,vectprod,vectsum,view,%
+      viewmodel,viewmodel,vrml,warp,warp,where,white,with,xcavalier,xor,%
+      xquadarray,xx,ycavalier,yellow},%
+   moredirectives={loadlib},%
+   otherkeywords={-,+,*,**,/,~,|,..,^,\&,\&\&,\#,\#\#},%
+   morecomment=[s]{\%}{\%},%
+   morestring=[b]',%
+   literate={~}{{$\sim$}}{1} {^}{$\wedge$}{1},%
+  }[keywords,directives,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PL/I}
+%
+% Found the data in
+% \begin{itemize}
+% \item
+%		\textsc{Bernhard Fischer, Herman Fischer}:
+%		\textbf{Structured Programming in PL/I and PL/C};
+%		Copyright {\copyright} 1976 by Marcel Dekker, Inc.;
+%		ISBN 0-8247-6394-7
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{PL/I}%
+  {morekeywords={ABS,ATAN,AUTOMATIC,AUTO,ATAND,BEGIN,BINARY,BIN,BIT,%
+      BUILTIN,BY,CALL,CHARACTER,CHAR,CHECK,COLUMN,COL,COMPLEX,CPLX,%
+      COPY,COS,COSD,COSH,DATA,DATE,DECIMAL,DEC,DECLARE,DCL,DO,EDIT,%
+      ELSE,END,ENDFILE,ENDPAGE,ENTRY,EXP,EXTERNAL,EXT,FINISH,FIXED,%
+      FIXEDOVERFLOW,FOFL,FLOAT,FORMAT,GET,GO,GOTO,IF,IMAG,INDEX,%
+      INITIAL,INIT,INTERNAL,INT,LABEL,LENGTH,LIKE,LINE,LIST,LOG,LOG2,%
+      LOG10,MAIN,MAX,MIN,MOD,NOCHECK,NOFIXEDOVERFLOW,NOFOFL,NOOVERFLOW,%
+      NOOFL,NOSIZE,NOUNDERFLOW,NOUFL,NOZERODIVIDE,NOZDIV,ON,OPTIONS,%
+      OVERFLOW,OFL,PAGE,PICTURE,PROCEDURE,PROC,PUT,READ,REPEAT,RETURN,%
+      RETURNS,ROUND,SIN,SIND,SINH,SIZE,SKIP,SQRT,STATIC,STOP,STRING,%
+      SUBSTR,SUM,SYSIN,SYSPRINT,TAN,TAND,TANH,THEN,TO,UNDERFLOW,UFL,%
+      VARYING,WHILE,WRITE,ZERODIVIDE,ZDIV},%
+   sensitive=f,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PostScript}
+%
+% Herbert Voss provided the following definition, written by
+% \lstthanks{Christophe~Jorssen}{}{2004/09/17} provided the following definition.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% PostScript language definition (c) 2005 Christophe Jorssen.
+%%
+\lst@definelanguage{PostScript}{%
+  morekeywords={abs,add,aload,anchorsearch,and,arc,arcn,arct,arcto,array,ashow,
+    astore,atan,awidthshow,begin,bind,bitshift,bytesavailable,cachestatus,
+    ceiling,charpath,clear,cleartomark,cleardictstack,clip,clippath,closefile,
+    closepath,colorimage,concat,concatmatrix,condition,copy,copypage,cos,count,
+    countdictstack,countexecstack,counttomark,cshow,currentblackgeneration,
+    currentcacheparams,currentcmykcolor,currentcolor,currentcolorrendering,
+    currentcolorscreen,currentcolorspace,currentcolortransfer,currentcontext,
+    currentdash,currentdevparams,currentdict,currentfile,currentflat,currentfont,
+    currentglobal,currentgray,currentgstate,currenthalftone,currenthalftonephase,
+    currenthsbcolor,currentlinecap,currentlinejoin,currentlinewidth,currentmatrix,
+    currentmiterlimit,currentobjectformat,currentpacking,currentpagedevice,
+    currentpoint,currentrgbcolor,currentscreen,currentshared,currentstrokeadjust,
+    currentsystemparams,currenttransfer,currentundercolorremoval,currentuserparams,
+    curveto,cvi,cvlit,cvn,cvr,cvrs,cvs,cvx,def,defaultmatrix,definefont,
+    defineresource,defineusername,defineuserobject,deletefile,detach,deviceinfo,
+    dict,dictstack,div,dtransform,dup,
+    echo,eexec,end,eoclip,eofill,eoviewclip,eq,erasepage,errordict,exch,exec,
+    execform,execstack,execuserobject,executeonly,executive,exit,
+    exp,false,file,filenameforall,fileposition,fill,filter,findencoding,findfont,
+    findresource,flattenpath,floor,flush,flushfile,FontDirectory,for,forall,fork,ge,
+    get,getinterval,globaldict,GlobalFontDirectory,glyphshow,grestore,grestoreall,
+    gsave,gstate,gt,identmatrix,idiv,idtransform,if,ifelse,image,
+    imagemask,index,ineofill,infill,initclip,initgraphics,initmatrix,initviewclip,
+    instroke,internaldict,inueofill,inufill,inustroke,
+    invertmatrix,ISOLatin1Encoding,itransform,join,kshow,
+    known,languagelevel,le,length,lineto,ln,load,lock,log,loop,lt,
+    makefont,makepattern,mark,matrix,maxlength,mod,monitor,moveto,mul,ne,neg,
+    newpath,noaccess,not,notify,null,nulldevice,or,packedarray,
+    pathbbox,pathforall,pop,print,printobject,product,prompt,pstack,put,putinterval,
+    quit,rand,rcurveto,read,readhexstring,readline,readonly,readstring,
+    realtime,rectclip,rectfill,rectstroke,rectviewclip,renamefile,repeat,resetfile,
+    resourceforall,resourcestatus,restore,reversepath,revision,rlineto,rmoveto,roll,
+    rootfont,rotate,round,rrand,run,save,scale,scalefont,scheck,search,selectfont,
+    serialnumber,setbbox,setblackgeneration,setcachedevice,setcachedevice2,
+    setcachelimit,setcacheparams,setcharwidth,setcmykcolor,setcolor,
+    setcolorrendering,setcolorscreen,setcolorspace,setcolortransfer,setdash,
+    setdevparams,setfileposition,setflat,setfont,setglobal,setgray,setgstate,
+    sethalftone,sethalftonephase,sethsbcolor,setlinecap,setlinejoin,setlinewidth,
+    setmatrix,setmiterlimit,setobjectformat,setoverprint,setpacking,setpagedevice,
+    setpattern,setrgbcolor,setscreen,setshared,setstrokeadjust,setsystemparams,
+    settransfer,setucacheparams,setundercolorremoval,setuserparams,setvmthreshold,
+    shareddict,show,showpage,sin,sqrt,srand,stack,
+    StandardEncoding,start,startjob,status,statusdict,stop,stopped,store,string,
+    stringwidth,stroke,strokepath,sub,systemdict,transform,
+    translate,true,truncate,type,token,uappend,ucache,ucachestatus,
+    ueofill,ufill,undef,
+    upath,userdict,UserObjects,
+    usertime,ustroke,ustrokepath,version,viewclip,viewclippath,vmreclaim,
+    vmstatus,wait,wcheck,where,widthshow,write,writehexstring,writeobject,
+    writestring,wtranslation,xcheck,xor,xshow,xyshow,yield,yshow},
+  sensitive,
+  morecomment=[l]\%}[keywords,comments]
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{POV-Ray}
+%
+% \lstthanks{Berthold~H\"ollmann}{bhoel@starship.python.net}{1999/04/15} sent
+% me the definition. But I removed |blankstring=false| and
+% |flexiblecolumns=true| from the driver since they have nothing to do with a
+% language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% POV definition (c) 1999 Berthold H\"ollmann
+%%
+\lst@definelanguage{POV}%
+  {morekeywords={abs,absorption,acos,acosh,adaptive,adc_bailout,agate,%
+      agate_turb,all,alpha,ambient,ambient_light,angle,aperture,append,%
+      arc_angle,area_light,array,asc,asin,asinh,assumed_gamma,atan,%
+      atan2,atanh,average,background,bezier_spline,bicubic_patch,%
+      black_hole,blob,blue,blur_samples,bounded_by,box,boxed,bozo,%
+      break,brick,brick_size,brightness,brilliance,bumps,bump_map,%
+      bump_size,camera,case,caustics,ceil,checker,chr,clipped_by,clock,%
+      clock_delta,color,color_map,colour,colour_map,component,%
+      composite,concat,cone,confidence,conic_sweep,control0,control1,%
+      cos,cosh,count,crackle,crand,cube,cubic,cubic_spline,cubic_wave,%
+      cylinder,cylindrical,debug,declare,default,defined,degrees,%
+      density,density_file,density_map,dents,difference,diffuse,%
+      dimensions,dimension_size,direction,disc,distance,%
+      distance_maximum,div,eccentricity,else,emission,end,error,%
+      error_bound,exp,extinction,fade_distance,fade_power,falloff,%
+      falloff_angle,false,fclose,file_exists,filter,finish,fisheye,%
+      flatness,flip,floor,focal_point,fog,fog_alt,fog_offset,fog_type,%
+      fopen,frequency,gif,global_settings,gradient,granite,%
+      gray_threshold,green,height_field,hexagon,hf_gray_16,hierarchy,%
+      hollow,hypercomplex,if,ifdef,iff,ifndef,image_map,include,int,%
+      interior,interpolate,intersection,intervals,inverse,ior,irid,%
+      irid_wavelength,jitter,julia_fractal,lambda,lathe,leopard,%
+      light_source,linear_spline,linear_sweep,local,location,log,%
+      looks_like,look_at,low_error_factor,macro,mandel,map_type,marble,%
+      material,material_map,matrix,max,max_intersections,max_iteration,%
+      max_trace_level,media,media_attenuation,media_interaction,merge,%
+      mesh,metallic,min,minimum_reuse,mod,mortar,nearest_count,no,%
+      normal,normal_map,no_shadow,number_of_waves,object,octaves,off,%
+      offset,omega,omnimax,on,once,onion,open,orthographic,panoramic,%
+      perspective,pgm,phase,phong,phong_size,pi,pigment,pigment_map,%
+      planar,plane,png,point_at,poly,polygon,poly_wave,pot,pow,ppm,%
+      precision,prism,pwr,quadratic_spline,quadric,quartic,quaternion,%
+      quick_color,quick_colour,quilted,radial,radians,radiosity,radius,%
+      rainbow,ramp_wave,rand,range,ratio,read,reciprocal,%
+      recursion_limit,red,reflection,reflection_exponent,refraction,%
+      render,repeat,rgb,rgbf,rgbft,rgbt,right,ripples,rotate,roughness,%
+      samples,scale,scallop_wave,scattering,seed,shadowless,sin,%
+      sine_wave,sinh,sky,sky_sphere,slice,slope_map,smooth,%
+      smooth_triangle,sor,specular,sphere,spherical,spiral1,spiral2,%
+      spotlight,spotted,sqr,sqrt,statistics,str,strcmp,strength,strlen,%
+      strlwr,strupr,sturm,substr,superellipsoid,switch,sys,t,tan,tanh,%
+      text,texture,texture_map,tga,thickness,threshold,tightness,tile2,%
+      tiles,torus,track,transform,translate,transmit,triangle,%
+      triangle_wave,true,ttf,turbulence,turb_depth,type,u,%
+      ultra_wide_angle,undef,union,up,use_color,use_colour,use_index,%
+      u_steps,v,val,variance,vaxis_rotate,vcross,vdot,version,vlength,%
+      vnormalize,vrotate,v_steps,warning,warp,water_level,waves,while,%
+      width,wood,wrinkles,write,x,y,yes,z},%
+   moredirectives={break,case,debug,declare,default,else,end,fclose,%
+      fopen,local,macro,read,render,statistics,switch,undef,version,%
+      warning,write},%
+   moredelim=*[directive]\#,%
+   sensitive,%
+   morecomment=[l]//,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]",%
+  }[keywords,directives,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Prolog}
+%
+% \lsthelper{Dominique~de~Waleffe}{ddw@miscrit.be}{1997/11/24}{Prolog} mailed
+% me the data for Prolog. He took the keywords from the \textsf{LGrind}
+% language definition file.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Prolog definition (c) 1997 Dominique de Waleffe
+%%
+\lst@definelanguage{Prolog}%
+  {morekeywords={op,mod,abort,ancestors,arg,ascii,ask,assert,asserta,%
+      assertz,atom,atomic,char,clause,close,concat,consult,ed,ef,em,%
+      eof,fail,file,findall,write,functor,getc,integer,is,length,%
+      listing,load,name,nl,nonvar,not,numbervars,op,or,pp,prin,print,%
+      private,prompt,putc,ratom,read,read_from_this_file,rename,repeat,%
+      retract,retractall,save,see,seeing,seen,sh,skip,statistics,%
+      subgoal_of,system,tab,tell,telling,time,told,trace,true,unload,%
+      untrace,var,write},%
+   sensitive=f,%
+   morecomment=[l]\%,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[bd]",%
+   morestring=[bd]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Promela}
+%
+% Thanks to \lstthanks{William~Thimbleby}{-}{1997/11/24}{Promela} for this
+% language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Promela definition (c) 2004 William Thimbleby
+%%
+\lst@definelanguage{Promela}
+  {morekeywords={active,assert,atomic,bit,bool,break,byte,chan,d_step,%
+      Dproctype,do,else,empty,enabled,fi,full,goto,hidden,if,init,int,%
+      len,mtype,nempty,never,nfull,od,of,pcvalue,printf,priority,%
+      proctype,provided,run,short,skip,timeout,typedef,unless,unsigned,%
+      xr,xs,true,false,inline,eval},%
+   moredirectives={define,ifdef,ifndef,if,if,else,endif,undef,include},%
+   moredelim=*[directive]\#,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[b]"%
+  }[keywords,comments,strings,directives]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{PSTricks}
+%
+% PSTricks is a \TeX\ macro package bundle.  
+% \lstthanks{Herbert~Voss}{}{2004/09/17} provided the following definition.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% PSTricks definition (c) 2006 Herbert Voss
+%%
+\lst@definelanguage{PSTricks}%
+  {morekeywords={%
+    begin,end,definecolor,multido,%
+    KillGlue,DontKillGlue,pslbrace,bsrbrace,psscalebox,psset,pstVerb,pstverb,%
+    pst@def,,psframebox,psclip,endclip,endpspicture,psframe,
+%%    pspicture,%
+    multirput,multips,Rput,rput,uput,cput,lput,%
+    newrgbcolor,newgray,newcmykcolor,
+%%
+%% pstricks-add
+    psStep,psgraph,psbrace,psPrintValue,
+%%
+%% pst-plot
+    psvlabel,pshlabel,psplot,psline,pscustom,pscurve,psccurve,%
+    readdata,savedata,fileplot,dataplot,listplot,%
+    psecurce,psgraph,parametricplot,%
+    psellipse,psaxes,ncline,nccurve,psbezier,parabola,%
+    qdisk,qline,clipbox,endpsclip,%
+    psgrid,pscircle,pscirclebox,psdiabox,pstribox,%
+    newpsfontdot,psdot,psdots,%
+    pspolygon,psdiamond,psoval,pstriangle,%
+    psarc,psarcn,psellipticarc,psellipticarcn,pswedge,psellipticwedge,
+    pcline,pcdiag,pcdiagg,pccurve,pccurve,pcecurve,%
+    scalebox,scaleboxto,psmathboxtrue,everypsbox,psverbboxtrue,overlaybox,%
+    psoverlay,putoverlaybox,%
+    newpsstyle,newpsobject,%
+    moveto,newpath,closepath,stroke,fill,gsave,grestore,msave,mrestore,translate,scale,%
+    swapaxes,rotate,openshadow,closedshadow,movepath,lineto,rlineto,curveto,rcurveto,%
+    code,dim,coor,rcoor,file,arrows,setcolor,%
+    rotateleft,rotateright,rotatedown,%
+%%
+%% pst-node
+    nput,naput,nbput,ncput,%
+    ncarc,ncbox,ncangle,ncangles,ncloop,ncdiag,ncdiagg,ncarcbox,ncbar,%
+    cnodeput,nccircle,%
+    pnode,rnode,Rnode,Cnode,cnode,fnode,%
+    circlenode,ovalnode,trinode,dianode,%
+    psmatrix,endpsmatrix,psspan,%
+%%
+%% pst-tree
+    pstree,Tcircle,TCircle,Ttri,Tn,TC,Tc,Tfan,TR,Tr,Tdia,Toval,Tdot,Tp,Tf,%
+    skiplevel,skiplevels,endskiplevels,tspace,tlput,%
+%%
+%% pst-text
+    pscharpath,pstextpath,
+%%
+%% pst-barcode
+    psbarcode,
+%%
+%% pst-coil
+    psboxfill,pscoil,psCoil,pszigzag,nccoil,
+    psshadow,pstilt,psTilt,ThreeDput,
+%%
+%% pst-gr3d
+    PstGridThreeDNodeProcessor,%
+%%
+%% pst-vue3d
+    PstGridThreeD,
+    AxesThreeD,LineThreeD,DieThreeD,FrameThreeD,SphereCircleThreeD,SphereMeridienThreeD,
+    QuadrillageThreeD,TetraedreThreeD,PyramideThreeD,ConeThreeD,CylindreThreeD,
+    DodecahedronThreeD,ConeThreeD,SphereThreeD,SphereInverseThreeD,DemiSphereThreeD,
+    SphereCreuseThreeD,SphereCircledThreeD,PortionSphereThreeD,pNodeThreeD,CubeThreeD,%
+%%
+%% pst-3dplot
+    pstThreeDCoor,pstThreeDDot,pstThreeDTriangle,pstThreeDCircle,pstPlanePut,%
+    pstThreeDBox,pstThreeDEllipse,pstThreeDLine,pstThreeDPut,%
+    pstThreeDNode,pstThreeDSquare,psplotThreeD,parametricplotThreeD,fileplotThreeD,%
+    dataplotThreeD,pstScalePoints,%
+%%
+%% pst-circ
+    resistor,battery,Ucc,Icc,capacitor,coil,diode,Zener,LED,lamp,switch,wire,tension,
+    circledipole,multidipole,OA,transistor,Tswitch,potentiometer,transformer,
+    optoCoupler,logic,
+%%
+%% pst-eucl
+    pstTriangle,pstMediatorAB,pstInterLL,pstMiddleAB,pstProjection,pstCircleOA,pstLineAB,%
+%%
+%% pst-func
+    psBessel,psPolynomial,psFourier,psGaussI,psGauss,psSi,pssi,psCi,psci,%
+%%
+%% pst-infixplot
+    psPlot,
+%%
+%% pst-ob3d
+    PstDie,PstCube,
+%%
+%% pst-poly
+    PstPolygon,pspolygonbox,
+%%
+%% pst-bar
+    psbarchart,readpsbardata,psbarscale,newpsbarstyle,%
+%%
+%% pst-lens
+    PstLens,%
+%%
+%% pst-geo
+    WorldMap,WorldMapII,WorldMapThreeD,WorldMapThreeDII,pnodeMap,MapPut,%
+%%
+%% pst-autoseg
+    asr,firstnode,merge,massoc,labelmerge,%
+%%
+%% gastex
+    node,imark,fmark,rmark,drawqbpedge,drawedge,drawloop,%
+%%
+%% pst-labo
+    Distillation,Ballon,
+%%
+%% pst-optic
+    lens,Transform,%
+%%
+%% pst-light3d
+    PstLightThreeDText,%
+%%
+%% calendrier
+    Calendrier,%
+%%
+%% pst-osci
+    Oscillo%
+  },%
+   sensitive,%
+   alsoother={0123456789$_},%
+   morecomment=[l]\% %
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Python}
+%
+% \lstthanks{Michael~Weber}{mweber@informatik.hu-berlin.de}{1998/12/21} sent me
+% the definition. He got data from \textsc{Mark Lutz}: \textbf{Programming
+% Python}; O'Reilly 1996; ISBN 1-56592-197-6.
+% \lstthanks{Stephen Kelly}{-}{2007/01/14} reported some problems that indicated
+% that the comment definitions needed to be moved after the string definitions
+% to work correctly.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Python definition (c) 1998 Michael Weber
+%%
+\lst@definelanguage{Python}%
+  {morekeywords={access,and,break,class,continue,def,del,elif,else,%
+      except,exec,finally,for,from,global,if,import,in,is,lambda,not,%
+      or,pass,print,raise,return,try,while},%
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morestring=[b]',% 
+   morestring=[b]",% 
+   morecomment=[s]{'''}{'''},% used for documentation text
+   morecomment=[s]{"""}{"""}% added by Philipp Matthias Hahn
+  }%
+%    \end{macrocode}
+% \lsthelper{Philipp Matthias Hahn}{pmhahn@titan.lahn.de}{2002/04/18}{}
+% added the third comment. \lsthelper{eRreuR}{rogspr@newdeal.ch}{2002/05/28}
+% {probl\`eme avec "listings" et le langage Python} found a bug using Python
+% and \lsthelper{Nicolas Markey}{markey@lsv.ens-cachan.fr}{2002/05/29}
+% {listings and Python} informed me about the corresponding thread on
+% \texttt{fr.comp.text.tex} and provided the fix---adding \texttt{[b]} to
+% both \texttt{morestring} declarations.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Rexx}
+%
+% \lstthanks{Patrick~TJ~McPhee}{ptjm@interlog.com}{2003/10/24} provided this
+% definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% classic rexx listings definition
+%% by Patrick TJ McPhee 
+%%
+\lst@definelanguage{Rexx}
+  {morekeywords={address,arg,call,do,drop,else,end,exit,if,iterate,%
+                 interpret,leave,nop,numeric,options,otherwise,parse,%
+                 procedure,pull,push,queue,return,say,signal,then,to,%
+                 trace,when},%
+   sensitive=false,%
+   morecomment=[n]{/*}{*/},%
+   morestring=[d]{'},%
+   morestring=[d]{"},%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Reduce}
+%
+% was provided by \lstthanks{Geraint~Paul~Bevan}{geraint@users.sf.net}
+% {2002/10/31}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Reduce definition (c) 2002 Geraint Paul Bevan
+%%
+\lst@definelanguage{Reduce}%
+  {morekeywords={%
+%% reserved identifiers
+	abs,acos,acosh,acot,acoth,acsc,acsch,%
+	adjprec,algebraic,algint,allbranch,allfac,and,%
+	antisymmetric,append,arglength,array,asec,asech,%
+	asin,asinh,atan,atan2,atanh,begin,bfspace,bye,%
+	card_no,ceiling,clear,clearrules,coeff,coeffn,%
+	cofactor,combineexpt,combinelogs,comment,comp,%
+	complex,conj,cons,cont,cos,cosh,cot,coth,cramer,%
+	cref,csc,csch,decompose,define,defn,deg,demo,den,%
+	depend,det,df,difference,dilog,display,div,do,e,%
+	echo,ed,editdef,ei,end,eps,eq,equal,erf,errcont,%
+	evallhseqp,eval_mode,even,evenp,exp,expandlogs,%
+	expr,expt,ezgcd,factor,factorial,factorize,fexpr,%
+	first,fix,fixp,floor,for,forall,foreach,fort,%
+	fort_width,freeof,fullroots,g,gcd,geq,go,goto,%
+	greaterp,high_pow,hypot,i,if,ifactor,impart,in,%
+	index,infinity,infix,input,int,integer,interpol,%
+	intstr,k,korder,lambda,lcm,lcof,length,leq,lessp,%
+	let,lhs,linear,linelength,lisp,list,listargp,%
+	listargs,ln,load,load_package,log,log10,logb,%
+	low_pow,lterm,macro,mainvar,mass,mat,match,%
+	mateigen,matrix,max,mcd,member,memq,min,minus,mkid,%
+	modular,msg,mshell,multiplicities,nat,neq,nero,%
+	nextprime,nil,nodepend,noncom,nonzero,nosplit,%
+	nospur,nullspace,num,numberp,odd,off,on,operator,%
+	or,order,ordp,out,output,part,pause,period,pf,pi,%
+	plus,precedence,precise,precision,pret,pri,primep,%
+	print_precision,procedure,product,quit,quotient,%
+	random,random_new_seed,rank,rat,ratarg,rational,%
+	rationalize,ratpri,real,rederr,reduct,remainder,%
+	remfac,remind,repart,repeat,rest,resultant,retry,%
+	return,reverse,revpri,rhs,rlisp88,%
+	root_multiplicity,round,roundall,roundbf,rounded,%
+	saveas,savestructr,scalar,sec,sech,second,set,%
+	setmod,setq,share,showrules,showtime,shut,sign,sin,%
+	sinh,smacro,solve,solvesingular,spur,sqrt,structr,%
+	sub,sum,symbolic,symmetric,t,tan,tanh,third,time,%
+	times,tp,tra,trace,trfac,trigform,trint,until,%
+	varname,vecdim,vector,weight,when,where,while,%
+	write,ws,wtlevel,%
+%% identifiers with spaces
+%%	for all,for each,go to,such that,%
+	},%
+  sensitive=false,%
+  morecomment=[l]\%,%
+  morecomment=[s]{COMMENT}{;},%
+  morecomment=[s]{COMMENT}{$},%
+  morestring="%
+ }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{RSL}
+%
+% Thanks go to \lstthanks{Brian~Christensen}{}{2004/02/15}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% RSL definition (c) 2004 Brian Christensen
+%%
+\lst@definelanguage{RSL}%
+  {morekeywords={Bool,Char,devt_relation,Int,Nat,Real,Text,Unit,abs,any,%
+      as,axiom,card,case,channel,chaos,class,do,dom,elems,else,elsif,end,%
+      extend,false,for,hd,hide,if,in,inds,initialise,int,len,let,local,%
+      object,of,out,post,pre,read,real,rng,scheme,skip,stop,swap,%
+      test_case,theory,then,tl,true,type,until,use,value,variable,while,%
+      with,write},%
+literate=%
+{<}{$<$}{1}%
+{>}{$>$}{1}%
+{[}{$[$}{1}%%
+{]}{$]$}{1}%%
+{^}{{\mbox{$\widehat{\;}$}}}{1}%%
+{'}{{\raisebox{1ex}[1ex][0ex]{\protect\scriptsize$\prime$}}}{1}%%
+{||}{{\mbox{$\parallel$}}}{2}%%
+{|-}{$\vdash$}{1}%%
+{|=|}{{\mbox{$\lceil\!\rceil\!\!\!\!\!\!\;\lfloor\!\rfloor$}}}{1}%%
+{**}{$\uparrow$}{1}%
+{/\\}{$\wedge$}{1}%%
+{inter}{$\cap$}{1}%%
+{-\\}{$\lambda$}{1}%%
+{->}{$\rightarrow$}{1}%%
+{-m->}{{\mbox{$\rightarrow \hspace{-2.5\lst@width} _{m}\;$}}}{1}%
+{-~m->}{{\mbox{$\stackrel{\sim}{\mbox{$\rightarrow\hspace{-2.5\lst@width} _{m}\;$}}$}}}{1}%
+{-~->}{{\mbox{$\stackrel{\sim}{\rightarrow}$}}}{1}%%
+{-set}{\bf{-set}}{4}%%
+{-list}{{$^{\ast}$}}{1}%%
+{-inflist}{$^\omega$}{1}%
+{-infset}{{\mbox{{\bf -infset}}}}{7}%
+{\#}{$\circ$}{1}%
+{:-}{{\raisebox{.4ex}{\tiny $\bullet$}}}{1}%%
+{=}{$=$}{1}%%
+{==}{$==$}{2}%%
+{=>}{$\Rightarrow$}{1}%%
+{\ is\protect\^^M}{{$\;\equiv$}}{2}%
+{\ is\ }{{$\equiv$}}{3}%%
+{\ isin\protect\^^M}{$\;\in$}{2}%%
+{~}{$\sim$}{1}%%
+{~=}{$\neq$}{1}%%
+{~isin}{$\notin$}{1}%%
+{+>}{$\mapsto$}{1}%%
+{++}{}{1}%
+{|^|}{{\mbox{$\lceil\!\rceil$}}}{1}%%
+{\\/}{$\vee$}{1}%%
+{exists}{$\exists$}{1}%%
+{union}{$\cup$}{1}%%
+{>=}{$\geq$}{1}%%
+{><}{$\times$}{1}%%
+{>>}{$\supset$}{1}%
+{>>=}{$\supseteq$}{1}%%
+{<=}{$\leq$}{1}%%
+{<<}{$\subset$}{1}%
+{<.}{$\langle$}{1}%%
+{<<=}{$\subseteq$}{1}%%
+{<->}{$\leftrightarrow$}{1}%%
+{[=}{$\sqsubseteq$}{1}%%
+{\{=}{$\preceq$}{1}%%
+{\ all\protect\^^M}{$\forall$}{2}%%
+{\ all\ }{$\forall$}{3}%%
+{!!}{$\dagger$}{1}%%
+{always}{$\Box$}{1}%%
+{.>}{$\rangle$}{1}%%
+{`alpha}{$\alpha$}{1}%
+{`beta}{$\beta$}{1}%
+{`gamma}{$\gamma$}{1}%
+{`delta}{$\delta$}{1}%
+{`epsilon}{$\epsilon$}{1}%
+{`zeta}{$\zeta$}{1}%
+{`eta}{$\eta$}{1}%
+{`theta}{$\theta$}{1}%
+{`iota}{$\iota$}{1}%
+{`kappa}{$\kappa$}{1}%
+{`mu}{$\mu$}{1}%
+{`nu}{$\nu$}{1}%
+{`xi}{$\xi$}{1}%
+{`pi}{$\pi$}{1}%
+{`rho}{$\rho$}{1}%
+{`sigma}{$\sigma$}{1}%
+{`tau}{$\tau$}{1}%
+{`upsilon}{$\upsilon$}{1}%
+{`phi}{$\phi$}{1}%
+{`chi}{$\chi$}{1}%
+{`psi}{$\psi$}{1}%
+{`omega}{$\omega$}{1}%
+{`Gamma}{$\Gamma$}{1}%
+{`Delta}{$\Delta$}{1}%
+{`Theta}{$\Theta$}{1}%
+{`Lambda}{$\Lambda$}{1}%
+{`Xi}{$\Xi$}{1}%
+{`Pi}{$\Pi$}{1}%
+{`Sigma}{$\Sigma$}{1}%
+{`Upsilon}{$\Upsilon$}{1}%
+{`Phi}{$\Phi$}{1}%
+{`Psi}{$\Psi$}{1}%
+{`Omega}{$\Omega$}{1},%
+   sensitive=true,%
+   morecomment=[l]{--},%
+   morecomment=[s]{/*}{*/}%
+  }[keywords,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Ruby}
+%
+% \lstthanks{Christian~Kaiser}{chk@combit.net}{2003/02/05} provided the initial
+% definition. \lstthanks{Xavier~Noria}{fxn@hashref.com}{2004/01/11} replaced
+% the keywords with the keywords from the at the time of writing current
+% stable Ruby version.  An erroneous string delimiter was removed following
+% a bug reported on comp.text.tex on 2006/09/01.
+%
+% Ruby supports string delimiters of the form \verb|%q!...!|, where \verb|!|
+% can be any character, or can be matched braces or parentheses or brackets.
+% The included string definitions include most of the common variants, but are
+% of course not comprehensive.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Ruby}%
+  {morekeywords={__FILE__,__LINE__,BEGIN,END,alias,and,begin,break,%
+      case,class,def,defined?,do,else,elsif,end,ensure,false,for,%
+      if,in,module,next,nil,not,or,redo,rescue,retry,return,self,%
+      super,then,true,undef,unless,until,when,while,yield},%
+   sensitive=true,%
+   morecomment=[l]\#,%
+   morecomment=[l]\#\#,%
+   morecomment=[s]{=BEGIN}{=END},%
+   morestring=[b]',%
+   morestring=[b]",%
+   morestring=[s]{\%q/}{/},%
+   morestring=[s]{\%q!}{!},%
+   morestring=[s]{\%q\{}{\}},%
+   morestring=[s]{\%q(}{)},%
+   morestring=[s]{\%q[}{]},%
+   morestring=[s]{\%q-}{-},%
+   morestring=[s]{\%Q/}{/},%
+   morestring=[s]{\%Q!}{!},%
+   morestring=[s]{\%Q\{}{\}},%
+   morestring=[s]{\%Q(}{)},%
+   morestring=[s]{\%Q[}{]},%
+   morestring=[s]{\%Q-}{-}%
+  }[keywords,comments,strings]%
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Scilab}
+%
+% Thanks go to \lstthanks{Jean-Philippe~Grivet}{grivet@cnrs-orleans.fr}
+% {2003/06/02}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Scilab definition (c) 2002,2003 Jean-Philippe Grivet
+%%
+\lst@definelanguage{Scilab}%
+  {morekeywords={abcd,abinv,abort,abs,acoshm,acosh,acosm,acos,addcolor,%
+      addf,addinter,addmenu,add_edge,add_node,adj2sp,adj_lists,aff2ab,%
+      amell,analpf,analyze,ans,apropos,arc_graph,arc_number,argn,arhnk,%
+      arl2,arma2p,armac,armax1,armax,arma,arsimul,artest,articul,ascii,%
+      asinhm,asinh,asinm,asin,atanhm,atanh,atanm,atan,augment,auread,%
+      auwrite,balanc,balreal,bandwr,basename,bdiag,besseli,besselj,%
+      besselk,bessely,best_match,bezout,bifish,bilin,binomial,black,%
+      bloc2exp,bloc2ss,bode,bool2s,boolean,boucle,break,bstap,buttmag,%
+      bvode,cainv,calerf,calfrq,call,canon,casc,case,ccontrg,cdfbet,%
+      cdfbin,cdfchi,cdfchn,cdffnc,cdff,cdfgam,cdfnbn,cdfnor,cdfpoi,%
+      cdft,ceil,center,cepstrum,chaintest,chain_struct,champ1,champ,%
+      chart,chdir,cheb1mag,cheb2mag,check_graph,check_io,chepol,chfact,%
+      chol,chsolve,circuit,classmarkov,clean,clearfun,clearglobal,%
+      clear,close,cls2dls,cmb_lin,cmndred,cmoment,code2str,coeff,coffg,%
+      coff,colcompr,colcomp,colinout,colormap,colregul,companion,comp,%
+      cond,conj,connex,contour2di,contour2d,contourf,contour,%
+      contract_edge,contrss,contr,cont_frm,cont_mat,convex_hull,convol,%
+      convstr,con_nodes,copfac,copy,correl,corr,coshm,cosh,cosm,cos,%
+      cotg,cothm,coth,covar,csim,cspect,ctr_gram,cumprod,cumsum,%
+      curblock,cycle_basis,czt,c_link,dasrt,dassl,datafit,date,dbphi,%
+      dcf,ddp,debug,dec2hex,deff,definedfields,degree,delbpt,%
+      delete_arcs,delete_nodes,delete,delip,delmenu,demos,denom,%
+      derivative,derivat,des2ss,des2tf,determ,detr,det,dft,dhinf,%
+      dhnorm,diag,diary,diff,diophant,dirname,dispbpt,dispfiles,disp,%
+      dlgamma,double,dragrect,drawaxis,drawlater,drawnow,draw,driver,%
+      dscr,dsearch,dsimul,dtsi,dt_ility,duplicate,edge_number,%
+      edit_curv,edit_graph_menus,edit_graph,edit,eigenmarkov,ell1mag,%
+      elseif,else,emptystr,endfunction,end,eqfir,eqiir,equil1,equil,%
+      ereduc,erfcx,erfc,erf,errbar,errcatch,errclear,error,eval3dp,%
+      eval3d,eval,evans,evstr,excel2sci,execstr,exec,exists,exit,expm,%
+      exp,external,eye,fac3d,factors,faurre,fchamp,fcontour2d,fcontour,%
+      fec,feedback,feval,ffilt,fftshift,fft,fgrayplot,figure,fileinfo,%
+      file,filter,findm,findobj,findx0BD,find_freq,find_path,find,%
+      findABCD,findAC,findBD,findBDK,findR,fit_dat,fix,floor,flts,foo,%
+      formatman,format,fort,for,fourplan,fplot2d,fplot3d1,fplot3d,%
+      fprintf,fprintfMat,frep2tf,freq,freson,frexp,frfit,frmag,fscanf,%
+      fscanfMat,fsfirlin,fsolve,fspecg,fstabst,fstair,ftest,ftuneq,%
+      fullrfk,fullrf,full,fun2string,funcprot,functions,function,%
+      funptr,fusee,gainplot,gamitg,gammaln,gamma,gcare,gcd,gcf,%
+      genfac3d,genlib,genmarkov,gen_net,geom3d,geomean,getblocklabel,%
+      getcolor,getcurblock,getcwd,getdate,getd,getenv,getfield,getfont,%
+      getf,getio,getlinestyle,getmark,getpid,getscicosvars,getsymbol,%
+      getvalue,getversion,get_function_path,get,gfare,gfrancis,girth,%
+      givens,glever,glist,global,glue,gpeche,graduate,grand,%
+      graphics_entities,graph_2_mat,graph_center,graph_complement,%
+      graph_diameter,graph_power,graph_simp,graph_sum,graph_union,%
+      graph-list,graycolormap,grayplot,graypolarplot,grep,group,%
+      gr_menu,gschur,gsort,gspec,gstacksize,gtild,g_margin,h2norm,halt,%
+      hamilton,hankelsv,hank,harmean,havewindow,help,hermit,hess,%
+      hex2dec,hilb,hinf,hist3d,histplot,horner,host,hotcolormap,%
+      householder,hrmt,htrianr,hypermat,h_cl,h_inf_st,h_inf,h_norm,%
+      iconvert,icon_edit,ieee,if,iirgroup,iirlp,iir,ilib_build,%
+      ilib_compile,ilib_for_link,ilib_gen_gateway,ilib_gen_loader,%
+      ilib_gen_Make,imag,impl,imrep2ss,imult,im_inv,inistate,input,%
+      int16,int2d,int32,int3d,int8,intc,intdec,integrate,interpln,%
+      interp,intersci,intersect,intg,intl,intppty,intsplin,inttrap,%
+      inttype,int,invr,invsyslin,inv_coeff,inv,iqr,isdef,isdir,isequal,%
+      iserror,isglobal,isinf,isnan,isoview,isreal,is_connex,jmat,%
+      justify,kalm,karmarkar,kernel,keyboard,knapsack,kpure,krac2,%
+      kroneck,kron,lasterror,lattn,lattp,lcf,lcmdiag,lcm,ldivf,ldiv,%
+      leastsq,legends,length,leqr,levin,lev,lex_sort,lft,lgfft,library,%
+      lib,lin2mu,lincos,lindquist,lines,line_graph,linfn,linf,link,%
+      linmeq,linpro,linsolve,linspace,lin,listfiles,list,lmisolver,%
+      lmitool,loadmatfile,loadplots,loadwave,load_graph,load,locate,%
+      log10,log1p,log2,logm,logspace,log,lotest,lqe,lqg2stan,lqg_ltr,%
+      lqg,lqr,lsq,lsslist,lstcat,lstsize,ltitr,ludel,lufact,luget,%
+      lusolve,lu,lyap,macglov,macr2lst,macrovar,macro,mad,make_graph,%
+      make_index,manedit,man,mapsound,markp2ss,matfile2sci,matrix,%
+      mat_2_graph,maxi,max_cap_path,max_clique,max_flow,max,mclearerr,%
+      mclose,meanf,mean,median,meof,mese,mesh2d,mfft,mfile2sci,mgeti,%
+      mgetl,mgetstr,mget,milk_drop,mine,mini,minreal,minss,%
+      min_lcost_cflow,min_lcost_flow1,min_lcost_flow2,min_qcost_flow,%
+      min_weight_tree,min,mlist,mode,modulo,moment,mopen,move,%
+      mps2linpro,mputl,mputstr,mput,mrfit,msd,mseek,mtell,mtlb_load,%
+      mtlb_mode,mtlb_save,mtlb_sparse,mu2lin,mulf,mvvacov,m_circle,%
+      names,nand2mean,nanmax,nanmeanf,nanmean,nanmedian,nanmin,%
+      nanstdev,nansum,narsimul,ndims,nearfloat,nehari,neighbors,%
+      netclose,netwindows,netwindow,newest,newfun,nextpow2,nf3d,nfreq,%
+      nlev,nnz,nodes_2_path,nodes_degrees,node_number,noisegen,norm,%
+      null,numdiff,numer,nyquist,obscont1,obscont,observer,obsvss,%
+      obsv_mat,obs_gram,odedc,odedi,odeoptions,ode_discrete,ode_root,%
+      ode,oldload,oldsave,ones,optim,orth,param3d1,param3d,%
+      paramfplot2d,parrot,part,pathconvert,path_2_nodes,pause,pbig,%
+      pdiv,pen2ea,pencan,penlaur,perctl,perfect_match,pertrans,pfss,%
+      phasemag,phc,pinv,pipe_network,playsnd,plot2d1,plot2d2,plot2d3,%
+      plot2d4,plot2d,plot3d1,plot3d2,plot3d3,plot3d,plotframe,%
+      plotprofile,plot_graph,plot,plzr,pmodulo,pol2des,pol2str,pol2tex,%
+      polarplot,polar,polfact,poly,portr3d,portrait,power,ppol,prbs_a,%
+      predecessors,predef,printf,printing,print,prod,profile,projsl,%
+      projspec,proj,psmall,pspect,pvm_addhosts,pvm_barrier,pvm_bcast,%
+      pvm_bufinfo,pvm_config,pvm_delhosts,pvm_error,pvm_exit,%
+      pvm_f772sci,pvm_getinst,pvm_gettid,pvm_get_timer,pvm_gsize,%
+      pvm_halt,pvm_joingroup,pvm_kill,pvm_lvgroup,pvm_mytid,pvm_parent,%
+      pvm_probe,pvm_recv,pvm_reduce,pvm_sci2f77,pvm_send,pvm_set_timer,%
+      pvm_spawn_independent,pvm_spawn,pvm_start,pvm_tasks,%
+      pvm_tidtohost,pvm,pwd,p_margin,qassign,qr,quapro,quart,quaskro,%
+      quit,randpencil,rand,range,rankqr,rank,rat,rcond,rdivf,read4b,%
+      readb,readc_,readmps,read,real,recur,reglin,regress,remezb,remez,%
+      repfreq,replot,residu,resume,return,riccati,riccsl,ricc,ric_desc,%
+      rlist,roots,rotate,round,routh_t,rowcompr,rowcomp,rowinout,%
+      rowregul,rowshuff,rpem,rref,rtitr,rubberbox,salesman,savewave,%
+      save_graph,save,scaling,scanf,schur,sci2exp,sci2for,sci2map,%
+      sciargs,scicosim,scicos,scifunc_block,sd2sci,secto3d,select,%
+      semidef,sensi,setbpt,seteventhandler,setfield,setmenu,%
+      setscicosvars,set,sfact,sgrid,shortest_path,showprofile,%
+      show_arcs,show_graph,show_nodes,sident,signm,sign,simp_mode,simp,%
+      sincd,sinc,sinc,sinhm,sinh,sinm,sin,size,sm2des,sm2ss,smooth,%
+      solve,sorder,sort,sound,sp2adj,spaninter,spanplus,spantwo,sparse,%
+      spchol,spcompack,specfact,spec,speye,spget,splin,split_edge,%
+      spones,sprand,sprintf,spzeros,sqroot,sqrtm,sqrt,squarewave,%
+      square,srfaur,srkf,ss2des,ss2ss,ss2tf,sscanf,sskf,ssprint,ssrand,%
+      stabil,stacksize,standard_define,standard_draw,standard_input,%
+      standard_origin,standard_output,startup,stdevf,stdev,steadycos,%
+      str2code,strange,strcat,strindex,strings,string,stripblanks,%
+      strong_connex,strong_con_nodes,strsubst,st_deviation,st_ility,%
+      subf,subgraph,subplot,successors,sum,supernode,sva,svd,svplot,%
+      sylm,sylv,sysconv,sysdiag,sysfact,syslin,syssize,systems,system,%
+      systmat,tabul,tangent,tanhm,tanh,tanm,tan,tdinit,testmatrix,%
+      texprint,tf2des,tf2ss,then,thrownan,timer,time_id,titlepage,%
+      tk_getdir,tk_getfile,tlist,toeplitz,tokenpos,tokens,trace,%
+      translatepaths,trans_closure,trans,trfmod,trianfml,tril,trimmean,%
+      trisolve,triu,trzeros,typename,typeof,type,uicontrol,uimenu,%
+      uint16,uint32,uint8,ui_observer,ulink,unglue,union,unique,unix_g,%
+      unix_s,unix_w,unix_x,unix,unobs,unsetmenu,user,varargin,%
+      varargout,variancef,variance,varn,warning,wavread,wavwrite,%
+      wcenter,wfir,what,whereami,whereis,where,while,whos,who_user,who,%
+      wiener,wigner,window,winsid,with_gtk,with_pvm,with_texmacs,%
+      with_tk,writb,write4b,write,xarcs,xarc,xarrows,xaxis,xbasc,%
+      xbasimp,xbasr,xchange,xclear,xclea,xclick,xclip,xdel,xend,xfarcs,%
+      xfarc,xfpolys,xfpoly,xfrect,xgetech,xgetfile,xgetmouse,xget,%
+      xgraduate,xgrid,xinfo,xinit,xlfont,xload,xname,xnumb,xpause,%
+      xpolys,xpoly,xrects,xrect,xrpoly,xs2fig,xs2gif,xs2ppm,xs2ps,%
+      xsave,xsegs,select,xsetech,xsetm,xset,xstringb,xstringl,xstring,%
+      xtape,xtitle,x_choices,x_choose,x_dialog,x_matrix,x_mdialog,%
+      x_message_modeless,x_message,yulewalk,zeropen,zeros,zgrid,zpbutt,%
+      zpch1,zpch2,zpell,mfprintf,mfscanf,mprintf,mscanf,msprintf,%
+      msscanf,mucomp,%
+      ABSBLK_f,AFFICH_f,ANDLOG_f,ANIMXY_f,BIGSOM_f,CLINDUMMY_f,CLKIN_f,%
+      CLKINV_f,CLKOUT_f,CLKOUTV_f,CLKSOM_f,CLKSOMV_f,CLKSPLIT_f,%
+      CLOCK_f,CLR_f,CLSS_f,CONST_f,COSBLK_f,CURV_f,DELAY_f,DELAYV_f,%
+      DEMUX_f,DLR_f,DLRADAPT_f,DLSS_f,EVENTSCOPE_f,EVTDLY_f,EVTGEN_f,%
+      EXPBLK_f,G_make,GAIN_f,GAINBLK_f,GENERAL_f,GENERIC_f,GENSIN_f,%
+      GENSQR_f,HALT_f,IFTHEL_f,IN_f,INTEGRAL_f,INTRP2BLK_f,INTRPLBLK_f,%
+      INVBLK_f,LOGBLK_f,LOOKUP_f,Matplot1,Matplot,MAX_f,MCLOCK_f,%
+      MFCLCK_f,MIN_f,MUX_f,NDcost,NEGTOPOS_f,OUT_f,POSTONEG_f,POWBLK_f,%
+      PROD_f,QUANT_f,RAND_f,READC_f,REGISTER_f,RELAY_f,RFILE_f,%
+      ScilabEval,Sfgrayplot,Sgrayplot,SAMPLEHOLD_f,SAT_f,SAWTOOTH_f,%
+      SCOPE_f,SCOPXY_f,SELECT_f,SINBLK_f,SOM_f,SPLIT_f,STOP_f,SUPER_f,%
+      TANBLK_f,TCLSS_f,TEXT_f,TIME_f,TK_EvalFile,TK_EvalStr,TK_GetVar,%
+      TK_SetVar,TRASH_f,WFILE_f,WRITEC_f,ZCROSS_f,%
+      \%asn,\%helps,\%k,\%sn},%
+   alsoletter=\%,% chmod
+   sensitive,%
+   morecomment=[l]//,%
+   morestring=[b]",%
+   morestring=[m]'%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{SHELXL}
+%
+% Thanks to \lstthanks{Aidan~Philip~Heerdegen}{Aidan.Heerdegen@anu.edu.au}
+% {1999/07/09} for mailing this definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% SHELXL definition (c) 1999 Aidan Philip Heerdegen
+%%
+\lst@definelanguage{SHELXL}%
+  {morekeywords={TITL,CELL,ZERR,LATT,SYMM,SFAC,DISP,UNIT,LAUE,%
+      REM,MORE,TIME,END,HKLF,OMIT,SHEL,BASF,TWIN,EXTI,SWAT,%
+      MERG,SPEC,RESI,MOVE,ANIS,AFIX,HFIX,FRAG,FEND,EXYZ,EADP,%        
+      EQIV,OMIT,CONN,PART,BIND,FREE,DFIX,BUMP,SAME,SADI,CHIV,%
+      FLAT,DELU,SIMU,DEFS,ISOR,SUMP,L.S.,CGLS,SLIM,BLOC,DAMP,%
+      WGHT,FVAR,BOND,CONF,MPLA,RTAB,LIST,ACTA,SIZE,TEMP,WPDB,%
+      FMAP,GRID,PLAN,MOLE},%
+   sensitive=false,%
+   alsoother=_,% Makes the syntax highlighting ignore the underscores
+   morecomment=[l]{! },%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Simula}
+%
+% Took data from
+% \begin{itemize}
+% \item
+%		\textsc{G\"unther Lamprecht}:
+%		\textbf{Introduction to SIMULA 67};
+%		Braunschweig; Wiesbaden: Vieweg, 1981
+% \end{itemize}
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[DEC]{Simula}[67]{Simula}%
+  {morekeywords={and,eq,eqv,ge,gt,hidden,imp,le,long,lt,ne,not,%
+      options,or,protected,short}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[CII]{Simula}[67]{Simula}%
+  {morekeywords={and,equiv,exit,impl,not,or,stop}}%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[67]{Simula}%
+  {morekeywords={activate,after,array,at,before,begin,boolean,%
+      character,class,comment,delay,detach,do,else,end,external,false,%
+      for,go,goto,if,in,inner,inspect,integer,is,label,name,new,none,%
+      notext,otherwise,prior,procedure,qua,reactivate,real,ref,resume,%
+      simset,simulation,step,switch,text,then,this,to,true,until,value,%
+      virtual,when,while},%
+   sensitive=f,%
+   keywordcommentsemicolon={end}{else,end,otherwise,when}{comment},%
+   morestring=[d]",%
+   morestring=[d]'%
+  }[keywords,keywordcomments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{SPARQL}
+%
+% This definition for the SPARQL query language (SPARQL Protocol and RDF
+% Query Language, \url{http://www.w3.org/TR/rdf-sparql-query/}) was provided
+% by \lstthanks{Christoph~Kiefer}{-}{2006/10/24}.
+%
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% SPARQL definition (c) 2006 Christoph Kiefer
+%%
+\lst@definelanguage{SPARQL}%
+  {morekeywords={BASE,PREFIX,SELECT,DISTINCT,CONSTRUCT,DESCRIBE,ASK,%
+        FROM,NAMED,WHERE,ORDER,BY,ASC,DESC,LIMIT,OFFSET,OPTIONAL,%
+        GRAPH,UNION,FILTER,a,STR,LANG,LANGMATCHES,DATATYPE,BOUND,%
+        isIRI,isURI,isBLANK,isLITERAL,REGEX,true,false},%
+   sensitive=false,%
+   morecomment=[l]\#,%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{SQL}
+%
+% Data come from \lstthanks{Christian~Haul}
+% {haul@dvs1.informatik.tu-darmstadt.de}{1998/01/09}.
+% \lstthanks{Neil~Conway}{nconway@klamath.dyndns.org}{2002/07/06} added some
+% keywords, ditto \lsthelper{Torsten~Flatter}{Thorsten.Flatter@T-Systems.de}
+% {2002/10/15}{missing keywords}, \lsthelper{Robert~Frank}{rf7@ukc.ac.uk}
+% {2002/11/19}{missing keywords} and \lsthelper{Dirk~Jesko}
+% {jesko@iti.cs.uni-magdeburg.de}{2003/06/03}{extended SQL definition}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% SQL definition (c) 1998 Christian Haul
+%%                (c) 2002 Neil Conway
+%%                (c) 2002 Robert Frank
+%%                (c) 2003 Dirk Jesko
+%%
+\lst@definelanguage{SQL}%
+  {morekeywords={ABSOLUTE,ACTION,ADD,ALLOCATE,ALTER,ARE,AS,ASSERTION,%
+      AT,BETWEEN,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,%
+      CATALOG,CHAR_LENGTH,CHARACTER_LENGTH,CLUSTER,COALESCE,%
+      COLLATE,COLLATION,COLUMN,CONNECT,CONNECTION,CONSTRAINT,%
+      CONSTRAINTS,CONVERT,CORRESPONDING,CREATE,CROSS,CURRENT_DATE,%
+      CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,DAY,DEALLOCATE,%
+      DEC,DEFERRABLE,DEFERED,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,%
+      DISCONNECT,DOMAIN,DROP,ELSE,END,EXEC,EXCEPT,EXCEPTION,EXECUTE,%
+      EXTERNAL,EXTRACT,FALSE,FIRST,FOREIGN,FROM,FULL,GET,GLOBAL,%
+      GRAPHIC,HAVING,HOUR,IDENTITY,IMMEDIATE,INDEX,INITIALLY,INNER,%
+      INPUT,INSENSITIVE,INSERT,INTO,INTERSECT,INTERVAL,%
+      ISOLATION,JOIN,KEY,LAST,LEADING,LEFT,LEVEL,LIMIT,LOCAL,LOWER,%
+      MATCH,MINUTE,MONTH,NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL,%
+      NULLIF,OCTET_LENGTH,ON,ONLY,ORDER,ORDERED,OUTER,OUTPUT,OVERLAPS,%
+      PAD,PARTIAL,POSITION,PREPARE,PRESERVE,PRIMARY,PRIOR,READ,%
+      RELATIVE,RESTRICT,REVOKE,RIGHT,ROWS,SCROLL,SECOND,SELECT,SESSION,%
+      SESSION_USER,SIZE,SPACE,SQLSTATE,SUBSTRING,SYSTEM_USER,%
+      TABLE,TEMPORARY,THEN,TIMEZONE_HOUR,%
+      TIMEZONE_MINUTE,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,%
+      TRUE,UNIQUE,UNKNOWN,UPPER,USAGE,USING,VALUE,VALUES,%
+      VARGRAPHIC,VARYING,WHEN,WHERE,WRITE,YEAR,ZONE,%
+      AND,ASC,avg,CHECK,COMMIT,count,DECODE,DESC,DISTINCT,GROUP,IN,% FF
+      LIKE,NUMBER,ROLLBACK,SUBSTR,sum,VARCHAR2,% FF
+      MIN,MAX,UNION,UPDATE,% RF
+      ALL,ANY,CUBE,CUBE,DEFAULT,DELETE,EXISTS,GRANT,OR,RECURSIVE,% DJ
+      ROLE,ROLLUP,SET,SOME,TRIGGER,VIEW},% DJ
+   morendkeywords={BIT,BLOB,CHAR,CHARACTER,CLOB,DATE,DECIMAL,FLOAT,% DJ
+      INT,INTEGER,NUMERIC,SMALLINT,TIME,TIMESTAMP,VARCHAR},% moved here
+   sensitive=false,% DJ
+   morecomment=[l]--,%
+   morecomment=[s]{/*}{*/},%
+   morestring=[d]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Tcl/Tk}
+%
+% Tcl/Tk is a very dynamic language. A statical analysis might not be
+% adequate. Nevertheless the following definitions produce the desired
+% result for my programs with a minimum of ``misses''.
+%
+% Data come from
+% \begin{itemize}
+% \item
+%		\textsc{Welch, Brent B.}:
+%		\textbf{Practical Programming in Tcl and Tk};
+%		{\copyright} 1997 Prentice Hall, Inc.;
+%		ISBN 0-13-616830-2.
+% \item
+%		\textsc{Ousterhout, John K.}:
+%		\textbf{Tcl and the Tk Toolkit};
+%		{\copyright} 1997 Addison-Wesley Publishing Company;
+%		ISBN 0-201-6337-X.
+% \end{itemize}
+% \lstthanks{Gerd~Neugebauer}{gerd.neugebauer@gmx.de}{2000/09/16} added support
+% for Tcl/Tk.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Tcl/Tk definition (c) Gerd Neugebauer
+%%
+\lst@definelanguage[tk]{tcl}[]{tcl}%
+  {morekeywords={activate,add,separator,radiobutton,checkbutton,%
+      command,cascade,all,bell,bind,bindtags,button,canvas,canvasx,%
+      canvasy,cascade,cget,checkbutton,config,configu,configur,%
+      configure,clipboard,create,arc,bitmap,image,line,oval,polygon,%
+      rectangle,text,textwindow,curselection,delete,destroy,end,entry,%
+      entrycget,event,focus,font,actual,families,measure,metrics,names,%
+      frame,get,grab,current,release,status,grid,columnconfigure,%
+      rowconfigure,image,image,create,bitmap,photo,delete,height,types,%
+      widt,names,index,insert,invoke,itemconfigure,label,listbox,lower,%
+      menu,menubutton,message,move,option,add,clear,get,readfile,pack,%
+      photo,place,radiobutton,raise,scale,scroll,scrollbar,search,see,%
+      selection,send,stdin,stdout,stderr,tag,bind,text,tk,tkerror,%
+      tkwait,window,variable,visibility,toplevel,unknown,update,winfo,%
+      class,exists,ismapped,parent,reqwidth,reqheight,rootx,rooty,%
+      width,height,wm,aspect,client,command,deiconify,focusmodel,frame,%
+      geometry,group,iconbitmap,iconify,iconmask,iconname,iconposition,%
+      iconwindow,maxsize,minsize,overrideredirect,positionfrom,%
+      protocol,sizefrom,state,title,transient,withdraw,xview,yview,%
+      yposition,%
+      -accelerator,-activebackground,-activeborderwidth,%
+      -activeforeground,-after,-anchor,-arrow,-arrowshape,-aspect,%
+      -async,-background,-before,-bg,-bigincrement,-bitmap,-bordermode,%
+      -borderwidth,-button,-capstyle,-channel,-class,-closeenough,%
+      -colormap,-column,-columnspan,-command,-confine,-container,%
+      -count,-cursor,-data,-default,-detail,-digits,-direction,%
+      -displayof,-disableforeground,-elementborderwidth,-expand,%
+      -exportselection,-extend,-family,-fg,-file,-fill,-focus,-font,%
+      -fontmap,-foreground,-format,-from,-gamma,-global,-height,%
+      -highlightbackground,-highlightcolor,-highlightthickness,-icon,%
+      -image,-in,-insertbackground,-insertborderwidth,-insertofftime,%
+      -insertontime,-imsertwidth,-ipadx,-ipady,-joinstyle,-jump,%
+      -justify,-keycode,-keysym,-label,-lastfor,-length,-maskdata,%
+      -maskfile,-menu,-message,-mode,-offvalue,-onvalue,-orient,%
+      -outlien,-outlinestipple,-overstrike,-override,-padx,-pady,%
+      -pageanchor,-pageheight,-pagewidth,-pagey,-pagey,-palette,%
+      -parent,-place,-postcommand,-relheight,-relief,-relwidth,-relx,%
+      -rely,-repeatdelay,-repeatinterval,-resolution,-root,-rootx,%
+      -rooty,-rotate,-row,-rowspan,-screen,-selectcolor,-selectimage,%
+      -sendevent,-serial,-setgrid,-showvalue,-shrink,-side,-size,%
+      -slant,-sliderlength,-sliderrelief,-smooth,-splinesteps,-state,%
+      -sticky,-stipple,-style,-subsample,-subwindow,-tags,-takefocus,%
+      -tearoff,-tearoffcommand,-text,-textvariable,-tickinterval,-time,%
+      -title,-to,-troughcolor,-type,-underline,-use,-value,-variable,%
+      -visual,-width,-wrap,-wraplength,-x,-xscrollcommand,-y,%
+      -bgstipple,-fgstipple,-lmargin1,-lmargin2,-rmargin,-spacing1,%
+      -spacing2,-spacing3,-tabs,-yscrollcommand,-zoom,%
+      activate,add,addtag,bbox,cget,clone,configure,coords,%
+      curselection,debug,delete,delta,deselect,dlineinfo,dtag,dump,%
+      entrycget,entryconfigure,find,flash,fraction,get,gettags,handle,%
+      icursor,identify,index,insert,invoke,itemcget,itemconfigure,mark,%
+      moveto,own,post,postcascade,postscript,put,redither,ranges,%
+      scale,select,show,tag,type,unpost,xscrollcommand,xview,%
+      yscrollcommand,yview,yposition}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[]{tcl}%
+  {alsoletter={.:,*=&-},%
+   morekeywords={after,append,array,names,exists,anymore,donesearch,%
+      get,nextelement,set,size,startsearch,auto_mkindex,binary,break,%
+      case,catch,cd,clock,close,concat,console,continue,default,else,%
+      elseif,eof,error,eval,exec,-keepnewline,exit,expr,fblocked,%
+      fconfigure,fcopy,file,atime,dirname,executable,exists,extension,%
+      isdirectory,isfile,join,lstat,mtime,owned,readable,readlink,%
+      rootname,size,stat,tail,type,writable,-permissions,-group,-owner,%
+      -archive,-hidden,-readonly,-system,-creator,-type,-force,%
+      fileevent,flush,for,foreach,format,gets,glob,global,history,if,%
+      incr,info,argsbody,cmdcount,commands,complete,default,exists,%
+      globals,level,library,locals,patchlevel,procs,script,tclversion,%
+      vars,interp,join,lappend,lindex,linsert,list,llength,lrange,%
+      lreplace,lsearch,-exact,-regexp,-glob,lsort,-ascii,-integer,%
+      -real,-dictionary,-increasing,-decreasing,-index,-command,load,%
+      namespace,open,package,forget,ifneeded,provide,require,unknown,%
+      vcompare,versions,vsatisfies,pid,proc,puts,-nonewline,pwd,read,%
+      regexp,-indices,regsub,-all,-nocaserename,return,scan,seek,set,%
+      socket,source,split,string,compare,first,index,last,length,match,%
+      range,tolower,toupper,trim,trimleft,trimright,subst,switch,tell,%
+      time,trace,variable,vdelete,vinfo,unknown,unset,uplevel,upvar,%
+      vwait,while,acos,asin,atan,atan2,ceil,cos,cosh,exp,floor,fmod,%
+      hypot,log,log10,pow,sin,sinh,sqrt,tan,tanh,abs,double,int,round%
+      },%
+   morestring=[d]",%
+   morecomment=[f]\#,%
+   morecomment=[l]{;\#},%
+   morecomment=[l]{[\#},%
+   morecomment=[l]{\{\#}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% And after receiving a bug report from \lsthelper{Vitaly A. Repin}
+% {vitaly@radio.hop.stu.neva.ru}{2002/04/08}{undefined control sequence
+% \lst@CommentB} I converted the version 0.21 contents of |MoreSelectCharTable|
+% to version 1.0.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Statistical languages}
+%
+% These languages have been added by \lstthanks{Winfried~Theis}
+% {theis@statistik.uni-dortmund.de}{2000/09/05}. \lstthanks{Robert~Denham}
+% {Robert.Denham@dnr.qld.gov.au}{2001/05/03} contributed the additional
+% string delimiter |'|.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{S}[]{R}{}
+\lst@definelanguage[PLUS]{S}[]{R}{}
+\lst@definelanguage{R}%
+  {keywords={abbreviate,abline,abs,acos,acosh,action,add1,add,%
+      aggregate,alias,Alias,alist,all,anova,any,aov,aperm,append,apply,%
+      approx,approxfun,apropos,Arg,args,array,arrows,as,asin,asinh,%
+      atan,atan2,atanh,attach,attr,attributes,autoload,autoloader,ave,%
+      axis,backsolve,barplot,basename,besselI,besselJ,besselK,besselY,%
+      beta,binomial,body,box,boxplot,break,browser,bug,builtins,bxp,by,%
+      c,C,call,Call,case,cat,category,cbind,ceiling,character,char,%
+      charmatch,check,chol,chol2inv,choose,chull,class,close,cm,codes,%
+      coef,coefficients,co,col,colnames,colors,colours,commandArgs,%
+      comment,complete,complex,conflicts,Conj,contents,contour,%
+      contrasts,contr,control,helmert,contrib,convolve,cooks,coords,%
+      distance,coplot,cor,cos,cosh,count,fields,cov,covratio,wt,CRAN,%
+      create,crossprod,cummax,cummin,cumprod,cumsum,curve,cut,cycle,D,%
+      data,dataentry,date,dbeta,dbinom,dcauchy,dchisq,de,debug,%
+      debugger,Defunct,default,delay,delete,deltat,demo,de,density,%
+      deparse,dependencies,Deprecated,deriv,description,detach,%
+      dev2bitmap,dev,cur,deviance,off,prev,,dexp,df,dfbetas,dffits,%
+      dgamma,dgeom,dget,dhyper,diag,diff,digamma,dim,dimnames,dir,%
+      dirname,dlnorm,dlogis,dnbinom,dnchisq,dnorm,do,dotplot,double,%
+      download,dpois,dput,drop,drop1,dsignrank,dt,dummy,dump,dunif,%
+      duplicated,dweibull,dwilcox,dyn,edit,eff,effects,eigen,else,%
+      emacs,end,environment,env,erase,eval,equal,evalq,example,exists,%
+      exit,exp,expand,expression,External,extract,extractAIC,factor,%
+      fail,family,fft,file,filled,find,fitted,fivenum,fix,floor,for,%
+      For,formals,format,formatC,formula,Fortran,forwardsolve,frame,%
+      frequency,ftable,ftable2table,function,gamma,Gamma,gammaCody,%
+      gaussian,gc,gcinfo,gctorture,get,getenv,geterrmessage,getOption,%
+      getwd,gl,glm,globalenv,gnome,GNOME,graphics,gray,grep,grey,grid,%
+      gsub,hasTsp,hat,heat,help,hist,home,hsv,httpclient,I,identify,if,%
+      ifelse,Im,image,\%in\%,index,influence,measures,inherits,install,%
+      installed,integer,interaction,interactive,Internal,intersect,%
+      inverse,invisible,IQR,is,jitter,kappa,kronecker,labels,lapply,%
+      layout,lbeta,lchoose,lcm,legend,length,levels,lgamma,library,%
+      licence,license,lines,list,lm,load,local,locator,log,log10,log1p,%
+      log2,logical,loglin,lower,lowess,ls,lsfit,lsf,ls,machine,Machine,%
+      mad,mahalanobis,make,link,margin,match,Math,matlines,mat,matplot,%
+      matpoints,matrix,max,mean,median,memory,menu,merge,methods,min,%
+      missing,Mod,mode,model,response,mosaicplot,mtext,mvfft,na,nan,%
+      names,omit,nargs,nchar,ncol,NCOL,new,next,NextMethod,nextn,%
+      nlevels,nlm,noquote,NotYetImplemented,NotYetUsed,nrow,NROW,null,%
+      numeric,\%o\%,objects,offset,old,on,Ops,optim,optimise,optimize,%
+      options,or,order,ordered,outer,package,packages,page,pairlist,%
+      pairs,palette,panel,par,parent,parse,paste,path,pbeta,pbinom,%
+      pcauchy,pchisq,pentagamma,persp,pexp,pf,pgamma,pgeom,phyper,pico,%
+      pictex,piechart,Platform,plnorm,plogis,plot,pmatch,pmax,pmin,%
+      pnbinom,pnchisq,pnorm,points,poisson,poly,polygon,polyroot,pos,%
+      postscript,power,ppoints,ppois,predict,preplot,pretty,Primitive,%
+      print,prmatrix,proc,prod,profile,proj,prompt,prop,provide,%
+      psignrank,ps,pt,ptukey,punif,pweibull,pwilcox,q,qbeta,qbinom,%
+      qcauchy,qchisq,qexp,qf,qgamma,qgeom,qhyper,qlnorm,qlogis,qnbinom,%
+      qnchisq,qnorm,qpois,qqline,qqnorm,qqplot,qr,Q,qty,qy,qsignrank,%
+      qt,qtukey,quantile,quasi,quit,qunif,quote,qweibull,qwilcox,%
+      rainbow,range,rank,rbeta,rbind,rbinom,rcauchy,rchisq,Re,read,csv,%
+      csv2,fwf,readline,socket,real,Recall,rect,reformulate,regexpr,%
+      relevel,remove,rep,repeat,replace,replications,report,require,%
+      resid,residuals,restart,return,rev,rexp,rf,rgamma,rgb,rgeom,R,%
+      rhyper,rle,rlnorm,rlogis,rm,rnbinom,RNGkind,rnorm,round,row,%
+      rownames,rowsum,rpois,rsignrank,rstandard,rstudent,rt,rug,runif,%
+      rweibull,rwilcox,sample,sapply,save,scale,scan,scan,screen,sd,se,%
+      search,searchpaths,segments,seq,sequence,setdiff,setequal,set,%
+      setwd,show,sign,signif,sin,single,sinh,sink,solve,sort,source,%
+      spline,splinefun,split,sqrt,stars,start,stat,stem,step,stop,%
+      storage,strstrheight,stripplot,strsplit,structure,strwidth,sub,%
+      subset,substitute,substr,substring,sum,summary,sunflowerplot,svd,%
+      sweep,switch,symbol,symbols,symnum,sys,status,system,t,table,%
+      tabulate,tan,tanh,tapply,tempfile,terms,terrain,tetragamma,text,%
+      time,title,topo,trace,traceback,transform,tri,trigamma,trunc,try,%
+      ts,tsp,typeof,unclass,undebug,undoc,union,unique,uniroot,unix,%
+      unlink,unlist,unname,untrace,update,upper,url,UseMethod,var,%
+      variable,vector,Version,vi,warning,warnings,weighted,weights,%
+      which,while,window,write,\%x\%,x11,X11,xedit,xemacs,xinch,xor,%
+      xpdrows,xy,xyinch,yinch,zapsmall,zip},%
+   otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},%
+   alsoother={._$},%
+   sensitive,%
+   morecomment=[l]\#,%
+   morestring=[d]",%
+   morestring=[d]'% 2001 Robert Denham
+  }%
+%    \end{macrocode}
+% \lsthelper{Benjamin Janson}{benjamin.janson@gmx.de}{2002/07/09}
+% {prockeywords undefined} got a \texttt{prockeywords undefined} error,
+% which was removed by \lsthelper{Heiko Oberdiek}{oberdiek@uni-freiburg.de}
+% {2002/07/10}{prockeywords -> procnamekeys}.
+%    \begin{macrocode}
+\lst@definelanguage{SAS}%
+  {procnamekeys={proc},%
+   morekeywords={DATA,AND,OR,NOT,EQ,GT,LT,GE,LE,NE,INFILE,INPUT,DO,BY,%
+      TO,SIN,COS,OUTPUT,END,PLOT,RUN,LIBNAME,VAR,TITLE,FIRSTOBS,OBS,%
+      DELIMITER,DLM,EOF,ABS,DIM,HBOUND,LBOUND,MAX,MIN,MOD,SIGN,SQRT,%
+      CEIL,FLOOR,FUZZ,INT,ROUND,TRUNC,DIGAMMA,ERF,ERFC,EXP,GAMMA,%
+      LGAMMA,LOG,LOG2,LOG10,ARCOS,ARSIN,ATAN,COSH,SINH,TANH,TAN,%
+      POISSON,PROBBETA,PROBBNML,PROBCHI,PROBF,PROBGAM,PROBHYPR,%
+      PROBNEGB,PROBNORM,PROBT,BETAINV,CINV,FINV,GAMINV,PROBIT,TINV,CSS,%
+      CV,KURTOSIS,MEAN,NMISS,RANGE,SKEWNESS,STD,STDERR,SUM,USS,NORMAL,%
+      RANBIN,RANCAU,RANEXP,RANGAM,RANNOR,RANPOI,RANTBL,RANTRI,RANUNI,%
+      UNIFORM,IF,THEN,ELSE,WHILE,UNTIL,DROP,KEEP,LABEL,DEFAULT,ARRAY,%
+      MERGE,CARDS,CARDS4,PUT,SET,UPDATE,ABORT,DELETE,DISPLAY,LIST,%
+      LOSTCARD,MISSING,STOP,WHERE,ARRAY,DROP,KEEP,WINDOW,LENGTH,RENAME,%
+      RETAIN,MEANS,UNIVARIATE,SUMMARY,TABULATE,CORR,FREQ,FOOTNOTE,NOTE,%
+      SHOW},%
+   otherkeywords={!,!=,~,$,*,\&,_,/,<,>=,=<,>},%
+   morestring=[d]'%
+   }[keywords,comments,strings,procnames]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{\TeX}
+%
+% I extracted the data from |plain.tex|, |latex.ltx|, and |size10.clo|.
+% \lsthelper{Dr.~Peter~Leibner}{leibner@sta.siemens.de}{1999/11/08}{missing
+% keywords in definition of \LaTeX} reported that some keywords are missing
+% and also added a couple.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}%
+  {moretexcs={AtBeginDocument,AtBeginDvi,AtEndDocument,AtEndOfClass,%
+      AtEndOfPackage,ClassError,ClassInfo,ClassWarning,%
+      ClassWarningNoLine,CurrentOption,DeclareErrorFont,%
+      DeclareFixedFont,DeclareFontEncoding,DeclareFontEncodingDefaults,%
+      DeclareFontFamily,DeclareFontShape,DeclareFontSubstitution,%
+      DeclareMathAccent,DeclareMathAlphabet,DeclareMathAlphabet,%
+      DeclareMathDelimiter,DeclareMathRadical,DeclareMathSizes,%
+      DeclareMathSymbol,DeclareMathVersion,DeclareOldFontCommand,%
+      DeclareOption,DeclarePreloadSizes,DeclareRobustCommand,%
+      DeclareSizeFunction,DeclareSymbolFont,DeclareSymbolFontAlphabet,%
+      DeclareTextAccent,DeclareTextAccentDefault,DeclareTextCommand,%
+      DeclareTextCommandDefault,DeclareTextComposite,%
+      DeclareTextCompositeCommand,DeclareTextFontCommand,%
+      DeclareTextSymbol,DeclareTextSymbolDefault,ExecuteOptions,%
+      GenericError,GenericInfo,GenericWarning,IfFileExists,%
+      InputIfFileExists,LoadClass,LoadClassWithOptions,MessageBreak,%
+      OptionNotUsed,PackageError,PackageInfo,PackageWarning,%
+      PackageWarningNoLine,PassOptionsToClass,PassOptionsToPackage,%
+      ProcessOptionsProvidesClass,ProvidesFile,ProvidesFile,%
+      ProvidesPackage,ProvideTextCommand,RequirePackage,%
+      RequirePackageWithOptions,SetMathAlphabet,SetSymbolFont,%
+      TextSymbolUnavailable,UseTextAccent,UseTextSymbol},%
+   morekeywords={array,center,displaymath,document,enumerate,eqnarray,%
+      equation,flushleft,flushright,itemize,list,lrbox,math,minipage,%
+      picture,sloppypar,tabbing,tabular,trivlist,verbatim}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[LaTeX]{TeX}[common]{TeX}%
+  {moretexcs={a,AA,aa,addcontentsline,addpenalty,addtocontents,%
+      addtocounter,addtolength,addtoversion,addvspace,alph,Alph,and,%
+      arabic,array,arraycolsep,arrayrulewidth,arraystretch,author,%
+      baselinestretch,begin,bezier,bfseries,bibcite,bibdata,bibitem,%
+      bibliography,bibliographystyle,bibstyle,bigskip,boldmath,%
+      botfigrule,bottomfraction,Box,caption,center,CheckCommand,circle,%
+      citation,cite,cleardoublepage,clearpage,cline,columnsep,%
+      columnseprule,columnwidth,contentsline,dashbox,date,dblfigrule,%
+      dblfloatpagefraction,dblfloatsep,dbltextfloatsep,dbltopfraction,%
+      defaultscriptratio,defaultscriptscriptratio,depth,Diamond,%
+      displaymath,document,documentclass,documentstyle,doublerulesep,%
+      em,emph,endarray,endcenter,enddisplaymath,enddocument,%
+      endenumerate,endeqnarray,endequation,endflushleft,endflushright,%
+      enditemize,endlist,endlrbox,endmath,endminipage,endpicture,%
+      endsloppypar,endtabbing,endtabular,endtrivlist,endverbatim,%
+      enlargethispage,ensuremath,enumerate,eqnarray,equation,%
+      evensidemargin,extracolsep,fbox,fboxrule,fboxsep,filecontents,%
+      fill,floatpagefraction,floatsep,flushbottom,flushleft,flushright,%
+      fnsymbol,fontencoding,fontfamily,fontseries,fontshape,fontsize,%
+      fontsubfuzz,footnotemark,footnotesep,footnotetext,footskip,frac,%
+      frame,framebox,fussy,glossary,headheight,headsep,height,hline,%
+      hspace,I,include,includeonly,index,inputlineno,intextsep,%
+      itemindent,itemize,itemsep,iterate,itshape,Join,kill,label,%
+      labelsep,labelwidth,LaTeX,LaTeXe,leadsto,lefteqn,leftmargin,%
+      leftmargini,leftmarginii,leftmarginiii,leftmarginiv,leftmarginv,%
+      leftmarginvi,leftmark,lhd,lim,linebreak,linespread,linethickness,%
+      linewidth,list,listfiles,listfiles,listparindent,lrbox,%
+      makeatletter,makeatother,makebox,makeglossary,makeindex,%
+      makelabel,MakeLowercase,MakeUppercase,marginpar,marginparpush,%
+      marginparsep,marginparwidth,markboth,markright,math,mathbf,%
+      mathellipsis,mathgroup,mathit,mathrm,mathsf,mathsterling,mathtt,%
+      mathunderscore,mathversion,mbox,mdseries,mho,minipage,%
+      multicolumn,multiput,NeedsTeXFormat,newcommand,newcounter,%
+      newenvironment,newfont,newhelp,newlabel,newlength,newline,%
+      newmathalphabet,newpage,newsavebox,newtheorem,nobreakspace,%
+      nobreakspace,nocite,nocorr,nocorrlist,nofiles,nolinebreak,%
+      nonumber,nopagebreak,normalcolor,normalfont,normalmarginpar,%
+      numberline,obeycr,oddsidemargin,oldstylenums,onecolumn,oval,%
+      pagebreak,pagenumbering,pageref,pagestyle,paperheight,paperwidth,%
+      paragraphmark,parbox,parsep,partopsep,picture,poptabs,pounds,%
+      protect,pushtabs,put,qbezier,qbeziermax,r,raggedleft,raisebox,%
+      ref,refstepcounter,renewcommand,renewenvironment,restorecr,%
+      reversemarginpar,rhd,rightmargin,rightmark,rmfamily,roman,Roman,%
+      rootbox,rule,samepage,sbox,scshape,secdef,section,sectionmark,%
+      selectfont,setcounter,settodepth,settoheight,settowidth,sffamily,%
+      shortstack,showoutput,showoverfull,sloppy,sloppypar,slshape,%
+      smallskip,sqsubset,sqsupset,SS,stackrel,stepcounter,stop,stretch,%
+      subparagraphmark,subsectionmark,subsubsectionmark,sum,%
+      suppressfloats,symbol,tabbing,tabbingsep,tabcolsep,tabular,%
+      tabularnewline,textasciicircum,textasciitilde,textbackslash,%
+      textbar,textbf,textbraceleft,textbraceright,textbullet,%
+      textcircled,textcompwordmark,textdagger,textdaggerdbl,textdollar,%
+      textellipsis,textemdash,textendash,textexclamdown,textfloatsep,%
+      textfraction,textgreater,textheight,textit,textless,textmd,%
+      textnormal,textparagraph,textperiodcentered,textquestiondown,%
+      textquotedblleft,textquotedblright,textquoteleft,textquoteright,%
+      textregistered,textrm,textsc,textsection,textsf,textsl,%
+      textsterling,textsuperscript,texttrademark,texttt,textunderscore,%
+      textup,textvisiblespace,textwidth,thanks,thefootnote,thempfn,%
+      thempfn,thempfootnote,thepage,thepage,thicklines,thinlines,%
+      thispagestyle,title,today,topfigrule,topfraction,topmargin,%
+      topsep,totalheight,tracingfonts,trivlist,ttfamily,twocolumn,%
+      typein,typeout,unboldmath,unitlength,unlhd,unrhd,upshape,usebox,%
+      usecounter,usefont,usepackage,value,vector,verb,verbatim,vline,%
+      vspace,width,%
+      normalsize,small,footnotesize,scriptsize,tiny,large,Large,LARGE,%
+      huge,Huge}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[plain]{TeX}[common]{TeX}%
+  {moretexcs={advancepageno,beginsection,bf,bffam,bye,cal,cleartabs,%
+      columns,dosupereject,endinsert,eqalign,eqalignno,fiverm,fivebf,%
+      fivei,fivesy,folio,footline,hang,headline,it,itemitem,itfam,%
+      leqalignno,magnification,makefootline,makeheadline,midinsert,mit,%
+      mscount,nopagenumbers,normalbottom,of,oldstyle,pagebody,%
+      pagecontents,pageinsert,pageno,plainoutput,preloaded,proclaim,rm,%
+      settabs,sevenbf,seveni,sevensy,sevenrm,sl,slfam,supereject,%
+      tabalign,tabs,tabsdone,tabsyet,tenbf,tenex,teni,tenit,tenrm,%
+      tensl,tensy,tentt,textindent,topglue,topins,topinsert,tt,ttfam,%
+      ttraggedright,vfootnote}%
+  }%
+%    \end{macrocode}
+% The following language is only a helper.
+%    \begin{macrocode}
+\lst@definelanguage[common]{TeX}[primitive]{TeX}
+  {moretexcs={active,acute,ae,AE,aleph,allocationnumber,allowbreak,%
+      alpha,amalg,angle,approx,arccos,arcsin,arctan,arg,arrowvert,%
+      Arrowvert,ast,asymp,b,backslash,bar,beta,bgroup,big,Big,bigbreak,%
+      bigcap,bigcirc,bigcup,bigg,Bigg,biggl,Biggl,biggm,Biggm,biggr,%
+      Biggr,bigl,Bigl,bigm,Bigm,bigodot,bigoplus,bigotimes,bigr,Bigr,%
+      bigskip,bigskipamount,bigsqcup,bigtriangledown,bigtriangleup,%
+      biguplus,bigvee,bigwedge,bmod,bordermatrix,bot,bowtie,brace,%
+      braceld,bracelu,bracerd,braceru,bracevert,brack,break,breve,%
+      buildrel,bullet,c,cap,cases,cdot,cdotp,cdots,centering,%
+      centerline,check,chi,choose,circ,clubsuit,colon,cong,coprod,%
+      copyright,cos,cosh,cot,coth,csc,cup,d,dag,dagger,dashv,ddag,%
+      ddagger,ddot,ddots,deg,delta,Delta,det,diamond,diamondsuit,dim,%
+      displaylines,div,do,dospecials,dot,doteq,dotfill,dots,downarrow,%
+      Downarrow,downbracefill,egroup,eject,ell,empty,emptyset,endgraf,%
+      endline,enskip,enspace,epsilon,equiv,eta,exists,exp,filbreak,%
+      flat,fmtname,fmtversion,footins,footnote,footnoterule,forall,%
+      frenchspacing,frown,gamma,Gamma,gcd,ge,geq,gets,gg,goodbreak,%
+      grave,H,hat,hbar,heartsuit,hglue,hideskip,hidewidth,hom,%
+      hookleftarrow,hookrightarrow,hphantom,hrulefill,i,ialign,iff,Im,%
+      imath,in,inf,infty,int,interdisplaylinepenalty,%
+      interfootnotelinepenalty,intop,iota,item,j,jmath,joinrel,jot,%
+      kappa,ker,l,L,lambda,Lambda,land,langle,lbrace,lbrack,lceil,%
+      ldotp,ldots,le,leavevmode,leftarrow,Leftarrow,leftarrowfill,%
+      leftharpoondown,leftharpoonup,leftline,leftrightarrow,%
+      Leftrightarrow,leq,lfloor,lg,lgroup,lhook,lim,liminf,limsup,line,%
+      ll,llap,lmoustache,ln,lnot,log,longleftarrow,Longleftarrow,%
+      longleftrightarrow,Longleftrightarrow,longmapsto,longrightarrow,%
+      Longrightarrow,loop,lor,lq,magstep,magstep,magstephalf,mapsto,%
+      mapstochar,mathhexbox,mathpalette,mathstrut,matrix,max,maxdimen,%
+      medbreak,medskip,medskipamount,mid,min,models,mp,mu,multispan,%
+      nabla,narrower,natural,ne,nearrow,neg,negthinspace,neq,newbox,%
+      newcount,newdimen,newfam,newif,newinsert,newlanguage,newmuskip,%
+      newread,newskip,newtoks,newwrite,next,ni,nobreak,nointerlineskip,%
+      nonfrenchspacing,normalbaselines,normalbaselineskip,%
+      normallineskip,normallineskiplimit,not,notin,nu,null,nwarrow,o,O,%
+      oalign,obeylines,obeyspaces,odot,oe,OE,offinterlineskip,oint,%
+      ointop,omega,Omega,ominus,ooalign,openup,oplus,oslash,otimes,%
+      overbrace,overleftarrow,overrightarrow,owns,P,parallel,partial,%
+      perp,phantom,phi,Phi,pi,Pi,pm,pmatrix,pmod,Pr,prec,preceq,prime,%
+      prod,propto,psi,Psi,qquad,quad,raggedbottom,raggedright,rangle,%
+      rbrace,rbrack,rceil,Re,relbar,Relbar,removelastskip,repeat,%
+      rfloor,rgroup,rho,rhook,rightarrow,Rightarrow,rightarrowfill,%
+      rightharpoondown,rightharpoonup,rightleftharpoons,rightline,rlap,%
+      rmoustache,root,rq,S,sb,searrow,sec,setminus,sharp,showhyphens,%
+      sigma,Sigma,sim,simeq,sin,sinh,skew,slash,smallbreak,smallint,%
+      smallskip,smallskipamount,smash,smile,sp,space,spadesuit,sqcap,%
+      sqcup,sqrt,sqsubseteq,sqsupseteq,ss,star,strut,strutbox,subset,%
+      subseteq,succ,succeq,sum,sup,supset,supseteq,surd,swarrow,t,tan,%
+      tanh,tau,TeX,theta,Theta,thinspace,tilde,times,to,top,tracingall,%
+      triangle,triangleleft,triangleright,u,underbar,underbrace,%
+      uparrow,Uparrow,upbracefill,updownarrow,Updownarrow,uplus,%
+      upsilon,Upsilon,v,varepsilon,varphi,varpi,varrho,varsigma,%
+      vartheta,vdash,vdots,vec,vee,vert,Vert,vglue,vphantom,wedge,%
+      widehat,widetilde,wlog,wp,wr,xi,Xi,zeta}%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage[primitive]{TeX}%
+  {moretexcs={above,abovedisplayshortskip,abovedisplayskip,aftergroup,%
+      abovewithdelims,accent,adjdemerits,advance,afterassignment,atop,%
+      atopwithdelims,badness,baselineskip,batchmode,begingroup,%
+      belowdisplayshortskip,belowdisplayskip,binoppenalty,botmark,box,%
+      boxmaxdepth,brokenpenalty,catcode,char,chardef,cleaders,closein,%
+      closeout,clubpenalty,copy,count,countdef,cr,crcr,csname,day,%
+      deadcycles,def,defaulthyphenchar,defaultskewchar,delcode,%
+      delimiter,delimiterfactor,delimitershortfall,dimen,dimendef,%
+      discretionary,displayindent,displaylimits,displaystyle,%
+      displaywidowpenalty,displaywidth,divide,doublehyphendemerits,dp,%
+      edef,else,emergencystretch,end,endcsname,endgroup,endinput,%
+      endlinechar,eqno,errhelp,errmessage,errorcontextlines,%
+      errorstopmode,escapechar,everycr,everydisplay,everyhbox,everyjob,%
+      everymath,everypar,everyvbox,exhyphenpenalty,expandafter,fam,fi,%
+      finalhypendemerits,firstmark,floatingpenalty,font,fontdimen,%
+      fontname,futurelet,gdef,global,globaldefs,halign,hangafter,%
+      hangindent,hbadness,hbox,hfil,hfill,hfilneg,hfuzz,hoffset,%
+      holdinginserts,hrule,hsize,hskip,hss,ht,hyphenation,hyphenchar,%
+      hyphenpenalty,if,ifcase,ifcat,ifdim,ifeof,iffalse,ifhbox,ifhmode,%
+      ifinner,ifmmode,ifnum,ifodd,iftrue,ifvbox,ifvmode,ifvoid,ifx,%
+      ignorespaces,immediate,indent,input,insert,insertpenalties,%
+      interlinepenalty,jobname,kern,language,lastbox,lastkern,%
+      lastpenalty,lastskip,lccode,leaders,left,lefthyphenmin,leftskip,%
+      leqno,let,limits,linepenalty,lineskip,lineskiplimits,long,%
+      looseness,lower,lowercase,mag,mark,mathaccent,mathbin,mathchar,%
+      mathchardef,mathchoice,mathclose,mathcode,mathinner,mathop,%
+      mathopen,mathord,mathpunct,mathrel,mathsurround,maxdeadcycles,%
+      maxdepth,meaning,medmuskip,message,mkern,month,moveleft,%
+      moveright,mskip,multiply,muskip,muskipdef,newlinechar,noalign,%
+      noboundary,noexpand,noindent,nolimits,nonscript,nonstopmode,%
+      nulldelimiterspace,nullfont,number,omit,openin,openout,or,outer,%
+      output,outputpenalty,over,overfullrule,overline,overwithdelims,%
+      pagedepth,pagefilllstretch,pagefillstretch,pagefilstretch,%
+      pagegoal,pageshrink,pagestretch,pagetotal,par,parfillskip,%
+      parindent,parshape,parskip,patterns,pausing,penalty,%
+      postdisplaypenalty,predisplaypenalty,predisplaysize,pretolerance,%
+      prevdepth,prevgraf,radical,raise,read,relax,relpenalty,right,%
+      righthyphenmin,rightskip,romannumeral,scriptfont,%
+      scriptscriptfont,scriptscriptstyle,scriptspace,scriptstyle,%
+      scrollmode,setbox,setlanguage,sfcode,shipout,show,showbox,%
+      showboxbreadth,showboxdepth,showlists,showthe,skewchar,skip,%
+      skipdef,spacefactor,spaceskip,span,special,splitbotmark,%
+      splitfirstmark,splitmaxdepth,splittopskip,string,tabskip,%
+      textfont,textstyle,the,thickmuskip,thinmuskip,time,toks,toksdef,%
+      tolerance,topmark,topskip,tracingcommands,tracinglostchars,%
+      tracingmacros,tracingonline,tracingoutput,tracingpages,%
+      tracingparagraphs,tracingrestores,tracingstats,uccode,uchyph,%
+      underline,unhbox,unhcopy,unkern,unpenalty,unskip,unvbox,unvcopy,%
+      uppercase,vadjust,valign,vbadness,vbox,vcenter,vfil,vfill,%
+      vfilneg,vfuzz,voffset,vrule,vsize,vskip,vsplit,vss,vtop,wd,%
+      widowpenalty,write,xdef,xleaders,xspaceskip,year},%
+   sensitive,%
+   alsoother={0123456789$_},%
+   morecomment=[l]\%%
+  }[keywords,tex,comments]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{VBScript}
+%
+% \lstthanks{Sonja~Weidmann}{Sonja.Weidmann@sap.com}{2000/01/10}{VBScript}
+% sent me this language definition.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% VBScript definition (c) 2000 Sonja Weidmann
+%%
+\lst@definelanguage{VBScript}%
+  {morekeywords={Call,Case,Const,Dim,Do,Each,Else,End,Erase,Error,Exit,%
+      Explicit,For,Function,If,Loop,Next,On,Option,Private,Public,%
+      Randomize,ReDim,Rem,Select,Set,Sub,Then,Wend,While,Abs,Array,Asc,%
+      Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,%
+      CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,%
+      Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,%
+      FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,%
+      IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,%
+      LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,%
+      MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,%
+      ScriptEngineBuildVersion,ScriptEngineMajorVersion,%
+      ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,%
+      StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,%
+      UBound,UCase,VarType,Weekday,WeekdayName,Year, And,Eqv,Imp,Is,%
+      Mod,Not,Or,Xor,Add,BuildPath,Clear,Close,Copy,CopyFile,%
+      CopyFolder,CreateFolder,CreateTextFile,Delete,DeleteFile,%
+      DeleteFolder,Dictionary,Drive,DriveExists,Drives,Err,Exists,File,%
+      FileExists,FileSystemObject,Files,Folder,FolderExists,Folders,%
+      GetAbsolutePathName,GetBaseName,GetDrive,GetDriveName,%
+      GetExtensionName,GetFile,GetFileName,GetFolder,%
+      GetParentFolderName,GetSpecialFolder,GetTempName,Items,Keys,Move,%
+      MoveFile,MoveFolder,OpenAsTextStream,OpenTextFile,Raise,Read,%
+      ReadAll,ReadLine,Remove,RemoveAll,Skip,SkipLine,TextStream,Write,%
+      WriteBlankLines,WriteLine,Alias,Archive,CDROM,Compressed,%
+      Directory,Fixed,ForAppending,ForReading,ForWriting,Hidden,Normal,%
+      RAMDisk,ReadOnly,Remote,Removable,System,SystemFolder,%
+      TemporaryFolder,TristateFalse,TristateTrue,TristateUseDefault,%
+      Unknown,Volume,WindowsFolder,vbAbortRetryIgnore,%
+      vbApplicationModal,vbArray,vbBinaryCompare,vbBlack,vbBlue,%
+      vbBoolean,vbByte,vbCr,vbCrLf,vbCritical,vbCurrency,vbCyan,%
+      vbDataObject,vbDate,vbDecimal,vbDefaultButton1,vbDefaultButton2,%
+      vbDefaultButton3,vbDefaultButton4,vbDouble,vbEmpty,vbError,%
+      vbExclamation,vbFirstFourDays,vbFirstFullWeek,vbFirstJan1,%
+      vbFormFeed,vbFriday,vbGeneralDate,vbGreen,vbInformation,%
+      vbInteger,vbLf,vbLong,vbLongDate,vbLongTime,vbMagenta,vbMonday,%
+      vbNewLine,vbNull,vbNullChar,vbNullString,vbOKC,ancel,vbOKOnly,%
+      vbObject,vbObjectError,vbQuestion,vbRed,vbRetryCancel,vbSaturday,%
+      vbShortDate,vbShortTime,vbSingle,vbString,vbSunday,vbSystemModal,%
+      vbTab,vbTextCompare,vbThursday,vbTuesday,vbUseSystem,%
+      vbUseSystemDayOfWeek,vbVariant,vbVerticalTab,vbWednesday,vbWhite,%
+      vbYellow,vbYesNo,vbYesNoCancel},%
+   sensitive=f,%
+   morecomment=[l]',%
+   morestring=[d]"%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Verilog}
+%
+% Thanks to \lstthanks{Cameron H. G. Wright}{c.h.g.wright@ieee.org}{2003/04/30}
+% for providing the definition. After a bug report by \lsthelper{George
+% M.~Georgiou}{georgiou@csci.csusb.edu}{2004/02/05}{directives not detected} I
+% changed the declaration of directives to use normal keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang3>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% Verilog definition (c) 2003 Cameron H. G. Wright 
+%%   Based on the IEEE 1364-2001 Verilog HDL standard
+%%   Ref: S. Palnitkar, "Verilog HDL: A Guide to Digital Design and Synthesis,"
+%%        Prentice Hall, 2003. ISBN: 0-13-044911-3
+%%
+\lst@definelanguage{Verilog}%
+  {morekeywords={% reserved keywords
+      always,and,assign,automatic,begin,buf,bufif0,bufif1,case,casex,%
+      casez,cell,cmos,config,deassign,default,defparam,design,disable,%
+      edge,else,end,endcase,endconfig,endfunction,endgenerate,%
+      endmodule,endprimitive,endspecify,endtable,endtask,event,for,%
+      force,forever,fork,function,generate,genvar,highz0,highz1,if,%
+      ifnone,incdir,include,initial,inout,input,instance,integer,join,%
+      large,liblist,library,localparam,macromodule,medium,module,nand,%
+      negedge,nmos,nor,noshowcancelled,not,notif0,notif1,or,output,%
+      parameter,pmos,posedge,primitive,pull0,pull1,pulldown,pullup,%
+      pulsestyle_onevent,pulsestyle_ondetect,rcmos,real,realtime,reg,%
+      release,repeat,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,%
+      showcancelled,signed,small,specify,specparam,strong0,strong1,%
+      supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,%
+      tri1,triand,trior,trireg,unsigned,use,vectored,wait,wand,weak0,%
+      weak1,while,wire,wor,xnor,xor},%
+   morekeywords=[2]{% system tasks and functions
+      $bitstoreal,$countdrivers,$display,$fclose,$fdisplay,$fmonitor,%
+      $fopen,$fstrobe,$fwrite,$finish,$getpattern,$history,$incsave,%
+      $input,$itor,$key,$list,$log,$monitor,$monitoroff,$monitoron,%
+      $nokey},%
+   morekeywords=[3]{% compiler directives
+      `accelerate,`autoexpand_vectornets,`celldefine,`default_nettype,%
+      `define,`else,`elsif,`endcelldefine,`endif,`endprotect,%
+      `endprotected,`expand_vectornets,`ifdef,`ifndef,`include,%
+      `no_accelerate,`noexpand_vectornets,`noremove_gatenames,%
+      `nounconnected_drive,`protect,`protected,`remove_gatenames,%
+      `remove_netnames,`resetall,`timescale,`unconnected_drive},%
+   alsoletter=\`,%
+   sensitive,%
+   morecomment=[s]{/*}{*/},%
+   morecomment=[l]//,% nonstandard
+   morestring=[b]"%
+  }[keywords,comments,strings]% 
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{VHDL}
+%
+% This language is due to \lstthanks{Kai~Wollenweber}{kai@ece.wpi.edu}
+% {1997/11/04}{VHDL}. I've done conversion to version 0.19 only.
+% \lsthelper{Gaurav Aggarwal}{gaurav@ics.uci.edu}{1998/04/02}{sensitive=f}
+% reported that VHDL is case insensitive and \lsthelper{Arnaud~Tisserand}
+% {2003/02/17}{missing keywords: disconnect, elif, with} added three
+% keywords.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% VHDL definition (c) 1997 Kai Wollenweber
+%%
+\lst@definelanguage{VHDL}%
+  {morekeywords={ALL,ARCHITECTURE,ABS,AND,ASSERT,ARRAY,AFTER,ALIAS,%
+      ACCESS,ATTRIBUTE,BEGIN,BODY,BUS,BLOCK,BUFFER,CONSTANT,CASE,%
+      COMPONENT,CONFIGURATION,DOWNTO,ELSE,ELSIF,END,ENTITY,EXIT,%
+      FUNCTION,FOR,FILE,GENERIC,GENERATE,GUARDED,GROUP,IF,IN,INOUT,IS,%
+      INERTIAL,IMPURE,LIBRARY,LOOP,LABEL,LITERAL,LINKAGE,MAP,MOD,NOT,%
+      NOR,NAND,NULL,NEXT,NEW,OUT,OF,OR,OTHERS,ON,OPEN,PROCESS,PORT,%
+      PACKAGE,PURE,PROCEDURE,POSTPONED,RANGE,REM,ROL,ROR,REPORT,RECORD,%
+      RETURN,REGISTER,REJECT,SIGNAL,SUBTYPE,SLL,SRL,SLA,SRA,SEVERITY,%
+      SELECT,THEN,TYPE,TRANSPORT,TO,USE,UNITS,UNTIL,VARIABLE,WHEN,WAIT,%
+      WHILE,XOR,XNOR,%
+      DISCONNECT,ELIF,WITH},% Arnaud Tisserand
+   sensitive=f,% 1998 Gaurav Aggarwal
+   morecomment=[l]--,%
+   morestring=[d]{"}%
+  }[keywords,comments,strings]%
+%    \end{macrocode}
+% The VHDL-AMS dialect has been added by \lstthanks{Steffen~Klupsch}
+% {steffen@vlsi.informatik.tu-darmstadt.de}{2001/10/05}.
+%    \begin{macrocode}
+%%
+%% VHDL-AMS definition (c) Steffen Klupsch
+%%
+\lst@definelanguage[AMS]{VHDL}[]{VHDL}%
+  {morekeywords={ACROSS,ARRAY,BREAK,DISCONNECT,NATURE,NOISE,PORT,%
+      PROCEDURAL,QUANTITY,SHARED,SPECTRUM,SUBNATURE,TERMINAL,THROUGH,%
+      TOLERANCE,UNAFFACTED,UNITS}}
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{VRML}
+%
+% This language is due to \lstthanks{Oliver~Baum}{oli.baum@web.de}{2001/07/10}
+% {VRML}.
+% \begingroup
+%    \begin{macrocode}
+%<*lang2>
+%    \end{macrocode}
+%    \begin{macrocode}
+%%
+%% VRML definition (c) 2001 Oliver Baum
+%%
+\lst@definelanguage[97]{VRML}
+  {morekeywords={DEF,EXTERNPROTO,FALSE,IS,NULL,PROTO,ROUTE,TO,TRUE,USE,%
+      eventIn,eventOut,exposedField,field,Introduction,Anchor,%
+      Appearance,AudioClip,Background,Billboard,Box,Collision,Color,%
+      ColorInterpolator,Cone,Coordinate,CoordinateInterpolator,%
+      Cylinder,CylinderSensor,DirectionalLight,ElevationGrid,Extrusion,%
+      Fog,FontStyle,Group,ImageTexture,IndexedFaceSet,IndexedLineSet,%
+      Inline,LOD,Material,MovieTexture,NavigationInfo,Normal,%
+      NormalInterpolator,OrientationInterpolator,PixelTexture,%
+      PlaneSensor,PointLight,PointSet,PositionInterpolator,%
+      ProximitySensor,ScalarInterpolator,Script,Shape,Sound,Sphere,%
+      SphereSensor,SpotLight,Switch,Text,TextureCoordinate,%
+      TextureTransform,TimeSensor,TouchSensor,Transform,Viewpoint,%
+      VisibilitySensor,WorldInfo},%
+   morecomment=[l]\#,% bug: starts comment in the first column
+   morestring=[b]"%
+  }[keywords,comments,strings]
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{XML et al}
+%
+% \lstthanks{Bernhard~Walle}{bernhard@bwalle.de}{2003/11/22} provided the
+% following two definitions.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{XSLT}[]{XML}%
+  {morekeywords={%
+     % main elements
+     xsl:stylesheet,xsl:transform,%
+     % childs of the main element
+     xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,xsl:import,%
+     xsl:include,xsl:key,xsl:namespace-alias,xsl:output,xsl:param,%
+     xsl:preserve-space,xsl:strip-space,xsl:template,xsl:variable,%
+     % 21 directives
+     xsl:apply-imports,xsl:apply-templates,xsl:attribute,%
+     xsl:call-template,xsl:choose,xsl:comment,xsl:copy,xsl:copy-of,%
+     xsl:element,xsl:fallback,xsl:for-each,xsl:if,xsl:message,%
+     xsl:number,xsl:otherwise,xsl:processing-instruction,xsl:text,%
+     xsl:value-of,xsl:variable,xsl:when,xsl:with-param},%
+   alsodigit={-},%
+  }%
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{Ant}[]{XML}%
+  {morekeywords={%
+     project,target,patternset,include,exclude,excludesfile,includesfile,filterset,%
+     filter,filtersfile,libfileset,custom,classpath,fileset,none,depend,mapper,%
+     filename,not,date,contains,selector,depth,or,and,present,majority,size,dirset,%
+     filelist,pathelement,path,param,filterreader,extension,filterchain,linecontainsregexp,%
+     regexp,classconstants,headfilter,tabstospaces,striplinebreaks,tailfilter,stripjavacomments,%
+     expandproperties,linecontains,replacetokens,token,striplinecomments,comment,prefixlines,%
+     classfileset,rootfileset,root,description,xmlcatalog,entity,dtd,substitution,%
+     extensionSet,propertyfile,entry,vsscheckin,sql,transaction,cvspass,csc,%
+     dirname,wlrun,wlclasspath,p4label,replaceregexp,get,jjtree,sleep,jarlib,%
+     dependset,targetfileset,srcfileset,srcfilelist,targetfilelist,zip,zipgroupfileset,zipfileset,%
+     patch,jspc,webapp,style,test,arg,jvmarg,sysproperty,testlet,env,tstamp,%
+     format,unwar,vsshistory,icontract,cvschangelog,user,p4submit,ccmcheckin,%
+     p4change,bzip2,vssadd,javadoc,bottom,source,doctitle,header,excludepackage,bootclasspath,%
+     doclet,taglet,packageset,sourcepath,link,footer,package,group,title,tag,%
+     translate,signjar,vajload,vajproject,jarlib,extensionset,WsdlToDotnet,buildnumber,%
+     jpcovmerge,tomcat,ejbjar,weblogictoplink,jboss,borland,weblogic,iplanet,jonas,%
+     support,websphere,wasclasspath,war,manifest,attribute,section,metainf,lib,%
+     classes,webinf,rename,sequential,serverdeploy,generic,property,move,%
+     copydir,cccheckin,wljspc,fixcrlf,sosget,pathconvert,map,record,p4sync,exec,%
+     p4edit,maudit,rulespath,searchpath,antlr,netrexxc,jpcovreport,reference,filters,%
+     coveragepath,execon,targetfile,srcfile,ccmcheckout,ant,xmlvalidate,xslt,%
+     iplanet,ccmcheckintask,gzip,native2ascii,starteam,ear,archives,input,%
+     rmic,extdirs,compilerarg,checksum,mail,bcc,message,cc,to,from,loadfile,vsscheckout,%
+     stylebook,soscheckin,mimemail,stlabel,gunzip,concat,cab,touch,parallel,splash,%
+     antcall,cccheckout,typedef,p4have,xmlproperty,copy,tomcat,antstructure,ccmcreatetask,%
+     rpm,delete,replace,replacefilter,replacetoken,replacevalue,mmetrics,waitfor,isfalse,%
+     equals,available,filepath,os,filesmatch,istrue,isset,socket,http,uptodate,srcfiles,%
+     untar,loadproperties,echoproperties,vajexport,stcheckout,bunzip2,copyfile,vsscreate,%
+     ejbc,unjar,tomcat,wsdltodotnet,mkdir,condition,cvs,commandline,marker,argument,%
+     tempfile,junitreport,report,taskdef,echo,ccupdate,java,renameext,vsslabel,basename,%
+     javadoc2,vsscp,tar,tarfileset,tomcat,vajimport,setproxy,wlstop,p4counter,ilasm,%
+     soscheckout,apply,ccuncheckout,jarlib,location,url,cvstagdiff,jlink,mergefiles,%
+     addfiles,javacc,pvcs,pvcsproject,jarlib,options,depends,chmod,jar,sound,fail,%
+     success,mparse,blgenclient,genkey,dname,javah,class,ccmreconfigure,unzip,javac,%
+     src,p4add,soslabel,jpcoverage,triggers,method,vssget,deltree,ddcreator},
+   deletekeywords={default},%
+  }
+%    \end{macrocode}
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+% This is my first attempt to support XML. It is from 2000/07/18.
+% \begingroup
+%    \begin{macrocode}
+%<*lang1>
+%    \end{macrocode}
+%    \begin{macrocode}
+\lst@definelanguage{XML}%
+  {keywords={,CDATA,DOCTYPE,ATTLIST,termdef,ELEMENT,EMPTY,ANY,ID,%
+      IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,NOTATION,%
+      INCLUDE,IGNORE,SYSTEM,PUBLIC,NDATA,PUBLIC,%
+      PCDATA,REQUIRED,IMPLIED,FIXED,%%% preceded by #
+      xml,xml:space,xml:lang,version,standalone,default,preserve},%
+   alsoother=$,%
+   alsoletter=:,%
+   tag=**[s]<>,%
+   morestring=[d]",% ??? doubled
+   morestring=[d]',% ??? doubled
+   MoreSelectCharTable=%
+      \lst@CArgX--\relax\lst@DefDelimB{}{}%
+          {\ifnum\lst@mode=\lst@tagmode\else
+               \expandafter\@gobblethree
+           \fi}%
+          \lst@BeginComment\lst@commentmode{{\lst@commentstyle}}%
+      \lst@CArgX--\relax\lst@DefDelimE{}{}{}%
+          \lst@EndComment\lst@commentmode
+      \lst@CArgX[CDATA[\relax\lst@CDef{}%
+          {\ifnum\lst@mode=\lst@tagmode
+               \expandafter\lst@BeginCDATA
+           \else \expandafter\lst@CArgEmpty
+           \fi}%
+          \@empty
+      \lst@CArgX]]\relax\lst@CDef{}%
+          {\ifnum\lst@mode=\lst@GPmode
+               \expandafter\lst@EndComment
+           \else \expandafter\lst@CArgEmpty
+           \fi}%
+          \@empty
+  }[keywords,comments,strings,html]%
+%    \end{macrocode}
+% And after receiving a bug report from \lsthelper{Michael~Niedermair}
+% {m.g.n@gmx.de}{2002/04/07}{undefined control sequence \lst@commentmode} I
+% converted the version 0.21 contents of |MoreSelectCharTable| to version 1.0.
+%    \begin{macrocode}
+%
+%    \end{macrocode}
+% \endgroup
+%
+%
+%^^A \setcounter{IndexColumns}{2}
+%^^A \PrintIndex
+%
+%
+% \Finale
+%
+\endinput
diff --git a/Master/texmf-dist/source/latex/listings/lstdrvrs.ins b/Master/texmf-dist/source/latex/listings/lstdrvrs.ins
index df3df1859a5..2c6126919e2 100644
--- a/Master/texmf-dist/source/latex/listings/lstdrvrs.ins
+++ b/Master/texmf-dist/source/latex/listings/lstdrvrs.ins
@@ -4,12 +4,12 @@
 %%
 %% The original source files were:
 %%
-%% lstdrvrs-1.3.dtx  (with options: `install')
+%% lstdrvrs.dtx  (with options: `install')
 %% 
 %% The listings package is copyright 1996--2004 Carsten Heinz, and
-%% continued maintenance on the package is copyright 2006 Brooks Moses.
-%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004 any
-%% individual author listed in this file.
+%% continued maintenance on the package is copyright 2006--2007 Brooks Moses.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007 any individual author listed in this file.
 %%
 %% This file is distributed under the terms of the LaTeX Project Public
 %% License from CTAN archives in directory  macros/latex/base/lppl.txt.
@@ -31,9 +31,9 @@
 }
 
 \generate{
-    \file{lstlang1.sty}{\from{lstdrvrs-1.3.dtx}{lang1}}
-    \file{lstlang2.sty}{\from{lstdrvrs-1.3.dtx}{lang2}}
-    \file{lstlang3.sty}{\from{lstdrvrs-1.3.dtx}{lang3}}
+    \file{lstlang1.sty}{\from{lstdrvrs.dtx}{lang1}}
+    \file{lstlang2.sty}{\from{lstdrvrs.dtx}{lang2}}
+    \file{lstlang3.sty}{\from{lstdrvrs.dtx}{lang3}}
 }
 
 \ifToplevel{
-- 
cgit v1.2.3