summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/listings
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/listings
Initial commit
Diffstat (limited to 'macros/latex/contrib/listings')
-rw-r--r--macros/latex/contrib/listings/Makefile225
-rw-r--r--macros/latex/contrib/listings/README16
-rw-r--r--macros/latex/contrib/listings/listings-devel.pdfbin0 -> 1140171 bytes
-rw-r--r--macros/latex/contrib/listings/listings.dtx16933
-rw-r--r--macros/latex/contrib/listings/listings.ins46
-rw-r--r--macros/latex/contrib/listings/listings.pdfbin0 -> 742942 bytes
-rw-r--r--macros/latex/contrib/listings/lstdrvrs.dtx9444
-rw-r--r--macros/latex/contrib/listings/lstdrvrs.ins62
-rw-r--r--macros/latex/contrib/listings/lstdrvrs.pdfbin0 -> 571118 bytes
9 files changed, 26726 insertions, 0 deletions
diff --git a/macros/latex/contrib/listings/Makefile b/macros/latex/contrib/listings/Makefile
new file mode 100644
index 0000000000..e93bffe666
--- /dev/null
+++ b/macros/latex/contrib/listings/Makefile
@@ -0,0 +1,225 @@
+### Makefile ---
+#
+# This file generates files required to use the listings package.
+#
+# $Id$
+#
+# (c) 2007 Brooks Moses
+# (c) 2013-2018 Jobst Hoffmann
+#
+# 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.3c or, at your option, any later version.
+
+# remember:
+# $<: first element of list of dependees
+# $^: list of (all) dependees
+# $@: target
+
+# formatting tools
+LATEX = pdflatex
+MAKEINDEX = makeindex
+TEX = tex
+# tarring options
+ifneq "$(wildcard listings.version)" ""
+include listings.version # version and date of the package
+endif
+TAR_SRC = $(PACKAGE)-$(VERSION)_source.tgz
+EXsvn = --exclude .svn --exclude auto --exclude contrib --exclude requests \
+ --exclude support --exclude testing \
+ --exclude *.tgz --exclude *.txt
+
+DISTRIBUTION_FILES = ../$(PACKAGE)/$(PACKAGE).pdf \
+ ../$(PACKAGE)/$(PACKAGE)-devel.pdf \
+ ../$(PACKAGE)/$(PACKAGE).dtx \
+ ../$(PACKAGE)/$(PACKAGE).ins \
+ ../$(PACKAGE)/README \
+ ../$(PACKAGE)/Makefile \
+ ../$(PACKAGE)/lstdrvrs.dtx \
+ ../$(PACKAGE)/lstdrvrs.ins \
+ ../$(PACKAGE)/lstdrvrs.pdf
+PACKAGE_FILES = $(subst ../$(PACKAGE)/,,$(DISTRIBUTION_FILES))
+
+.SUFFIXES: # Delete the default suffixes
+.SUFFIXES: .dtx .ins .pdf .sty # Define our own suffix list
+
+.PHONY: listings pdf pdf-devel tests all
+
+listings: listings.sty
+
+pdf: listings.pdf lstdrvrs.pdf
+
+pdf-devel: listings-devel.pdf
+
+all: listings pdf pdf-devel
+
+
+listings.sty: listings.ins listings.dtx lstdrvrs.dtx
+ $(TEX) $<
+
+listings.pdf: listings.sty
+ rm -f ltxdoc.cfg
+ $(LATEX) ${<:.sty=.dtx}
+ $(MAKEINDEX) -s gind.ist ${@:.pdf=}
+ $(LATEX) ${<:.sty=.dtx}
+ $(LATEX) ${<:.sty=.dtx}
+
+listings-devel.pdf: listings.sty
+ rm -rf ltxdoc.cfg
+ echo "\AtBeginDocument{\AlsoImplementation}" > ltxdoc.cfg
+ $(LATEX) -jobname=${@:.pdf=} ${<:.sty=.dtx}
+ $(MAKEINDEX) -s gind.ist ${@:.pdf=}
+ $(LATEX) -jobname=${@:.pdf=} ${<:.sty=.dtx}
+ $(LATEX) -jobname=${@:.pdf=} ${<:.sty=.dtx}
+ rm -rf ltxdoc.cfg
+
+lstdrvrs.pdf: lstdrvrs.dtx
+ rm -f ltxdoc.cfg
+ $(LATEX) ${<:.sty=.dtx}
+ $(MAKEINDEX) -s gind.ist lstdrvrs
+ $(LATEX) ${<:.sty=.dtx}
+ $(LATEX) ${<:.sty=.dtx}
+
+## Testing targets
+acm-tests:
+ cd testing; make acm
+
+algol-tests:
+ cd testing; make algol
+
+bash-tests:
+ cd testing; make bash
+
+c++11-tests:
+ cd testing; make c++11
+
+cobol-tests:
+ cd testing; make cobol
+
+fortran-tests:
+ cd testing; make fortran
+
+elisp-tests:
+ cd testing; make elisp
+
+gap-tests:
+ cd testing; make gap
+
+go-tests:
+ cd testing; make go
+
+hansl-tests:
+ cd testing; make hansl
+
+llvm-tests:
+ cd testing; make llvm
+
+lua-tests:
+ cd testing; make lua
+
+mathematica-tests:
+ cd testing; make mathematica
+
+python-tests:
+ cd testing; make python
+
+scala-tests:
+ cd testing; make scala
+
+swift-tests:
+ cd testing; make swift
+
+vbscript-tests:
+ cd testing; make vbscript
+
+xml-tests:
+ cd testing; make xml
+
+tests:
+ cd testing; make all
+
+## Clean targets
+clean:
+ -rm -f *~ *.aux *.lof *.log *.lot *.tmp *.toc
+ -rm -f *.idx *.ind *.glg *.glo *.gls *.ilg *.out
+ -rm -f *.bbl *.blg *.brf
+
+clean-results:
+ -rm -f *.cfg *.pdf *.prf *.sty
+
+realclean: clean clean-results
+
+### create packed files
+tar-src:
+ @$(MAKE) realclean; \
+ sed -i -e "s+fileversion{[a-z0-9\.\-]*}+fileversion{$(VERSION)}+g" \
+ -e "s+filedate{[0-9/]*}+filedate{$(DATE)}+g" \
+ -e "s+date{[0-9/]*\\\\enspace+date{$(DATE)\\\\enspace+g" \
+ -e "s+Version [a-z0-9\.\-]*\\\\+Version $(VERSION)\\\\+g" \
+ listings.dtx; \
+ sed -i -e "s+date{[0-9/]*\\\\enspace+date{$(DATE)\\\\enspace+g" \
+ -e "s+Version [a-z0-9\.\-]*\\\\+Version $(VERSION)\\\\+g" \
+ -e "s+\[[0-9/]* [a-z0-9\.\-]* listings+[$(DATE) $(VERSION) listings+g" \
+ lstdrvrs.dtx; \
+ cd ..; tar $(EXsvn) -czvf $(PACKAGE)/$(TAR_SRC) $(PACKAGE)
+
+tar-dist: $(PACKAGE_FILES)
+ @$(MAKE) realclean; \
+ sed -i -e "s+fileversion{[a-z0-9\.\-]*}+fileversion{$(VERSION)}+g" \
+ -e "s+filedate{[0-9/]*}+filedate{$(DATE)}+g" \
+ -e "s+date{[0-9/]*\\\\enspace+date{$(DATE)\\\\enspace+g" \
+ -e "s+Version [a-z0-9\.\-]*\\\\+Version $(VERSION)\\\\+g" \
+ listings.dtx; \
+ sed -i -e "s+date{[0-9/]*\\\\enspace+date{$(DATE)\\\\enspace+g" \
+ -e "s+Version [a-z0-9\.\-]*\\\\+Version $(VERSION)\\\\+g" \
+ -e "s+\[[0-9/]* [a-z0-9\.\-]* listings+[$(DATE) $(VERSION) listings+g" \
+ lstdrvrs.dtx; \
+ $(MAKE) listings.pdf; \
+ $(MAKE) listings-devel.pdf; \
+ $(MAKE) lstdrvrs.pdf; \
+ tar cfvz $(PACKAGE)-$(VERSION).tgz $(DISTRIBUTION_FILES);
+
+tagged-release:
+ sed -n -e "/Version $(VERSION)/,$$$$w announcement_text.log" \
+ announcement_text.txt
+ svn copy --file ./announcement_text.log \
+ svn+ssh://j_hoffmann@svn.gnu.org.ua/listings/trunk \
+ svn+ssh://j_hoffmann@svn.gnu.org.ua/listings/tags/$(VERSION)
+ rm announcement_text.log
+
+
+## Documentation target
+help::
+ $(info Usage:)
+ $(info )
+ $(info make [all] generates listings.sty and [all] the .pdf versions)
+ $(info $(empty) (user/developer) of the documentation)
+ $(info )
+ $(info make <file name>)
+ $(info $(empty) creates the corresponding file denoted by <file name>)
+ $(info )
+ $(info make help shows this help)
+ $(info )
+ $(info make tests performs a little test suite)
+ $(info )
+ $(info make clean removes all intermediate files created by a LaTeX run)
+ $(info )
+ $(info make clean-results)
+ $(info $(empty) removes .cfg, .sty, and .pdf files)
+ $(info )
+ $(info make realclean)
+ $(info $(empty) performs clean and clean-results)
+ $(info )
+ $(info make tar-src)
+ $(info $(empty) generates a tarred version of the current directory)
+ $(info )
+ $(info make tar-dist)
+ $(info $(empty) generates a distributable version of the listings)
+ $(info $(empty) package)
+ $(info )
+ $(info make tagged-release)
+ $(info $(empty) creates a new tagged version of the package based on)
+ $(info $(empty) the contents of listings.version and announcement_text.txt)
+ @echo "" # prevents message "nothing to do ..."
+
+### Makefile ends here ---
diff --git a/macros/latex/contrib/listings/README b/macros/latex/contrib/listings/README
new file mode 100644
index 0000000000..a6f0849c16
--- /dev/null
+++ b/macros/latex/contrib/listings/README
@@ -0,0 +1,16 @@
+Listings package
+
+Copyright 1996--2004 Carsten Heinz (the package)
+Copyright 1996--2007 individual authors (language drivers)
+Copyright 2006--2007 Brooks Moses (continued maintenance)
+Copyright 2013--2019 Jobst Hoffmann (continued maintenance)
+
+Released under the LaTeX Project Public License 1.3c or later
+
+The `listings' package is a source code printer for LaTeX.
+You can typeset stand alone files as well as listings with
+an environment similar to `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.
diff --git a/macros/latex/contrib/listings/listings-devel.pdf b/macros/latex/contrib/listings/listings-devel.pdf
new file mode 100644
index 0000000000..06c8147ab6
--- /dev/null
+++ b/macros/latex/contrib/listings/listings-devel.pdf
Binary files differ
diff --git a/macros/latex/contrib/listings/listings.dtx b/macros/latex/contrib/listings/listings.dtx
new file mode 100644
index 0000000000..2a9216744a
--- /dev/null
+++ b/macros/latex/contrib/listings/listings.dtx
@@ -0,0 +1,16933 @@
+% \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. From 2013 on copyright is Jobst Hoffmann, who is the maintainer
+% since july 2013. The drivers are copyright 1997/1998/1999/2000/2001/
+% 2002/2003/2004/2006/2007/2013 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.3c 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 Jobst Hoffmann <j.hoffmann(at)fh-aachen.de>.
+%
+% end of software license
+%
+%
+%<*driver>
+\documentclass[a4paper]{ltxdoc}
+\DisableCrossrefs
+\OnlyDescription
+
+\usepackage{lstdoc,textcomp}
+\usepackage{mdframed} % frames for external files
+\usepackage{moreverb} % writing external files
+\usepackage{xcolor} % because of colouring the background
+
+\makeindex
+
+\begin{document}
+ \DocInput{listings.dtx}
+\end{document}
+%</driver>
+% \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,^^A
+% deletekeywords,keywordstyle,ndkeywords,morendkeywords,deletendkeywords,^^A
+% 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,^^A
+% deletekeywordcomment,keywordcommentsemicolon}
+%\lstisaspect[index]{index,moreindex,deleteindex,indexstyle,\string\lstindexmacro}
+%\lstisaspect[procnames]{procnamestyle,indexprocnames,procnamekeys,^^A
+% moreprocnamekeys,deleteprocnamekeys}
+%\lstisaspect[style]{style,\string\lstdefinestyle,\string\lst@definestyle,^^A
+% \string\lststylefiles}
+%\lstisaspect[language]{language,alsolanguage,defaultdialect,^^A
+% \string\lstalias,\string\lstdefinelanguage,\string\lst@definelanguage,^^A
+% \string\lstloadlanguages,\string\lstlanguagefiles}
+%\lstisaspect[formats]{format,fmtindent,\string\lstdefineformat,^^A
+% \string\lst@defineformat,\string\lstformatfiles}
+%\lstisaspect[labels]{numbers,numberstyle,numbersep,stepnumber,^^A
+% numberblanklines,firstnumber,\string\thelstnumber,numberfirstline}
+%\lstisaspect[lineshape]{xleftmargin,xrightmargin,resetmargins,linewidth,^^A
+% lineskip,breaklines,breakindent,breakautoindent,prebreak,postbreak,^^A
+% breakatwhitespace}
+%\lstisaspect[frames]{framexleftmargin,framexrightmargin,framextopmargin,^^A
+% framexbottommargin,backgroundcolor,fillcolor,rulecolor,rulesepcolor,^^A
+% 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,^^A
+% 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
+% \\ Copyright 2013--, Jobst Hoffmann
+% \\ Maintainer: Jobst Hoffmann\thanks{Jobst %
+% Hoffmann became the maintainer of the \packagename{listings}
+% package in 2013; see the Preface for details.}~ %
+% \textless\lstemail\textgreater}
+% \date{2019/02/27\enspace\enspace Version 1.8b\ \box\abstractbox}
+% \def\lstemail{\href{mailto:j.hoffmann@fh-aachen.de}{\texttt{j.hoffmann(at)fh-aachen.de}}}
+% \ifhyper
+% \hypersetup{pdfsubject=Package guide,pdfauthor=Jobst Hoffmann <j.hoffmann(at)fh-aachen.de>}
+% \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. The
+% result is known as listings version 1.4.
+%
+% This release, version 1.5, is a minor maintenance release since
+% I accepted maintainership of the package. I would like to thank Stephan
+% Hennig who supported the Lua language definitions. He is the one who
+% asked for the integration of a new language and gave the impetus to me to
+% become the maintainer of this package.
+%
+%
+% \paragraph{News and changes}
+% Version 1.5 is the fifth bugfix release. There are no changes
+% in this version, but two extensions: support of modern Fortran (2003,
+% 2008) and Lua.
+%
+%
+% \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}}^^A
+% {\lstset{alsoletter=\\,emph=\\lstinputlisting,emphstyle=\rstyle}^^A
+% \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,^^A
+% 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,^^A
+% 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}{^^A
+% \lstset{literate={:=}{{$\gets$}}1 {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 ^^A
+% {<>}{{$\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://mirror.ctan.org/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://mirror.ctan.org/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://mirror.ctan.org/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://mirror.ctan.org/support/tiny_c2l}^^A
+% {\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://mirror.ctan.org/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://mirror.ctan.org/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://mirror.ctan.org/macros/latex/contrib/algorithms}^^A
+% {\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}^^A
+% {\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://mirror.ctan.org/macros/latex/contrib/moreverb}^^A
+% {\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://mirror.ctan.org/macros/latex/contrib/fancyvrb}^^A
+% {\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.3c 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.
+%
+% There is at least one language (VDM, Vienna Development Language,
+% \url{http://www.vdmportal.org}) which is not directly supported by the
+% \packagename{listings} package. It needs a package for its own:
+% \packagename{vdmlisting}. On the other hand \packagename{vdmlisting} uses
+% the \packagename{listings} package and so it should be mentioned in this
+% context.
+%
+%
+% \subsubsection{Preferences}\label{uPreferences}
+%
+% Sometimes authors of language support provide their own configuration
+% preferences. These may come either from their personal experience or
+% from the settings in an IDE and can be defined as a \packagename{listings}
+% style. From version 1.5b of the \packagename{listings} package on these
+% styles are provided as files with the name
+% |listings-|\meta{language}|.prf|, \meta{language} is the name of the
+% supported programming language in lowercase letters.
+%
+% So if an user of the \packagename{listings} package wants to use these
+% preferences, she/he can say for example when using Python
+% \begin{quote}
+% |\input{listings-python.prf}|
+% \end{quote}
+% at the end of her/his |listings.cfg| configuration file as long as the
+% file |listings-python.prf| resides in the \TeX{} search path. Of course
+% that file can be changed according to the user's preferences.
+%
+% At the moment there are five such preferences files:
+% \begin{enumerate}
+% \item |listings-acm.prf|
+% \item |listings-bash.prf|
+% \item |listings-fortran.prf|
+% \item |listings-lua.prf|
+% \item |listings-python.prf|
+% \end{enumerate}
+% All contributors are invited to supply more personal preferences.
+%
+%
+% \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,^^A
+% 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,^^A
+% 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,^^A
+% 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://mirror.ctan.org/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{Byron~K.~Boulton}{bkboulton@berriehill.com},
+% \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{Joseph~Wright}{joseph.wright@morningstar2.co.uk},
+% \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}^^A
+% \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}.
+%
+% Another limitation is that this feature can't be used in cells of a
+% |tabular|-environment. See section \ref{uListingsArguments} for a
+% workaround.
+%
+% 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{Options}
+%
+% The following sections describe all the keys that can be used to
+% influence the appearance of the listing.
+%
+%
+% \subsubsection{Searching for files}
+%
+% \begin{syntax}
+% \item[1.8, {}] \rkeyname{inputpath}|=|\meta{path}
+%
+% defines the path, where the file given by \meta{file name} resides.
+%
+% \rkeyname{inputpath} overrules the |TEXINPUTS| environment variable,
+% which means that a file residing on one of the paths given by
+% |TEXINPUTS| isn't found anymore, if \meta{path} isn't part of
+% |TEXINPUTS|.
+%
+% \rkeyname{inputpath} set as option of \rcmdname\lstinputlisting{}
+% overrules the value set by \rcmdname\lstset.
+% \end{syntax}
+%
+%
+% \subsubsection{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}
+%
+%
+% \subsubsection{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,^^A
+% \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}
+%
+%
+% \subsubsection{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}}^^A
+% \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}
+%
+%
+% \subsubsection{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]^^A
+% \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]^^A
+% [\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)}
+% \item[1.0]
+% \rkeyname{moredelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt]^^A
+% [\texttt[\meta{style}\texttt]]\meta{delimiter\textup(s\textup)}
+% \item[1.0]
+% \rkeyname{deletedelim}|=|[\texttt*[\texttt*]]\texttt[\meta{type}\texttt]^^A
+% \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}
+%
+%
+% \subsubsection{Getting all characters right}
+%
+% \begin{syntax}
+% \item[0.18,true]
+% \rkeyname{extendedchars}|=|\meta{\alternative{true,false}}^^A
+% \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}
+%
+%
+% \subsubsection{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}}^^A
+% \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}
+%
+%
+% \subsubsection{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}
+%
+%
+% \subsubsection{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}}^^A
+% \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}}^^A
+% \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}
+%
+%
+% \subsubsection{Frames}\label{rFrames}
+%
+% \begin{syntax}
+% \item[1.0,none]
+% \rkeyname{frame}|=|\meta{\alternative{none,leftline,topline,bottomline,^^A
+% 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}}^^A
+% \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.
+%
+%
+% \subsubsection{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.
+%
+%
+% \subsubsection{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}}^^A
+% \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}}^^A
+% \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}
+%
+%
+% \subsubsection{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}^^A
+% \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$}^^A
+% \ldots\label{uoption:fvcmdparams}
+% \item[1.1]
+% \rkeyname{morefvcmdparams}|=|\meta{command$_1$}\meta{number$_1$}^^A
+% \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}]^^A
+% \marg{language}\syntaxnewline[\oarg{base dialect}^^A
+% \marg{and base language}]\syntaxnewline\marg{key=value list}^^A
+% \syntaxnewline[\oarg{list of required aspects ^^A
+% \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}^^A
+% \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}^^A
+% \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 ^^A
+% {<>}{{$\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{^^A
+% \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{Bugs and workarounds}\label{uBugsWorkarounds}
+%
+% \subsection{Listings inside arguments}\label{uListingsArguments}
+%
+% At the moment it isn't possible to use \verb-\lstinline{...}- in a cell
+% of a table\makeatletter\@ifundefined{r@uProcessingInline}{}{%
+% (see section \ref{uProcessingInline} on page \pageref{uProcessingInline}
+% for more information)},%
+% \makeatother%
+% but it is possible to define a wrapper macro
+% which can be used instead of \verb-\lstinline{...}-:
+% \begin{lstsample}[lstlisting]{}{}
+% \newcommand\foo{\lstinline{t}}
+% \newcommand\foobar[2][]{\lstinline[#1]{#2}}
+%
+% \begin{tabular}{ll}
+% \foo & a variable\\
+% \foobar[language=java]{int u;} & a declaration
+% \end{tabular}
+% \end{lstsample}
+%
+%
+% \subsection{Listings with a background colour and \LaTeX{} escaped
+% formulas}
+% \label{uListingsBackgroundColour}
+%
+% If there is any text escaped to \LaTeX{} with some coloured background
+% and surrounding frames, then there are gaps in the background as well as
+% in the lines making up the frame.
+% \begin{lstsample}[lstlisting]{}{}
+% \begin{lstlisting}[language=C, mathescape,
+% backgroundcolor=\color{yellow!10}, frame=tlb]
+% /* the following code computes $\displaystyle\sum_{i=1}^{n}i$ */
+% for (i = 1; i <= limit; i++) {
+% sum += i;
+% }
+% \end{lstlisting}
+% \end{lstsample}
+%
+% At the moment there is only one workaround:
+% \begin{itemize}
+% \item Write your code into an external file \meta{filename}.
+% \item Input your code by |\lstinputlisting|\meta{filename} into your
+% document and surround it with a frame generated by |\begin{mdframed}|
+% \ldots{} |\end{mdframed}|.
+% \end{itemize}
+% \begin{lstsample}[lstlisting]{}{}
+% \begin{verbatimwrite}{temp.c}
+% /* the following code computes $\displaystyle\sum_{i=1}^{n}i$ */
+% for (i = 1; i <= limit; i++) {
+% sum += i;
+% }
+% \end{verbatimwrite}
+% \begin{mdframed}[backgroundcolor=yellow!10, rightline=false]
+% \lstinputlisting[language=C,mathescape,frame={}]{./temp.c}
+% \end{mdframed}
+% \end{lstsample}
+% For more information about the |verbatimwrite| environment have a look at
+% \cite{Fairbairns:moreverb}, the |mdframed| environment is deeply discussed in
+% \cite{DanielSchubert:mdframed}.
+%
+%
+% \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://mirror.ctan.org/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.
+%
+% If you can run the (GNU) make program, executing the command
+% \begin{verbatim}
+% make all\end{verbatim}
+% or
+% \begin{verbatim}
+% make listings-devel.pdf\end{verbatim}
+% or
+% \begin{verbatim}
+% make pdf-devel\end{verbatim}
+% gives the same result---it is called \texttt{listings-devel.pdf}.
+%
+% \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{%
+% \begin{thebibliography}{MDB01}
+%
+% \bibitem[Fai11]{Fairbairns:moreverb}
+% Robin Fairbairns.
+% \newblock{The \textsf{moreverb} package}, 2011.
+%
+% \bibitem[DS13]{DanielSchubert:mdframed}
+% Marco Daniel and Elke Schubert.
+% \newblock{The \textsf{mdframed} package}, 2013.
+% \end{thebibliography}
+% \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.
+%
+% This implementation of C. Heinz has a problem\label{gAmpersand}, if
+% the listing is part of a tabular environment as found out by
+% \lsthelper{Nasser~M.~Abbasi}{2016/05/25}{possible bug in listings
+% package}. \lsthelper{David~Carlisle}{2016/05/25}{%
+% http://tex.stackexchange.com/questions/311383/^^A
+% adding-frame-none-to-lstlisting-options-in-lstdefinestyle^^A
+% -gives-error-with-tabu}
+% gave a hint how to avoid this problem and so the separator |&| is
+% replaced by |:|.
+%
+% \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|^^A
+% |\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}^^A
+% \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}^^A
+% \cs{lst@EndComment}|}|\\
+% \meta{extra prefix}\syntaxfill |i|\\
+% \meta{extra conversion}\syntaxfill |\@empty|\\
+% \marg{begin- and end-delim macro}\syntaxfill|{|\cs{lst@BeginIComment}^^A
+% \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{12377}
+%^^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 |\lstMakeShortInline@| does the main work for |\lstMakeShortInline|.
+%
+% \paragraph{Preamble}
+% All files generated from this \texttt{listings.dtx} will get a header.
+% \begin{macrocode}
+%<*kernel|misc>
+%% Please read the software license in listings.dtx or listings.pdf.
+%%
+%% (w)(c) 1996--2004 Carsten Heinz and/or any other author listed
+%% elsewhere in this file.
+%% (c) 2006 Brooks Moses
+%% (c) 2013- Jobst Hoffmann
+%%
+%% Send comments and ideas on the package, error reports and additional
+%% programming languages to Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+%</kernel|misc>
+% \end{macrocode}
+%
+% \paragraph{Identification}
+% All files will have same date and version.
+% \begin{macrocode}
+%<*kernel|misc|doc>
+\def\filedate{2019/02/27}
+\def\fileversion{1.8b}
+%</kernel|misc|doc>
+% \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
+%</kernel>
+% \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}
+%</misc>
+% \end{macrocode}
+% or by the dummy patch.
+% \begin{macrocode}
+%<*patch>
+\ProvidesFile{lstpatch.sty}
+ [\filedate\space\fileversion\space(Carsten Heinz)]
+\lst@CheckVersion\lst@version{}
+%</patch>
+% \end{macrocode}
+% \begin{macrocode}
+%<*doc>
+\ProvidesPackage{lstdoc}
+ [\filedate\space\fileversion\space(Carsten Heinz)]
+%</doc>
+% \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}
+%</kernel>
+% \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}
+%</info>
+% \end{macrocode}
+% \endgroup
+%
+% \paragraph{Miscellaneous}
+% \begin{macro}{\@lst}
+% Just a definition to save memory space.
+% \begin{macrocode}
+%<*kernel>
+\def\@lst{lst}
+%</kernel>
+% \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,^^A
+% 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 replace 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}
+%<!info>\let\lst@UserCommand\gdef
+%<info>\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}
+%<!info> \let\lst@next\@empty
+%<info> \def\lst@next{%
+%<info> \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
+%<info> \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{%
+%<info> \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}{%
+%<info> \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. The original version used an |&|,
+% which produced a bug---see p.~\pageref{gAmpersand}.
+% \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{Diverse 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}
+%</kernel>
+% \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}
+%</kernel>
+% \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
+%</misc>
+% \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$}^^A
+% \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.
+%
+% \lsthelper{Joseph~Wright}{2016/04/04}{unguarded setting of |lccode|}
+% pointed to a bug which came up on TeX StackExchange
+% (|http://tex.stackexchange.com/questions/302437/textcase-lstings-and-tilde|). Other
+% than in |\lst@CCPutMacro| the |\lccode| settings weren't local and caused
+% the error.
+% \begin{macrocode}
+\def\lst@CCPut#1#2{%
+ \ifnum#2=\z@
+ \expandafter\@gobbletwo
+ \else
+ \begingroup\lccode`\~=#2\lccode`\/=#2\lowercase{\endgroup\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}
+%</kernel>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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}
+%</kernel>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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 <float>}), 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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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}}
+%</kernel>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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.
+% \lsthelper{Ivo~Pletikosi\'c}{2015/08/18}{listings + hyperref, lstmisc.sty}
+% reported another problem with the redefinition of |\thelstlisting|.
+% \lsthelper{Heiko~Oberdiek}{2001/11/08}%
+% {http://tex.stackexchange.com/questions/261437/renewing-the-thelstlisting^^A
+% -command-when-hyperref-is-on}
+% again provided a fix: |\thelstlisting| must be replaced by |\theHlstlisting|.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting
+ \else \theHlstlisting \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
+%</misc>
+% \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}
+%</kernel>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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} ^^A $
+% 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} ^^A $
+% \end{macro}
+%
+% \begin{macrocode}
+\lst@EndAspect
+%</misc>
+% \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
+% \hookname{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} and \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 \meta{execute},
+% \meta{pre}, and \meta{post} 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 according to an
+% error reported by
+% \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}
+% \lsthelper{Byron~K.~Boulton}{2013/11/21}{line numbers off by one}
+% reported, that the line numbers are off by one, if they are displayed when
+% a linerange is given by patterns and |includerangemarker=false| is
+% set. Adding this test corrects this behaviour.
+% \begin{macrocode}
+ \lst@ifincluderangemarker\else%
+ \global\advance\c@lstnumber by 1%
+ \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} ^^A $
+% \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}\label{uProcessingInline}
+%
+% \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{%
+% \end{macrocode}
+% \lsthelper{Luc~Van~Eycken}{2014/01/22}{Luc.VanEycken@esat.kuleuven.be}
+% reported, that the experimental implementation of |\lstinline| with
+% braces instead of characters surrounding the source code resulted in an
+% error if used in a tabular environment. He found that this error comes
+% from the master counter (cf. appendix D (Dirty Tricks), item 5. (Brace
+% hacks), of the TeXbook (p. 385-386)). Adding the following line at this
+% point
+%\begin{verbatim}
+% \ifnum`{=0}\fi%
+%\end{verbatim}
+% remedies the wrong behaviour. But \lsthelper{Qing Lee}{2014/06/28}{-}
+% pointed out, that this breaks code like the one showed in
+% \ref{uListingsArguments} on \pageref{uListingsArguments} and proposed
+% another solution which in turn broke the code needed by Luc:
+%\begin{verbatim}
+% % \renewcommand\lstinline[1][]{%
+% % \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+% % \def\lst@boxpos{b}%
+% % \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+% % \lsthk@TextStyle
+% % \ifnum\iffalse{\fi`}=\z@\fi
+% % \@ifnextchar\bgroup{%
+% % \ifnum`{=\z@}\fi%
+% % \afterassignment\lst@InlineG \let\@let@token}{%
+% % \ifnum`{=\z@}\fi\lstinline@}}
+%\end{verbatim}
+% So finally the old code comes back and the people, who need a
+% |\lstinline| with braces, should use the workaround from section
+% \ref{uListingsArguments} on page \pageref{uListingsArguments}.
+% \begin{macrocode}
+ \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
+% \end{macrocode}
+% |\lst@set| takes the local options, especially |inputpath=<path>| for
+% formatting the input file. So |\lstset| must be updated to have the right
+% value of |\lst@inputpath|. The whole procedure must be grouped to make
+% the change local.
+% \begin{macrocode}
+ \bgroup\def\lst@set{#1}%
+ \expandafter\lstset\expandafter{\lst@set}%
+ \IfFileExists{\lst@inputpath#2}%
+ {\lst@InputListing{\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
+% \end{macrocode}
+% We must provide a valid value for |\lst@doendpe| in the (error) case that there
+% exists no file.
+% \begin{macrocode}
+ \let\lst@doendpe\@empty}%
+ \egroup
+ \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 <RETURN> 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%
+ }{%
+% \end{macrocode}
+% There is a problem with vertical space below a listing as pointed out by
+% \lsthelper{Jean-Yves~Baudais}{2016/03/11}{some vertical space problem}. A
+% similar problem arises with a listing beginning at the top of a
+% |\paragraph| or at the beginning of an |example| environment. Jean-Yves
+% provided a solution---|\let\if@nobreak\iffalse|---as has been discussed
+% on |fr.comp.text.tex|. The assumption, that the problem vanishes if there
+% is a top rule at the beginning of the listing or if |\leavevmode|
+% introduces the listing, was wrong as \lsthelper{Karl
+% Berry}{karl@freefriends.org}{2018/10/26} and \lsthelper{Sven
+% Schreiber}{svetosch@gmx.net}{2018/10/23} reported independently, so the
+% proposed code goes into the second part of the environment definition
+% \begin{macrocode}
+ \let\if@nobreak\iffalse%
+ \csname\@lst @SaveFirstNumber\endcsname%
+ }
+% \end{macrocode}
+% \begin{macrocode}
+%</kernel>
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \section{Documentation support}
+%
+% \begin{syntax}
+% \item[0.19]
+% |\begin{lstsample}|\oarg{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{dialect}|),|.
+%
+% \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}
+% There are two commands for credits and helpers:
+% \begin{enumerate}
+% \item |\lstthanks| is used to put a name of a contributor into the
+% section ``Closing and credit''. It has two arguments: |#1| is the
+% name, |#2| the email address---the email addres is not shown.
+% \item |\lsthelper| must be used in the text to show the name of the
+% helper (argument |#1|), the date of the contribution (argument |#2|)
+% and a short text about the contribution (argument |#3|). Only the
+% first argument is printed.
+% \end{enumerate}
+% \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}
+%</doc>
+% \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
+%</0.21>
+% \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
+%</kernel>
+% \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
+%</misc>
+% \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}
+%</kernel>
+% \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
+%</misc>
+% \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
+%</misc>
+% \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}{}{}
+%<info>\lst@ReportAllocs
+% \end{macrocode}
+% \begin{macrocode}
+%</kernel>
+% \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.
+% \item[1.5] 2013/06/27
+% \item new maintainership
+% \item[1.6] 2015/05/05
+% \item add discussion about using |\lstinline|\oarg{key=value list}\marg{source code}.
+% \item add section ``Bugs and workarounds''.
+% \item[1.7] 2018/09/02
+% \item some new or updated language definitions.
+% \item several error corrections.
+% \end{itemize}
+% \endgroup
+%
+%
+% \Finale
+%
+\endinput
diff --git a/macros/latex/contrib/listings/listings.ins b/macros/latex/contrib/listings/listings.ins
new file mode 100644
index 0000000000..29e790f2eb
--- /dev/null
+++ b/macros/latex/contrib/listings/listings.ins
@@ -0,0 +1,46 @@
+%%
+%% 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
+%% (c) 2018 Jobst Hoffmann
+%%
+%% 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.3c 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/macros/latex/contrib/listings/listings.pdf b/macros/latex/contrib/listings/listings.pdf
new file mode 100644
index 0000000000..5831599b09
--- /dev/null
+++ b/macros/latex/contrib/listings/listings.pdf
Binary files differ
diff --git a/macros/latex/contrib/listings/lstdrvrs.dtx b/macros/latex/contrib/listings/lstdrvrs.dtx
new file mode 100644
index 0000000000..b185d4d768
--- /dev/null
+++ b/macros/latex/contrib/listings/lstdrvrs.dtx
@@ -0,0 +1,9444 @@
+% \iffalse
+%
+% $Id$
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{lstdoc, textcomp}
+\EnableCrossrefs
+\CodelineIndex%
+\begin{document}
+ \DocInput{lstdrvrs.dtx}
+\end{document}
+%</driver>
+% \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}
+%
+%
+% \newbox\abstractbox
+% \setbox\abstractbox=\vbox{
+% \begin{abstract}
+% This article describes the implementation of the language drivers for
+% the \packagename{listings} package.
+% \end{abstract}}
+%
+% \title{Language, Style and Format drivers\\ for \textsf{Listings}\\
+% {\large by Carsten Heinz and individual authors:}}
+% \author{\InputIfFileExists{lstdrvrs.tmp}{}{}}
+% \date{2019/02/27\enspace\enspace Version 1.8b\ \box\abstractbox}
+%
+% \hypersetup{pdfsubject=Language definitions,pdfauthor=Jobst Hoffmann
+% <j.hoffmann-(at)-fh-aachen.de>}
+%
+% \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\"}^^A
+% \def\'{\string\'}\immediate\write\authors{#1}\endgroup}
+%
+% \renewcommand*\lsthelper[4]{#1}
+%
+% \newif\ifmulticols
+% \IfFileExists{multicol.sty}{\multicolstrue}{}
+%
+% \ifmulticols
+% \addtocontents{toc}{\protect\begin{multicols}{2}}
+% \fi
+%
+% \tableofcontents
+%
+%
+% \section{Installation and configuration}
+% \label{sec:installation}
+%
+% \begingroup
+% \begin{macrocode}
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 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.3c 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 Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+% \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}}
+}
+
+\generate{
+ \file{listings-acm.prf}{\from{lstdrvrs.dtx}{acm-prf}}
+ \file{listings-bash.prf}{\from{lstdrvrs.dtx}{bash-prf}}
+ \file{listings-fortran.prf}{\from{lstdrvrs.dtx}{fortran-prf}}
+ \file{listings-hansl.prf}{\from{lstdrvrs.dtx}{hansl-prf}}
+ \file{listings-lua.prf}{\from{lstdrvrs.dtx}{lua-prf}}
+ \file{listings-python.prf}{\from{lstdrvrs.dtx}{python-prf}}
+}
+
+
+\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
+%</install>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% \begin{macrocode}
+%<*config>
+% \end{macrocode}
+% \endgroup
+% We mainly define default dialects.
+% \begin{macrocode}
+\ProvidesFile{listings.cfg}[2019/02/27 1.8b 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=[11.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}
+%</config>
+% \end{macrocode}
+% \endgroup
+%
+% \begin{macrocode}
+%<+lang1>\ProvidesFile{lstlang1.sty}
+%<+lang2>\ProvidesFile{lstlang2.sty}
+%<+lang3>\ProvidesFile{lstlang3.sty}
+%<+acm-prf>\ProvidesFile{listings-acm.prf}
+%<+bash-prf>\ProvidesFile{listings-bash.prf}
+%<+fortran-prf>\ProvidesFile{listings-fortran.prf}
+%<+hansl-prf>\ProvidesFile{listings-hansl.prf}
+%<+lua-prf>\ProvidesFile{listings-lua.prf}
+%<+python-prf>\ProvidesFile{listings-python.prf}
+%<-config> [2019/02/27 1.8b 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}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{ACM}
+%
+% ACM is the language of the Aspen Custom Modeler
+% (\url{http://www.aspentech.com/products/aspen-custom-modeler.aspx}), the
+% language definition was provided by \lstthanks{Stefan Pinnow}{Stefan
+% Pinnow <Mo-Gul@gmx.net>}{2013/09/08}. It is intended for writing models.
+% \lsthelper{Maximilian~Dammann}{maximilian.dammann@tu-clausthal.de}
+% {2014/09/16}{missing keyword} pointed out the missing keyword
+% ``Description''.
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% \begin{macrocode}
+%%
+%% ACM and ACMscript definition
+%% (c) 2013 Stefan Pinnow
+%%
+\lst@definelanguage{ACM}{%
+ morekeywords={ abs, After, acos, And, As, asin, atan, At, Call,%
+ Compatibility, Connect, cos, cosh, Create, Delay, Description,%
+ Difference, Do, Else, ElseIf, End, EndFor, EndIf, EndParallel,%
+ EndState, EndSwitch, EndText, EndWith, exp, External, Fixed, For,%
+ ForEach, Free, Global, Hidden, If, Implementation, In, Initial, Input,%
+ InterSection, IntegerSet, Invoke, Is, Language, Library, Link, Log10,%
+ LogE, Max, Min, Model, Of, Once, Options, Output, Parallel, Parameter,%
+ Pause, Port, Print, Private, Procedure, Product, Ramp, Repeat, Restart,%
+ Return, Round, Runs, Sigma, sin, sinh, Size, SnapShot, sqr, sqrt,%
+ SRamp, State, Stream, StringSet, Structure, Switch, SubRoutine,%
+ SymDiff, tan, tanh, Task, Text, Time, Then, Truncate, Union, Until,%
+ Uses, Variable, Wait, When, With, WithIn, WorkSpace},%
+ sensitive=false,%
+ morecomment=[l]{//},%
+ morecomment=[s]{/*}{*/},%
+ string=[b]{"},%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% In addition to writing models there is a language ACMscript, which is
+% similar to VBScript. According to Stefan Pinnow this language is used for
+% writing scripts for the models.
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{ACMscript}[]{VBScript}{%
+ morekeywords={%
+ ElseIf,False,In,Resume,True%
+ },%
+ deletekeywords={%
+ Abs,Array,Clear,CreateObject,CStr,Err,ForReading,ForWriting,%
+ OpenTextFile,Replace,WriteLine%
+ }%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Stefan Pinnow also supplied a definition of a style for printing ACM code:
+% \begin{macrocode}
+%<*acm-prf>
+% \end{macrocode}
+% \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+\definecolor{Comments}{rgb}{0.00,0.50,0.00}
+\definecolor{KeyWords}{rgb}{0.00,0.00,0.63}
+\definecolor{Strings}{rgb}{0.84,0.00,0.00}
+
+\lstdefinestyle{ACM}{%
+ basicstyle=\scriptsize\ttfamily,%
+ keywordstyle=\color{KeyWords},%
+ showstringspaces=false,%
+ identifierstyle=\color{black},%
+ commentstyle=\color{Comments},%
+ stringstyle=\color{Strings},%
+ frame=shadowbox,% % for ACM-Code scrartcl commented out
+% frame=l,% % line on the left side
+ rulesepcolor=\color{black},%
+ numbers=left,% % left
+ firstnumber=1,%
+ stepnumber=5,%
+ columns=fixed,% % to prevent inserting spaces
+ fontadjust=true,%
+ basewidth=0.5em,%
+ captionpos=t,%
+ abovecaptionskip=\smallskipamount,% same amount as default
+ belowcaptionskip=\smallskipamount,% in caption package
+}%
+% \end{macrocode}
+% This code is provided in the file |listings-acm.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+% \begin{macrocode}
+%</acm-prf>
+% \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}
+%</lang1>
+% \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
+%% <Santiago.Uruena@upm.es>
+%%
+\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}
+%</lang1>
+% \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]%
+%</lang3>
+% \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]
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%
+% 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]
+%</lang3>
+% \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]%
+%</lang1>
+% \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]
+%</lang1>
+% \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]%
+%</lang3>
+% \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]%
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{C, C++, et al}
+%
+% \begingroup
+% \begin{macrocode}
+%<*lang1>
+% \end{macrocode}
+% \lstthanks{Michael Fiedler}{post@michael-fiedler.net}{2014/09/04}
+% provided the following list of new introduced keywords for C++11.
+% \begin{macrocode}
+\lst@definelanguage[11]{C++}[ISO]{C++}%
+ {morekeywords={alignas,alignof,char16_t,char32_t,constexpr,%
+ decltype,noexcept,nullptr,static_assert,thread_local},%
+ }%
+% \end{macrocode}
+% \lstthanks{Michael Piefel}{piefel@informatik.hu-berlin.de}{2001/11/21}
+% suggested some more changes and added GNU C++.
+% 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}
+%</lang1>
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Common Intermediate Language}
+%
+% This language definition for CIL (Common Intermediate Language, part of
+% Microsoft's .NET interface) was provided by
+% \lsthelper{Olaf~Conradi}{-}{2006/08/23}. \lsthelper{Akim
+% Demaille}{akim@lrde.epita.fr}{2014/07/09}{Algol broken} pointed out that
+% the support for Algol was broken, but that came from a long missing `@'
+% in the following |lst@definelanguage|.
+%
+% \begingroup
+% \begin{macrocode}
+%<*lang3>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{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}
+%</lang3>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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. \lstthanks{Scott~Pakin}{scott@pakin.org}{2014/08/08} pointed
+% out some missing keywords (|elif|, |in| for |sh|, |caller|, |compopt|,
+% |coproc|, |dirs|, |help|, |mapfile|, |readarray| for |bash|) to the
+% current maintainer. The |sh| list of keywords was checkead against the
+% ``Manual of the Bourne Shell on Version 7'', found at
+% \url{http://www.in-ulm.de/~mascheck/bourne/v7/}, last visited on
+% 2014/09/06. \lstthanks{Ralf Schandl}{ralf.schandl@gmx.de}{2003/10/14}
+% indicated the missing of an apostrophe as delimiter of strings.
+% \begin{macrocode}
+%%
+%% bash,sh definition (c) 2003 Riccardo Murri <riccardo.murri@gmx.it>
+%%
+\lst@definelanguage{bash}[]{sh}%
+ {morekeywords={alias,bg,bind,builtin,caller,command,compgen,compopt,%
+ complete,coproc,declare,disown,dirs,enable,fc,fg,help,history,%
+ jobs,let,local,logout,mapfile,printf,pushd,popd,readarray,select,%
+ set,suspend,shopt,source,times,type,typeset,ulimit,unalias,wait},%
+ }%
+\lst@definelanguage{sh}%
+ {morekeywords={awk,break,case,cat,cd,continue,do,done,echo,elif,else,%
+ env,esac,eval,exec,exit,export,expr,false,fi,for,function,getopts,%
+ hash,history,if,in,kill,login,newgrp,nice,nohup,ps,pwd,read,%
+ readonly,return,set,sed,shift,test,then,times,trap,true,type,%
+ ulimit,umask,unset,until,wait,while},%
+ morecomment=[l]\#,%
+ morestring=[d]",%
+ morestring=[d]'%
+ }[keywords,comments,strings]%
+%</lang1>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Jobst Hoffmann copied the definition of a style for printing Fortran code
+% to a style for printing shell programs:
+% \begin{macrocode}
+%<*bash-prf>
+% \end{macrocode}
+% \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+% common settings
+\lstset{%
+ frame=tlb,% the frame is open on the right side
+ resetmargins=false,%
+ rulesepcolor=\color{black},%
+ numbers=left,% % left
+ numberstyle=\tiny,%
+ numbersep=5pt,%
+ firstnumber=1,%
+ stepnumber=5,%
+ columns=fixed,% % to prevent inserting spaces
+ fontadjust=true,%
+ keepspaces=true,%
+ basewidth=0.5em,%
+ captionpos=t,%
+ abovecaptionskip=\smallskipamount,% same amount as default
+ belowcaptionskip=\smallskipamount,% in caption package
+}
+% settings for colored printing
+\lstdefinestyle{bash}{%
+ backgroundcolor=\color{yellow!10},%
+ basicstyle=\small\ttfamily,%
+ identifierstyle=\color{black},%
+ keywordstyle=\color{blue},%
+ keywordstyle={[2]\color{cyan}},%
+ keywordstyle={[3]\color{olive}},%
+ stringstyle=\color{teal},%
+ commentstyle=\itshape\color{orange},%
+}%
+% settings for back and white printing
+\lstdefinestyle{bashbw}{%
+ backgroundcolor={},%
+ basicstyle=\small\ttfamily,%
+ identifierstyle={},%
+ keywordstyle=\bfseries,%
+ stringstyle=\itshape,%
+ commentstyle=\slshape,%
+ rulesepcolor=\color{black},%
+}%
+% \end{macrocode}
+% This code is provided in the file |listings-bash.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+% \begin{macrocode}
+%</bash-prf>
+% \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}
+%</lang2>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Fortran}
+% \label{sec: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}
+% Another source for Fortran keywords is
+% \url{http://fortranwiki.org/fortran/show/Keywords} where the keywords for
+% Fortran 2003 and 2008 are taken from.
+% \begingroup
+% \begin{macrocode}
+%<*lang1>
+% \end{macrocode}
+% The current version of Fortran (Fortran 2008) is defined by ISO/IEC
+% 1539-1:2010. It contains nine new keywords, four of them consisting of
+% two words: ^^A
+% |ERROR STOP|, |SYNC ALL|, |SYNC IMAGES|, |SYNC MEMORY|, so
+% the list of keywords contains the single parts |ALL|, |ERROR|, |IMAGES|,
+% |MEMORY|, and |SYNC|.
+% \begin{macrocode}
+\lst@definelanguage[08]{Fortran}[03]{Fortran}{%
+ morekeywords={ALL, BLOCK, CODIMENSION, CONCURRENT, CONTIGUOUS, CRITICAL,%
+ ERROR, LOCK, SUBMODULE, SYNC, UNLOCK},%
+% \end{macrocode}
+% New procedures in Fortran 2008:
+% \begin{macrocode}
+ morekeywords=[3]{ACOSH, ASINH, ATANH, ATOMIC_DEFINE, ATOMIC_REF,%
+ BESSEL_J0, BESSEL_J1, BESSEL_JN, BESSEL_Y0, BESSEL_Y1, BESSEL_YN,%
+ BGE, BGT, BLE, BLT, C_SIZEOF, COMPILER_OPTIONS, COMPILER_VERSION,%
+ DSHIFTL, DSHIFTR, ERF, ERFC, ERFC_SCALED, EXECUTE_COMMAND_LINE,%
+ FINDLOC, GAMMA, HYPOT, IALL, IANY, IMAGE_INDEX, IPARITY, LCOBOUND,%
+ LEADZ, LOG_GAMMA, MASKL, MASKR, MERGE_BITS, NORM2, NUM_IMAGES,%
+ PARITY, POPCNT, POPPAR, SHIFTA, SHIFTL, SHIFTR, STORAGE_SIZE,%
+ THIS_IMAGE, TRAILZ, UCOBOUND}%
+}%
+% \end{macrocode}
+% Fortran 2003 introduces the following keywords:
+% \begin{macrocode}
+\lst@definelanguage[03]{Fortran}[95]{Fortran}{%
+ morekeywords={ABSTRACT, ASSOCIATE, ASYNCHRONOUS, BIND, CLASS, DEFERRED,%
+ ENUM, ENUMERATOR, EXTENDS, FINAL, FLUSH, GENERIC, IMPORT,%
+ NON_OVERRIDABLE, NOPASS, PASS, PROTECTED, VALUE, VOLATILE, WAIT},%
+% \end{macrocode}
+% These are new options/specifiers:
+% \begin{macrocode}
+ morekeywords=[2]{DECIMAL, ENCODING, IOMSG, ROUND},%
+% \end{macrocode}
+% And also some new procedures:
+% \begin{macrocode}
+ morekeywords=[3]{C_ASSOCIATED, C_F_POINTER, C_F_PROCPOINTER, C_FUNLOC,%
+ C_LOC, COMMAND_ARGUMENT_COUNT, EXTENDS_TYPE_OF, GET_COMMAND,%
+ GET_COMMAND_ARGUMENT, GET_ENVIRONMENT_VARIABLE, IS_IOSTAT_END,%
+ MOVE_ALLOC,NEW_LINE,SAME_TYPE_AS, SELECTED_CHAR_KIND}%
+}%
+% \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={ALLOCATABLE, ALLOCATE, ASSIGNMENT, CASE, CONTAINS, CYCLE,%
+ DEALLOCATE, DEFAULT, EXIT, INCLUDE, IN, NONE, OUT, INTENT, INTERFACE,%
+ MODULE, NAMELIST, NULLIFY, ONLY, OPERATOR, OPTIONAL, OUT, POINTER,%
+ PRIVATE, PUBLIC, RECURSIVE, RESULT, SELECT, SEQUENCE, TARGET, USE,%
+ WHERE, WHILE, BLOCKDATA, DOUBLEPRECISION, ENDBLOCKDATA, ENDFILE,%
+ ENDFUNCTION, ENDINTERFACE, ENDMODULE, ENDPROGRAM, ENDSELECT,%
+ ENDSUBROUTINE, ENDTYPE, ENDWHERE, INOUT, SELECTCASE,%
+% \end{macrocode}
+% Theses keys were missing from the 1.4 version of listings:
+% \begin{macrocode}
+ ELEMENTAL, ELSEWHERE, FORALL, PURE,%
+% \end{macrocode}
+% This is another key missing from the 1.4 version of listings:
+% \begin{macrocode}
+ PROCEDURE},%
+% \end{macrocode}
+% The list of option keywords/specifiers new in Fortran 90 and 95:
+% \begin{macrocode}
+ morekeywords=[2]{ACTION, ADVANCE, DELIM, IOLENGTH, LEN, NAME, NML, PAD,%
+ POSITION, READWRITE, SIZE, STAT},% corrected NML from NMT
+% \end{macrocode}
+% and the list of intrinsic procedures new in Fortran 90 and 95:
+% \begin{macrocode}
+ morekeywords=[3]{ACHAR, ADJUSTL, ADJUSTR, ALL, ALLOCATED, ANY, ASSOCIATED,%
+ BIT_SIZE, BTEST, CEILING, COUNT, CPU_TIME, CSHIFT, DATE_AND_TIME, DIGITS,%
+ DOT_PRODUCT, EOSHIFT, EPSILON, EXPONENT, FLOOR, FRACTION, HUGE, IACHAR,%
+ IAND, IBCLR, IBITS, IBSET, ICHAR, IEOR, IOR, ISHFT, ISHFTC, KIND, LBOUND,%
+ LEN_TRIM,% left out LOGICAL
+ MATMUL, MAXEXPONENT, MAXLOC, MAXVAL, MERGE, MINEXPONENT, MINLOC, MINVAL,%
+ MODULO, MVBITS, NEAREST, NOT, NULL, PACK, PRECISION, PRESENT, PRODUCT,%
+ RADIX, RANDOM_NUMBER, RANDOM_SEED, RANGE, RANK, REPEAT, RESHAPE,%
+ RRSPACING, SCALE, SCAN, SELECTED_INT_KIND, SELECTED_REAL_KIND,%
+ SET_EXPONENT, SHAPE, SINH, SIZE, SPACING, SPREAD, SUM, SYSTEM_CLOCK,%
+ TINY, TRANSFER, TRANSPOSE, TRIM, UBOUND, UNPACK, VERIFY},%
+ 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}{%
+% \end{macrocode}
+% Jobst Hoffmann divided the list of keywords into two lists. The first
+% list contains the statement keywords, the second list contains the option
+% keywords/specifiers and values. This makes the different meanings of the
+% keywords distinguishable.
+% \begin{macrocode}
+ morekeywords={ASSIGN, BACKSPACE, CALL, CHARACTER, %
+ CLOSE, COMMON, COMPLEX, CONTINUE, DATA, DIMENSION, DO, DOUBLE, %
+ ELSE, ELSEIF, END, ENDIF, ENDDO, ENTRY, EQUIVALENCE, EXTERNAL, %
+ FILE, FORMAT, FUNCTION, GO, TO, GOTO, IF, IMPLICIT, %
+ INQUIRE, INTEGER, INTRINSIC, LOGICAL, %
+ OPEN, PARAMETER, PAUSE, PRECISION, PRINT, PROGRAM, READ, REAL, %
+ RETURN, REWIND, STOP, SUBROUTINE, THEN, %
+ WRITE, SAVE},%
+ morekeywords=[2]{ACCESS, BLANK, BLOCK, DIRECT, EOF, ERR, EXIST,%
+ FMT, FORM, FORMATTED, IOSTAT, NAMED, NEXTREC, NUMBER, OPENED,%
+ REC, RECL, SEQUENTIAL, STATUS, TYPE, UNFORMATTED, UNIT},%
+% \end{macrocode}
+% And here is another list: the list of intrinsic procedures (remember: all
+% functions belong to the Fortran language specification!)
+% \begin{macrocode}
+ morekeywords=[3]{INT, DBLE, CMPLX, ICHAR, CHAR, AINT, ANINT,% left out real
+ NINT, ABS, MOD, SIGN, DIM, DPROD, MAX, MIN, AIMAG, CONJG, SQRT,%
+ EXP, LOG, LOG10, SIN, COS, TAN, ASIN, ACOS, ATAN, ATAN2, SINH,%
+ COSH, TANH, LGE, LGT, LLE, LLT, LEN, INDEX},%
+% \end{macrocode}
+% And here is the last list: fortran operators:
+% \begin{macrocode}
+ morekeywords=[4]{AND, EQ, EQV, FALSE, GE, GT, OR, LE, LT, NE, NEQV,%
+ NOT, TRUE},%
+ 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}
+%</lang1>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Jobst Hoffmann supplied a definition of a style for printing Fortran code:
+% \begin{macrocode}
+%<*fortran-prf>
+% \end{macrocode}
+% \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+% common settings
+\lstset{%
+ frame=tlb,% the frame is open on the right side
+ resetmargins=false,%
+ rulesepcolor=\color{black},%
+ numbers=left,% % left
+ numberstyle=\tiny,%
+ numbersep=5pt,%
+ firstnumber=1,%
+ stepnumber=5,%
+ columns=fixed,% % to prevent inserting spaces
+ fontadjust=true,%
+ keepspaces=true,%
+ basewidth=0.5em,%
+ captionpos=t,%
+ abovecaptionskip=\smallskipamount,% same amount as default
+ belowcaptionskip=\smallskipamount,% in caption package
+}
+% settings for colored printing
+\lstdefinestyle{fortran}{%
+ backgroundcolor=\color{yellow!10},%
+ basicstyle=\small\ttfamily,%
+ identifierstyle=\color{black},%
+ keywordstyle=\color{blue},%
+ keywordstyle={[2]\color{cyan}},%
+ keywordstyle={[3]\color{olive}},%
+ stringstyle=\color{teal},%
+ commentstyle=\itshape\color{orange},%
+}%
+% settings for back and white printing
+\lstdefinestyle{fortranbw}{%
+ backgroundcolor={},%
+ basicstyle=\small\ttfamily,%
+ identifierstyle={},%
+ keywordstyle=\bfseries,%
+ stringstyle=\itshape,%
+ commentstyle=\slshape,%
+ rulesepcolor=\color{black},%
+}%
+% \end{macrocode}
+% This code is provided in the file |listings-fortran.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+% \begin{macrocode}
+%</fortran-prf>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{GAP---Groups, Algorithms, Programming}
+%\label{sec:gap}
+%
+% GAP is a System for Computational Discrete Algebra, a description can be
+% found at \url{http://www.gap-system.org/}. \lstthanks{Heiko
+% Oberdiek}{heiko.oberdiek@googlemail.com}{2013/07/18} provided a
+% language definition without knowing this language, so any error should be
+% announced to the current maintainer of the \packagename{listings} package.
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% \begin{macrocode}
+%%
+%% GAP definition
+%% (c) 2013 Heiko Oberdiek
+%%
+\lst@definelanguage{GAP}{%
+ morekeywords={%
+ Assert,Info,IsBound,QUIT,%
+ TryNextMethod,Unbind,and,break,%
+ continue,do,elif,%
+ else,end,false,fi,for,%
+ function,if,in,local,%
+ mod,not,od,or,%
+ quit,rec,repeat,return,%
+ then,true,until,while%
+ },%
+ sensitive,%
+ morecomment=[l]\#,%
+ morestring=[b]",%
+ morestring=[b]',%
+}[keywords,comments,strings]
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Go---Groups, Algorithms, Programming}
+%\label{sec:gap}
+%
+% From \url{https://en.wikipedia.org/wiki/Go_(programming_language)}: Go
+% (often referred to as Golang) is a programming language created by
+% Google in 2009 by Robert Griesemer, Rob Pike, and Ken Thompson.
+% Go is a statically typed, compiled language in the tradition of C, with
+% memory safety, garbage collection, structural typing, and CSP-style
+% concurrency. The compiler, tools, and source code are all free and
+% open source.
+%
+% \lstthanks{Christian Maurer}{christian@maurer-berlin.eu}{2018/08/15}
+% provided the following language definition.
+% \begingroup
+% \begin{macrocode}
+%<*lang3>
+% \end{macrocode}
+% \begin{macrocode}
+%%
+%% Go definition
+%% (c) 2018 Christian Maurer
+%%
+\lst@definelanguage{Go}{%
+ morekeywords={append,bool,break,byte,cap,case,chan,close,complex,%
+ complex128,complex64,const,continue,copy,default,defer,delete,%
+ else,error,fallthrough,false,float32,float64,for,func,go,goto,%
+ if,imag,import,int,int16,int32,int64,int8,interface,iota,len,%
+ make,map,new,nil,package,panic,print,println,range,real,%
+ recover,return,rune,select,string,struct,switch,true,type,%
+ uint,uint16,uint32,uint64,uint8,uintptr,var},%
+ sensitive,%
+ morecomment=[s]{/*}{*/},%
+ morecomment=[l]//,%
+ morestring=[b]',%
+ morestring=[b]",%
+ morestring=[s]{`}{`},%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang3>
+% \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}
+%</lang2>
+% \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]%
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Hansl/Gretl}
+%
+% Thanks to \lstthanks{Ignacio
+% D\'{i}az-Emparanza}{ignacio.diaz-emparanza@ehu.es}{2013/10/24},
+% \lstthanks{Riccardo (Jack) Lucchetti}{r.lucchetti@univpm.it}{2018/11/03},
+% and \lstthanks{Sven Schreiber}{svetosch@gmx.net}{2018/11/22}
+% for providing the definition of hansl. Hansl is the gretl scripting
+% language (see \url{http://gretl.sourceforge.net}).%
+% \begingroup%
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{hansl}{%
+ showstringspaces = false, %
+ morekeywords={ % hansl commands:
+ add, adf, anova, append, ar, ar1, arbond, arch, arima, biprobit, break,%
+ boxplot, chow, clear, coeffsum, coint, coint2, corr, corrgm, cusum,%
+ data, dataset, delete, diff, difftest, discrete, dpanel, dummify,%
+ duration, elif, else, end, endif, endloop, eqnprint, equation,%
+ estimate, eval, fcast, flush, foreign, fractint, freq, function,%
+ funcerr, garch, genr, gmm, gnuplot, graphpg, hausman, heckit, help,%
+ hfplot, hsk, hurst, if, include, info, intreg, join, kpss, labels, lad,%
+ lags, ldiff, leverage, levinlin, logistic, logit, logs, loop, mahal,%
+ makepkg, markers, meantest, midasreg, mle, modeltab, modprint, modtest,%
+ mpi, mpols, negbin, nls, normtest, nulldata, ols, omit, open, orthdev,%
+ outfile, panel, pca, pergm, plot, poisson, print, printf, probit,%
+ pvalue, quantreg, qlrtest, qqplot, quit, rename, reset, restrict,%
+ rmplot, run, runs, scatters, sdiff, set, setinfo, setobs, setopt,%
+ setmiss, smpl, spearman, square, store,%
+ summary, system, tabprint, textplot, tobit, tsls, var, varlist,%
+ vartest, vecm, vif, wls, xcorrgm, xtab, debug, return, catch, pkg,%
+ arma, deriv, params, hessian, for, foreach, while, const},%
+ morekeywords=[2]{ % accessors:
+ \$nobs, \$nvars, \$pd, \$t1, \$t2, \$tmax, \$datatype, \$test,%
+ \$pvalue, \$qlrbreak, \$rlnl, \$stopwatch, \$unit, \$obsmajor,%
+ \$obsminor, \$obsmicro, \$obsdate, \$windows, \$version, \$error,%
+ \$seed, \$huge, \$ess, \$T, \$rsq, \$sigma, \$df, \$ncoeff, \$lnl,%
+ \$gmmcrit, \$aic, \$bic, \$hqc, \$trsq, \$dw, \$dwpval, \$Fstat,%
+ \$chisq, \$diagtest, \$diagpval, \$pmanteau, \$uhat, \$yhat, \$llt,%
+ \$ahat, \$sample, \$h, \$coeff, \$stderr, \$vcv, \$rho, \$compan,%
+ \$xtxinv, \$vecGamma, \$vma, \$fevd, \$evals, \$jalpha, \$jbeta,%
+ \$jvbeta, \$s00, \$s11, \$s01, \$ec, \$hausman, \$sargan, \$sysGamma,%
+ \$sysA, \$sysB, \$fcast, \$fcse, \$coeff_ci, \$ehat, \$mnlprobs,%
+ \$xlist, \$ylist, \$command, \$depvar, \$model, \$system, \$sysinfo},%
+ morekeywords=[3]{ % functions
+ BFGScmax, BFGSmax, GSSmax, I, NMmax, NRmax, abs, acos, acosh,%
+ aggregate, argname, array, asin, asinh, atan, atanh, atof, bessel,%
+ bkfilt, bootci, bootpval, boxcox, bread, bwfilt, bwrite, cdemean, cdf,%
+ cdiv, cdummify, ceil, cholesky, chowlin, cmult, cnameget, cnameset,%
+ cnorm, cnumber, cols, corr, corrgm, cos, cosh, cov, critical, cum,%
+ curl, dayspan, defarray, defbundle, deflist, deseas, det, diag,%
+ diagcat, diff, digamma, dnorm, dropcoll, dsort, dummify, easterday,%
+ ecdf, eigengen, eigensym, eigsolve, epochday, errmsg, exists, exp,%
+ fcstats, fdjac, feval, fevd, fft, ffti, filter, firstobs, fixname,%
+ floor, fracdiff, fraclag, freq, gammafun, genseries, getenv, getinfo,%
+ getkeys, getline, ghk, gini, ginv, grab, halton, hdprod, hfdiff,%
+ hflags, hfldiff, hflist, hpfilt, imaxc, imaxr, imhof, iminc, iminr,%
+ inbundle, infnorm, inlist, instring, int, inv, invcdf, invmills, invpd,%
+ irf, irr, isconst, isdiscrete, isdummy, isnan, isoconv, isodate,%
+ iwishart, jsonget, jsongetb, juldate, kdensity, kdsmooth, kfilter,%
+ kmeier, kpsscrit, ksetup, ksimdata, ksimul, ksmooth, kurtosis, lags,%
+ lastobs, ldet, ldiff, lincomb, linearize, ljungbox, lngamma, loess,%
+ log, log10, log2, logistic, lower, lrcovar, lrvar, max, maxc, maxr,%
+ mcorr, mcov, mcovg, mean, meanc, meanr, median, mexp, mgradient, min,%
+ minc, minr, missing, misszero, mlag, mlincomb, mnormal, mols, monthlen,%
+ movavg, mpiallred, mpibcast, mpirecv, mpireduce, mpiscatter, mpisend,%
+ mpols, mrandgen, mread, mreverse, mrls, mshape, msortby, muniform,%
+ mweights, mwrite, mxtab, naalen, nadarwat, nelem, ngetenv, nlines,%
+ nobs, normal, normtest, npcorr, npv, nullspace, numhess, obslabel,%
+ obsnum, ok, onenorm, ones, orthdev, pdf, pergm, pexpand, pmax, pmean,%
+ pmin, pnobs, polroots, polyfit, princomp, printf, prodc, prodr, psd,%
+ psdroot, pshrink, psum, pvalue, pxnobs, pxsum, qform, qlrpval, qnorm,%
+ qrdecomp, quadtable, quantile, randgen, randgen1, randint, rank,%
+ ranking, rcond, readfile, regsub, remove, replace, resample, rnameget,%
+ rnameset, round, rows, sd, sdc, sdiff, seasonals, selifc, selifr, seq,%
+ setnote, simann, sin, sinh, skewness, sleep, smplspan, sort, sortby,%
+ sprintf, sqrt, square, sscanf, sst, stringify, strlen, strncmp,%
+ strsplit, strstr, strstrip, strsub, strvals, substr, sum, sumall, sumc,%
+ sumr, svd, svm, tan, tanh, toepsolv, tolower, toupper, tr, transp,%
+ trimr, typeof, typestr, uniform, uniq, unvech, upper, urcpval, values,%
+ var, varname, varnames, varnum, varsimul, vec, vech, weekday, wmean,%
+ wsd, wvar, xmax, xmin, xmlget, zeromiss, zeros, NMmin, GSSmin,%
+ BFGScmin, BFGSmin },%
+ morekeywords=[4]{ % genr aliases:
+ null, series, scalar, matrix, string, list, bundle, strings, matrices,%
+ bundles, lists%
+ },%
+ sensitive=t,%
+ morecomment=[l]{\#},%
+ morecomment=[s]{/*}{*/},%
+ morestring=[b]{"}%
+}%
+\lstalias{gretl}{hansl}
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup%
+% The developers of the hansl support also supplied a definition of a style
+% for printing hansl code:
+% \begin{macrocode}
+%<*hansl-prf>
+% \end{macrocode}
+% \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+
+% settings for black and white
+\lstdefinestyle{hanslbw}{%
+ keywordstyle = \bfseries,
+ keywordstyle = [2]\bfseries,
+ keywordstyle = [3]\itshape,
+ keywordstyle = [4]\underbar,
+ commentstyle = \ttfamily,
+ stringstyle = \ttfamily
+}
+% settings for colored printing
+\lstdefinestyle{hanslcolor}{%
+ basicstyle = \small\ttfamily,
+ keywordstyle = \color{red},
+ keywordstyle = [2]\color{green},
+ keywordstyle = [3]\color{cyan},
+ keywordstyle = [4]\color{olive},
+ commentstyle = \color{blue}\rmfamily, %
+ stringstyle = \color{magenta},
+ moredelim = [l][\color{green}]{--}
+}%
+% \end{macrocode}
+% This code is provided in the file |listings-hansl.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+% \begin{macrocode}
+%</hansl-prf>
+% \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}
+%</lang2>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \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},%
+ %
+ % Library 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}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Java and other JVM based languages}
+%
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsubsection{Scala}
+%
+% \lstthanks{Bastian Germann}{bastian.germann@nordakademie.de}{2013/10/19}
+% asked to include the Scala definition provided by Frank Teubler
+% (2009). Here it is:
+% \begingroup
+% \begin{macrocode}
+%<*lang3>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{Scala}%
+ {morekeywords={abstract,case,catch,class,def,%
+ do,else,extends,false,final,finally,%
+ for,if,implicit,import,lazy,match,mixin,%
+ new,null,object,override,package,%
+ private,protected,requires,return,sealed,%
+ super,this,trait,true,try,%
+ type,val,var,while,with,yield},%+
+% otherkeywords={_,:,=,=>,<<:,<\%,>:,\#,@},%
+ otherkeywords={=,=>,<-,<\%,<:,>:,\#,@},%
+ sensitive,%
+ morecomment=[l]//,%
+ morecomment=[n]{/*}{*/},%
+ morestring=[b]",%
+ morestring=[b]',%
+ morestring=[b]""",%
+ }[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Lisp, AutoLisp and Emacs Lisp (elisp)}
+%
+% 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. \lsthelper{Hilmar
+% Preuße}{hille42@web.de}{2019/01/28} informed about an issue mentioned at
+% \url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=499422}{sensitive
+% is false}, the issue got corrected.
+% \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=false,% ???
+ alsodigit=-,%
+ morecomment=[l];,%
+ morecomment=[s]{\#|}{|\#},% 1997 Aslak Raanes
+ morestring=[b]"%
+ }[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \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}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% A first approch to elisp by one of the maintainers (\lstthanks{Jobst
+% Hoffmann}{j.hoffmann@fh-aachen.de}{2018/08/31}), it is far away from
+% completeness, the list of keywords is defined according the to the needs
+% of the maintainer\ldots
+% \begin{macrocode}
+\lst@definelanguage{elisp}[]{Lisp}{%
+ morekeywords={begin, car, cdr, cons, define, display, drop, filter,%
+ hash-ref, hash-set, if, load-file, lambda, length, map, message,%
+ progn, quote, require, setq, string-append, take, vector,%
+ },%
+ sensitive,%
+ alsodigit=->,%
+ otherkeywords={1+,1-},%
+ sensitive=true,%
+ morecomment=[l];,%
+ morecomment=[l];;,%
+ morestring=[b]"%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% \subsection{LLVM}
+%\label{sec:llvm}
+%
+% LLVM provides a collection of modular and reusable compiler and toolchain
+% technologies, all further information can be found at its home page
+% \url{http://llvm.org/}. \lstthanks{Scott
+% Pakin}{scott@pakin.org}{2013/07/31}
+% provided a language definition for the LLVM intermediate presentation
+% according to \url{http://llvm.org/docs/}.\footnote{In this section `I'
+% is Scott Pakin.} The language provides
+% \begingroup
+% \begin{macrocode}
+%<*lang3>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{LLVM}{%
+ morekeywords={%
+% \end{macrocode}
+% \begin{itemize}
+% \item Instructions
+% \begin{macrocode}
+ ret,br,switch,indirectbr,invoke,resume,unreachable,%
+ add,fadd,sub,fsub,mul,fmul,udiv,sdiv,fdiv,urem,srem,frem,%
+ shl,lshr,ashr,and,or,xor,%
+ extractelement,insertelement,shufflevector,%
+ extractvalue,insertvalue,%
+ alloca,load,store,fence,cmpxchg,atomicrmw,getelementptr,%
+ trunc,zext,sext,fptrunc,fpext,fptoui,fptosi,uitofp,sitofp,ptrtoint,%
+ inttoptr,bitcast,to,%
+ icmp,fcmp,phi,select,call,va_arg,landingpad,%
+% \end{macrocode}
+% \item Atomic operations -- some duplication with the above
+% \begin{macrocode}
+ xchg,add,sub,and,nand,or,xor,max,min,umax,umin,%
+% \end{macrocode}
+% \item Comparisons
+% \begin{macrocode}
+ eq,ne,ugt,uge,ult,ule,sgt,sge,slt,sle,%
+ false,oeq,ogt,oge,olt,ole,one,ord,ueq,ugt,uge,ult,ule,une,uno,true,%
+% \end{macrocode}
+% \item Linkage types
+% \begin{macrocode}
+ private,linker_private,linker_private_weak,linker_private_weak_def_auto,%
+ internal,available_externally,linkonce,common,weak,appending,extern_weak,%
+ linkonce_odr,weak_odr,external,dllimport,dllexport,%
+% \end{macrocode}
+% \item Function headers
+% \begin{macrocode}
+ define,declare,%
+% \end{macrocode}
+% \item Parameter attributes
+% \begin{macrocode}
+ zeroext,signext,inreg,byval,sret,noalias,nocapture,next,%
+% \end{macrocode}
+% \item Garbage collector names
+% \begin{macrocode}
+ gc,%
+% \end{macrocode}
+% \item Function attributes
+% \begin{macrocode}
+ address_safety,alignstack,alwaysinline,nonlazybind,inlinehint,naked,%
+ noimplicitfloat,noinline,noredzone,noreturn,nounwind,optsize,readnone,%
+ readonly,returns_twice,ssp,sspreq,uwtable,%
+% \end{macrocode}
+% \item Module-level inline assembly
+% \begin{macrocode}
+ module,asm,%
+% \end{macrocode}
+% \item Data layout
+% \begin{macrocode}
+ target,datalayout,%
+% \end{macrocode}
+% \item Inline assembler expressions
+% \begin{macrocode}
+ sideeffect,alignstack,%
+% \end{macrocode}
+% \item Other keywords -- I'm probably missing some here.
+% \begin{macrocode}
+ nuw,nsw,exact,inbounds,unnamed_addr},%
+ morekeywords=[2]{%
+% \end{macrocode}
+% \item Types
+% \begin{macrocode}
+ i1,i2,i4,i8,i16,i32,i64,i128,i256,i512,i1024,% <-- Most common integers
+ half,float,double,x86_fp80,fp128,ppc_fp128,x86mmx,%
+ void,label,metadata},%
+ alsoletter=.,%
+ sensitive=false,%
+ morecomment=[l];,%
+ morestring=[b]"%
+}
+% \end{macrocode}
+% \end{itemize}
+% \begin{macrocode}
+%</lang3>
+% \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}
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Lua}
+%
+% \lstthanks{Stephan Hennig}{sh2d@arcor.de}{2013/06/14} contributed the Lua
+% keywords.
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% We begin with the keywords for Lua 5.0:
+% \begin{macrocode}
+%%
+%% Lua definitions (c) 2013 Stephan Hennig
+%%
+\lst@definelanguage[5.0]{Lua}{%
+% \end{macrocode}
+% To enable highlighting of library keywords, the dot needs to be a
+% letter.
+% \begin{macrocode}
+ alsoletter={.},%
+% \end{macrocode}
+% The language definition knows
+% \begin{itemize}
+% \item language keywords
+% \begin{macrocode}
+ morekeywords=[1]{%
+ and, break, do, else, elseif, end, false, for, function, if, in,%
+ local, nil, not, or, repeat, return, then, true, until, while,%
+ },%
+% \end{macrocode}
+% \item the standard library identifiers
+% \begin{macrocode}
+ morekeywords=[2]{%
+% \end{macrocode}
+% \begin{itemize}
+% \item coming from the base library
+% \begin{macrocode}
+ _G, _LOADED, _REQUIREDNAME, _VERSION, LUA_PATH,%
+ assert, collectgarbage, dofile, error, gcinfo, getfenv,%
+ getmetatable, ipairs, loadfile, loadlib, loadstring, newproxy,%
+ next, pairs, pcall, print, rawequal, rawget, rawset, require,%
+ setfenv, setmetatable, tonumber, tostring, type, unpack, xpcall,%
+% \end{macrocode}
+% \item coming from the coroutine library
+% \begin{macrocode}
+ coroutine, coroutine.create, coroutine.resume,%
+ coroutine.status, coroutine.wrap, coroutine.yield,%
+% \end{macrocode}
+% \item the debug library
+% \begin{macrocode}
+ _TRACEBACK, debug, debug.debug, debug.gethook, debug.getinfo,%
+ debug.getlocal, debug.getupvalue, debug.sethook, debug.setlocal,%
+ debug.setupvalue,debug.traceback,%
+% \end{macrocode}
+% \item the io library
+% \begin{macrocode}
+ io, io.close, io.flush, io.input, io.lines, io.open, io.output,%
+ io.popen, io.read, io.stderr, io.stdin, io.stdout, io.tmpfile,%
+ io.type, io.write,%
+% \end{macrocode}
+% \item the mathematical library
+% \begin{macrocode}
+ __pow, math, math.abs, math.acos, math.asin, math.atan, math.atan2,%
+ math.ceil, math.cos, math.deg, math.exp, math.floor, math.frexp,%
+ math.ldexp, math.log, math.log10, math.max, math.min, math.mod,%
+ math.pi, math.pow, math.rad, math.random, math.randomseed, math.sin,%
+ math.sqrt, math.tan,%
+% \end{macrocode}
+% \item the os library
+% \begin{macrocode}
+ os, os.clock, os.date, os.difftime, os.execute, os.exit, os.getenv,%
+ os.remove, os.rename, os.setlocale, os.time, os.tmpname,%
+% \end{macrocode}
+% \item the string library
+% \begin{macrocode}
+ string, string.byte, string.char, string.dump, string.find,%
+ string.format, string.gfind, string.gsub, string.len, string.lower,%
+ string.rep, string.sub, string.upper,%
+% \end{macrocode}
+% \item the table library
+% \begin{macrocode}
+ table, table.concat, table.foreach, table.foreachi, table.getn,%
+ table.insert, table.remove, table.setn, table.sort,%
+ },%
+% \end{macrocode}
+% \end{itemize}
+% \end{itemize}
+% and some additional identifiers
+% \begin{macrocode}
+ morekeywords=[2]{%
+ _PROMPT, _PROMPT2, arg,%
+ },%
+% \end{macrocode}
+% These are the common language settings
+% \begin{macrocode}
+ sensitive=true,%
+ % single line comments
+ morecomment=[l]{--},%
+ % multi line comments
+ morecomment=[s]{--[[}{]]},%
+ % backslash escaped strings
+ morestring=[b]",%
+ morestring=[b]',%
+ % multi line strings
+ morestring=[s]{[[}{]]},%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \endgroup
+% And here are the new definitions for Lua 5.1:
+% \begingroup
+% \begin{macrocode}
+\lst@definelanguage[5.1]{Lua}[5.0]{Lua}{%
+% \end{macrocode}
+% There are some deletions
+% \begin{macrocode}
+ deletekeywords=[2]{%
+% \end{macrocode}
+% concerning
+% \begin{itemize}
+% \item the base library
+% \begin{macrocode}
+ _LOADED, _REQUIREDNAME, LUA_PATH, gcinfo, loadlib,%
+% \end{macrocode}
+% \item the debug library
+% \begin{macrocode}
+ _TRACEBACK,%
+% \end{macrocode}
+% \item the mathematical library
+% \begin{macrocode}
+ __pow, math.mod,%
+% \end{macrocode}
+% \item the string library
+% \begin{macrocode}
+ string.gfind,%
+% \end{macrocode}
+% \item the table library
+% \begin{macrocode}
+ table.foreach, table.foreachi, table.getn, table.setn,%
+ },%
+% \end{macrocode}
+% \end{itemize}
+% and some new identifiers in standard libraries like
+% \begin{macrocode}
+ morekeywords=[2]{%
+% \end{macrocode}
+% \begin{itemize}
+% \item the base library
+% \begin{macrocode}
+ load, select,%
+% \end{macrocode}
+% \item coroutine library
+% \begin{macrocode}
+ coroutine.running,%
+% \end{macrocode}
+% \item debug library
+% \begin{macrocode}
+ debug.getfenv, debug.getmetatable, debug.getregistry, debug.setfenv,%
+ debug.setmetatable,%
+% \end{macrocode}
+% \item the mathematical library
+% \begin{macrocode}
+ math.cosh, math.fmod, math.huge, math.modf, math.sinh, math.tanh,%
+% \end{macrocode}
+% \item the package library which itself is new in Lua 5.1
+% \begin{macrocode}
+ module, package, package.config, package.cpath, package.loaded,%
+ package.loaders, package.loadlib, package.path, package.preload,%
+ package.seeall,%
+% \end{macrocode}
+% \item the string library and
+% \begin{macrocode}
+ string.gmatch, string.match, string.reverse,%
+% \end{macrocode}
+% \item the table library
+% \begin{macrocode}
+ table.maxn,%
+ },%
+% \end{macrocode}
+% \end{itemize}
+% In Lua 5.1 long bracket comments were introduced also
+% \begin{macrocode}
+ morecomment=[s]{--[=[}{]=]},%
+ morecomment=[s]{--[==[}{]==]},%
+ morecomment=[s]{--[===[}{]===]},%
+ morecomment=[s]{--[====[}{]====]},%
+ morecomment=[s]{--[=====[}{]=====]},%
+ morecomment=[s]{--[======[}{]======]},%
+ morecomment=[s]{--[=======[}{]=======]},%
+ morecomment=[s]{--[========[}{]========]},%
+ morecomment=[s]{--[=========[}{]=========]},%
+ morecomment=[s]{--[==========[}{]==========]},%
+% \end{macrocode}
+% as well as long bracket strings
+% \begin{macrocode}
+ morestring=[s]{[=[}{]=]},%
+ morestring=[s]{[==[}{]==]},%
+ morestring=[s]{[===[}{]===]},%
+ morestring=[s]{[====[}{]====]},%
+ morestring=[s]{[=====[}{]=====]},%
+ morestring=[s]{[======[}{]======]},%
+ morestring=[s]{[=======[}{]=======]},%
+ morestring=[s]{[========[}{]========]},%
+ morestring=[s]{[=========[}{]=========]},%
+ morestring=[s]{[==========[}{]==========]},%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \endgroup
+%
+% Lua 5.2 again has some changed features. These are
+% \begingroup
+% \begin{macrocode}
+\lst@definelanguage[5.2]{Lua}[5.1]{Lua}{%
+% \end{macrocode}
+% \begin{itemize}
+% \item new language keywords
+% \begin{macrocode}
+ morekeywords=[1]{%
+ goto,%
+ },%
+% \end{macrocode}
+% \item deleted identifiers from the standard libraries like
+% \begin{macrocode}
+ deletekeywords=[2]{%
+% \end{macrocode}
+% \begin{itemize}
+% \item the base library
+% \begin{macrocode}
+ getfenv, loadstring, module, newproxy, setfenv, unpack,%
+% \end{macrocode}
+% \item the debug library
+% \begin{macrocode}
+ debug.getfenv, debug.setfenv,%
+% \end{macrocode}
+% \item the mathematical library
+% \begin{macrocode}
+ math.log10,%
+% \end{macrocode}
+% \item the package library and
+% \begin{macrocode}
+ package.loaders, package.seeall,%
+% \end{macrocode}
+% \item the table library
+% \begin{macrocode}
+ table.maxn,%
+ },%
+% \end{macrocode}
+% \end{itemize}
+% \end{itemize}
+% Again there are some new identifiers in the standard libraries
+% \begin{macrocode}
+ morekeywords=[2]{%
+% \end{macrocode}
+% like
+% \begin{itemize}
+% \item the base library
+% \begin{macrocode}
+ rawlen,%
+% \end{macrocode}
+% \item the bit library
+% \begin{macrocode}
+ bit32, bit32.arshift, bit32.band, bit32.bnot, bit32.bor,%
+ bit32.btest, bit32.bxor, bit32.extract, bit32.lrotate,%
+ bit32.lshift, bit32.replace, bit32.rrotate, bit32.rshift,%
+% \end{macrocode}
+% \item the debug library
+% \begin{macrocode}
+ debug.getuservalue, debug.setuservalue, debug.upvalueid,%
+ debug.upvaluejoin,%
+% \end{macrocode}
+% \item the package library
+% \begin{macrocode}
+ package.searchers, package.searchpath,%
+% \end{macrocode}
+% \item the table library
+% \begin{macrocode}
+ table.pack, table.unpack,%
+ },%
+% \end{macrocode}
+% \end{itemize}
+% There is a new additional identifier
+% \begin{macrocode}
+ morekeywords=[2]{%
+ _ENV,%
+ },%
+% \end{macrocode}
+% and labels are also new in Lua 5.2
+% \begin{macrocode}
+ moredelim=[s][keywordstyle3]{::}{::},%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \endgroup
+%
+% In January 2015 Lua 5.3 was released, \lstthanks{Stephan
+% Hennig}{sh2d@posteo.net}{2015/03/28} again contributed the Lua
+% keywords.
+% \begingroup
+% \begin{macrocode}
+\lst@definelanguage[5.3]{Lua}[5.2]{Lua}{%
+% \end{macrocode}
+% \begin{itemize}
+% \item some libraries are deprecated, so the following identifiers
+% are deleted
+% \begin{macrocode}
+ deletekeywords=[2]{%
+% \end{macrocode}
+% \begin{itemize}
+% \item the |bit32| library
+% \begin{macrocode}
+ bit32, bit32.arshift, bit32.band, bit32.bnot, bit32.bor,%
+ bit32.btest, bit32.bxor, bit32.extract, bit32.lrotate,%
+ bit32.lshift, bit32.replace, bit32.rrotate, bit32.rshift,%
+% \end{macrocode}
+% \item the mathematical library
+% \begin{macrocode}
+ math.atan2, math.cosh, math.frexp, math.ldexp, math.pow,%
+ math.sinh, math.tanh,%
+ },%
+% \end{macrocode}
+% \end{itemize}
+% \end{itemize}
+% Again there are some new identifiers in the standard libraries
+% \begin{macrocode}
+ morekeywords=[2]{%
+% \end{macrocode}
+% like
+% \begin{itemize}
+% \item the coroutine library
+% \begin{macrocode}
+ coroutine.isyieldable,%
+% \end{macrocode}
+% \item the mathematical library
+% \begin{macrocode}
+ math.maxinteger, math.mininteger, math.tointeger, math.type,%
+ math.ult,%
+% \end{macrocode}
+% \item the string library
+% \begin{macrocode}
+ string.pack, string.packsize, string.unpack,%
+% \end{macrocode}
+% \item the table library
+% \begin{macrocode}
+ table.move,%
+% \end{macrocode}
+% \item the utf-8 library
+% \begin{macrocode}
+ utf8, utf8.char, utf8.charpattern, utf8.codepoint, utf8.codes,%
+ utf8.len, utf8.offset,%
+ },%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% \begingroup
+% Stephan Hennig also supplied a definition of a style for printing Lua code:
+% \begin{macrocode}
+%<*lua-prf>
+% \end{macrocode}
+% \begin{macrocode}
+\usepackage[rgb, x11names]{xcolor}
+\lstdefinestyle{Lua}{%
+ language=[5.2]Lua,
+ basicstyle=\ttfamily,
+ columns=spaceflexible,
+ keywordstyle=\bfseries\color{Blue4},% language keywords
+ keywordstyle=[2]\bfseries\color{RoyalBlue3},% std. library identifiers
+ keywordstyle=[3]\bfseries\color{Purple3},% labels
+ stringstyle=\bfseries\color{Coral4},% strings
+ commentstyle=\itshape\color{Green4},% comments
+}
+% \end{macrocode}
+% This code is provided in the file |listings-lua.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+% \begin{macrocode}
+%</lua-prf>
+% \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,<D,<F,^D,^F,+D,+F,?D,?F,%
+ AR,AS,CC,CXX,CO,CPP,FC,GET,LEX,PC,YACC,YACCR,MAKEINFO,TEXI2DVI,%
+ WEAVE,CWEAVE,TANGLE,CTANGLE,RM,M2C,LINT,COMPILE,LINK,PREPROCESS,%
+ CHECKOUT,%
+ ARFLAGS,ASFLAGS,CFLAGS,CXXFLAGS,COFLAGS,CPPFLAGS,FFLAGS,GFLAGS,%
+ LDFLAGS,LOADLIBES,LFLAGS,PFLAGS,RFLAGS,YFLAGS,M2FLAGS,MODFLAGS,%
+ LINTFLAGS,MAKEINFO_FLAGS,TEXI2DVI_FLAGS,COFLAGS,GFLAGS,%
+ OUTPUT_OPTION,SCCS_OUTPUT_OPTION,% missing comma: Markus Pahlow
+ .PHONY,.SUFFIXES,.DEFAULT,.PRECIOUS,.INTERMEDIATE,.SECONDARY,%
+ .IGNORE,.SILENT,.EXPORT_ALL_VARIABLES,MAKEFILES,VPATH,MAKESHELL,%
+ MAKELEVEL,MAKECMDGOALS,SUFFIXES},%
+ sensitive=true,
+ morecomment=[l]\#,%
+ morestring=[b]"%
+ }[keywords,comments,strings,make]%
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{make}
+ {morekeywords={SHELL,MAKE,MAKEFLAGS,$@,$\%,$<,$?,$^,$+,$*},%
+ sensitive=true,%
+ morecomment=[l]\#,%
+ morestring=[b]"%
+ }[keywords,comments,strings,make]%
+% \end{macrocode}
+% The two \texttt{[b]}-arguments have been added after a bug report by
+% \lsthelper{Dr.~Jobst~Hoffmann}{2002/06/24,2002/09/05}{language=make leads
+% to: Use of \lst@FindAlias doesn't match its definition}.
+% \begin{macrocode}
+%</lang2>
+% \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}
+%</lang1>
+% \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.
+% \lstthanks{Simon Pearce}{-}{2017/01/04} provided the list of keywords for
+% Mathematica 11.0.
+% \begingroup
+% \begin{macrocode}
+%<*lang1>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage[11.0]{Mathematica}[5.2]{Mathematica}{%
+ morekeywords={
+ "AASTriangle", "AbelianGroup", "Abort", "AbortKernels",%
+ "AbortProtect", "AbortScheduledTask", "Above", "Abs", "AbsArg",%
+ "Absolute", "AbsoluteCorrelation", "AbsoluteCorrelationFunction",%
+ "AbsoluteCurrentValue", "AbsoluteDashing", "AbsoluteFileName",%
+ "AbsoluteOptions", "AbsolutePointSize", "AbsoluteThickness",%
+ "AbsoluteTime", "AbsoluteTiming", "AccountingForm", "Accumulate",%
+ "Accuracy", "AccuracyGoal", "ActionDelay", "ActionMenu",%
+ "ActionMenuBox", "ActionMenuBoxOptions", "Activate", "Active",%
+ "ActiveItem", "ActiveStyle", "AcyclicGraphQ", "AddOnHelpPath",%
+ "AddTo", "AddUsers", "AdjacencyGraph", "AdjacencyList",%
+ "AdjacencyMatrix", "AdjustmentBox", "AdjustmentBoxOptions",%
+ "AdjustTimeSeriesForecast", "AdministrativeDivisionData",%
+ "AffineHalfSpace", "AffineSpace", "AffineStateSpaceModel",%
+ "AffineTransform", "After", "AircraftData", "AirportData",%
+ "AirPressureData", "AirTemperatureData", "AiryAi", "AiryAiPrime",%
+ "AiryAiZero", "AiryBi", "AiryBiPrime", "AiryBiZero",%
+ "AlgebraicIntegerQ", "AlgebraicNumber", "AlgebraicNumberDenominator",%
+ "AlgebraicNumberNorm", "AlgebraicNumberPolynomial",%
+ "AlgebraicNumberTrace", "AlgebraicRules", "AlgebraicRulesData",%
+ "Algebraics", "AlgebraicUnitQ", "Alignment", "AlignmentMarker",%
+ "AlignmentPoint", "All", "AllowedDimensions", "AllowedHeads",%
+ "AllowGroupClose", "AllowIncomplete", "AllowInlineCells",%
+ "AllowKernelInitialization", "AllowLooseGrammar",%
+ "AllowReverseGroupClose", "AllowScriptLevelChange", "AllTrue",%
+ "Alphabet", "AlphabeticOrder", "AlphabeticSort", "AlphaChannel",%
+ "AlternateImage", "AlternatingFactorial", "AlternatingGroup",%
+ "AlternativeHypothesis", "Alternatives", "AltitudeMethod",%
+ "AmbientLight", "AmbiguityFunction", "AmbiguityList", "Analytic",%
+ "AnatomyData", "AnatomyForm", "AnatomyPlot3D", "AnchoredSearch",%
+ "And", "AndersonDarlingTest", "AngerJ", "AngleBracket", "AnglePath",%
+ "AngleVector", "AngularGauge", "Animate", "AnimationCycleOffset",%
+ "AnimationCycleRepetitions", "AnimationDirection",%
+ "AnimationDisplayTime", "AnimationRate", "AnimationRepetitions",%
+ "AnimationRunning", "AnimationRunTime", "AnimationTimeIndex",%
+ "Animator", "AnimatorBox", "AnimatorBoxOptions", "AnimatorElements",%
+ "Annotation", "Annuity", "AnnuityDue", "Annulus", "Anonymous",%
+ "Antialiasing", "AntihermitianMatrixQ", "Antisymmetric",%
+ "AntisymmetricMatrixQ", "AnyOrder", "AnySubset", "AnyTrue", "Apart",%
+ "ApartSquareFree", "APIFunction", "Appearance", "AppearanceElements",%
+ "AppearanceRules", "AppellF1", "Append", "AppendTo", "Apply",%
+ "ArcCos", "ArcCosh", "ArcCot", "ArcCoth", "ArcCsc", "ArcCsch",%
+ "ArcCurvature", "ARCHProcess", "ArcLength", "ArcSec", "ArcSech",%
+ "ArcSin", "ArcSinDistribution", "ArcSinh", "ArcTan", "ArcTanh",%
+ "Area", "Arg", "ArgMax", "ArgMin", "ArgumentCountQ", "ARIMAProcess",%
+ "ArithmeticGeometricMean", "ARMAProcess", "ARProcess", "Array",%
+ "ArrayComponents", "ArrayDepth", "ArrayFilter", "ArrayFlatten",%
+ "ArrayMesh", "ArrayPad", "ArrayPlot", "ArrayQ", "ArrayResample",%
+ "ArrayReshape", "ArrayRules", "Arrays", "Arrow", "Arrow3DBox",%
+ "ArrowBox", "Arrowheads", "ASATriangle", "Ask", "AskAppend",%
+ "AskConfirm", "AskDisplay", "AskedQ", "AskedValue", "AskFunction",%
+ "AskTemplateDisplay", "AspectRatio", "AspectRatioFixed", "Assert",%
+ "AssociateTo", "Association", "AssociationFormat", "AssociationMap",%
+ "AssociationQ", "AssociationThread", "AssumeDeterministic",%
+ "Assuming", "Assumptions", "AstronomicalData",%
+ "AsymptoticOutputTracker", "Asynchronous", "AsynchronousTaskObject",%
+ "AsynchronousTasks", "AtomQ", "Attributes", "Audio", "AudioAmplify",%
+ "AudioBlockMap", "AudioChannelCombine", "AudioChannelMix",%
+ "AudioChannels", "AudioChannelSeparate", "AudioData", "AudioDelay",%
+ "AudioDelete", "AudioDevice", "AudioFade", "AudioFrequencyShift",%
+ "AudioGenerator", "AudioIntervals", "AudioJoin", "AudioLabel",%
+ "AudioLength", "AudioLocalMeasurements", "AudioMeasurements",%
+ "AudioNormalize", "AudioOverlay", "AudioPad", "AudioPan",%
+ "AudioPartition", "AudioPitchShift", "AudioPlot", "AudioQ",%
+ "AudioResample", "AudioReverb", "AudioSampleRate", "AudioSplit",%
+ "AudioTimeStretch", "AudioTrim", "AudioType",%
+ "AugmentedSymmetricPolynomial", "Authentication", "AutoAction",%
+ "Autocomplete", "AutocompletionFunction", "AutoCopy",%
+ "AutocorrelationTest", "AutoDelete", "AutoEvaluateEvents",%
+ "AutoGeneratedPackage", "AutoIndent", "AutoIndentSpacings",%
+ "AutoItalicWords", "AutoloadPath", "AutoMatch", "Automatic",%
+ "AutomaticImageSize", "AutoMultiplicationSymbol",%
+ "AutoNumberFormatting", "AutoOpenNotebooks", "AutoOpenPalettes",%
+ "AutoRefreshed", "AutoRemove", "AutorunSequencing", "AutoScaling",%
+ "AutoScroll", "AutoSpacing", "AutoStyleOptions", "AutoStyleWords",%
+ "AutoSubmitting", "Axes", "AxesEdge", "AxesLabel", "AxesOrigin",%
+ "AxesStyle", "Axis", "BabyMonsterGroupB", "Back", "Background",%
+ "BackgroundTasksSettings", "Backslash", "Backsubstitution",%
+ "Backward", "Ball", "Band", "BandpassFilter", "BandstopFilter",%
+ "BarabasiAlbertGraphDistribution", "BarChart", "BarChart3D",%
+ "BarcodeImage", "BarcodeRecognize", "BaringhausHenzeTest",%
+ "BarLegend", "BarlowProschanImportance", "BarnesG", "BarOrigin",%
+ "BarSpacing", "BartlettHannWindow", "BartlettWindow", "BaseForm",%
+ "Baseline", "BaselinePosition", "BaseStyle",%
+ "BatchNormalizationLayer", "BatchSize", "BatesDistribution",%
+ "BattleLemarieWavelet", "BayesianMaximization",%
+ "BayesianMaximizationObject", "BayesianMinimization",%
+ "BayesianMinimizationObject", "Because", "BeckmannDistribution",%
+ "Beep", "Before", "Begin", "BeginDialogPacket",%
+ "BeginFrontEndInteractionPacket", "BeginPackage", "BellB", "BellY",%
+ "Below", "BenfordDistribution", "BeniniDistribution",%
+ "BenktanderGibratDistribution", "BenktanderWeibullDistribution",%
+ "BernoulliB", "BernoulliDistribution", "BernoulliGraphDistribution",%
+ "BernoulliProcess", "BernsteinBasis", "BesselFilterModel", "BesselI",%
+ "BesselJ", "BesselJZero", "BesselK", "BesselY", "BesselYZero",%
+ "Beta", "BetaBinomialDistribution", "BetaDistribution",%
+ "BetaNegativeBinomialDistribution", "BetaPrimeDistribution",%
+ "BetaRegularized", "Between", "BetweennessCentrality", "BezierCurve",%
+ "BezierCurve3DBox", "BezierCurve3DBoxOptions", "BezierCurveBox",%
+ "BezierCurveBoxOptions", "BezierFunction", "BilateralFilter",%
+ "Binarize", "BinaryDistance", "BinaryFormat", "BinaryImageQ",%
+ "BinaryRead", "BinaryReadList", "BinaryWrite", "BinCounts",%
+ "BinLists", "Binomial", "BinomialDistribution", "BinomialProcess",%
+ "BinormalDistribution", "BiorthogonalSplineWavelet",%
+ "BipartiteGraphQ", "BiquadraticFilterModel", "BirnbaumImportance",%
+ "BirnbaumSaundersDistribution", "BitAnd", "BitClear", "BitGet",%
+ "BitLength", "BitNot", "BitOr", "BitSet", "BitShiftLeft",%
+ "BitShiftRight", "BitXor", "Black", "BlackmanHarrisWindow",%
+ "BlackmanNuttallWindow", "BlackmanWindow", "Blank", "BlankForm",%
+ "BlankNullSequence", "BlankSequence", "Blend", "Block", "BlockMap",%
+ "BlockRandom", "BlomqvistBeta", "BlomqvistBetaTest", "Blue", "Blur",%
+ "BodePlot", "BohmanWindow", "Bold", "Bookmarks", "Boole",%
+ "BooleanConsecutiveFunction", "BooleanConvert",%
+ "BooleanCountingFunction", "BooleanFunction", "BooleanGraph",%
+ "BooleanMaxterms", "BooleanMinimize", "BooleanMinterms", "BooleanQ",%
+ "BooleanRegion", "Booleans", "BooleanStrings", "BooleanTable",%
+ "BooleanVariables", "BorderDimensions", "BorelTannerDistribution",%
+ "Bottom", "BottomHatTransform", "BoundaryDiscretizeGraphics",%
+ "BoundaryDiscretizeRegion", "BoundaryMesh", "BoundaryMeshRegion",%
+ "BoundaryMeshRegionQ", "BoundaryStyle", "BoundedRegionQ",%
+ "BoundingRegion", "Bounds", "Box", "BoxBaselineShift", "BoxData",%
+ "BoxDimensions", "Boxed", "Boxes", "BoxForm", "BoxFormFormatTypes",%
+ "BoxFrame", "BoxID", "BoxMargins", "BoxMatrix", "BoxObject",%
+ "BoxRatios", "BoxRotation", "BoxRotationPoint", "BoxStyle",%
+ "BoxWhiskerChart", "Bra", "BracketingBar", "BraKet",%
+ "BrayCurtisDistance", "BreadthFirstScan", "Break", "BridgeData",%
+ "BroadcastStationData", "Brown", "BrownForsytheTest",%
+ "BrownianBridgeProcess", "BrowserCategory", "BSplineBasis",%
+ "BSplineCurve", "BSplineCurve3DBox", "BSplineCurve3DBoxOptions",%
+ "BSplineCurveBox", "BSplineCurveBoxOptions", "BSplineFunction",%
+ "BSplineSurface", "BSplineSurface3DBox",%
+ "BSplineSurface3DBoxOptions", "BubbleChart", "BubbleChart3D",%
+ "BubbleScale", "BubbleSizes", "BuildingData", "BulletGauge",%
+ "BusinessDayQ", "ButterflyGraph", "ButterworthFilterModel", "Button",%
+ "ButtonBar", "ButtonBox", "ButtonBoxOptions", "ButtonCell",%
+ "ButtonContents", "ButtonData", "ButtonEvaluator",%
+ "ButtonExpandable", "ButtonFrame", "ButtonFunction", "ButtonMargins",%
+ "ButtonMinHeight", "ButtonNote", "ButtonNotebook", "ButtonSource",%
+ "ButtonStyle", "ButtonStyleMenuListing", "Byte", "ByteArray",%
+ "ByteArrayQ", "ByteCount", "ByteOrdering", "C", "CachedValue",%
+ "CacheGraphics", "CachePersistence", "CalendarConvert",%
+ "CalendarData", "CalendarType", "Callout", "CalloutMarker",%
+ "CalloutStyle", "CallPacket", "CanberraDistance", "Cancel",%
+ "CancelButton", "CandlestickChart", "CanonicalGraph",%
+ "CanonicalName", "CanonicalWarpingCorrespondence",%
+ "CanonicalWarpingDistance", "CantorStaircase", "Cap", "CapForm",%
+ "CapitalDifferentialD", "Capitalize", "CapsuleShape",%
+ "CardinalBSplineBasis", "CarlemanLinearize", "CarmichaelLambda",%
+ "CaseOrdering", "Cases", "CaseSensitive", "Cashflow", "Casoratian",%
+ "Catalan", "CatalanNumber", "Catch", "Catenate", "CatenateLayer",%
+ "CauchyDistribution", "CauchyWindow", "CayleyGraph", "CDF",%
+ "CDFDeploy", "CDFInformation", "CDFWavelet", "Ceiling",%
+ "CelestialSystem", "Cell", "CellAutoOverwrite", "CellBaseline",%
+ "CellBoundingBox", "CellBracketOptions", "CellChangeTimes",%
+ "CellContents", "CellContext", "CellDingbat",%
+ "CellDynamicExpression", "CellEditDuplicate",%
+ "CellElementsBoundingBox", "CellElementSpacings", "CellEpilog",%
+ "CellEvaluationDuplicate", "CellEvaluationFunction",%
+ "CellEventActions", "CellFrame", "CellFrameColor",%
+ "CellFrameLabelMargins", "CellFrameLabels", "CellFrameMargins",%
+ "CellGroup", "CellGroupData", "CellGrouping", "CellGroupingRules",%
+ "CellHorizontalScrolling", "CellID", "CellLabel",%
+ "CellLabelAutoDelete", "CellLabelMargins", "CellLabelPositioning",%
+ "CellMargins", "CellObject", "CellOpen", "CellPrint", "CellProlog",%
+ "Cells", "CellSize", "CellStyle", "CellTags", "CellularAutomaton",%
+ "CensoredDistribution", "Censoring", "Center", "CenterArray",%
+ "CenterDot", "CentralMoment", "CentralMomentGeneratingFunction",%
+ "CForm", "ChampernowneNumber", "ChangeOptions", "ChannelBase",%
+ "ChannelDatabin", "ChannelHistoryLength", "ChannelListen",%
+ "ChannelListener", "ChannelListeners", "ChannelListenerWait",%
+ "ChannelObject", "ChannelPreSendFunction", "ChannelSend",%
+ "ChannelSubscribers", "ChanVeseBinarize", "Character",%
+ "CharacterCounts", "CharacterEncoding", "CharacterEncodingsPath",%
+ "CharacteristicFunction", "CharacteristicPolynomial",%
+ "CharacterName", "CharacterRange", "Characters", "ChartBaseStyle",%
+ "ChartElementData", "ChartElementDataFunction",%
+ "ChartElementFunction", "ChartElements", "ChartLabels",%
+ "ChartLayout", "ChartLegends", "ChartStyle", "Chebyshev1FilterModel",%
+ "Chebyshev2FilterModel", "ChebyshevDistance", "ChebyshevT",%
+ "ChebyshevU", "Check", "CheckAbort", "CheckAll", "Checkbox",%
+ "CheckboxBar", "CheckboxBox", "CheckboxBoxOptions", "ChemicalData",%
+ "ChessboardDistance", "ChiDistribution", "ChineseRemainder",%
+ "ChiSquareDistribution", "ChoiceButtons", "ChoiceDialog",%
+ "CholeskyDecomposition", "Chop", "ChromaticityPlot",%
+ "ChromaticityPlot3D", "ChromaticPolynomial", "Circle", "CircleBox",%
+ "CircleDot", "CircleMinus", "CirclePlus", "CirclePoints",%
+ "CircleTimes", "CirculantGraph",%
+ "CircularOrthogonalMatrixDistribution",%
+ "CircularQuaternionMatrixDistribution",%
+ "CircularRealMatrixDistribution",%
+ "CircularSymplecticMatrixDistribution",%
+ "CircularUnitaryMatrixDistribution", "Circumsphere", "CityData",%
+ "ClassifierFunction", "ClassifierInformation",%
+ "ClassifierMeasurements", "ClassifierMeasurementsObject", "Classify",%
+ "ClassPriors", "Clear", "ClearAll", "ClearAttributes",%
+ "ClearCookies", "ClearPermissions", "ClearSystemCache",%
+ "ClebschGordan", "ClickPane", "Clip", "ClipboardNotebook",%
+ "ClipFill", "ClippingStyle", "ClipPlanes", "ClipPlanesStyle",%
+ "ClipRange", "Clock", "ClockGauge", "ClockwiseContourIntegral",%
+ "Close", "Closed", "CloseKernels", "ClosenessCentrality", "Closing",%
+ "ClosingAutoSave", "ClosingEvent", "CloudAccountData", "CloudBase",%
+ "CloudConnect", "CloudDeploy", "CloudDirectory", "CloudDisconnect",%
+ "CloudEvaluate", "CloudExport", "CloudExpression",%
+ "CloudExpressions", "CloudFunction", "CloudGet", "CloudImport",%
+ "CloudLoggingData", "CloudObject", "CloudObjectInformation",%
+ "CloudObjectInformationData", "CloudObjects", "CloudPublish",%
+ "CloudPut", "CloudSave", "CloudShare", "CloudSubmit", "CloudSymbol",%
+ "ClusterClassify", "ClusterDissimilarityFunction",%
+ "ClusteringComponents", "ClusteringTree", "CMYKColor", "Coarse",%
+ "CodeAssistOptions", "Coefficient", "CoefficientArrays",%
+ "CoefficientDomain", "CoefficientList", "CoefficientRules",%
+ "CoifletWavelet", "Collect", "Colon", "ColonForm", "ColorBalance",%
+ "ColorCombine", "ColorConvert", "ColorCoverage", "ColorData",%
+ "ColorDataFunction", "ColorDistance", "ColorFunction",%
+ "ColorFunctionScaling", "Colorize", "ColorNegate", "ColorOutput",%
+ "ColorProfileData", "ColorQ", "ColorQuantize", "ColorReplace",%
+ "ColorRules", "ColorSelectorSettings", "ColorSeparate",%
+ "ColorSetter", "ColorSetterBox", "ColorSetterBoxOptions",%
+ "ColorSlider", "ColorSpace", "ColorToneMapping", "Column",%
+ "ColumnAlignments", "ColumnBackgrounds", "ColumnForm", "ColumnLines",%
+ "ColumnsEqual", "ColumnSpacings", "ColumnWidths", "CombinerFunction",%
+ "CometData", "CommonDefaultFormatTypes", "Commonest",%
+ "CommonestFilter", "CommonName", "CommonUnits",%
+ "CommunityBoundaryStyle", "CommunityGraphPlot", "CommunityLabels",%
+ "CommunityRegionStyle", "CompanyData", "CompatibleUnitQ",%
+ "CompilationOptions", "CompilationTarget", "Compile", "Compiled",%
+ "CompiledFunction", "Complement", "CompleteGraph", "CompleteGraphQ",%
+ "CompleteKaryTree", "CompletionsListPacket", "Complex", "Complexes",%
+ "ComplexExpand", "ComplexInfinity", "ComplexityFunction",%
+ "ComponentMeasurements", "ComponentwiseContextMenu", "Compose",%
+ "ComposeList", "ComposeSeries", "CompositeQ", "Composition",%
+ "CompoundElement", "CompoundExpression",%
+ "CompoundPoissonDistribution", "CompoundPoissonProcess",%
+ "CompoundRenewalProcess", "Compress", "CompressedData", "Condition",%
+ "ConditionalExpression", "Conditioned", "Cone", "ConeBox",%
+ "ConfidenceLevel", "ConfidenceRange", "ConfidenceTransform",%
+ "ConfigurationPath", "ConformationRules", "ConformAudio",%
+ "ConformImages", "Congruent", "ConicHullRegion",%
+ "ConicHullRegion3DBox", "ConicHullRegionBox", "Conjugate",%
+ "ConjugateTranspose", "Conjunction", "Connect",%
+ "ConnectedComponents", "ConnectedGraphComponents", "ConnectedGraphQ",%
+ "ConnectedMeshComponents", "ConnectLibraryCallbackFunction",%
+ "ConnesWindow", "ConoverTest", "ConsoleMessage",%
+ "ConsoleMessagePacket", "ConsolePrint", "Constant", "ConstantArray",%
+ "ConstantImage", "ConstantRegionQ", "Constants", "ConstellationData",%
+ "ConstrainedMax", "ConstrainedMin", "Containing", "ContainsAll",%
+ "ContainsAny", "ContainsExactly", "ContainsNone", "ContainsOnly",%
+ "ContentFieldOptions", "ContentLocationFunction", "ContentObject",%
+ "ContentPadding", "ContentsBoundingBox", "ContentSelectable",%
+ "ContentSize", "Context", "ContextMenu", "Contexts",%
+ "ContextToFileName", "Continuation", "Continue", "ContinuedFraction",%
+ "ContinuedFractionK", "ContinuousAction", "ContinuousMarkovProcess",%
+ "ContinuousTask", "ContinuousTimeModelQ", "ContinuousWaveletData",%
+ "ContinuousWaveletTransform", "ContourDetect", "ContourGraphics",%
+ "ContourIntegral", "ContourLabels", "ContourLines", "ContourPlot",%
+ "ContourPlot3D", "Contours", "ContourShading", "ContourSmoothing",%
+ "ContourStyle", "ContraharmonicMean", "Control", "ControlActive",%
+ "ControlAlignment", "ControllabilityGramian",%
+ "ControllabilityMatrix", "ControllableDecomposition",%
+ "ControllableModelQ", "ControllerDuration", "ControllerInformation",%
+ "ControllerInformationData", "ControllerLinking",%
+ "ControllerManipulate", "ControllerMethod", "ControllerPath",%
+ "ControllerState", "ControlPlacement", "ControlsRendering",%
+ "ControlType", "Convergents", "ConversionOptions", "ConversionRules",%
+ "ConvertToBitmapPacket", "ConvertToPostScript",%
+ "ConvertToPostScriptPacket", "ConvexHullMesh", "ConvolutionLayer",%
+ "Convolve", "ConwayGroupCo1", "ConwayGroupCo2", "ConwayGroupCo3",%
+ "CookieFunction", "Cookies", "CoordinateBoundingBox",%
+ "CoordinateBoundingBoxArray", "CoordinateBounds",%
+ "CoordinateBoundsArray", "CoordinateChartData",%
+ "CoordinatesToolOptions", "CoordinateTransform",%
+ "CoordinateTransformData", "CoprimeQ", "Coproduct",%
+ "CopulaDistribution", "Copyable", "CopyDatabin", "CopyDirectory",%
+ "CopyFile", "CopyTag", "CopyToClipboard", "CornerFilter",%
+ "CornerNeighbors", "Correlation", "CorrelationDistance",%
+ "CorrelationFunction", "CorrelationTest", "Cos", "Cosh",%
+ "CoshIntegral", "CosineDistance", "CosineWindow", "CosIntegral",%
+ "Cot", "Coth", "Count", "CountDistinct", "CountDistinctBy",%
+ "CounterAssignments", "CounterBox", "CounterBoxOptions",%
+ "CounterClockwiseContourIntegral", "CounterEvaluator",%
+ "CounterFunction", "CounterIncrements", "CounterStyle",%
+ "CounterStyleMenuListing", "CountRoots", "CountryData", "Counts",%
+ "CountsBy", "Covariance", "CovarianceEstimatorFunction",%
+ "CovarianceFunction", "CoxianDistribution",%
+ "CoxIngersollRossProcess", "CoxModel", "CoxModelFit",%
+ "CramerVonMisesTest", "CreateArchive", "CreateCellID",%
+ "CreateChannel", "CreateCloudExpression", "CreateDatabin",%
+ "CreateDialog", "CreateDirectory", "CreateDocument", "CreateFile",%
+ "CreateIntermediateDirectories", "CreateManagedLibraryExpression",%
+ "CreateNotebook", "CreatePalette", "CreatePalettePacket",%
+ "CreatePermissionsGroup", "CreateScheduledTask", "CreateSearchIndex",%
+ "CreateTemporary", "CreateUUID", "CreateWindow", "CriterionFunction",%
+ "CriticalityFailureImportance", "CriticalitySuccessImportance",%
+ "CriticalSection", "Cross", "CrossEntropyLossLayer",%
+ "CrossingDetect", "CrossMatrix", "Csc", "Csch", "CubeRoot", "Cubics",%
+ "Cuboid", "CuboidBox", "Cumulant", "CumulantGeneratingFunction",%
+ "Cup", "CupCap", "Curl", "CurlyDoubleQuote", "CurlyQuote",%
+ "CurrencyConvert", "CurrentImage", "CurrentlySpeakingPacket",%
+ "CurrentValue", "CurvatureFlowFilter", "CurveClosed", "Cyan",%
+ "CycleGraph", "CycleIndexPolynomial", "Cycles", "CyclicGroup",%
+ "Cyclotomic", "Cylinder", "CylinderBox", "CylindricalDecomposition",%
+ "D", "DagumDistribution", "DamData", "DamerauLevenshteinDistance",%
+ "DampingFactor", "Darker", "Dashed", "Dashing", "Databin",%
+ "DatabinAdd", "DatabinRemove", "Databins", "DatabinUpload",%
+ "DataCompression", "DataDistribution", "DataRange", "DataReversed",%
+ "Dataset", "Date", "DateBounds", "Dated", "DateDelimiters",%
+ "DateDifference", "DatedUnit", "DateFormat", "DateFunction",%
+ "DateHistogram", "DateList", "DateListLogPlot", "DateListPlot",%
+ "DateListStepPlot", "DateObject", "DateObjectQ", "DatePattern",%
+ "DatePlus", "DateRange", "DateReduction", "DateString",%
+ "DateTicksFormat", "DateValue", "DaubechiesWavelet",%
+ "DavisDistribution", "DawsonF", "DayCount", "DayCountConvention",%
+ "DayHemisphere", "DaylightQ", "DayMatchQ", "DayName",%
+ "DayNightTerminator", "DayPlus", "DayRange", "DayRound",%
+ "DeBruijnGraph", "Debug", "DebugTag", "Decapitalize", "Decimal",%
+ "DeclareKnownSymbols", "DeclarePackage", "Decompose",%
+ "DeconvolutionLayer", "Decrement", "Decrypt", "DedekindEta",%
+ "DeepSpaceProbeData", "Default", "DefaultAxesStyle",%
+ "DefaultBaseStyle", "DefaultBoxStyle", "DefaultButton",%
+ "DefaultColor", "DefaultControlPlacement",%
+ "DefaultDuplicateCellStyle", "DefaultDuration", "DefaultElement",%
+ "DefaultFaceGridsStyle", "DefaultFieldHintStyle", "DefaultFont",%
+ "DefaultFontProperties", "DefaultFormatType",%
+ "DefaultFormatTypeForStyle", "DefaultFrameStyle",%
+ "DefaultFrameTicksStyle", "DefaultGridLinesStyle",%
+ "DefaultInlineFormatType", "DefaultInputFormatType",%
+ "DefaultLabelStyle", "DefaultMenuStyle", "DefaultNaturalLanguage",%
+ "DefaultNewCellStyle", "DefaultNewInlineCellStyle",%
+ "DefaultNotebook", "DefaultOptions", "DefaultOutputFormatType",%
+ "DefaultStyle", "DefaultStyleDefinitions", "DefaultTextFormatType",%
+ "DefaultTextInlineFormatType", "DefaultTicksStyle",%
+ "DefaultTooltipStyle", "DefaultValue", "DefaultValues", "Defer",%
+ "DefineExternal", "DefineInputStreamMethod",%
+ "DefineOutputStreamMethod", "Definition", "Degree",%
+ "DegreeCentrality", "DegreeGraphDistribution", "DegreeLexicographic",%
+ "DegreeReverseLexicographic", "DEigensystem", "DEigenvalues",%
+ "Deinitialization", "Del", "DelaunayMesh", "Delayed", "Deletable",%
+ "Delete", "DeleteBorderComponents", "DeleteCases", "DeleteChannel",%
+ "DeleteCloudExpression", "DeleteContents", "DeleteDirectory",%
+ "DeleteDuplicates", "DeleteDuplicatesBy", "DeleteFile",%
+ "DeleteMissing", "DeletePermissionsKey", "DeleteSearchIndex",%
+ "DeleteSmallComponents", "DeleteStopwords", "DeleteWithContents",%
+ "DeletionWarning", "DelimitedArray", "DelimitedSequence",%
+ "Delimiter", "DelimiterFlashTime", "DelimiterMatching", "Delimiters",%
+ "DeliveryFunction", "Dendrogram", "Denominator", "DensityGraphics",%
+ "DensityHistogram", "DensityPlot", "DensityPlot3D",%
+ "DependentVariables", "Deploy", "Deployed", "Depth",%
+ "DepthFirstScan", "Derivative", "DerivativeFilter",%
+ "DescriptorStateSpace", "DesignMatrix", "DestroyAfterEvaluation",%
+ "Det", "DeviceClose", "DeviceConfigure", "DeviceExecute",%
+ "DeviceExecuteAsynchronous", "DeviceObject", "DeviceOpen",%
+ "DeviceOpenQ", "DeviceRead", "DeviceReadBuffer", "DeviceReadLatest",%
+ "DeviceReadList", "DeviceReadTimeSeries", "Devices", "DeviceStreams",%
+ "DeviceWrite", "DeviceWriteBuffer", "DGaussianWavelet",%
+ "DiacriticalPositioning", "Diagonal", "DiagonalizableMatrixQ",%
+ "DiagonalMatrix", "Dialog", "DialogIndent", "DialogInput",%
+ "DialogLevel", "DialogNotebook", "DialogProlog", "DialogReturn",%
+ "DialogSymbols", "Diamond", "DiamondMatrix", "DiceDissimilarity",%
+ "DictionaryLookup", "DictionaryWordQ", "DifferenceDelta",%
+ "DifferenceOrder", "DifferenceQuotient", "DifferenceRoot",%
+ "DifferenceRootReduce", "Differences", "DifferentialD",%
+ "DifferentialRoot", "DifferentialRootReduce", "DifferentiatorFilter",%
+ "DigitBlock", "DigitBlockMinimum", "DigitCharacter", "DigitCount",%
+ "DigitQ", "DihedralGroup", "Dilation", "DimensionalCombinations",%
+ "DimensionalMeshComponents", "DimensionReduce",%
+ "DimensionReducerFunction", "DimensionReduction", "Dimensions",%
+ "DiracComb", "DiracDelta", "DirectedEdge", "DirectedEdges",%
+ "DirectedGraph", "DirectedGraphQ", "DirectedInfinity", "Direction",%
+ "Directive", "Directory", "DirectoryName", "DirectoryQ",%
+ "DirectoryStack", "DirichletBeta", "DirichletCharacter",%
+ "DirichletCondition", "DirichletConvolve", "DirichletDistribution",%
+ "DirichletEta", "DirichletL", "DirichletLambda",%
+ "DirichletTransform", "DirichletWindow", "DisableConsolePrintPacket",%
+ "DiscreteChirpZTransform", "DiscreteConvolve", "DiscreteDelta",%
+ "DiscreteHadamardTransform", "DiscreteIndicator",%
+ "DiscreteLQEstimatorGains", "DiscreteLQRegulatorGains",%
+ "DiscreteLyapunovSolve", "DiscreteMarkovProcess", "DiscretePlot",%
+ "DiscretePlot3D", "DiscreteRatio", "DiscreteRiccatiSolve",%
+ "DiscreteShift", "DiscreteTimeModelQ", "DiscreteUniformDistribution",%
+ "DiscreteVariables", "DiscreteWaveletData",%
+ "DiscreteWaveletPacketTransform", "DiscreteWaveletTransform",%
+ "DiscretizeGraphics", "DiscretizeRegion", "Discriminant",%
+ "DisjointQ", "Disjunction", "Disk", "DiskBox", "DiskMatrix",%
+ "DiskSegment", "Dispatch", "DispatchQ",%
+ "DispersionEstimatorFunction", "Display", "DisplayAllSteps",%
+ "DisplayEndPacket", "DisplayFlushImagePacket", "DisplayForm",%
+ "DisplayFunction", "DisplayPacket", "DisplayRules",%
+ "DisplaySetSizePacket", "DisplayString", "DisplayTemporary",%
+ "DisplayWith", "DisplayWithRef", "DisplayWithVariable",%
+ "DistanceFunction", "DistanceMatrix", "DistanceTransform",%
+ "Distribute", "Distributed", "DistributedContexts",%
+ "DistributeDefinitions", "DistributionChart", "DistributionDomain",%
+ "DistributionFitTest", "DistributionParameterAssumptions",%
+ "DistributionParameterQ", "Dithering", "Div", "Divergence", "Divide",%
+ "DivideBy", "Dividers", "Divisible", "Divisors", "DivisorSigma",%
+ "DivisorSum", "DMSList", "DMSString", "Do", "DockedCells",%
+ "DocumentGenerator", "DocumentGeneratorInformation",%
+ "DocumentGeneratorInformationData", "DocumentGenerators",%
+ "DocumentNotebook", "DominantColors", "DOSTextFormat", "Dot",%
+ "DotDashed", "DotEqual", "DotPlusLayer", "Dotted",%
+ "DoubleBracketingBar", "DoubleContourIntegral", "DoubleDownArrow",%
+ "DoubleLeftArrow", "DoubleLeftRightArrow", "DoubleLeftTee",%
+ "DoubleLongLeftArrow", "DoubleLongLeftRightArrow",%
+ "DoubleLongRightArrow", "DoubleRightArrow", "DoubleRightTee",%
+ "DoubleUpArrow", "DoubleUpDownArrow", "DoubleVerticalBar",%
+ "DoublyInfinite", "Down", "DownArrow", "DownArrowBar",%
+ "DownArrowUpArrow", "DownLeftRightVector", "DownLeftTeeVector",%
+ "DownLeftVector", "DownLeftVectorBar", "DownRightTeeVector",%
+ "DownRightVector", "DownRightVectorBar", "Downsample", "DownTee",%
+ "DownTeeArrow", "DownValues", "DragAndDrop", "DrawEdges",%
+ "DrawFrontFaces", "DrawHighlighted", "Drop", "DropoutLayer",%
+ "DSolve", "DSolveValue", "Dt", "DualLinearProgramming",%
+ "DualSystemsModel", "DumpGet", "DumpSave", "DuplicateFreeQ",%
+ "Duration", "Dynamic", "DynamicBox", "DynamicBoxOptions",%
+ "DynamicEvaluationTimeout", "DynamicGeoGraphics", "DynamicImage",%
+ "DynamicLocation", "DynamicModule", "DynamicModuleBox",%
+ "DynamicModuleBoxOptions", "DynamicModuleParent",%
+ "DynamicModuleValues", "DynamicName", "DynamicNamespace",%
+ "DynamicReference", "DynamicSetting", "DynamicUpdating",%
+ "DynamicWrapper", "DynamicWrapperBox", "DynamicWrapperBoxOptions",%
+ "E", "EarthImpactData", "EarthquakeData", "EccentricityCentrality",%
+ "Echo", "EchoFunction", "EclipseType", "EdgeAdd",%
+ "EdgeBetweennessCentrality", "EdgeCapacity", "EdgeCapForm",%
+ "EdgeColor", "EdgeConnectivity", "EdgeContract", "EdgeCost",%
+ "EdgeCount", "EdgeCoverQ", "EdgeCycleMatrix", "EdgeDashing",%
+ "EdgeDelete", "EdgeDetect", "EdgeForm", "EdgeIndex", "EdgeJoinForm",%
+ "EdgeLabeling", "EdgeLabels", "EdgeLabelStyle", "EdgeList",%
+ "EdgeOpacity", "EdgeQ", "EdgeRenderingFunction", "EdgeRules",%
+ "EdgeShapeFunction", "EdgeStyle", "EdgeThickness", "EdgeWeight",%
+ "Editable", "EditButtonSettings", "EditCellTagsSettings",%
+ "EditDistance", "EffectiveInterest", "Eigensystem", "Eigenvalues",%
+ "EigenvectorCentrality", "Eigenvectors", "Element", "ElementData",%
+ "ElementwiseLayer", "ElidedForms", "Eliminate", "EliminationOrder",%
+ "Ellipsoid", "EllipticE", "EllipticExp", "EllipticExpPrime",%
+ "EllipticF", "EllipticFilterModel", "EllipticK", "EllipticLog",%
+ "EllipticNomeQ", "EllipticPi", "EllipticReducedHalfPeriods",%
+ "EllipticTheta", "EllipticThetaPrime", "EmbedCode", "EmbeddedHTML",%
+ "EmbeddedService", "EmbeddingLayer", "EmbeddingObject", "EmitSound",%
+ "EmphasizeSyntaxErrors", "EmpiricalDistribution", "Empty",%
+ "EmptyGraphQ", "EmptyRegion", "EnableConsolePrintPacket", "Enabled",%
+ "Encode", "Encrypt", "EncryptedObject", "End", "EndAdd",%
+ "EndDialogPacket", "EndFrontEndInteractionPacket", "EndOfBuffer",%
+ "EndOfFile", "EndOfLine", "EndOfString", "EndPackage",%
+ "EngineEnvironment", "EngineeringForm", "Enter",%
+ "EnterExpressionPacket", "EnterTextPacket", "Entity", "EntityClass",%
+ "EntityClassList", "EntityCopies", "EntityGroup", "EntityInstance",%
+ "EntityList", "EntityProperties", "EntityProperty",%
+ "EntityPropertyClass", "EntityStore", "EntityTypeName",%
+ "EntityValue", "Entropy", "EntropyFilter", "Environment", "Epilog",%
+ "EpilogFunction", "Equal", "EqualColumns", "EqualRows", "EqualTilde",%
+ "EqualTo", "EquatedTo", "Equilibrium", "EquirippleFilterKernel",%
+ "Equivalent", "Erf", "Erfc", "Erfi", "ErlangB", "ErlangC",%
+ "ErlangDistribution", "Erosion", "ErrorBox", "ErrorBoxOptions",%
+ "ErrorNorm", "ErrorPacket", "ErrorsDialogSettings", "EscapeRadius",%
+ "EstimatedBackground", "EstimatedDistribution", "EstimatedProcess",%
+ "EstimatorGains", "EstimatorRegulator", "EuclideanDistance",%
+ "EulerAngles", "EulerE", "EulerGamma", "EulerianGraphQ",%
+ "EulerMatrix", "EulerPhi", "Evaluatable", "Evaluate", "Evaluated",%
+ "EvaluatePacket", "EvaluateScheduledTask", "EvaluationBox",%
+ "EvaluationCell", "EvaluationCompletionAction", "EvaluationData",%
+ "EvaluationElements", "EvaluationMode", "EvaluationMonitor",%
+ "EvaluationNotebook", "EvaluationObject", "EvaluationOrder",%
+ "Evaluator", "EvaluatorNames", "EvenQ", "EventData",%
+ "EventEvaluator", "EventHandler", "EventHandlerTag", "EventLabels",%
+ "EventSeries", "ExactBlackmanWindow", "ExactNumberQ",%
+ "ExactRootIsolation", "ExampleData", "Except", "ExcludedForms",%
+ "ExcludedLines", "ExcludedPhysicalQuantities", "ExcludePods",%
+ "Exclusions", "ExclusionsStyle", "Exists", "Exit", "ExitDialog",%
+ "ExoplanetData", "Exp", "Expand", "ExpandAll", "ExpandDenominator",%
+ "ExpandFileName", "ExpandNumerator", "Expectation", "ExpectationE",%
+ "ExpectedValue", "ExpGammaDistribution", "ExpIntegralE",%
+ "ExpIntegralEi", "Exponent", "ExponentFunction",%
+ "ExponentialDistribution", "ExponentialFamily",%
+ "ExponentialGeneratingFunction", "ExponentialMovingAverage",%
+ "ExponentialPowerDistribution", "ExponentPosition", "ExponentStep",%
+ "Export", "ExportAutoReplacements", "ExportForm", "ExportPacket",%
+ "ExportString", "Expression", "ExpressionCell", "ExpressionPacket",%
+ "ExpressionUUID", "ExpToTrig", "ExtendedGCD", "ExtensibleParameters",%
+ "Extension", "ExtentElementFunction", "ExtentMarkers", "ExtentSize",%
+ "ExternalBundle", "ExternalCall", "ExternalDataCharacterEncoding",%
+ "ExternalFunctionName", "ExternalOptions", "ExternalTypeSignature",%
+ "Extract", "ExtractArchive", "ExtremeValueDistribution", "FaceForm",%
+ "FaceGrids", "FaceGridsStyle", "Factor", "FactorComplete",%
+ "Factorial", "Factorial2", "FactorialMoment",%
+ "FactorialMomentGeneratingFunction", "FactorialPower",%
+ "FactorInteger", "FactorList", "FactorSquareFree",%
+ "FactorSquareFreeList", "FactorTerms", "FactorTermsList", "Fail",%
+ "Failure", "FailureAction", "FailureDistribution", "FailureQ",%
+ "False", "FareySequence", "FARIMAProcess", "FeatureDistance",%
+ "FeatureExtract", "FeatureExtraction", "FeatureExtractor",%
+ "FeatureExtractorFunction", "FeatureNames", "FeatureTypes",%
+ "FEDisableConsolePrintPacket", "FeedbackLinearize", "FeedbackSector",%
+ "FeedbackSectorStyle", "FeedbackType", "FEEnableConsolePrintPacket",%
+ "FetalGrowthData", "Fibonacci", "Fibonorial", "FieldHint",%
+ "FieldHintStyle", "FieldMasked", "FieldSize", "File", "FileBaseName",%
+ "FileByteCount", "FileDate", "FileExistsQ", "FileExtension",%
+ "FileFormat", "FileHash", "FileInformation", "FileName",%
+ "FileNameDepth", "FileNameDialogSettings", "FileNameDrop",%
+ "FileNameForms", "FileNameJoin", "FileNames", "FileNameSetter",%
+ "FileNameSplit", "FileNameTake", "FilePrint", "FileSystemMap",%
+ "FileSystemScan", "FileTemplate", "FileTemplateApply", "FileType",%
+ "FilledCurve", "FilledCurveBox", "FilledCurveBoxOptions", "Filling",%
+ "FillingStyle", "FillingTransform", "FilterRules", "FinancialBond",%
+ "FinancialData", "FinancialDerivative", "FinancialIndicator", "Find",%
+ "FindArgMax", "FindArgMin", "FindChannels", "FindClique",%
+ "FindClusters", "FindCookies", "FindCurvePath", "FindCycle",%
+ "FindDevices", "FindDistribution", "FindDistributionParameters",%
+ "FindDivisions", "FindEdgeCover", "FindEdgeCut",%
+ "FindEdgeIndependentPaths", "FindEulerianCycle", "FindFaces",%
+ "FindFile", "FindFit", "FindFormula", "FindFundamentalCycles",%
+ "FindGeneratingFunction", "FindGeoLocation",%
+ "FindGeometricTransform", "FindGraphCommunities",%
+ "FindGraphIsomorphism", "FindGraphPartition", "FindHamiltonianCycle",%
+ "FindHamiltonianPath", "FindHiddenMarkovStates",%
+ "FindIndependentEdgeSet", "FindIndependentVertexSet", "FindInstance",%
+ "FindIntegerNullVector", "FindKClan", "FindKClique", "FindKClub",%
+ "FindKPlex", "FindLibrary", "FindLinearRecurrence", "FindList",%
+ "FindMaximum", "FindMaximumFlow", "FindMaxValue", "FindMeshDefects",%
+ "FindMinimum", "FindMinimumCostFlow", "FindMinimumCut",%
+ "FindMinValue", "FindPath", "FindPeaks", "FindPermutation",%
+ "FindPostmanTour", "FindProcessParameters", "FindRoot",%
+ "FindSequenceFunction", "FindSettings", "FindShortestPath",%
+ "FindShortestTour", "FindSpanningTree", "FindThreshold",%
+ "FindTransientRepeat", "FindVertexCover", "FindVertexCut",%
+ "FindVertexIndependentPaths", "Fine", "FinishDynamic",%
+ "FiniteAbelianGroupCount", "FiniteGroupCount", "FiniteGroupData",%
+ "First", "FirstCase", "FirstPassageTimeDistribution",%
+ "FirstPosition", "FischerGroupFi22", "FischerGroupFi23",%
+ "FischerGroupFi24Prime", "FisherHypergeometricDistribution",%
+ "FisherRatioTest", "FisherZDistribution", "Fit", "FitAll",%
+ "FittedModel", "FixedOrder", "FixedPoint", "FixedPointList",%
+ "FlashSelection", "Flat", "Flatten", "FlattenAt", "FlattenLayer",%
+ "FlatTopWindow", "FlipView", "Floor", "FlowPolynomial",%
+ "FlushPrintOutputPacket", "Fold", "FoldList", "FoldPair",%
+ "FoldPairList", "FollowRedirects", "Font", "FontColor", "FontFamily",%
+ "FontForm", "FontName", "FontOpacity", "FontPostScriptName",%
+ "FontProperties", "FontReencoding", "FontSize", "FontSlant",%
+ "FontSubstitutions", "FontTracking", "FontVariations", "FontWeight",%
+ "For", "ForAll", "Format", "FormatRules", "FormatType",%
+ "FormatTypeAutoConvert", "FormatValues", "FormBox", "FormBoxOptions",%
+ "FormControl", "FormFunction", "FormLayoutFunction", "FormObject",%
+ "FormPage", "FormTheme", "FormulaData", "FormulaLookup",%
+ "FortranForm", "Forward", "ForwardBackward", "Fourier",%
+ "FourierCoefficient", "FourierCosCoefficient", "FourierCosSeries",%
+ "FourierCosTransform", "FourierDCT", "FourierDCTFilter",%
+ "FourierDCTMatrix", "FourierDST", "FourierDSTMatrix",%
+ "FourierMatrix", "FourierParameters", "FourierSequenceTransform",%
+ "FourierSeries", "FourierSinCoefficient", "FourierSinSeries",%
+ "FourierSinTransform", "FourierTransform", "FourierTrigSeries",%
+ "FractionalBrownianMotionProcess", "FractionalGaussianNoiseProcess",%
+ "FractionalPart", "FractionBox", "FractionBoxOptions",%
+ "FractionLine", "Frame", "FrameBox", "FrameBoxOptions", "Framed",%
+ "FrameInset", "FrameLabel", "Frameless", "FrameMargins",%
+ "FrameStyle", "FrameTicks", "FrameTicksStyle", "FRatioDistribution",%
+ "FrechetDistribution", "FreeQ", "FrenetSerretSystem",%
+ "FrequencySamplingFilterKernel", "FresnelC", "FresnelF", "FresnelG",%
+ "FresnelS", "Friday", "FrobeniusNumber", "FrobeniusSolve",%
+ "FromCharacterCode", "FromCoefficientRules", "FromContinuedFraction",%
+ "FromDate", "FromDigits", "FromDMS", "FromEntity", "FromJulianDate",%
+ "FromLetterNumber", "FromPolarCoordinates", "FromRomanNumeral",%
+ "FromSphericalCoordinates", "FromUnixTime", "Front",%
+ "FrontEndDynamicExpression", "FrontEndEventActions",%
+ "FrontEndExecute", "FrontEndObject", "FrontEndResource",%
+ "FrontEndResourceString", "FrontEndStackSize", "FrontEndToken",%
+ "FrontEndTokenExecute", "FrontEndValueCache", "FrontEndVersion",%
+ "FrontFaceColor", "FrontFaceOpacity", "Full", "FullAxes",%
+ "FullDefinition", "FullForm", "FullGraphics",%
+ "FullInformationOutputRegulator", "FullOptions", "FullRegion",%
+ "FullSimplify", "Function", "FunctionDomain", "FunctionExpand",%
+ "FunctionInterpolation", "FunctionPeriod", "FunctionRange",%
+ "FunctionSpace", "FussellVeselyImportance", "GaborFilter",%
+ "GaborMatrix", "GaborWavelet", "GainMargins", "GainPhaseMargins",%
+ "GalaxyData", "GalleryView", "Gamma", "GammaDistribution",%
+ "GammaRegularized", "GapPenalty", "GARCHProcess", "Gather",%
+ "GatherBy", "GaugeFaceElementFunction", "GaugeFaceStyle",%
+ "GaugeFrameElementFunction", "GaugeFrameSize", "GaugeFrameStyle",%
+ "GaugeLabels", "GaugeMarkers", "GaugeStyle", "GaussianFilter",%
+ "GaussianIntegers", "GaussianMatrix",%
+ "GaussianOrthogonalMatrixDistribution",%
+ "GaussianSymplecticMatrixDistribution",%
+ "GaussianUnitaryMatrixDistribution", "GaussianWindow", "GCD",%
+ "GegenbauerC", "General", "GeneralizedLinearModelFit",%
+ "GenerateAsymmetricKeyPair", "GenerateConditions", "GeneratedCell",%
+ "GeneratedDocumentBinding", "GenerateDocument",%
+ "GeneratedParameters", "GenerateHTTPResponse",%
+ "GenerateSymmetricKey", "GeneratingFunction", "GeneratorDescription",%
+ "GeneratorHistoryLength", "GeneratorOutputType", "Generic",%
+ "GenericCylindricalDecomposition", "GenomeData", "GenomeLookup",%
+ "GeoArea", "GeoBackground", "GeoBoundingBox", "GeoBounds",%
+ "GeoBoundsRegion", "GeoCenter", "GeoCircle", "GeodesicClosing",%
+ "GeodesicDilation", "GeodesicErosion", "GeodesicOpening",%
+ "GeoDestination", "GeodesyData", "GeoDirection", "GeoDisk",%
+ "GeoDisplacement", "GeoDistance", "GeoDistanceList",%
+ "GeoElevationData", "GeoEntities", "GeoGraphics",%
+ "GeogravityModelData", "GeoGridLines", "GeoGridLinesStyle",%
+ "GeoGridPosition", "GeoGroup", "GeoHemisphere",%
+ "GeoHemisphereBoundary", "GeoHistogram", "GeoIdentify", "GeoLabels",%
+ "GeoLength", "GeoListPlot", "GeoLocation", "GeologicalPeriodData",%
+ "GeomagneticModelData", "GeoMarker",%
+ "GeometricBrownianMotionProcess", "GeometricDistribution",%
+ "GeometricMean", "GeometricMeanFilter", "GeometricTransformation",%
+ "GeometricTransformation3DBox",%
+ "GeometricTransformation3DBoxOptions", "GeometricTransformationBox",%
+ "GeometricTransformationBoxOptions", "GeoModel", "GeoNearest",%
+ "GeoPath", "GeoPosition", "GeoPositionENU", "GeoPositionXYZ",%
+ "GeoProjection", "GeoProjectionData", "GeoRange", "GeoRangePadding",%
+ "GeoRegionValuePlot", "GeoScaleBar", "GeoServer", "GeoStyling",%
+ "GeoStylingImageFunction", "GeoVariant", "GeoVisibleRegion",%
+ "GeoVisibleRegionBoundary", "GeoWithinQ", "GeoZoomLevel",%
+ "GestureHandler", "GestureHandlerTag", "Get",%
+ "GetBoundingBoxSizePacket", "GetContext", "GetEnvironment",%
+ "GetFileName", "GetFrontEndOptionsDataPacket",%
+ "GetLinebreakInformationPacket", "GetMenusPacket",%
+ "GetPageBreakInformationPacket", "Glaisher",%
+ "GlobalClusteringCoefficient", "GlobalPreferences", "GlobalSession",%
+ "Glow", "GoldenAngle", "GoldenRatio", "GompertzMakehamDistribution",%
+ "GoodmanKruskalGamma", "GoodmanKruskalGammaTest", "Goto", "Grad",%
+ "Gradient", "GradientFilter", "GradientOrientationFilter",%
+ "GrammarApply", "GrammarRules", "GrammarToken", "Graph", "Graph3D",%
+ "GraphAssortativity", "GraphAutomorphismGroup", "GraphCenter",%
+ "GraphComplement", "GraphData", "GraphDensity", "GraphDiameter",%
+ "GraphDifference", "GraphDisjointUnion", "GraphDistance",%
+ "GraphDistanceMatrix", "GraphElementData", "GraphEmbedding",%
+ "GraphHighlight", "GraphHighlightStyle", "GraphHub", "Graphics",%
+ "Graphics3D", "Graphics3DBox", "Graphics3DBoxOptions",%
+ "GraphicsArray", "GraphicsBaseline", "GraphicsBox",%
+ "GraphicsBoxOptions", "GraphicsColor", "GraphicsColumn",%
+ "GraphicsComplex", "GraphicsComplex3DBox",%
+ "GraphicsComplex3DBoxOptions", "GraphicsComplexBox",%
+ "GraphicsComplexBoxOptions", "GraphicsContents", "GraphicsData",%
+ "GraphicsGrid", "GraphicsGridBox", "GraphicsGroup",%
+ "GraphicsGroup3DBox", "GraphicsGroup3DBoxOptions",%
+ "GraphicsGroupBox", "GraphicsGroupBoxOptions", "GraphicsGrouping",%
+ "GraphicsHighlightColor", "GraphicsRow", "GraphicsSpacing",%
+ "GraphicsStyle", "GraphIntersection", "GraphLayout",%
+ "GraphLinkEfficiency", "GraphPeriphery", "GraphPlot", "GraphPlot3D",%
+ "GraphPower", "GraphPropertyDistribution", "GraphQ", "GraphRadius",%
+ "GraphReciprocity", "GraphRoot", "GraphStyle", "GraphUnion", "Gray",%
+ "GrayLevel", "Greater", "GreaterEqual", "GreaterEqualLess",%
+ "GreaterEqualThan", "GreaterFullEqual", "GreaterGreater",%
+ "GreaterLess", "GreaterSlantEqual", "GreaterThan", "GreaterTilde",%
+ "Green", "GreenFunction", "Grid", "GridBaseline", "GridBox",%
+ "GridBoxAlignment", "GridBoxBackground", "GridBoxDividers",%
+ "GridBoxFrame", "GridBoxItemSize", "GridBoxItemStyle",%
+ "GridBoxOptions", "GridBoxSpacings", "GridCreationSettings",%
+ "GridDefaultElement", "GridElementStyleOptions", "GridFrame",%
+ "GridFrameMargins", "GridGraph", "GridLines", "GridLinesStyle",%
+ "GroebnerBasis", "GroupActionBase", "GroupBy", "GroupCentralizer",%
+ "GroupElementFromWord", "GroupElementPosition", "GroupElementQ",%
+ "GroupElements", "GroupElementToWord", "GroupGenerators",%
+ "Groupings", "GroupMultiplicationTable", "GroupOrbits", "GroupOrder",%
+ "GroupPageBreakWithin", "GroupSetwiseStabilizer", "GroupStabilizer",%
+ "GroupStabilizerChain", "GroupTogetherGrouping",%
+ "GroupTogetherNestedGrouping", "GrowCutComponents", "Gudermannian",%
+ "GuidedFilter", "GumbelDistribution", "HaarWavelet",%
+ "HadamardMatrix", "HalfLine", "HalfNormalDistribution", "HalfPlane",%
+ "HalfSpace", "HamiltonianGraphQ", "HammingDistance", "HammingWindow",%
+ "HandlerFunctions", "HandlerFunctionsKeys", "HankelH1", "HankelH2",%
+ "HankelMatrix", "HannPoissonWindow", "HannWindow",%
+ "HaradaNortonGroupHN", "HararyGraph", "HarmonicMean",%
+ "HarmonicMeanFilter", "HarmonicNumber", "Hash", "Haversine",%
+ "HazardFunction", "Head", "HeadCompose", "HeaderLines", "Heads",%
+ "HeavisideLambda", "HeavisidePi", "HeavisideTheta", "HeldGroupHe",%
+ "HeldPart", "HelpBrowserLookup", "HelpBrowserNotebook",%
+ "HelpBrowserSettings", "Here", "HermiteDecomposition", "HermiteH",%
+ "HermitianMatrixQ", "HessenbergDecomposition", "Hessian",%
+ "HexadecimalCharacter", "Hexahedron", "HexahedronBox",%
+ "HexahedronBoxOptions", "HiddenMarkovProcess", "HiddenSurface",%
+ "Highlighted", "HighlightGraph", "HighlightImage", "HighlightMesh",%
+ "HighpassFilter", "HigmanSimsGroupHS", "HilbertFilter",%
+ "HilbertMatrix", "Histogram", "Histogram3D", "HistogramDistribution",%
+ "HistogramList", "HistogramTransform",%
+ "HistogramTransformInterpolation", "HistoricalPeriodData",%
+ "HitMissTransform", "HITSCentrality", "HodgeDual", "HoeffdingD",%
+ "HoeffdingDTest", "Hold", "HoldAll", "HoldAllComplete",%
+ "HoldComplete", "HoldFirst", "HoldForm", "HoldPattern", "HoldRest",%
+ "HolidayCalendar", "HomeDirectory", "HomePage", "Horizontal",%
+ "HorizontalForm", "HorizontalGauge", "HorizontalScrollPosition",%
+ "HornerForm", "HostLookup", "HotellingTSquareDistribution",%
+ "HoytDistribution", "HTMLSave", "HTTPErrorResponse", "HTTPRedirect",%
+ "HTTPRequest", "HTTPRequestData", "HTTPResponse", "Hue",%
+ "HumanGrowthData", "HumpDownHump", "HumpEqual", "HurwitzLerchPhi",%
+ "HurwitzZeta", "HyperbolicDistribution", "HypercubeGraph",%
+ "HyperexponentialDistribution", "Hyperfactorial",%
+ "Hypergeometric0F1", "Hypergeometric0F1Regularized",%
+ "Hypergeometric1F1", "Hypergeometric1F1Regularized",%
+ "Hypergeometric2F1", "Hypergeometric2F1Regularized",%
+ "HypergeometricDistribution", "HypergeometricPFQ",%
+ "HypergeometricPFQRegularized", "HypergeometricU", "Hyperlink",%
+ "HyperlinkCreationSettings", "Hyperplane", "Hyphenation",%
+ "HyphenationOptions", "HypoexponentialDistribution",%
+ "HypothesisTestData", "I", "IconData", "IconRules", "Identity",%
+ "IdentityMatrix", "If", "IgnoreCase", "IgnoreDiacritics",%
+ "IgnorePunctuation", "IgnoringInactive", "Im", "Image", "Image3D",%
+ "Image3DSlices", "ImageAccumulate", "ImageAdd", "ImageAdjust",%
+ "ImageAlign", "ImageApply", "ImageApplyIndexed", "ImageAspectRatio",%
+ "ImageAssemble", "ImageCache", "ImageCacheValid", "ImageCapture",%
+ "ImageChannels", "ImageClip", "ImageCollage", "ImageColorSpace",%
+ "ImageCompose", "ImageConvolve", "ImageCooccurrence", "ImageCorners",%
+ "ImageCorrelate", "ImageCorrespondingPoints", "ImageCrop",%
+ "ImageData", "ImageDeconvolve", "ImageDemosaic", "ImageDifference",%
+ "ImageDimensions", "ImageDisplacements", "ImageDistance",%
+ "ImageEffect", "ImageExposureCombine", "ImageFeatureTrack",%
+ "ImageFileApply", "ImageFileFilter", "ImageFileScan", "ImageFilter",%
+ "ImageFocusCombine", "ImageForestingComponents",%
+ "ImageFormattingWidth", "ImageForwardTransformation",%
+ "ImageHistogram", "ImageIdentify", "ImageInstanceQ",%
+ "ImageKeypoints", "ImageLevels", "ImageLines", "ImageMargins",%
+ "ImageMarker", "ImageMarkers", "ImageMeasurements", "ImageMesh",%
+ "ImageMultiply", "ImageOffset", "ImagePad", "ImagePadding",%
+ "ImagePartition", "ImagePeriodogram",%
+ "ImagePerspectiveTransformation", "ImageQ", "ImageRangeCache",%
+ "ImageReflect", "ImageRegion", "ImageResize", "ImageResolution",%
+ "ImageRotate", "ImageRotated", "ImageSaliencyFilter", "ImageScaled",%
+ "ImageScan", "ImageSize", "ImageSizeAction", "ImageSizeCache",%
+ "ImageSizeMultipliers", "ImageSizeRaw", "ImageSubtract", "ImageTake",%
+ "ImageTransformation", "ImageTrim", "ImageType", "ImageValue",%
+ "ImageValuePositions", "ImagingDevice", "ImplicitRegion", "Implies",%
+ "Import", "ImportAutoReplacements", "ImportOptions", "ImportString",%
+ "ImprovementImportance", "In", "Inactivate", "Inactive",%
+ "IncidenceGraph", "IncidenceList", "IncidenceMatrix",%
+ "IncludeConstantBasis", "IncludeFileExtension",%
+ "IncludeGeneratorTasks", "IncludeInflections",%
+ "IncludeMetaInformation", "IncludePods", "IncludeQuantities",%
+ "IncludeSingularTerm", "IncludeWindowTimes", "Increment",%
+ "IndefiniteMatrixQ", "Indent", "IndentingNewlineSpacings",%
+ "IndentMaxFraction", "IndependenceTest", "IndependentEdgeSetQ",%
+ "IndependentUnit", "IndependentVertexSetQ", "Indeterminate",%
+ "IndeterminateThreshold", "IndexCreationOptions", "Indexed",%
+ "IndexGraph", "IndexTag", "Inequality", "InexactNumberQ",%
+ "InexactNumbers", "InfiniteLine", "InfinitePlane", "Infinity",%
+ "Infix", "InflationAdjust", "InflationMethod", "Information",%
+ "Inherited", "InheritScope", "InhomogeneousPoissonProcess",%
+ "InitialEvaluationHistory", "Initialization", "InitializationCell",%
+ "InitializationCellEvaluation", "InitializationCellWarning",%
+ "InlineCounterAssignments", "InlineCounterIncrements", "InlinePart",%
+ "InlineRules", "Inner", "Inpaint", "Input", "InputAliases",%
+ "InputAssumptions", "InputAutoReplacements", "InputField",%
+ "InputFieldBox", "InputFieldBoxOptions", "InputForm",%
+ "InputGrouping", "InputNamePacket", "InputNotebook", "InputPacket",%
+ "InputSettings", "InputStream", "InputString", "InputStringPacket",%
+ "InputToBoxFormPacket", "Insert", "InsertionFunction",%
+ "InsertionPointObject", "InsertLinebreaks", "InsertResults", "Inset",%
+ "Inset3DBox", "Inset3DBoxOptions", "InsetBox", "InsetBoxOptions",%
+ "Insphere", "Install", "InstallService", "InString", "Integer",%
+ "IntegerDigits", "IntegerExponent", "IntegerLength", "IntegerName",%
+ "IntegerPart", "IntegerPartitions", "IntegerQ", "IntegerReverse",%
+ "Integers", "IntegerString", "Integral", "Integrate", "Interactive",%
+ "InteractiveTradingChart", "Interlaced", "Interleaving",%
+ "InternallyBalancedDecomposition", "InterpolatingFunction",%
+ "InterpolatingPolynomial", "Interpolation", "InterpolationOrder",%
+ "InterpolationPoints", "InterpolationPrecision", "Interpretation",%
+ "InterpretationBox", "InterpretationBoxOptions",%
+ "InterpretationFunction", "Interpreter", "InterpretTemplate",%
+ "InterquartileRange", "Interrupt", "InterruptSettings",%
+ "IntersectingQ", "Intersection", "Interval", "IntervalIntersection",%
+ "IntervalMemberQ", "IntervalSlider", "IntervalUnion", "Into",%
+ "Inverse", "InverseBetaRegularized", "InverseCDF",%
+ "InverseChiSquareDistribution", "InverseContinuousWaveletTransform",%
+ "InverseDistanceTransform", "InverseEllipticNomeQ", "InverseErf",%
+ "InverseErfc", "InverseFourier", "InverseFourierCosTransform",%
+ "InverseFourierSequenceTransform", "InverseFourierSinTransform",%
+ "InverseFourierTransform", "InverseFunction", "InverseFunctions",%
+ "InverseGammaDistribution", "InverseGammaRegularized",%
+ "InverseGaussianDistribution", "InverseGudermannian",%
+ "InverseHaversine", "InverseJacobiCD", "InverseJacobiCN",%
+ "InverseJacobiCS", "InverseJacobiDC", "InverseJacobiDN",%
+ "InverseJacobiDS", "InverseJacobiNC", "InverseJacobiND",%
+ "InverseJacobiNS", "InverseJacobiSC", "InverseJacobiSD",%
+ "InverseJacobiSN", "InverseLaplaceTransform",%
+ "InverseMellinTransform", "InversePermutation", "InverseRadon",%
+ "InverseSeries", "InverseSurvivalFunction",%
+ "InverseTransformedRegion", "InverseWaveletTransform",%
+ "InverseWeierstrassP", "InverseWishartMatrixDistribution",%
+ "InverseZTransform", "Invisible", "InvisibleApplication",%
+ "InvisibleTimes", "IPAddress", "IrreduciblePolynomialQ",%
+ "IslandData", "IsolatingInterval", "IsomorphicGraphQ", "IsotopeData",%
+ "Italic", "Item", "ItemAspectRatio", "ItemBox", "ItemBoxOptions",%
+ "ItemSize", "ItemStyle", "ItoProcess", "JaccardDissimilarity",%
+ "JacobiAmplitude", "Jacobian", "JacobiCD", "JacobiCN", "JacobiCS",%
+ "JacobiDC", "JacobiDN", "JacobiDS", "JacobiNC", "JacobiND",%
+ "JacobiNS", "JacobiP", "JacobiSC", "JacobiSD", "JacobiSN",%
+ "JacobiSymbol", "JacobiZeta", "JankoGroupJ1", "JankoGroupJ2",%
+ "JankoGroupJ3", "JankoGroupJ4", "JarqueBeraALMTest",%
+ "JohnsonDistribution", "Join", "JoinAcross", "Joined", "JoinedCurve",%
+ "JoinedCurveBox", "JoinedCurveBoxOptions", "JoinForm",%
+ "JordanDecomposition", "JordanModelDecomposition", "JulianDate",%
+ "JuliaSetBoettcher", "JuliaSetIterationCount", "JuliaSetPlot",%
+ "JuliaSetPoints", "K", "KagiChart", "KaiserBesselWindow",%
+ "KaiserWindow", "KalmanEstimator", "KalmanFilter",%
+ "KarhunenLoeveDecomposition", "KaryTree", "KatzCentrality",%
+ "KCoreComponents", "KDistribution", "KEdgeConnectedComponents",%
+ "KEdgeConnectedGraphQ", "KelvinBei", "KelvinBer", "KelvinKei",%
+ "KelvinKer", "KendallTau", "KendallTauTest", "KernelExecute",%
+ "KernelMixtureDistribution", "Kernels", "Ket", "Key",%
+ "KeyCollisionFunction", "KeyComplement", "KeyDrop", "KeyDropFrom",%
+ "KeyExistsQ", "KeyFreeQ", "KeyIntersection", "KeyMap", "KeyMemberQ",%
+ "KeypointStrength", "Keys", "KeySelect", "KeySort", "KeySortBy",%
+ "KeyTake", "KeyUnion", "KeyValueMap", "KeyValuePattern", "Khinchin",%
+ "KillProcess", "KirchhoffGraph", "KirchhoffMatrix",%
+ "KleinInvariantJ", "KnapsackSolve", "KnightTourGraph", "KnotData",%
+ "KnownUnitQ", "KolmogorovSmirnovTest", "KroneckerDelta",%
+ "KroneckerModelDecomposition", "KroneckerProduct", "KroneckerSymbol",%
+ "KuiperTest", "KumaraswamyDistribution", "Kurtosis",%
+ "KuwaharaFilter", "KVertexConnectedComponents",%
+ "KVertexConnectedGraphQ", "LABColor", "Label", "Labeled",%
+ "LabeledSlider", "LabelingFunction", "LabelStyle", "LaguerreL",%
+ "LakeData", "LambdaComponents", "LambertW", "LaminaData",%
+ "LanczosWindow", "LandauDistribution", "Language",%
+ "LanguageCategory", "LanguageData", "LanguageIdentify",%
+ "LaplaceDistribution", "LaplaceTransform", "Laplacian",%
+ "LaplacianFilter", "LaplacianGaussianFilter", "Large", "Larger",%
+ "Last", "Latitude", "LatitudeLongitude", "LatticeData",%
+ "LatticeReduce", "Launch", "LaunchKernels", "LayeredGraphPlot",%
+ "LayerSizeFunction", "LayoutInformation", "LCHColor", "LCM",%
+ "LeaderSize", "LeafCount", "LeapYearQ", "LeastSquares",%
+ "LeastSquaresFilterKernel", "Left", "LeftArrow", "LeftArrowBar",%
+ "LeftArrowRightArrow", "LeftDownTeeVector", "LeftDownVector",%
+ "LeftDownVectorBar", "LeftRightArrow", "LeftRightVector", "LeftTee",%
+ "LeftTeeArrow", "LeftTeeVector", "LeftTriangle", "LeftTriangleBar",%
+ "LeftTriangleEqual", "LeftUpDownVector", "LeftUpTeeVector",%
+ "LeftUpVector", "LeftUpVectorBar", "LeftVector", "LeftVectorBar",%
+ "LegendAppearance", "Legended", "LegendFunction", "LegendLabel",%
+ "LegendLayout", "LegendMargins", "LegendMarkers", "LegendMarkerSize",%
+ "LegendreP", "LegendreQ", "LegendreType", "Length", "LengthWhile",%
+ "LerchPhi", "Less", "LessEqual", "LessEqualGreater", "LessEqualThan",%
+ "LessFullEqual", "LessGreater", "LessLess", "LessSlantEqual",%
+ "LessThan", "LessTilde", "LetterCharacter", "LetterCounts",%
+ "LetterNumber", "LetterQ", "Level", "LeveneTest", "LeviCivitaTensor",%
+ "LevyDistribution", "Lexicographic", "LibraryDataType",%
+ "LibraryFunction", "LibraryFunctionError",%
+ "LibraryFunctionInformation", "LibraryFunctionLoad",%
+ "LibraryFunctionUnload", "LibraryLoad", "LibraryUnload", "LicenseID",%
+ "LiftingFilterData", "LiftingWaveletTransform", "LightBlue",%
+ "LightBrown", "LightCyan", "Lighter", "LightGray", "LightGreen",%
+ "Lighting", "LightingAngle", "LightMagenta", "LightOrange",%
+ "LightPink", "LightPurple", "LightRed", "LightSources",%
+ "LightYellow", "Likelihood", "Limit", "LimitsPositioning",%
+ "LimitsPositioningTokens", "LindleyDistribution", "Line",%
+ "Line3DBox", "Line3DBoxOptions", "LinearFilter",%
+ "LinearFractionalTransform", "LinearGradientImage",%
+ "LinearizingTransformationData", "LinearModelFit",%
+ "LinearOffsetFunction", "LinearProgramming", "LinearRecurrence",%
+ "LinearSolve", "LinearSolveFunction", "LineBox", "LineBoxOptions",%
+ "LineBreak", "LinebreakAdjustments", "LineBreakChart",%
+ "LinebreakSemicolonWeighting", "LineBreakWithin", "LineColor",%
+ "LineGraph", "LineIndent", "LineIndentMaxFraction",%
+ "LineIntegralConvolutionPlot", "LineIntegralConvolutionScale",%
+ "LineLegend", "LineOpacity", "LineSpacing", "LineWrapParts",%
+ "LinkActivate", "LinkClose", "LinkConnect", "LinkConnectedQ",%
+ "LinkCreate", "LinkError", "LinkFlush", "LinkFunction", "LinkHost",%
+ "LinkInterrupt", "LinkLaunch", "LinkMode", "LinkObject", "LinkOpen",%
+ "LinkOptions", "LinkPatterns", "LinkProtocol", "LinkRankCentrality",%
+ "LinkRead", "LinkReadHeld", "LinkReadyQ", "Links", "LinkService",%
+ "LinkWrite", "LinkWriteHeld", "LiouvilleLambda", "List", "Listable",%
+ "ListAnimate", "ListContourPlot", "ListContourPlot3D",%
+ "ListConvolve", "ListCorrelate", "ListCurvePathPlot",%
+ "ListDeconvolve", "ListDensityPlot", "ListDensityPlot3D", "Listen",%
+ "ListFormat", "ListFourierSequenceTransform", "ListInterpolation",%
+ "ListLineIntegralConvolutionPlot", "ListLinePlot",%
+ "ListLogLinearPlot", "ListLogLogPlot", "ListLogPlot", "ListPicker",%
+ "ListPickerBox", "ListPickerBoxBackground", "ListPickerBoxOptions",%
+ "ListPlay", "ListPlot", "ListPlot3D", "ListPointPlot3D",%
+ "ListPolarPlot", "ListQ", "ListSliceContourPlot3D",%
+ "ListSliceDensityPlot3D", "ListSliceVectorPlot3D", "ListStepPlot",%
+ "ListStreamDensityPlot", "ListStreamPlot", "ListSurfacePlot3D",%
+ "ListVectorDensityPlot", "ListVectorPlot", "ListVectorPlot3D",%
+ "ListZTransform", "Literal", "LiteralSearch",%
+ "LocalAdaptiveBinarize", "LocalCache", "LocalClusteringCoefficient",%
+ "LocalizeDefinitions", "LocalizeVariables", "LocalObject",%
+ "LocalObjects", "LocalSymbol", "LocalTime", "LocalTimeZone",%
+ "LocationEquivalenceTest", "LocationTest", "Locator",%
+ "LocatorAutoCreate", "LocatorBox", "LocatorBoxOptions",%
+ "LocatorCentering", "LocatorPane", "LocatorPaneBox",%
+ "LocatorPaneBoxOptions", "LocatorRegion", "Locked", "Log", "Log10",%
+ "Log2", "LogBarnesG", "LogGamma", "LogGammaDistribution",%
+ "LogicalExpand", "LogIntegral", "LogisticDistribution",%
+ "LogisticSigmoid", "LogitModelFit", "LogLikelihood", "LogLinearPlot",%
+ "LogLogisticDistribution", "LogLogPlot",%
+ "LogMultinormalDistribution", "LogNormalDistribution", "LogPlot",%
+ "LogRankTest", "LogSeriesDistribution", "LongEqual", "Longest",%
+ "LongestCommonSequence", "LongestCommonSequencePositions",%
+ "LongestCommonSubsequence", "LongestCommonSubsequencePositions",%
+ "LongestMatch", "LongestOrderedSequence", "LongForm", "Longitude",%
+ "LongLeftArrow", "LongLeftRightArrow", "LongRightArrow", "Lookup",%
+ "Loopback", "LoopFreeGraphQ", "LowerCaseQ", "LowerLeftArrow",%
+ "LowerRightArrow", "LowerTriangularize", "LowpassFilter",%
+ "LQEstimatorGains", "LQGRegulator", "LQOutputRegulatorGains",%
+ "LQRegulatorGains", "LUBackSubstitution", "LucasL",%
+ "LuccioSamiComponents", "LUDecomposition", "LunarEclipse",%
+ "LUVColor", "LyapunovSolve", "LyonsGroupLy", "MachineID",%
+ "MachineName", "MachineNumberQ", "MachinePrecision",%
+ "MacintoshSystemPageSetup", "Magenta", "Magnification", "Magnify",%
+ "MailReceiverFunction", "MailResponseFunction", "MainSolve",%
+ "MaintainDynamicCaches", "Majority", "MakeBoxes", "MakeExpression",%
+ "MakeRules", "ManagedLibraryExpressionID",%
+ "ManagedLibraryExpressionQ", "MandelbrotSetBoettcher",%
+ "MandelbrotSetDistance", "MandelbrotSetIterationCount",%
+ "MandelbrotSetMemberQ", "MandelbrotSetPlot", "MangoldtLambda",%
+ "ManhattanDistance", "Manipulate", "Manipulator",%
+ "MannedSpaceMissionData", "MannWhitneyTest", "MantissaExponent",%
+ "Manual", "Map", "MapAll", "MapAt", "MapIndexed", "MAProcess",%
+ "MapThread", "MarchenkoPasturDistribution", "MarcumQ",%
+ "MardiaCombinedTest", "MardiaKurtosisTest", "MardiaSkewnessTest",%
+ "MarginalDistribution", "MarkovProcessProperties", "Masking",%
+ "MatchingDissimilarity", "MatchLocalNameQ", "MatchLocalNames",%
+ "MatchQ", "Material", "MathematicalFunctionData",%
+ "MathematicaNotation", "MathieuC", "MathieuCharacteristicA",%
+ "MathieuCharacteristicB", "MathieuCharacteristicExponent",%
+ "MathieuCPrime", "MathieuGroupM11", "MathieuGroupM12",%
+ "MathieuGroupM22", "MathieuGroupM23", "MathieuGroupM24", "MathieuS",%
+ "MathieuSPrime", "MathMLForm", "MathMLText", "Matrices", "MatrixExp",%
+ "MatrixForm", "MatrixFunction", "MatrixLog",%
+ "MatrixNormalDistribution", "MatrixPlot", "MatrixPower",%
+ "MatrixPropertyDistribution", "MatrixQ", "MatrixRank",%
+ "MatrixTDistribution", "Max", "MaxBend", "MaxCellMeasure",%
+ "MaxDetect", "MaxExtraBandwidths", "MaxExtraConditions",%
+ "MaxFeatureDisplacement", "MaxFeatures", "MaxFilter", "MaximalBy",%
+ "Maximize", "MaxItems", "MaxIterations", "MaxMemoryUsed",%
+ "MaxMixtureKernels", "MaxPlotPoints", "MaxPoints", "MaxRecursion",%
+ "MaxStableDistribution", "MaxStepFraction", "MaxSteps",%
+ "MaxStepSize", "MaxTrainingRounds", "MaxValue",%
+ "MaxwellDistribution", "MaxWordGap", "McLaughlinGroupMcL", "Mean",%
+ "MeanAbsoluteLossLayer", "MeanClusteringCoefficient",%
+ "MeanDegreeConnectivity", "MeanDeviation", "MeanFilter",%
+ "MeanGraphDistance", "MeanNeighborDegree", "MeanShift",%
+ "MeanShiftFilter", "MeanSquaredLossLayer", "Median",%
+ "MedianDeviation", "MedianFilter", "MedicalTestData", "Medium",%
+ "MeijerG", "MeijerGReduce", "MeixnerDistribution", "MellinConvolve",%
+ "MellinTransform", "MemberQ", "MemoryConstrained",%
+ "MemoryConstraint", "MemoryInUse", "Menu", "MenuAppearance",%
+ "MenuCommandKey", "MenuEvaluator", "MenuItem", "MenuPacket",%
+ "MenuSortingValue", "MenuStyle", "MenuView", "Merge",%
+ "MergeDifferences", "MersennePrimeExponent",%
+ "MersennePrimeExponentQ", "Mesh", "MeshCellCentroid",%
+ "MeshCellCount", "MeshCellHighlight", "MeshCellIndex",%
+ "MeshCellLabel", "MeshCellMarker", "MeshCellMeasure",%
+ "MeshCellQuality", "MeshCells", "MeshCellShapeFunction",%
+ "MeshCellStyle", "MeshCoordinates", "MeshFunctions",%
+ "MeshPrimitives", "MeshQualityGoal", "MeshRange",%
+ "MeshRefinementFunction", "MeshRegion", "MeshRegionQ", "MeshShading",%
+ "MeshStyle", "Message", "MessageDialog", "MessageList",%
+ "MessageName", "MessageOptions", "MessagePacket", "Messages",%
+ "MessagesNotebook", "MetaCharacters", "MetaInformation",%
+ "MetaParameters", "MeteorShowerData", "Method", "MethodOptions",%
+ "MexicanHatWavelet", "MeyerWavelet", "Min", "MinColorDistance",%
+ "MinDetect", "MineralData", "MinFilter", "MinimalBy",%
+ "MinimalPolynomial", "MinimalStateSpaceModel", "Minimize",%
+ "MinimumTimeIncrement", "MinIntervalSize", "MinkowskiQuestionMark",%
+ "MinMax", "MinorPlanetData", "Minors", "MinRecursion", "MinSize",%
+ "MinStableDistribution", "Minus", "MinusPlus", "MinValue", "Missing",%
+ "MissingBehavior", "MissingDataMethod", "MissingDataRules",%
+ "MissingQ", "MissingString", "MissingStyle", "MittagLefflerE",%
+ "MixedGraphQ", "MixedMagnitude", "MixedRadix", "MixedRadixQuantity",%
+ "MixedUnit", "MixtureDistribution", "Mod", "Modal", "Mode",%
+ "Modular", "ModularLambda", "Module", "Modulus", "MoebiusMu",%
+ "Moment", "Momentary", "MomentConvert", "MomentEvaluate",%
+ "MomentGeneratingFunction", "MomentOfInertia", "Monday", "Monitor",%
+ "MonomialList", "MonomialOrder", "MonsterGroupM", "MoonPhase",%
+ "MoonPosition", "MorletWavelet", "MorphologicalBinarize",%
+ "MorphologicalBranchPoints", "MorphologicalComponents",%
+ "MorphologicalEulerNumber", "MorphologicalGraph",%
+ "MorphologicalPerimeter", "MorphologicalTransform", "MortalityData",%
+ "Most", "MountainData", "MouseAnnotation", "MouseAppearance",%
+ "MouseAppearanceTag", "MouseButtons", "Mouseover",%
+ "MousePointerNote", "MousePosition", "MovieData", "MovingAverage",%
+ "MovingMap", "MovingMedian", "MoyalDistribution", "Multicolumn",%
+ "MultiedgeStyle", "MultigraphQ", "MultilaunchWarning",%
+ "MultiLetterItalics", "MultiLetterStyle", "MultilineFunction",%
+ "Multinomial", "MultinomialDistribution", "MultinormalDistribution",%
+ "MultiplicativeOrder", "Multiplicity", "Multiselection",%
+ "MultivariateHypergeometricDistribution",%
+ "MultivariatePoissonDistribution", "MultivariateTDistribution", "N",%
+ "NakagamiDistribution", "NameQ", "Names", "NamespaceBox", "Nand",%
+ "NArgMax", "NArgMin", "NBernoulliB", "NCache", "NDEigensystem",%
+ "NDEigenvalues", "NDSolve", "NDSolveValue", "Nearest",%
+ "NearestFunction", "NearestNeighborGraph", "NebulaData",%
+ "NeedCurrentFrontEndPackagePacket",%
+ "NeedCurrentFrontEndSymbolsPacket", "NeedlemanWunschSimilarity",%
+ "Needs", "Negative", "NegativeBinomialDistribution",%
+ "NegativeDefiniteMatrixQ", "NegativeMultinomialDistribution",%
+ "NegativeSemidefiniteMatrixQ", "NeighborhoodData",%
+ "NeighborhoodGraph", "Nest", "NestedGreaterGreater",%
+ "NestedLessLess", "NestedScriptRules", "NestGraph", "NestList",%
+ "NestWhile", "NestWhileList", "NetChain", "NetDecoder", "NetEncoder",%
+ "NetExtract", "NetGraph", "NetInitialize", "NetPort", "NetTrain",%
+ "NeumannValue", "NevilleThetaC", "NevilleThetaD", "NevilleThetaN",%
+ "NevilleThetaS", "NewPrimitiveStyle", "NExpectation", "Next",%
+ "NextCell", "NextPrime", "NextScheduledTaskTime", "NHoldAll",%
+ "NHoldFirst", "NHoldRest", "NicholsGridLines", "NicholsPlot",%
+ "NightHemisphere", "NIntegrate", "NMaximize", "NMaxValue",%
+ "NMinimize", "NMinValue", "NominalVariables", "NonAssociative",%
+ "NoncentralBetaDistribution", "NoncentralChiSquareDistribution",%
+ "NoncentralFRatioDistribution", "NoncentralStudentTDistribution",%
+ "NonCommutativeMultiply", "NonConstants", "None", "NoneTrue",%
+ "NonlinearModelFit", "NonlinearStateSpaceModel",%
+ "NonlocalMeansFilter", "NonNegative", "NonPositive", "Nor",%
+ "NorlundB", "Norm", "Normal", "NormalDistribution", "NormalGrouping",%
+ "Normalize", "Normalized", "NormalizedSquaredEuclideanDistance",%
+ "NormalMatrixQ", "NormalsFunction", "NormFunction", "Not",%
+ "NotCongruent", "NotCupCap", "NotDoubleVerticalBar", "Notebook",%
+ "NotebookApply", "NotebookAutoSave", "NotebookClose",%
+ "NotebookConvertSettings", "NotebookCreate",%
+ "NotebookCreateReturnObject", "NotebookDefault", "NotebookDelete",%
+ "NotebookDirectory", "NotebookDynamicExpression", "NotebookEvaluate",%
+ "NotebookEventActions", "NotebookFileName", "NotebookFind",%
+ "NotebookFindReturnObject", "NotebookGet",%
+ "NotebookGetLayoutInformationPacket",%
+ "NotebookGetMisspellingsPacket", "NotebookImport",%
+ "NotebookInformation", "NotebookInterfaceObject", "NotebookLocate",%
+ "NotebookObject", "NotebookOpen", "NotebookOpenReturnObject",%
+ "NotebookPath", "NotebookPrint", "NotebookPut",%
+ "NotebookPutReturnObject", "NotebookRead",%
+ "NotebookResetGeneratedCells", "Notebooks", "NotebookSave",%
+ "NotebookSaveAs", "NotebookSelection",%
+ "NotebookSetupLayoutInformationPacket", "NotebooksMenu",%
+ "NotebookTemplate", "NotebookWrite", "NotElement", "NotEqualTilde",%
+ "NotExists", "NotGreater", "NotGreaterEqual", "NotGreaterFullEqual",%
+ "NotGreaterGreater", "NotGreaterLess", "NotGreaterSlantEqual",%
+ "NotGreaterTilde", "Nothing", "NotHumpDownHump", "NotHumpEqual",%
+ "NotificationFunction", "NotLeftTriangle", "NotLeftTriangleBar",%
+ "NotLeftTriangleEqual", "NotLess", "NotLessEqual",%
+ "NotLessFullEqual", "NotLessGreater", "NotLessLess",%
+ "NotLessSlantEqual", "NotLessTilde", "NotNestedGreaterGreater",%
+ "NotNestedLessLess", "NotPrecedes", "NotPrecedesEqual",%
+ "NotPrecedesSlantEqual", "NotPrecedesTilde", "NotReverseElement",%
+ "NotRightTriangle", "NotRightTriangleBar", "NotRightTriangleEqual",%
+ "NotSquareSubset", "NotSquareSubsetEqual", "NotSquareSuperset",%
+ "NotSquareSupersetEqual", "NotSubset", "NotSubsetEqual",%
+ "NotSucceeds", "NotSucceedsEqual", "NotSucceedsSlantEqual",%
+ "NotSucceedsTilde", "NotSuperset", "NotSupersetEqual", "NotTilde",%
+ "NotTildeEqual", "NotTildeFullEqual", "NotTildeTilde",%
+ "NotVerticalBar", "Now", "NoWhitespace", "NProbability", "NProduct",%
+ "NProductFactors", "NRoots", "NSolve", "NSum", "NSumTerms",%
+ "NuclearExplosionData", "NuclearReactorData", "Null", "NullRecords",%
+ "NullSpace", "NullWords", "Number", "NumberCompose",%
+ "NumberDecompose", "NumberExpand", "NumberFieldClassNumber",%
+ "NumberFieldDiscriminant", "NumberFieldFundamentalUnits",%
+ "NumberFieldIntegralBasis", "NumberFieldNormRepresentatives",%
+ "NumberFieldRegulator", "NumberFieldRootsOfUnity",%
+ "NumberFieldSignature", "NumberForm", "NumberFormat",%
+ "NumberLinePlot", "NumberMarks", "NumberMultiplier", "NumberPadding",%
+ "NumberPoint", "NumberQ", "NumberSeparator", "NumberSigns",%
+ "NumberString", "Numerator", "NumericFunction", "NumericQ",%
+ "NuttallWindow", "NValues", "NyquistGridLines", "NyquistPlot", "O",%
+ "ObservabilityGramian", "ObservabilityMatrix",%
+ "ObservableDecomposition", "ObservableModelQ", "OceanData", "OddQ",%
+ "Off", "Offset", "OLEData", "On", "ONanGroupON", "Once",%
+ "OneIdentity", "Opacity", "OpacityFunction",%
+ "OpacityFunctionScaling", "Open", "OpenAppend", "Opener",%
+ "OpenerBox", "OpenerBoxOptions", "OpenerView",%
+ "OpenFunctionInspectorPacket", "Opening", "OpenRead",%
+ "OpenSpecialOptions", "OpenTemporary", "OpenWrite", "Operate",%
+ "OperatingSystem", "OptimumFlowData", "Optional", "OptionalElement",%
+ "OptionInspectorSettings", "OptionQ", "Options", "OptionsPacket",%
+ "OptionsPattern", "OptionValue", "OptionValueBox",%
+ "OptionValueBoxOptions", "Or", "Orange", "Order",%
+ "OrderDistribution", "OrderedQ", "Ordering", "Orderless",%
+ "OrderlessPatternSequence", "OrnsteinUhlenbeckProcess",%
+ "Orthogonalize", "OrthogonalMatrixQ", "Out", "Outer",%
+ "OutputAutoOverwrite", "OutputControllabilityMatrix",%
+ "OutputControllableModelQ", "OutputForm", "OutputFormData",%
+ "OutputGrouping", "OutputMathEditExpression", "OutputNamePacket",%
+ "OutputResponse", "OutputSizeLimit", "OutputStream", "Over",%
+ "OverBar", "OverDot", "Overflow", "OverHat", "Overlaps", "Overlay",%
+ "OverlayBox", "OverlayBoxOptions", "Overscript", "OverscriptBox",%
+ "OverscriptBoxOptions", "OverTilde", "OverVector", "OverwriteTarget",%
+ "OwenT", "OwnValues", "Package", "PackingMethod", "PaddedForm",%
+ "Padding", "PaddingSize", "PadeApproximant", "PadLeft", "PadRight",%
+ "PageBreakAbove", "PageBreakBelow", "PageBreakWithin",%
+ "PageFooterLines", "PageFooters", "PageHeaderLines", "PageHeaders",%
+ "PageHeight", "PageRankCentrality", "PageTheme", "PageWidth",%
+ "Pagination", "PairedBarChart", "PairedHistogram",%
+ "PairedSmoothHistogram", "PairedTTest", "PairedZTest",%
+ "PaletteNotebook", "PalettePath", "PalindromeQ", "Pane", "PaneBox",%
+ "PaneBoxOptions", "Panel", "PanelBox", "PanelBoxOptions", "Paneled",%
+ "PaneSelector", "PaneSelectorBox", "PaneSelectorBoxOptions",%
+ "PaperWidth", "ParabolicCylinderD", "ParagraphIndent",%
+ "ParagraphSpacing", "ParallelArray", "ParallelCombine", "ParallelDo",%
+ "Parallelepiped", "ParallelEvaluate", "Parallelization",%
+ "Parallelize", "ParallelMap", "ParallelNeeds", "Parallelogram",%
+ "ParallelProduct", "ParallelSubmit", "ParallelSum", "ParallelTable",%
+ "ParallelTry", "Parameter", "ParameterEstimator",%
+ "ParameterMixtureDistribution", "ParameterVariables",%
+ "ParametricFunction", "ParametricNDSolve", "ParametricNDSolveValue",%
+ "ParametricPlot", "ParametricPlot3D", "ParametricRegion",%
+ "ParentBox", "ParentCell", "ParentConnect", "ParentDirectory",%
+ "ParentForm", "Parenthesize", "ParentList", "ParentNotebook",%
+ "ParetoDistribution", "ParkData", "Part", "PartBehavior",%
+ "PartialCorrelationFunction", "PartialD", "ParticleAcceleratorData",%
+ "ParticleData", "Partition", "PartitionGranularity", "PartitionsP",%
+ "PartitionsQ", "PartOfSpeech", "PartProtection", "ParzenWindow",%
+ "PascalDistribution", "PassEventsDown", "PassEventsUp", "Paste",%
+ "PasteBoxFormInlineCells", "PasteButton", "Path", "PathGraph",%
+ "PathGraphQ", "Pattern", "PatternSequence", "PatternTest",%
+ "PauliMatrix", "PaulWavelet", "Pause", "PausedTime", "PDF",%
+ "PeakDetect", "PearsonChiSquareTest", "PearsonCorrelationTest",%
+ "PearsonDistribution", "PerfectNumber", "PerfectNumberQ",%
+ "PerformanceGoal", "PeriodicBoundaryCondition",%
+ "PeriodicInterpolation", "Periodogram", "PeriodogramArray",%
+ "Permanent", "Permissions", "PermissionsGroup", "PermissionsGroups",%
+ "PermissionsKey", "PermissionsKeys", "PermutationCycles",%
+ "PermutationCyclesQ", "PermutationGroup", "PermutationLength",%
+ "PermutationList", "PermutationListQ", "PermutationMax",%
+ "PermutationMin", "PermutationOrder", "PermutationPower",%
+ "PermutationProduct", "PermutationReplace", "Permutations",%
+ "PermutationSupport", "Permute", "PeronaMalikFilter",%
+ "Perpendicular", "PersonData", "PERTDistribution", "PetersenGraph",%
+ "PhaseMargins", "PhaseRange", "PhysicalSystemData", "Pi", "Pick",%
+ "PIDData", "PIDDerivativeFilter", "PIDFeedforward", "PIDTune",%
+ "Piecewise", "PiecewiseExpand", "PieChart", "PieChart3D",%
+ "PillaiTrace", "PillaiTraceTest", "PingTime", "Pink", "Pivoting",%
+ "PixelConstrained", "PixelValue", "PixelValuePositions", "Placed",%
+ "Placeholder", "PlaceholderReplace", "Plain", "PlanarGraph",%
+ "PlanarGraphQ", "PlanckRadiationLaw", "PlaneCurveData",%
+ "PlanetaryMoonData", "PlanetData", "PlantData", "Play", "PlayRange",%
+ "Plot", "Plot3D", "Plot3Matrix", "PlotDivision", "PlotJoined",%
+ "PlotLabel", "PlotLabels", "PlotLayout", "PlotLegends",%
+ "PlotMarkers", "PlotPoints", "PlotRange", "PlotRangeClipping",%
+ "PlotRangeClipPlanesStyle", "PlotRangePadding", "PlotRegion",%
+ "PlotStyle", "PlotTheme", "Pluralize", "Plus", "PlusMinus",%
+ "Pochhammer", "PodStates", "PodWidth", "Point", "Point3DBox",%
+ "Point3DBoxOptions", "PointBox", "PointBoxOptions",%
+ "PointFigureChart", "PointLegend", "PointSize",%
+ "PoissonConsulDistribution", "PoissonDistribution", "PoissonProcess",%
+ "PoissonWindow", "PolarAxes", "PolarAxesOrigin", "PolarGridLines",%
+ "PolarPlot", "PolarTicks", "PoleZeroMarkers",%
+ "PolyaAeppliDistribution", "PolyGamma", "Polygon", "Polygon3DBox",%
+ "Polygon3DBoxOptions", "PolygonalNumber", "PolygonBox",%
+ "PolygonBoxOptions", "PolygonHoleScale", "PolygonIntersections",%
+ "PolygonScale", "PolyhedronData", "PolyLog", "PolynomialExtendedGCD",%
+ "PolynomialForm", "PolynomialGCD", "PolynomialLCM", "PolynomialMod",%
+ "PolynomialQ", "PolynomialQuotient", "PolynomialQuotientRemainder",%
+ "PolynomialReduce", "PolynomialRemainder", "Polynomials",%
+ "PoolingLayer", "PopupMenu", "PopupMenuBox", "PopupMenuBoxOptions",%
+ "PopupView", "PopupWindow", "Position", "PositionIndex", "Positive",%
+ "PositiveDefiniteMatrixQ", "PositiveSemidefiniteMatrixQ",%
+ "PossibleZeroQ", "Postfix", "PostScript", "Power",%
+ "PowerDistribution", "PowerExpand", "PowerMod", "PowerModList",%
+ "PowerRange", "PowerSpectralDensity", "PowersRepresentations",%
+ "PowerSymmetricPolynomial", "Precedence", "PrecedenceForm",%
+ "Precedes", "PrecedesEqual", "PrecedesSlantEqual", "PrecedesTilde",%
+ "Precision", "PrecisionGoal", "PreDecrement", "Predict",%
+ "PredictionRoot", "PredictorFunction", "PredictorInformation",%
+ "PredictorMeasurements", "PredictorMeasurementsObject",%
+ "PreemptProtect", "PreferencesPath", "Prefix", "PreIncrement",%
+ "Prepend", "PrependTo", "PreserveImageOptions", "Previous",%
+ "PreviousCell", "PriceGraphDistribution", "PrimaryPlaceholder",%
+ "Prime", "PrimeNu", "PrimeOmega", "PrimePi", "PrimePowerQ", "PrimeQ",%
+ "Primes", "PrimeZetaP", "PrimitiveRoot", "PrimitiveRootList",%
+ "PrincipalComponents", "PrincipalValue", "Print", "PrintableASCIIQ",%
+ "PrintAction", "PrintForm", "PrintingCopies", "PrintingOptions",%
+ "PrintingPageRange", "PrintingStartingPageNumber",%
+ "PrintingStyleEnvironment", "Printout3D", "Printout3DPreviewer",%
+ "PrintPrecision", "PrintTemporary", "Prism", "PrismBox",%
+ "PrismBoxOptions", "PrivateCellOptions", "PrivateEvaluationOptions",%
+ "PrivateFontOptions", "PrivateFrontEndOptions", "PrivateKey",%
+ "PrivateNotebookOptions", "PrivatePaths", "Probability",%
+ "ProbabilityDistribution", "ProbabilityPlot", "ProbabilityPr",%
+ "ProbabilityScalePlot", "ProbitModelFit", "ProcessConnection",%
+ "ProcessDirectory", "ProcessEnvironment", "Processes",%
+ "ProcessEstimator", "ProcessInformation", "ProcessObject",%
+ "ProcessParameterAssumptions", "ProcessParameterQ",%
+ "ProcessStateDomain", "ProcessStatus", "ProcessTimeDomain",%
+ "Product", "ProductDistribution", "ProductLog", "ProgressIndicator",%
+ "ProgressIndicatorBox", "ProgressIndicatorBoxOptions", "Projection",%
+ "Prolog", "PromptForm", "Properties", "Property", "PropertyList",%
+ "PropertyValue", "Proportion", "Proportional", "Protect",%
+ "Protected", "ProteinData", "Pruning", "PseudoInverse", "PublicKey",%
+ "PulsarData", "PunctuationCharacter", "Purple", "Put", "PutAppend",%
+ "Pyramid", "PyramidBox", "PyramidBoxOptions", "QBinomial",%
+ "QFactorial", "QGamma", "QHypergeometricPFQ", "QPochhammer",%
+ "QPolyGamma", "QRDecomposition", "QuadraticIrrationalQ", "Quantile",%
+ "QuantilePlot", "Quantity", "QuantityArray", "QuantityDistribution",%
+ "QuantityForm", "QuantityMagnitude", "QuantityQ", "QuantityThread",%
+ "QuantityUnit", "QuantityVariable", "QuantityVariableCanonicalUnit",%
+ "QuantityVariableDimensions", "QuantityVariableIdentifier",%
+ "QuantityVariablePhysicalQuantity", "Quartics", "QuartileDeviation",%
+ "Quartiles", "QuartileSkewness", "Query", "QueueingNetworkProcess",%
+ "QueueingProcess", "QueueProperties", "Quiet", "Quit", "Quotient",%
+ "QuotientRemainder", "RadialGradientImage", "RadialityCentrality",%
+ "RadicalBox", "RadicalBoxOptions", "RadioButton", "RadioButtonBar",%
+ "RadioButtonBox", "RadioButtonBoxOptions", "Radon", "RamanujanTau",%
+ "RamanujanTauL", "RamanujanTauTheta", "RamanujanTauZ", "Ramp",%
+ "Random", "RandomChoice", "RandomColor", "RandomComplex",%
+ "RandomEntity", "RandomFunction", "RandomGraph", "RandomImage",%
+ "RandomInteger", "RandomPermutation", "RandomPoint", "RandomPrime",%
+ "RandomReal", "RandomSample", "RandomSeed", "RandomVariate",%
+ "RandomWalkProcess", "RandomWord", "Range", "RangeFilter",%
+ "RangeSpecification", "RankedMax", "RankedMin", "Raster", "Raster3D",%
+ "Raster3DBox", "Raster3DBoxOptions", "RasterArray", "RasterBox",%
+ "RasterBoxOptions", "Rasterize", "RasterSize", "Rational",%
+ "RationalFunctions", "Rationalize", "Rationals", "Ratios", "Raw",%
+ "RawArray", "RawBoxes", "RawData", "RawMedium",%
+ "RayleighDistribution", "Re", "Read", "ReadLine", "ReadList",%
+ "ReadProtected", "ReadString", "Real", "RealBlockDiagonalForm",%
+ "RealDigits", "RealExponent", "Reals", "Reap", "RecognitionPrior",%
+ "RecognitionThreshold", "Record", "RecordLists", "RecordSeparators",%
+ "Rectangle", "RectangleBox", "RectangleBoxOptions", "RectangleChart",%
+ "RectangleChart3D", "RecurrenceFilter", "RecurrenceTable",%
+ "RecurringDigitsForm", "Red", "Reduce", "RefBox",%
+ "ReferenceLineStyle", "ReferenceMarkers", "ReferenceMarkerStyle",%
+ "Refine", "ReflectionMatrix", "ReflectionTransform", "Refresh",%
+ "RefreshRate", "RegionBinarize", "RegionBoundary", "RegionBounds",%
+ "RegionCentroid", "RegionDifference", "RegionDimension",%
+ "RegionDistance", "RegionDistanceFunction",%
+ "RegionEmbeddingDimension", "RegionFunction", "RegionIntersection",%
+ "RegionMeasure", "RegionMember", "RegionMemberFunction",%
+ "RegionMoment", "RegionNearest", "RegionNearestFunction",%
+ "RegionPlot", "RegionPlot3D", "RegionProduct", "RegionQ",%
+ "RegionResize", "RegionSize", "RegionSymmetricDifference",%
+ "RegionUnion", "RegularExpression", "Regularization",%
+ "RegularlySampledQ", "RegularPolygon", "ReIm", "Reinstall",%
+ "RelationGraph", "Release", "ReleaseHold", "ReliabilityDistribution",%
+ "ReliefImage", "ReliefPlot", "Remove", "RemoveAlphaChannel",%
+ "RemoveAsynchronousTask", "RemoveBackground",%
+ "RemoveChannelListener", "Removed", "RemoveDiacritics",%
+ "RemoveInputStreamMethod", "RemoveOutputStreamMethod",%
+ "RemoveProperty", "RemoveScheduledTask", "RemoveUsers",%
+ "RenameDirectory", "RenameFile", "RenderAll", "RenderingOptions",%
+ "RenewalProcess", "RenkoChart", "RepairMesh", "Repeated",%
+ "RepeatedNull", "RepeatedString", "RepeatedTiming",%
+ "RepeatingElement", "Replace", "ReplaceAll", "ReplaceHeldPart",%
+ "ReplaceImageValue", "ReplaceList", "ReplacePart",%
+ "ReplacePixelValue", "ReplaceRepeated", "RequiredPhysicalQuantities",%
+ "Resampling", "ResamplingAlgorithmData", "ResamplingMethod",%
+ "Rescale", "RescalingTransform", "ResetDirectory",%
+ "ResetMenusPacket", "ResetScheduledTask", "ReshapeLayer", "Residue",%
+ "Resolve", "ResourceAcquire", "ResourceData", "ResourceObject",%
+ "ResourceRemove", "ResourceSearch", "ResourceSubmissionObject",%
+ "ResourceSubmit", "ResponseForm", "Rest", "RestartInterval",%
+ "Restricted", "Resultant", "ResumePacket", "Return",%
+ "ReturnExpressionPacket", "ReturnInputFormPacket", "ReturnPacket",%
+ "ReturnReceiptFunction", "ReturnTextPacket", "Reverse",%
+ "ReverseBiorthogonalSplineWavelet", "ReverseElement",%
+ "ReverseEquilibrium", "ReverseGraph", "ReverseUpEquilibrium",%
+ "RevolutionAxis", "RevolutionPlot3D", "RGBColor", "RiccatiSolve",%
+ "RiceDistribution", "RidgeFilter", "RiemannR", "RiemannSiegelTheta",%
+ "RiemannSiegelZ", "RiemannXi", "Riffle", "Right", "RightArrow",%
+ "RightArrowBar", "RightArrowLeftArrow", "RightComposition",%
+ "RightCosetRepresentative", "RightDownTeeVector", "RightDownVector",%
+ "RightDownVectorBar", "RightTee", "RightTeeArrow", "RightTeeVector",%
+ "RightTriangle", "RightTriangleBar", "RightTriangleEqual",%
+ "RightUpDownVector", "RightUpTeeVector", "RightUpVector",%
+ "RightUpVectorBar", "RightVector", "RightVectorBar",%
+ "RiskAchievementImportance", "RiskReductionImportance",%
+ "RogersTanimotoDissimilarity", "RollPitchYawAngles",%
+ "RollPitchYawMatrix", "RomanNumeral", "Root", "RootApproximant",%
+ "RootIntervals", "RootLocusPlot", "RootMeanSquare", "RootOfUnityQ",%
+ "RootReduce", "Roots", "RootSum", "Rotate", "RotateLabel",%
+ "RotateLeft", "RotateRight", "RotationAction", "RotationBox",%
+ "RotationBoxOptions", "RotationMatrix", "RotationTransform", "Round",%
+ "RoundImplies", "RoundingRadius", "Row", "RowAlignments",%
+ "RowBackgrounds", "RowBox", "RowHeights", "RowLines", "RowMinHeight",%
+ "RowReduce", "RowsEqual", "RowSpacings", "RSolve", "RSolveValue",%
+ "RudinShapiro", "RudvalisGroupRu", "Rule", "RuleCondition",%
+ "RuleDelayed", "RuleForm", "RulePlot", "RulerUnits", "Run",%
+ "RunProcess", "RunScheduledTask", "RunThrough", "RuntimeAttributes",%
+ "RuntimeOptions", "RussellRaoDissimilarity", "SameQ", "SameTest",%
+ "SampleDepth", "SampledSoundFunction", "SampledSoundList",%
+ "SampleRate", "SamplingPeriod", "SARIMAProcess", "SARMAProcess",%
+ "SASTriangle", "SatelliteData", "SatisfiabilityCount",%
+ "SatisfiabilityInstances", "SatisfiableQ", "Saturday", "Save",%
+ "Saveable", "SaveAutoDelete", "SaveDefinitions",%
+ "SavitzkyGolayMatrix", "SawtoothWave", "Scale", "Scaled",%
+ "ScaleDivisions", "ScaledMousePosition", "ScaleOrigin",%
+ "ScalePadding", "ScaleRanges", "ScaleRangeStyle", "ScalingFunctions",%
+ "ScalingMatrix", "ScalingTransform", "Scan", "ScheduledTask",%
+ "ScheduledTaskActiveQ", "ScheduledTaskInformation",%
+ "ScheduledTaskInformationData", "ScheduledTaskObject",%
+ "ScheduledTasks", "SchurDecomposition", "ScientificForm", "ScorerGi",%
+ "ScorerGiPrime", "ScorerHi", "ScorerHiPrime", "ScreenRectangle",%
+ "ScreenStyleEnvironment", "ScriptBaselineShifts", "ScriptForm",%
+ "ScriptLevel", "ScriptMinSize", "ScriptRules",%
+ "ScriptSizeMultipliers", "Scrollbars", "ScrollingOptions",%
+ "ScrollPosition", "SearchAdjustment", "SearchBoost",%
+ "SearchIndexObject", "SearchIndices", "SearchQueryString",%
+ "SearchResultObject", "SearchSynonyms", "Sec", "Sech",%
+ "SechDistribution", "SectionGrouping", "SectorChart",%
+ "SectorChart3D", "SectorOrigin", "SectorSpacing", "SeedRandom",%
+ "Select", "Selectable", "SelectComponents", "SelectedCells",%
+ "SelectedNotebook", "SelectFirst", "Selection", "SelectionAnimate",%
+ "SelectionCell", "SelectionCellCreateCell",%
+ "SelectionCellDefaultStyle", "SelectionCellParentStyle",%
+ "SelectionCreateCell", "SelectionDebuggerTag",%
+ "SelectionDuplicateCell", "SelectionEvaluate",%
+ "SelectionEvaluateCreateCell", "SelectionMove",%
+ "SelectionPlaceholder", "SelectionSetStyle", "SelectWithContents",%
+ "SelfLoops", "SelfLoopStyle", "SemanticImport",%
+ "SemanticImportString", "SemanticInterpretation",%
+ "SemialgebraicComponentInstances", "SendMail", "SendMessage",%
+ "Sequence", "SequenceAlignment", "SequenceCases", "SequenceCount",%
+ "SequenceFold", "SequenceFoldList", "SequenceForm", "SequenceHold",%
+ "SequenceLimit", "SequencePosition", "Series", "SeriesCoefficient",%
+ "SeriesData", "ServiceConnect", "ServiceDisconnect",%
+ "ServiceExecute", "ServiceObject", "SessionTime", "Set",%
+ "SetAccuracy", "SetAlphaChannel", "SetAttributes", "Setbacks",%
+ "SetBoxFormNamesPacket", "SetCloudDirectory", "SetCookies",%
+ "SetDelayed", "SetDirectory", "SetEnvironment",%
+ "SetEvaluationNotebook", "SetFileDate", "SetFileLoadingContext",%
+ "SetNotebookStatusLine", "SetOptions", "SetOptionsPacket",%
+ "SetPermissions", "SetPrecision", "SetProperty",%
+ "SetSelectedNotebook", "SetSharedFunction", "SetSharedVariable",%
+ "SetSpeechParametersPacket", "SetStreamPosition", "SetSystemOptions",%
+ "Setter", "SetterBar", "SetterBox", "SetterBoxOptions", "Setting",%
+ "SetUsers", "SetValue", "Shading", "Shallow", "ShannonWavelet",%
+ "ShapiroWilkTest", "Share", "SharingList", "Sharpen",%
+ "ShearingMatrix", "ShearingTransform", "ShellRegion",%
+ "ShenCastanMatrix", "ShiftedGompertzDistribution",%
+ "ShiftRegisterSequence", "Short", "ShortDownArrow", "Shortest",%
+ "ShortestMatch", "ShortestPathFunction", "ShortLeftArrow",%
+ "ShortRightArrow", "ShortUpArrow", "Show", "ShowAutoSpellCheck",%
+ "ShowAutoStyles", "ShowCellBracket", "ShowCellLabel", "ShowCellTags",%
+ "ShowClosedCellArea", "ShowContents", "ShowControls",%
+ "ShowCursorTracker", "ShowGroupOpenCloseIcon", "ShowGroupOpener",%
+ "ShowInvisibleCharacters", "ShowPageBreaks",%
+ "ShowPredictiveInterface", "ShowSelection", "ShowShortBoxForm",%
+ "ShowSpecialCharacters", "ShowStringCharacters", "ShowSyntaxStyles",%
+ "ShrinkingDelay", "ShrinkWrapBoundingBox", "SiderealTime",%
+ "SiegelTheta", "SiegelTukeyTest", "Sign", "Signature",%
+ "SignedRankTest", "SignedRegionDistance", "SignificanceLevel",%
+ "SignPadding", "SignTest", "SimilarityRules", "SimpleGraph",%
+ "SimpleGraphQ", "Simplex", "Simplify", "Sin", "Sinc",%
+ "SinghMaddalaDistribution", "SingleEvaluation",%
+ "SingleLetterItalics", "SingleLetterStyle",%
+ "SingularValueDecomposition", "SingularValueList",%
+ "SingularValuePlot", "SingularValues", "Sinh", "SinhIntegral",%
+ "SinIntegral", "SixJSymbol", "Skeleton", "SkeletonTransform",%
+ "SkellamDistribution", "Skewness", "SkewNormalDistribution",%
+ "SkinStyle", "Skip", "SliceContourPlot3D", "SliceDensityPlot3D",%
+ "SliceDistribution", "SliceVectorPlot3D", "Slider", "Slider2D",%
+ "Slider2DBox", "Slider2DBoxOptions", "SliderBox", "SliderBoxOptions",%
+ "SlideView", "Slot", "SlotSequence", "Small", "SmallCircle",%
+ "Smaller", "SmithDecomposition", "SmithDelayCompensator",%
+ "SmithWatermanSimilarity", "SmoothDensityHistogram",%
+ "SmoothHistogram", "SmoothHistogram3D", "SmoothKernelDistribution",%
+ "Snippet", "SocialMediaData", "Socket", "SocketConnect",%
+ "SocketObject", "SoftmaxLayer", "SokalSneathDissimilarity",%
+ "SolarEclipse", "SolarSystemFeatureData", "SolidData",%
+ "SolidRegionQ", "Solve", "SolveAlways", "SolveDelayed", "Sort",%
+ "SortBy", "Sound", "SoundAndGraphics", "SoundNote", "SoundVolume",%
+ "SourceLink", "Sow", "Space", "SpaceCurveData", "SpaceForm",%
+ "Spacer", "Spacings", "Span", "SpanAdjustments",%
+ "SpanCharacterRounding", "SpanFromAbove", "SpanFromBoth",%
+ "SpanFromLeft", "SpanLineThickness", "SpanMaxSize", "SpanMinSize",%
+ "SpanningCharacters", "SpanSymmetric", "SparseArray",%
+ "SpatialGraphDistribution", "Speak", "SpeakTextPacket",%
+ "SpearmanRankTest", "SpearmanRho", "SpeciesData", "SpecificityGoal",%
+ "Spectrogram", "SpectrogramArray", "Specularity",%
+ "SpellingCorrection", "SpellingCorrectionList",%
+ "SpellingDictionaries", "SpellingDictionariesPath",%
+ "SpellingOptions", "SpellingSuggestionsPacket", "Sphere",%
+ "SphereBox", "SphericalBesselJ", "SphericalBesselY",%
+ "SphericalHankelH1", "SphericalHankelH2", "SphericalHarmonicY",%
+ "SphericalPlot3D", "SphericalRegion", "SphericalShell",%
+ "SpheroidalEigenvalue", "SpheroidalJoiningFactor", "SpheroidalPS",%
+ "SpheroidalPSPrime", "SpheroidalQS", "SpheroidalQSPrime",%
+ "SpheroidalRadialFactor", "SpheroidalS1", "SpheroidalS1Prime",%
+ "SpheroidalS2", "SpheroidalS2Prime", "Splice", "SplicedDistribution",%
+ "SplineClosed", "SplineDegree", "SplineKnots", "SplineWeights",%
+ "Split", "SplitBy", "SpokenString", "Sqrt", "SqrtBox",%
+ "SqrtBoxOptions", "Square", "SquaredEuclideanDistance",%
+ "SquareFreeQ", "SquareIntersection", "SquareMatrixQ", "SquaresR",%
+ "SquareSubset", "SquareSubsetEqual", "SquareSuperset",%
+ "SquareSupersetEqual", "SquareUnion", "SquareWave", "SSSTriangle",%
+ "StabilityMargins", "StabilityMarginsStyle", "StableDistribution",%
+ "Stack", "StackBegin", "StackComplete", "StackInhibit",%
+ "StadiumShape", "StandardAtmosphereData", "StandardDeviation",%
+ "StandardDeviationFilter", "StandardForm", "Standardize",%
+ "Standardized", "StandardOceanData", "StandbyDistribution", "Star",%
+ "StarClusterData", "StarData", "StarGraph", "StartAsynchronousTask",%
+ "StartingStepSize", "StartOfLine", "StartOfString", "StartProcess",%
+ "StartScheduledTask", "StartupSound", "StateDimensions",%
+ "StateFeedbackGains", "StateOutputEstimator", "StateResponse",%
+ "StateSpaceModel", "StateSpaceRealization", "StateSpaceTransform",%
+ "StateTransformationLinearize", "StationaryDistribution",%
+ "StationaryWaveletPacketTransform", "StationaryWaveletTransform",%
+ "StatusArea", "StatusCentrality", "StepMonitor", "StieltjesGamma",%
+ "StirlingS1", "StirlingS2", "StopAsynchronousTask",%
+ "StoppingPowerData", "StopScheduledTask", "StrataVariables",%
+ "StratonovichProcess", "StreamColorFunction",%
+ "StreamColorFunctionScaling", "StreamDensityPlot", "StreamPlot",%
+ "StreamPoints", "StreamPosition", "Streams", "StreamScale",%
+ "StreamStyle", "String", "StringBreak", "StringByteCount",%
+ "StringCases", "StringContainsQ", "StringCount", "StringDelete",%
+ "StringDrop", "StringEndsQ", "StringExpression", "StringExtract",%
+ "StringForm", "StringFormat", "StringFreeQ", "StringInsert",%
+ "StringJoin", "StringLength", "StringMatchQ", "StringPadLeft",%
+ "StringPadRight", "StringPart", "StringPartition", "StringPosition",%
+ "StringQ", "StringRepeat", "StringReplace", "StringReplaceList",%
+ "StringReplacePart", "StringReverse", "StringRiffle",%
+ "StringRotateLeft", "StringRotateRight", "StringSkeleton",%
+ "StringSplit", "StringStartsQ", "StringTake", "StringTemplate",%
+ "StringToStream", "StringTrim", "StripBoxes", "StripOnInput",%
+ "StripWrapperBoxes", "StrokeForm", "StructuralImportance",%
+ "StructuredArray", "StructuredSelection", "StruveH", "StruveL",%
+ "Stub", "StudentTDistribution", "Style", "StyleBox",%
+ "StyleBoxAutoDelete", "StyleData", "StyleDefinitions", "StyleForm",%
+ "StyleHints", "StyleKeyMapping", "StyleMenuListing",%
+ "StyleNameDialogSettings", "StyleNames", "StylePrint",%
+ "StyleSheetPath", "Subdivide", "Subfactorial", "Subgraph",%
+ "SubMinus", "SubPlus", "SubresultantPolynomialRemainders",%
+ "SubresultantPolynomials", "Subresultants", "Subscript",%
+ "SubscriptBox", "SubscriptBoxOptions", "Subscripted", "Subsequences",%
+ "Subset", "SubsetEqual", "SubsetQ", "Subsets", "SubStar",%
+ "SubstitutionSystem", "Subsuperscript", "SubsuperscriptBox",%
+ "SubsuperscriptBoxOptions", "Subtract", "SubtractFrom", "SubValues",%
+ "Succeeds", "SucceedsEqual", "SucceedsSlantEqual", "SucceedsTilde",%
+ "SuchThat", "Sum", "SumConvergence", "SummationLayer", "Sunday",%
+ "SunPosition", "Sunrise", "Sunset", "SuperDagger", "SuperMinus",%
+ "SupernovaData", "SuperPlus", "Superscript", "SuperscriptBox",%
+ "SuperscriptBoxOptions", "Superset", "SupersetEqual", "SuperStar",%
+ "Surd", "SurdForm", "SurfaceColor", "SurfaceData", "SurfaceGraphics",%
+ "SurvivalDistribution", "SurvivalFunction", "SurvivalModel",%
+ "SurvivalModelFit", "SuspendPacket", "SuzukiDistribution",%
+ "SuzukiGroupSuz", "SwatchLegend", "Switch", "Symbol", "SymbolName",%
+ "SymletWavelet", "Symmetric", "SymmetricGroup", "SymmetricKey",%
+ "SymmetricMatrixQ", "SymmetricPolynomial", "SymmetricReduction",%
+ "Symmetrize", "SymmetrizedArray", "SymmetrizedArrayRules",%
+ "SymmetrizedDependentComponents", "SymmetrizedIndependentComponents",%
+ "SymmetrizedReplacePart", "SynchronousInitialization",%
+ "SynchronousUpdating", "Syntax", "SyntaxForm", "SyntaxInformation",%
+ "SyntaxLength", "SyntaxPacket", "SyntaxQ", "SystemDialogInput",%
+ "SystemException", "SystemGet", "SystemHelpPath",%
+ "SystemInformation", "SystemInformationData", "SystemOpen",%
+ "SystemOptions", "SystemsModelDelay", "SystemsModelDelayApproximate",%
+ "SystemsModelDelete", "SystemsModelDimensions",%
+ "SystemsModelExtract", "SystemsModelFeedbackConnect",%
+ "SystemsModelLabels", "SystemsModelLinearity", "SystemsModelMerge",%
+ "SystemsModelOrder", "SystemsModelParallelConnect",%
+ "SystemsModelSeriesConnect", "SystemsModelStateFeedbackConnect",%
+ "SystemsModelVectorRelativeOrders", "SystemStub", "Tab",%
+ "TabFilling", "Table", "TableAlignments", "TableDepth",%
+ "TableDirections", "TableForm", "TableHeadings", "TableSpacing",%
+ "TableView", "TableViewBox", "TabSpacings", "TabView", "TabViewBox",%
+ "TabViewBoxOptions", "TagBox", "TagBoxNote", "TagBoxOptions",%
+ "TaggingRules", "TagSet", "TagSetDelayed", "TagStyle", "TagUnset",%
+ "Take", "TakeDrop", "TakeLargest", "TakeLargestBy", "TakeSmallest",%
+ "TakeSmallestBy", "TakeWhile", "Tally", "Tan", "Tanh",%
+ "TargetDevice", "TargetFunctions", "TargetUnits", "TautologyQ",%
+ "TelegraphProcess", "TemplateApply", "TemplateArgBox", "TemplateBox",%
+ "TemplateBoxOptions", "TemplateEvaluate", "TemplateExpression",%
+ "TemplateIf", "TemplateObject", "TemplateSequence", "TemplateSlot",%
+ "TemplateSlotSequence", "TemplateUnevaluated", "TemplateVerbatim",%
+ "TemplateWith", "TemporalData", "TemporalRegularity", "Temporary",%
+ "TemporaryVariable", "TensorContract", "TensorDimensions",%
+ "TensorExpand", "TensorProduct", "TensorQ", "TensorRank",%
+ "TensorReduce", "TensorSymmetry", "TensorTranspose", "TensorWedge",%
+ "TestID", "TestReport", "TestReportObject", "TestResultObject",%
+ "Tetrahedron", "TetrahedronBox", "TetrahedronBoxOptions", "TeXForm",%
+ "TeXSave", "Text", "Text3DBox", "Text3DBoxOptions", "TextAlignment",%
+ "TextBand", "TextBoundingBox", "TextBox", "TextCases", "TextCell",%
+ "TextClipboardType", "TextData", "TextElement", "TextForm",%
+ "TextGrid", "TextJustification", "TextLine", "TextPacket",%
+ "TextParagraph", "TextPosition", "TextRecognize", "TextSearch",%
+ "TextSearchPage", "TextSearchReport", "TextSentences", "TextString",%
+ "TextStructure", "TextStyle", "Texture", "TextureCoordinateFunction",%
+ "TextureCoordinateScaling", "TextWords", "Therefore",%
+ "ThermodynamicData", "ThermometerGauge", "Thick", "Thickness",%
+ "Thin", "Thinning", "ThisLink", "ThompsonGroupTh", "Thread",%
+ "ThreadDepth", "ThreeJSymbol", "Threshold", "Through", "Throw",%
+ "ThueMorse", "Thumbnail", "Thursday", "Ticks", "TicksStyle", "Tilde",%
+ "TildeEqual", "TildeFullEqual", "TildeTilde", "TimeConstrained",%
+ "TimeConstraint", "TimeDirection", "TimeFormat", "TimelinePlot",%
+ "TimeObject", "TimeObjectQ", "Times", "TimesBy", "TimeSeries",%
+ "TimeSeriesAggregate", "TimeSeriesForecast", "TimeSeriesInsert",%
+ "TimeSeriesInvertibility", "TimeSeriesMap", "TimeSeriesMapThread",%
+ "TimeSeriesModel", "TimeSeriesModelFit", "TimeSeriesResample",%
+ "TimeSeriesRescale", "TimeSeriesShift", "TimeSeriesThread",%
+ "TimeSeriesWindow", "TimeUsed", "TimeValue",%
+ "TimeWarpingCorrespondence", "TimeWarpingDistance", "TimeZone",%
+ "TimeZoneConvert", "TimeZoneOffset", "Timing", "Tiny",%
+ "TitleGrouping", "TitsGroupT", "ToBoxes", "ToCharacterCode",%
+ "ToColor", "ToContinuousTimeModel", "ToDate", "Today",%
+ "ToDiscreteTimeModel", "ToEntity", "ToeplitzMatrix", "ToExpression",%
+ "ToFileName", "Together", "Toggle", "ToggleFalse", "Toggler",%
+ "TogglerBar", "TogglerBox", "TogglerBoxOptions", "ToHeldExpression",%
+ "ToInvertibleTimeSeries", "TokenWords", "Tolerance", "ToLowerCase",%
+ "Tomorrow", "ToNumberField", "TooBig", "Tooltip", "TooltipBox",%
+ "TooltipBoxOptions", "TooltipDelay", "TooltipStyle", "Top",%
+ "TopHatTransform", "ToPolarCoordinates", "TopologicalSort",%
+ "ToRadicals", "ToRules", "ToSphericalCoordinates", "ToString",%
+ "Total", "TotalHeight", "TotalLayer", "TotalVariationFilter",%
+ "TotalWidth", "TouchPosition", "TouchscreenAutoZoom",%
+ "TouchscreenControlPlacement", "ToUpperCase", "Tr", "Trace",%
+ "TraceAbove", "TraceAction", "TraceBackward", "TraceDepth",%
+ "TraceDialog", "TraceForward", "TraceInternal", "TraceLevel",%
+ "TraceOff", "TraceOn", "TraceOriginal", "TracePrint", "TraceScan",%
+ "TrackedSymbols", "TrackingFunction", "TracyWidomDistribution",%
+ "TradingChart", "TraditionalForm", "TraditionalFunctionNotation",%
+ "TraditionalNotation", "TraditionalOrder", "TransferFunctionCancel",%
+ "TransferFunctionExpand", "TransferFunctionFactor",%
+ "TransferFunctionModel", "TransferFunctionPoles",%
+ "TransferFunctionTransform", "TransferFunctionZeros",%
+ "TransformationClass", "TransformationFunction",%
+ "TransformationFunctions", "TransformationMatrix",%
+ "TransformedDistribution", "TransformedField", "TransformedProcess",%
+ "TransformedRegion", "TransitionDirection", "TransitionDuration",%
+ "TransitionEffect", "TransitiveClosureGraph",%
+ "TransitiveReductionGraph", "Translate", "TranslationOptions",%
+ "TranslationTransform", "Transliterate", "Transparent",%
+ "TransparentColor", "Transpose", "TrapSelection", "TravelDirections",%
+ "TravelDirectionsData", "TravelDistance", "TravelDistanceList",%
+ "TravelMethod", "TravelTime", "TreeForm", "TreeGraph", "TreeGraphQ",%
+ "TreePlot", "TrendStyle", "Triangle", "TriangleWave",%
+ "TriangularDistribution", "TriangulateMesh", "Trig", "TrigExpand",%
+ "TrigFactor", "TrigFactorList", "Trigger", "TrigReduce", "TrigToExp",%
+ "TrimmedMean", "TropicalStormData", "True", "TrueQ",%
+ "TruncatedDistribution", "TsallisQExponentialDistribution",%
+ "TsallisQGaussianDistribution", "TTest", "Tube",%
+ "TubeBezierCurveBox", "TubeBezierCurveBoxOptions", "TubeBox",%
+ "TubeBoxOptions", "TubeBSplineCurveBox",%
+ "TubeBSplineCurveBoxOptions", "Tuesday", "TukeyLambdaDistribution",%
+ "TukeyWindow", "TunnelData", "Tuples", "TuranGraph", "TuringMachine",%
+ "TuttePolynomial", "UnateQ", "Uncompress", "Undefined", "UnderBar",%
+ "Underflow", "Underlined", "Underoverscript", "UnderoverscriptBox",%
+ "UnderoverscriptBoxOptions", "Underscript", "UnderscriptBox",%
+ "UnderscriptBoxOptions", "UnderseaFeatureData", "UndirectedEdge",%
+ "UndirectedGraph", "UndirectedGraphQ", "UndoOptions",%
+ "UndoTrackedVariables", "Unequal", "UnequalTo", "Unevaluated",%
+ "UniformDistribution", "UniformGraphDistribution",%
+ "UniformSumDistribution", "Uninstall", "Union", "UnionPlus",%
+ "Unique", "UnitaryMatrixQ", "UnitBox", "UnitConvert",%
+ "UnitDimensions", "Unitize", "UnitRootTest", "UnitSimplify",%
+ "UnitStep", "UnitSystem", "UnitTriangle", "UnitVector",%
+ "UnityDimensions", "UniverseModelData", "UniversityData", "UnixTime",%
+ "Unprotect", "UnsameQ", "UnsavedVariables", "Unset", "UnsetShared",%
+ "UntrackedVariables", "Up", "UpArrow", "UpArrowBar",%
+ "UpArrowDownArrow", "Update", "UpdateDynamicObjects",%
+ "UpdateDynamicObjectsSynchronous", "UpdateInterval",%
+ "UpdateSearchIndex", "UpDownArrow", "UpEquilibrium", "UpperCaseQ",%
+ "UpperLeftArrow", "UpperRightArrow", "UpperTriangularize",%
+ "Upsample", "UpSet", "UpSetDelayed", "UpTee", "UpTeeArrow", "UpTo",%
+ "UpValues", "URL", "URLBuild", "URLDecode", "URLDispatcher",%
+ "URLDownload", "URLEncode", "URLExecute", "URLExistsQ", "URLExpand",%
+ "URLFetch", "URLFetchAsynchronous", "URLParse", "URLQueryDecode",%
+ "URLQueryEncode", "URLRead", "URLSave", "URLSaveAsynchronous",%
+ "URLShorten", "URLSubmit", "UseGraphicsRange", "UserDefinedWavelet",%
+ "Using", "UsingFrontEnd", "UtilityFunction", "V2Get",%
+ "ValidationLength", "ValidationSet", "Value", "ValueBox",%
+ "ValueBoxOptions", "ValueDimensions", "ValueForm", "ValueQ",%
+ "Values", "ValuesData", "Variables", "Variance",%
+ "VarianceEquivalenceTest", "VarianceEstimatorFunction",%
+ "VarianceGammaDistribution", "VarianceTest", "VectorAngle",%
+ "VectorColorFunction", "VectorColorFunctionScaling",%
+ "VectorDensityPlot", "VectorGlyphData", "VectorPlot", "VectorPlot3D",%
+ "VectorPoints", "VectorQ", "Vectors", "VectorScale", "VectorStyle",%
+ "Vee", "Verbatim", "Verbose", "VerboseConvertToPostScriptPacket",%
+ "VerificationTest", "VerifyConvergence",%
+ "VerifySecurityCertificates", "VerifySolutions",%
+ "VerifyTestAssumptions", "Version", "VersionNumber", "VertexAdd",%
+ "VertexCapacity", "VertexColors", "VertexComponent",%
+ "VertexConnectivity", "VertexContract", "VertexCoordinateRules",%
+ "VertexCoordinates", "VertexCorrelationSimilarity",%
+ "VertexCosineSimilarity", "VertexCount", "VertexCoverQ",%
+ "VertexDataCoordinates", "VertexDegree", "VertexDelete",%
+ "VertexDiceSimilarity", "VertexEccentricity", "VertexInComponent",%
+ "VertexInDegree", "VertexIndex", "VertexJaccardSimilarity",%
+ "VertexLabeling", "VertexLabels", "VertexLabelStyle", "VertexList",%
+ "VertexNormals", "VertexOutComponent", "VertexOutDegree", "VertexQ",%
+ "VertexRenderingFunction", "VertexReplace", "VertexShape",%
+ "VertexShapeFunction", "VertexSize", "VertexStyle",%
+ "VertexTextureCoordinates", "VertexWeight", "Vertical",%
+ "VerticalBar", "VerticalForm", "VerticalGauge", "VerticalSeparator",%
+ "VerticalSlider", "VerticalTilde", "ViewAngle", "ViewCenter",%
+ "ViewMatrix", "ViewPoint", "ViewPointSelectorSettings", "ViewPort",%
+ "ViewRange", "ViewVector", "ViewVertical", "VirtualGroupData",%
+ "Visible", "VisibleCell", "VoigtDistribution", "VolcanoData",%
+ "Volume", "VonMisesDistribution", "VoronoiMesh", "WaitAll",%
+ "WaitAsynchronousTask", "WaitNext", "WaitUntil",%
+ "WakebyDistribution", "WalleniusHypergeometricDistribution",%
+ "WaringYuleDistribution", "WarpingCorrespondence", "WarpingDistance",%
+ "WatershedComponents", "WatsonUSquareTest",%
+ "WattsStrogatzGraphDistribution", "WaveletBestBasis",%
+ "WaveletFilterCoefficients", "WaveletImagePlot", "WaveletListPlot",%
+ "WaveletMapIndexed", "WaveletMatrixPlot", "WaveletPhi", "WaveletPsi",%
+ "WaveletScale", "WaveletScalogram", "WaveletThreshold",%
+ "WeaklyConnectedComponents", "WeaklyConnectedGraphComponents",%
+ "WeaklyConnectedGraphQ", "WeakStationarity", "WeatherData",%
+ "WeatherForecastData", "WeberE", "Wedge", "Wednesday",%
+ "WeibullDistribution", "WeierstrassHalfPeriods",%
+ "WeierstrassInvariants", "WeierstrassP", "WeierstrassPPrime",%
+ "WeierstrassSigma", "WeierstrassZeta", "WeightedAdjacencyGraph",%
+ "WeightedAdjacencyMatrix", "WeightedData", "WeightedGraphQ",%
+ "Weights", "WelchWindow", "WheelGraph", "WhenEvent", "Which",%
+ "While", "White", "WhiteNoiseProcess", "WhitePoint", "Whitespace",%
+ "WhitespaceCharacter", "WhittakerM", "WhittakerW", "WienerFilter",%
+ "WienerProcess", "WignerD", "WignerSemicircleDistribution",%
+ "WikipediaData", "WikipediaSearch", "WilksW", "WilksWTest",%
+ "WindDirectionData", "WindowClickSelect", "WindowElements",%
+ "WindowFloating", "WindowFrame", "WindowFrameElements",%
+ "WindowMargins", "WindowMovable", "WindowOpacity", "WindowSelected",%
+ "WindowSize", "WindowStatusArea", "WindowTitle", "WindowToolbars",%
+ "WindowWidth", "WindSpeedData", "WindVectorData",%
+ "WishartMatrixDistribution", "With", "WolframAlpha",%
+ "WolframAlphaDate", "WolframAlphaQuantity", "WolframAlphaResult",%
+ "WolframLanguageData", "Word", "WordBoundary", "WordCharacter",%
+ "WordCloud", "WordCount", "WordCounts", "WordData", "WordDefinition",%
+ "WordFrequency", "WordFrequencyData", "WordList", "WordOrientation",%
+ "WordSearch", "WordSeparators", "WordSpacings", "WordStem",%
+ "WordTranslation", "WorkingPrecision", "WrapAround", "Write",%
+ "WriteLine", "WriteString", "Wronskian", "XMLElement", "XMLObject",%
+ "XMLTemplate", "Xnor", "Xor", "XYZColor", "Yellow", "Yesterday",%
+ "YuleDissimilarity", "ZernikeR", "ZeroSymmetric", "ZeroTest",%
+ "ZeroWidthTimes", "Zeta", "ZetaZero", "ZIPCodeData",%
+ "ZipfDistribution", "ZoomCenter", "ZoomFactor", "ZTest",%
+ "ZTransform"%
+ }%
+ morendkeywords={%
+ "$Aborted", "$ActivationGroupID", "$ActivationKey",%
+ "$ActivationUserRegistered", "$AddOnsDirectory",%
+ "$AllowExternalChannelFunctions", "$AssertFunction", "$Assumptions",%
+ "$AsynchronousTask", "$AudioOutputDevices", "$BaseDirectory",%
+ "$BatchInput", "$BatchOutput", "$BoxForms", "$ByteOrdering",%
+ "$CacheBaseDirectory", "$Canceled", "$ChannelBase",%
+ "$CharacterEncoding", "$CharacterEncodings", "$CloudBase",%
+ "$CloudConnected", "$CloudCreditsAvailable", "$CloudEvaluation",%
+ "$CloudExpressionBase", "$CloudRootDirectory", "$CloudSymbolBase",%
+ "$CloudVersion", "$CloudVersionNumber", "$CommandLine",%
+ "$CompilationTarget", "$ConditionHold", "$ConfiguredKernels",%
+ "$Context", "$ContextPath", "$ControlActiveSetting", "$Cookies",%
+ "$CookieStore", "$CreationDate", "$CurrentLink", "$DateStringFormat",%
+ "$DefaultAudioOutputDevice", "$DefaultFont", "$DefaultFrontEnd",%
+ "$DefaultImagingDevice", "$DefaultLocalBase", "$DefaultPath",%
+ "$Display", "$DisplayFunction", "$DistributedContexts",%
+ "$DynamicEvaluation", "$Echo", "$EmbedCodeEnvironments",%
+ "$EmbeddableServices", "$EntityStores", "$Epilog",%
+ "$EvaluationCloudObject", "$EvaluationEnvironment", "$ExportFormats",%
+ "$Failed", "$FinancialDataSource", "$FontFamilies", "$FormatType",%
+ "$FrontEnd", "$FrontEndSession", "$GeoEntityTypes", "$GeoLocation",%
+ "$GeoLocationCity", "$GeoLocationCountry", "$GeoLocationPrecision",%
+ "$GeoLocationSource", "$HistoryLength", "$HomeDirectory",%
+ "$HTMLExportRules", "$HTTPCookies", "$HTTPRequest", "$IgnoreEOF",%
+ "$ImageFormattingWidth", "$ImagingDevice", "$ImagingDevices",%
+ "$ImportFormats", "$InitialDirectory", "$Input", "$InputFileName",%
+ "$InputStreamMethods", "$Inspector", "$InstallationDate",%
+ "$InstallationDirectory", "$InterfaceEnvironment",%
+ "$InterpreterTypes", "$IterationLimit", "$KernelCount", "$KernelID",%
+ "$Language", "$LaunchDirectory", "$LibraryPath",%
+ "$LicenseExpirationDate", "$LicenseID", "$LicenseProcesses",%
+ "$LicenseServer", "$LicenseSubprocesses", "$LicenseType", "$Line",%
+ "$Linked", "$LinkSupported", "$LoadedFiles", "$LocalBase",%
+ "$LocalSymbolBase", "$MachineAddresses", "$MachineDomain",%
+ "$MachineDomains", "$MachineEpsilon", "$MachineID", "$MachineName",%
+ "$MachinePrecision", "$MachineType", "$MaxExtraPrecision",%
+ "$MaxLicenseProcesses", "$MaxLicenseSubprocesses",%
+ "$MaxMachineNumber", "$MaxNumber", "$MaxPiecewiseCases",%
+ "$MaxPrecision", "$MaxRootDegree", "$MessageGroups", "$MessageList",%
+ "$MessagePrePrint", "$Messages", "$MinMachineNumber", "$MinNumber",%
+ "$MinorReleaseNumber", "$MinPrecision", "$ModuleNumber",%
+ "$NetworkLicense", "$NewMessage", "$NewSymbol", "$Notebooks",%
+ "$NumberMarks", "$Off", "$OperatingSystem", "$Output",%
+ "$OutputForms", "$OutputSizeLimit", "$OutputStreamMethods",%
+ "$Packages", "$ParentLink", "$ParentProcessID", "$PasswordFile",%
+ "$PatchLevelID", "$Path", "$PathnameSeparator", "$PerformanceGoal",%
+ "$Permissions", "$PermissionsGroupBase", "$PhoneNumber",%
+ "$PipeSupported", "$PlotTheme", "$Post", "$Pre",%
+ "$PreferencesDirectory", "$PrePrint", "$PreRead", "$PrintForms",%
+ "$PrintLiteral", "$Printout3DPreviewer", "$ProcessID",%
+ "$ProcessorCount", "$ProcessorType", "$ProductInformation",%
+ "$ProgramName", "$RandomState", "$RecursionLimit",%
+ "$RegisteredDeviceClasses", "$RegisteredUserName", "$ReleaseNumber",%
+ "$RequesterAddress", "$RequesterWolframID", "$RequesterWolframUUID",%
+ "$RootDirectory", "$ScheduledTask", "$ScriptCommandLine",%
+ "$ScriptInputString", "$Services", "$SessionID", "$SetParentLink",%
+ "$SharedFunctions", "$SharedVariables", "$SMSDestination",%
+ "$SoundDisplay", "$SoundDisplayFunction", "$SourceLink",%
+ "$SuppressInputFormHeads", "$SynchronousEvaluation",%
+ "$SyntaxHandler", "$System", "$SystemCharacterEncoding", "$SystemID",%
+ "$SystemMemory", "$SystemShell", "$SystemTimeZone",%
+ "$SystemWordLength", "$TemplatePath", "$TemporaryDirectory",%
+ "$TemporaryPrefix", "$TextStyle", "$TimedOut", "$TimeUnit",%
+ "$TimeZone", "$TimeZoneEntity", "$TopDirectory", "$TraceOff",%
+ "$TraceOn", "$TracePattern", "$TracePostAction", "$TracePreAction",%
+ "$UnitSystem", "$Urgent", "$UserAddOnsDirectory",%
+ "$UserAgentLanguages", "$UserAgentMachine", "$UserAgentName",%
+ "$UserAgentOperatingSystem", "$UserAgentString", "$UserAgentVersion",%
+ "$UserBaseDirectory", "$UserDocumentsDirectory", "$UserName",%
+ "$Version", "$VersionNumber", "$WolframID", "$WolframUUID"%
+ }%
+}
+% \end{macrocode}
+%^^A $ to make emacs font locking happy
+%
+% \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}
+%^^A $ to make emacs font locking happy
+% \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}
+%</lang1>
+% \end{macrocode}
+% \endgroup
+%^^A $ to make emacs font locking happy
+%
+%
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%^^A $ to make emacs font locking happy
+%
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%^^A $ to make emacs font locking happy
+%
+%
+% \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.
+%
+% In August 2013
+% \lstthanks{Alexis~Dimitriadis}{A.Dimitriadis@uu.nl}{2013/08/15} reworked
+% the definition by supplying the builtins.
+% \begingroup
+% \begin{macrocode}
+%<*lang1>
+% \end{macrocode}
+% \begin{macrocode}
+%%
+%% Python definition (c) 1998 Michael Weber
+%% Additional definitions (2013) Alexis Dimitriadis
+%%
+\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},%
+% \end{macrocode}
+% Python has a long list of builtin-in functions
+% (\url{http://docs.python.org/2/library/functions.html}) and it is a good
+% idea to make them visible in printed code
+% \begin{macrocode}
+ % Built-ins
+ morekeywords=[2]{abs, all, any, basestring, bin, bool, bytearray,%
+ callable, chr, classmethod, cmp, compile, complex, delattr, dict, dir,%
+ divmod, enumerate, eval, execfile, file, filter, float, format,%
+ frozenset, getattr, globals, hasattr, hash, help, hex, id, input, int,%
+ isinstance, issubclass, iter, len, list, locals, long, map, max,%
+ memoryview, min, next, object, oct, open, ord, pow, property, range,%
+ raw_input, reduce, reload, repr, reversed, round, set, setattr, slice,%
+ sorted, staticmethod, str, sum, super, tuple, type, unichr, unicode,%
+ vars, xrange, zip, apply, buffer, coerce, intern},%
+ sensitive=true,%
+ morecomment=[l]\#,%
+ morestring=[b]',%
+ morestring=[b]",%
+% \end{macrocode}
+% According to PEP (Python Enhancement Proposals) comment should be
+% distinguished from documentation strings, so we define
+% \begin{macrocode}
+ morecomment=[s]{'''}{'''},% used for documentation text
+ % (mulitiline strings)
+ morecomment=[s]{"""}{"""},% added by Philipp Matthias Hahn
+% \end{macrocode}
+% \lsthelper{J\"urgen Dietel}{j.dietel@rz.rwth-aachen}{2015/05/05}{} provided
+% an example with a wrong representation of documentation strings, so the
+% two lines above got changed from |morestring| $\rightarrow$ |morecomment|.
+%
+% Python now supports so called \emph{raw strings} and also Unicode
+% strings. Here is the definition of these strings:
+% \begin{macrocode}
+ morestring=[s]{r'}{'},% `raw' strings
+ morestring=[s]{r"}{"},%
+ morestring=[s]{r'''}{'''},%
+ morestring=[s]{r"""}{"""},%
+ morestring=[s]{u'}{'},% unicode strings
+ morestring=[s]{u"}{"},%
+ morestring=[s]{u'''}{'''},%
+ morestring=[s]{u"""}{"""}%
+}%
+% \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}
+%</lang1>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \begingroup
+% Alexis Dimitriadis also proposes the following configuration for printing
+% Python code which simulates colorizing the code as it's done by the IDLE
+% GUI:
+% \begin{macrocode}
+%<*python-prf>
+% \end{macrocode}
+% \begin{macrocode}
+\usepackage{xcolor}
+\usepackage{textcomp}
+
+%% Actual colors from idlelib/config-highlight.def
+%% --> corrected to ``web-safe''
+%% strings = #00aa00 / 0,170,0 (a darker green)
+%% builtins = #900090 / 144,0,144 (purple-ish)
+%% keywords = #FF7700 / 255,119,0 (quite close to plain `orange')
+%\definecolor{IDLEorange}{RGB}{255,119,0} % pretty close to real orange
+%\definecolor{IDLEpurple}{RGB}{144,0,144}
+%\definecolor{IDLEgreen}{RGB}{0,170,0}
+%\definecolor{IDLEred}{RGB}{221,0,0}
+%% Corrected to ``web-safe''
+%\definecolor{orange2}{RGB}{255,102,0}
+\definecolor{purple2}{RGB}{153,0,153} % there's actually no standard purple
+\definecolor{green2}{RGB}{0,153,0} % a darker green
+%\definecolor{red2}{RGB}{221,0,0}
+
+% Except for green and purple, the other colors are pretty good in standard
+% hue
+\lstdefinestyle{python-idle-code}{%
+ language=Python, % the language
+ basicstyle=\normalsize\ttfamily, % size of the fonts for the code
+ % Color settings to match IDLE style
+ keywordstyle=\color{orange}, % core keywords
+ keywordstyle={[2]\color{purple2}}, % built-ins
+ stringstyle=\color{green2},%
+ commentstyle=\color{red},%
+ upquote=true, % requires textcomp
+}
+% Unimplemented IDLE syntax: function/class names being defined should be
+% blue
+% \end{macrocode}
+% This code is provided in the file |listings-python.prf|, see section
+% 2.4.1 (Preferences) of the \packagename{listings} documentation.
+% \begin{macrocode}
+%</python-prf>
+% \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 <ptjm@interlog.com>
+%%
+\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}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+% There are two dialects of Rexx: the one from System Product Interpreter
+% Reference, VM/XA SP Release 1 and Release 2 and the modern version
+% ooRexx (see \url{http://www.oorexx.org/}).
+%
+%
+% \subsubsection{Rexx---VM/XA}
+%
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% \begin{macrocode}
+%%
+%% REXX keywords from System Product Interpreter Reference, VM/XA SP Release 1
+%% and Release 2
+\lst@definelanguage[VM/XA]{Rexx}[]{Rexx}{%
+ morekeywords={all,by,digits,commands,end,engineering,error,errors,expose,%
+ external,for,form,fuzz,halt,labels,intermediates,negative,normal,novalue,%
+ on,off,results,scan,scientific,select,source,stream,syntax,until,upper,%
+ value,var,version,while,with},%
+ ndkeywords={abbrev,abs,address,bitand,bitor,bitxor,center,centre,%
+ compare,copies,c2d,c2x,datatype,date,delstr,delword,diag,diagrc,%
+ d2c,d2x,errortext,externals,find,format,index,insert,justify,%
+ lastpos,left,length,linesize,max,min,overlay,pos,queued,random,%
+ reverse,rigth,sign,sourceline,space,storage,strip,substr,subword,%
+ symbol,time,translate,trunc,userid,value,verify,word,wordindex,%
+ wordlength,words,xrange,x2c,x2d},%
+ sensitive=false,%
+ morestring=[d]",%
+ morestring=[d]',%
+ morecomment=[s]{/*}{*/},%
+ alsoletter={:},%
+}[keywords,comments,strings]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsubsection{ooRexx}
+%
+% \begingroup
+% \begin{macrocode}
+%<*lang2>
+% \end{macrocode}
+% \begin{macrocode}
+%%
+%% ooREXX keywords (http://www.oorexx.org/)
+\lst@definelanguage[]{OORexx}[VM/XA]{Rexx}{%
+ morekeywords={::class, ::method, ::attribute},%
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</lang2>
+% \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}
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%^^A $ to make emacs font locking happy
+%
+%
+% \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}
+%</lang3>
+% \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}
+%</lang2>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \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}
+%</lang3>
+% \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}. \lsthelper{Hilmar
+% Preuße}{hille42@web.de}{2019/01/28}{added keyword} informed about an issue mentioned at
+% \url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=626521}, the issue
+% got corrected.
+% \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,BEGIN,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}
+%</lang1>
+% \end{macrocode}
+% \endgroup
+%
+%
+% \subsection{Swift}
+%
+% The definition for Swift was provided by
+% \lstthanks{Stefan Jager}{-}{2017/11/13}.
+%
+% \begingroup
+% \begin{macrocode}
+%<*lang3>
+% \end{macrocode}
+% \begin{macrocode}
+\lst@definelanguage{Swift}{%
+ morekeywords={associatedtype,class,deinit,enum,extension,fileprivate,%
+ func,import,init,inout,internal,let,open,operator,private,protocol,%
+ public,static,struct,subscript,typealias,var,break,case,continue,%
+ default,defer,do,else,fallthrough,for,guard,if,in,repeat,return,%
+ switch,where,while,as,Any,catch,false,is,nil,rethrows,super,self,%
+ Self,throw,throws,true,try,_,associativity,convenience,dynamic,%
+ didSet,final,get,infix,indirect,lazy,left,mutating,none,%
+ nonmutating,optional,override,postfix,precedence,prefix,Protocol,%
+ required,right,set,Type,unowned,weak,willSet},%
+ sensitive,%
+ morecomment=[s]{/*}{*/},%
+ morecomment=[s]{/**}{*/},%
+ morecomment=[l]//,%
+ morecomment=[l]///,%
+ morestring=[b]",%
+ morestring=[b]""",%
+ moredelim=*[directive]\#,%
+ moredirectives={available,colorLiteral,column,else,elseif,endif,file,%
+ fileLiteral,function,if,imageLiteral,line,selector,sourceLocation}%
+ }[keywords,comments,strings,directives]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang3>
+% \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}
+%</lang2>
+% \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}
+%</lang3>
+% \end{macrocode}
+% \endgroup
+%^^A $ to make emacs font locking happy
+%
+%
+% \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}
+% \lsthelper{Herbert Voss}{Herbert.Voss@FU-Berlin.DE}{2013-12-12}{typo}
+% pointed to a typo: the \TeX{} primitive is |lineskiplimit| instead of
+% |lineskiplimits|.
+% \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,lineskiplimit,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$_},%$ to make Emacs fontlocking happy
+ morecomment=[l]\%%
+ }[keywords,tex,comments]%
+% \end{macrocode}
+% \begin{macrocode}
+%</lang3>
+% \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}
+%</lang2>
+% \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 <c.h.g.wright@ieee.org>
+%% 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}
+%</lang3>
+% \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}
+%</lang1>
+% \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}
+%</lang2>
+% \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}
+%</lang1>
+% \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}
+%</lang1>
+% \end{macrocode}
+%^^A $ to make emacs font locking happy
+% \endgroup
+%
+%
+% \ifmulticols
+% \addtocontents{toc}{\protect\end{multicols}}
+% \fi
+%
+%^^A \setcounter{IndexColumns}{2}
+%^^A \PrintIndex
+%
+%
+% \Finale
+%
+\endinput
diff --git a/macros/latex/contrib/listings/lstdrvrs.ins b/macros/latex/contrib/listings/lstdrvrs.ins
new file mode 100644
index 0000000000..b02f69b9a4
--- /dev/null
+++ b/macros/latex/contrib/listings/lstdrvrs.ins
@@ -0,0 +1,62 @@
+%%
+%% This is file `lstdrvrs.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lstdrvrs.dtx (with options: `install')
+%%
+%% The listings package is copyright 1996--2004 Carsten Heinz, and
+%% continued maintenance on the package is copyright 2006--2007 Brooks
+%% Moses. From 2013 on the maintenance is done by Jobst Hoffmann.
+%% The drivers are copyright 1997/1998/1999/2000/2001/2002/2003/2004/2006/
+%% 2007/2013 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.3c 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 Jobst Hoffmann at <j.hoffmann@fh-aachen.de>.
+%%
+\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}}
+}
+
+\generate{
+ \file{listings-acm.prf}{\from{lstdrvrs.dtx}{acm-prf}}
+ \file{listings-bash.prf}{\from{lstdrvrs.dtx}{bash-prf}}
+ \file{listings-fortran.prf}{\from{lstdrvrs.dtx}{fortran-prf}}
+ \file{listings-hansl.prf}{\from{lstdrvrs.dtx}{hansl-prf}}
+ \file{listings-lua.prf}{\from{lstdrvrs.dtx}{lua-prf}}
+ \file{listings-python.prf}{\from{lstdrvrs.dtx}{python-prf}}
+}
+
+\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
+ [2019/02/27 1.8b listings language file]
+\endinput
+%%
+%% End of file `lstdrvrs.ins'.
diff --git a/macros/latex/contrib/listings/lstdrvrs.pdf b/macros/latex/contrib/listings/lstdrvrs.pdf
new file mode 100644
index 0000000000..823831c95d
--- /dev/null
+++ b/macros/latex/contrib/listings/lstdrvrs.pdf
Binary files differ