%%
%% This is file `lstpatch.sty', generated manually.
%%
%% Please read the software license in listings.dtx or listings.dvi.
%%
%% (w)(c) 2002 Carsten Heinz
%%
%% This file is distributed under the terms of the LaTeX Project Public
%% License from CTAN archives in directory  macros/latex/base/lppl.txt.
%% Either version 1.0 or, at your option, any later version.
%%
%% Send comments and ideas on the package, error reports and additional
%% programming languages to <cheinz@gmx.de>.
%%
%% This patch file will remove the following bugs from the listings package.
%% Each item contains the bug finder with date of report and first bug fix
%% version, a short description of the problem, and the reason for the bug
%% in parenthesis.
%%
%%  1) Jochen Schneider, 2002/04/03, 1.0a (2002/04/05)
%%
%%     undefined control sequence \lst@CommentB with HTML, XML, tcl
%%     (I didn't renamed them to \lst@DefDelimB|E)
%%
%%  2) Michael Niedermair, 2002/04/07, 1.0b
%%
%%     undefined control sequence \lst@commentmode with XML
%%     (mode not defined any more)
%%
%%  3) Carsten Heinz, 2002/04/08, 1.0b
%%
%%     bad PODs (investigating bugs 1 and 2)
%%     (definition doesn't use 1.0 style)
%%
%%  4) Peter Bartke, 2002/04/10, 1.0b
%%
%%     various problems with fancyvrb interface: string ".5" at beginning
%%     of first line when using lineskip; ditto "perhaps a missing \item
%%     error"; wrong placed characters , and - when using fancyvrb
%%     (bad use of \strip@pt; TeX is not in vertical mode when leaving
%%     Verbatim; bad `noligs' handling)
%%
%%  5) Rolf Niepraschk, 2002/04/12, 1.0b
%%
%%     \RequirePackage is missing keywordstyle when near the top of a page
%%     (\lst@lastother not saved away across page breaks)
%%
%%  6) Peter Ruckdeschel, 2002/04/12, 1.0b
%%     Timothy Van Zandt analyzed and fixed the bug
%%
%%     incompatibility with seminar class
%%     (bad assignment of \lst@do@noligs in \lst@SelectCharTable)
%%
%%  7) Rene H. Larsen, 2002/04/12, 1.0b
%%
%%     \lstinputlistings and texcl conflict
%%     (^^M not active to reenter modes)
%%
%%  8) Carsten Heinz, 2002/04/15, 1.0b (2002/04/15)
%%
%%     gobble doesn't always work (investigating problem with VTeX)
%%     (\lst@BOLGobble@ must test against \lst@Process{FormFeed|Tabulator}X)
%%
%%  9) Peter Bartke, 2002/04/17, 1.0c
%%
%%     TeX capacity exceeded with fancyvrb
%%     (\let\lst@entermodes\@empty must stay in \lstFV@VerbatimBegin)
%%
%% 10) Svend Tollak Munkejord, 2002/04/17, 1.0c
%%     Heiko Oberdiek analyzed and fixed the bug
%%
%%     package incompatible with Lucida .fd files
%%     (parentheses have active catcodes when reading the file)
%%
%% 11) Carsten Hamm, 2002/04/19, 1.0c (2002/04/24)
%%
%%     wrong frame rules with breaklines and xleftmargin>0pt
%%     (missing \kern-\lst@xleftmargin in \lst@discretionary)
%%
%% 12) Michael Niedermair, 2002/05/14, 1.0d
%%
%%     backgroundcolor take effect on bottom captions
%%     (wrong order of \everypar{} and \lsthk@ExitVars in \lst@DeInit)
%%
%% 13) Georg Rehm, 2002/05/14, 1.0d
%%
%%     bad baselineskip with captionpos=b
%%     (missing \normalbaselines)
%%
%% 14) Herfried Karl Wagner, 2002/05/11, 1.0d
%%
%%     undefined control sequence \lst@entermodes
%%     (\output called before first \lst@EnterMode)
%%
%% 15) Peter K\"oller, 2002/05/24, 1.0d
%%
%%     XML keywords don't have keywordstyle
%%     (missing \ifx... in implementation of contentsstyle)
%%
%% 16) Stephen Reindl, 2002/05/28, 1.0d
%%
%%     \inaccessible using Cobol
%%     (\lst@Delim@option didn't enclose option in [])
%%
%% 17) Stephen Reindl, 2002/06/04, 1.0d (2002/06/12)
%%
%%     frames not deactivated for text style listings
%%
%% 18) Carsten Heinz, 2002/07/27, 1.0e (2002/07/31)
%%
%%     broken keywordcomments
%%     (\lst@KCpost inside group level 2; bad \lst@BeginComment call)
%%
%%
%% Moreover the following functionality is added.
%%
%%  a) option "final" (Rolf Niepraschk, Enrico Straube)
%%
%%  b) keys "fvcmdparams" and "morefvcmdparams" (Denis Girou)
%%
%%  c) key "contentstyle" (Peter K\"oller)
%%
%%  d) key "numberfirstline" (Georg Rehm)
%%
%%
\ProvidesFile{lstpatch.sty}[2002/07/31 1.0e (Carsten Heinz)]
\lst@CheckVersion{1.0}
{\typeout{^^J%
    ***^^J%
    *** This is a patch for `listings.sty' version 1.0, but^^J%
    *** you're using version \lst@version.^^J%
    ***^^J
    *** Patch file not loaded.^^J%
    ***^^J}%
    \endinput
}
%
% 1) Define the missing control sequences. (Not needed any more.)
\def\lstpatch@comments{%
    \global\let\lst@CommentB\lst@DefDelimB
    \global\let\lst@CommentE\lst@DefDelimE}
%
% 2) Define  \lst@commentmode.
\lst@NewMode\lst@commentmode
%
% 3) Introduce \lst@ifxpodcomment as master-clause and define 1.0 style
%    contents for SelectCharTable.
\def\lstpatch@pod{%
\lst@Key{podcomment}{false}[t]{\lstKV@SetIf{##1}\lst@ifxpodcomment}%
\lst@AddToHookExe{SetLanguage}{\let\lst@ifxpodcomment\iffalse}%
\lst@AddToHook{SelectCharTable}%
    {\lst@ifxpodcomment
         \lst@CArgX =\relax\lst@DefDelimB{}{}%
           {\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}}% modified
         \lst@CArgX =cut\^^M\relax\lst@DefDelimE
           {\lst@CalcColumn}%
           {\ifnum\@tempcnta=\z@\else
                \expandafter\@gobblethree
            \fi}%
           {}%
           \lst@EndComment\lst@PODmode
	 \fi}%
}
%
% 4) Redefine lineskip like podcomment above and don't use \strip@pt
%    together with \divide.
\def\lstpatch@lineshape{%
\lst@Key{lineskip}{\z@}{\def\lst@xlineskip{##1\relax}}
\lst@AddToHook{Init}
    {\ifdim\z@=\lst@xlineskip\else
         \@tempdima\baselineskip
         \advance\@tempdima\lst@xlineskip
         \multiply\@tempdima\@cclvi
         \divide\@tempdima\baselineskip\relax
         \multiply\@tempdima\@cclvi
         \edef\baselinestretch{\strip@pt\@tempdima}%
         \selectfont
     \fi}%
% 11) Add \kern-\lst@xleftmargin.
\gdef\lst@discretionary{%
    \discretionary{\let\space\lst@spacekern\lst@prebreak}%
                  {\llap{\lsthk@EveryLine
                   \kern\lst@breakcurrindent\kern-\lst@xleftmargin}%
                   \let\space\lst@spacekern\lst@postbreak}{}}%
}
% Back to 4): Insert \par for vertical mode.
\def\lstpatch@fancyvrb{%
\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 % modified
    \fi}%
% 9) Redefined \lstFV@VerbatimBegin removed.
% b) Refine conversion definitions to either work as usual or to ...
\gdef\lst@FVConvert{\@tempcnta\z@ \lst@FVConvertO@}%
\gdef\lst@FVConvertO@{%
    \ifcase\@tempcnta \expandafter
        \futurelet\expandafter\@let@token\expandafter\lst@FVConvert@@
    \else
% append arguments as they are.
        \expandafter\lst@FVConvertO@a
    \fi}%
\gdef\lst@FVConvertO@a##1{%
    \lst@lAddTo\lst@arg{{##1}}\advance\@tempcnta\m@ne
    \lst@FVConvertO@}%
% Here, ...
\gdef\lst@FVConvert@##1{%
    \ifx \@nil##1\else
       \if\relax\noexpand##1%
          \lst@lAddTo\lst@arg{\lst@OutputLostSpace\lst@PrintToken##1}%
% ... actually here, we check for commands with arguments and set the
% value of \@tempcnta as required.
          \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}
% Eventually we define user keys to adjust \lst@FVcmdparams. The base
% set of commands and parameter numbers was provided by Denis Girou.
\lst@Key{fvcmdparams}%
% D.G. suggestion begin - 2002/05/31
    {\overlay\@ne}%
% D.G. suggestion end
    {\def\lst@FVcmdparams{,##1}}%
\lst@Key{morefvcmdparams}\relax{\lst@lAddTo\lst@FVcmdparams{,##1}}%
}
%
% 5) Extend \lst@SaveToken to save \lst@lastother.
\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}%
}
%
% 6) Assign \lst@do@noligs to \do.
\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
    \let\do\lst@do@noligs \verbatim@nolig@list % modified
    \lsthk@SelectCharTable
    \lst@DeveloperSCT
    \ifx\lst@Backslash\relax\else
        \lst@LetSaveDef{"5C}\lsts@backslash\lst@Backslash
    \fi}
% 4)+6) And we need correct versions of \lst@do@noligs[@].
\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}}
%
% 7) Make ^^M active.
\def\lst@InputListing#1{%
    \begingroup
      \lsthk@PreSet \gdef\lst@intname{#1}%
      \expandafter\lstset\expandafter{\lst@set}%
      \lsthk@DisplayStyle
      \catcode\active=\active % added
      \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}
%
% 8) Replace \lst@Process{FormFeed|Tabulator}.
\def\lst@ProcessFormFeedX{\lst@ProcessFormFeed}
\def\lst@ProcessTabulatorX{\lst@ProcessTabulator}
\def\lst@BOLGobble@#1{%
    \let\lst@next#1%
    \ifx \lst@next\relax\else
    \ifx \lst@next\lst@MProcessListing\else
    \ifx \lst@next\lst@ProcessFormFeedX\else
    \ifx \lst@next\lstenv@backslash
        \let\lst@next\lstenv@BOLGobble@@
    \else
        \let\lst@next\lst@BOLGobble@@
        \ifx #1\lst@ProcessTabulatorX
            \advance\@tempcnta-\lst@tabsize\relax
            \ifnum\@tempcnta<\z@
                \lst@length-\@tempcnta \lst@PreGotoTabStop
            \fi
        \else
            \advance\@tempcnta\m@ne
        \fi
    \fi \fi \fi \fi
    \lst@next}
%
% 10) Add some \@makeother to \lst@nfss@catcodes.
\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}
%
% 12) and 13) Deactivate \everypar and use normal baseline parameters.
\lst@AddToHook{DeInit}{\everypar{}\normalbaselines}
%
% 14) Define \lst@entermodes.
\let\lst@entermodes\@empty
%
% 16) Insert [ and ] in replacement text.
\def\lst@Delim@option[#1]{\def\lst@arg{[#1]}\lst@Delim@delim}
%
% 17) Just empty `frame' and top, right, bottom, and left shape.
\lst@AddToHook{TextStyle}
   {\let\lst@frame\@empty
    \let\lst@frametshape\@empty
    \let\lst@framershape\@empty
    \let\lst@framebshape\@empty
    \let\lst@framelshape\@empty}
%
% 18) Execute \lst@BeginKC and \lst@BeginKCS outside the two groups.
%     Modify third argument to \lst@BeginComment to work properly.
\def\lstpatch@keywordcomments{%
\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}%
\gdef\lst@EndKC{\lst@SaveToken \lst@LeaveMode \lst@RestoreToken
    \let\lst@thestyle\lst@identifierstyle \lsthk@Output}% renew style selection
}
%
% a) Just declare the option.
\DeclareOption{final}{\let\lst@ifdraft\iffalse}
%
% c) Define contentstyle and use it.
\def\lstpatch@html{%
\lst@Key{contentstyle}{}{\def\lst@contentstyle{##1}}%
\lst@AddToHook{Init}%
    {\ifx\lst@DefInside\@empty\else
         \let\lst@tagstyle\lst@identifierstyle
         \let\lst@identifierstyle\lst@contentstyle
     \fi}%
\lst@AddToHook{Output}%
    {\ifnum\lst@mode=\lst@insidemode
% 15) Check for keywordstyle.
     \ifx\lst@thestyle\lst@gkeywords@sty\else
         \lst@ifusekeysinside \let\lst@thestyle\lst@tagstyle
                   \else \let\lst@thestyle\lst@gkeywords@sty \fi
     \fi\fi}%
\lst@AddToHook{OutputOther}%
    {\lst@ifmode\else \ifnum\lst@mode=\lst@insidemode\else
     \ifx\lst@DefInside\@empty\else
         \let\lst@thestyle\lst@contentstyle
     \fi
     \fi\fi}%
}
%
% d) Define key and adjust \lst@SkipOrPrintLabel.
\def\lstpatch@labels{%
\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{##1}\lst@ifnumberfirstline}%
\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse}
\gdef\lst@SkipOrPrintLabel{%
    \ifnum\lst@skipnumbers=\z@
        \global\advance\lst@skipnumbers-\lst@stepnumber\relax
        \lst@PlaceNumber
        \lst@numberfirstlinefalse
    \else
        \lst@ifnumberfirstline
            \lst@PlaceNumber
            \lst@numberfirstlinefalse
        \fi
    \fi
    \global\advance\lst@skipnumbers\@ne}%
}
%%
\endinput
%%
%% End of file `lstpatch.sty'.
