%% %% This is file `lstpatch.sty', generated manually. %% %% (w)(c) 2004 Carsten Heinz %% %% This file may be 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 . %% %% 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) Frank Atanassow, 2004/10/07, 1.3b %% %% space after mathescape is not preserved %% (\lst@newlines>0) %% %% 2) Benjamin Lings, 2004/10/15, 1.3b (2004/10/17) %% %% \usepackage{xy,listings} yields: %% "Forbidden control sequence found while scanning use of \lst@lExtend" %% (xy-pic correctly resets catcode of ^^L (to active), which is \outer) %% %% %% The following features are added to the base package. %% %% 1.3a (2004/09/07) %% %% a) H I G H L Y E X P E R I M E N T A L %% %% Use the options %% rangeprefix= %% rangesuffix= %% %% rangebeginprefix= %% rangebeginsuffix= %% %% rangeendprefix= %% rangeendsuffix= %% %% includerangemarker=true|false %% together with %% firstline= %% lastline= %% or %% linerange={-, %% -, ...} %% The according markers in the source code are %% %% for begin respectively end of range. Moreover, one can use %% includerangemarker=true|false %% to show or hide the range markers in the output. %% %% 1.3b (2004/10/17) %% %% b) multicols= (requires loaded multicol package) %% %% \lst@CheckVersion{1.3} {\typeout{^^J% ***^^J% *** This is a patch for listings 1.3, but you're using^^J% *** version \lst@version.^^J% ***^^J *** Patch file not loaded.^^J% ***^^J}% \endinput } \def\fileversion{1.3b} \def\filedate{2004/10/17} \ProvidesFile{lstpatch.sty}[\filedate\space\fileversion\space (Carsten Heinz)] % % 0) Insert % after #1. \def\@@xbitor #1{\@tempcntb \count#1% \ifnum \@tempcnta =\z@ \else \divide\@tempcntb\@tempcnta \ifodd\@tempcntb \@testtrue\fi \fi} % % 1) Reset \lst@newlines at end of escape. \def\lstpatch@escape{% \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}% \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}% {}}% } % % 2) Deactivate \outer definition of ^^L temporarily (inside and outside % of \lst@ScanChars) and restore \catcode at end of package. \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 \lst@lAddTo\lst@RestoreCatcodes{\catcode12\active} % % a) Let's start with the options: \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} % % The key is a redefinition of \lst@GLI@ checking for numbers. \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}% % % If we've found a general marker, we set firstline and lastline to 9999999. % This prevents (almost) anything to be printed for now. {\def\lst@firstline{9999999\relax}% \let\lst@lastline\lst@firstline % % We add the prefixes and suffixes to the markers. \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 % The following definition will be executed in the SelectCharTable hook % and here right now if we are already processing a listing. \global\def\lst@DefRange{\expandafter\lst@CArgX\lst@rangebegin\relax\lst@DefRangeB}% \ifnum\lst@mode=\lst@Pmode \expandafter\lst@DefRange \fi}} % \lst@DefRange is not inserted via a hook anymore. Instead it is now called % directly from \lst@SelectCharTable. This was necessary to get rid of an % interference with the escape-to-LaTeX-feature. The bug was reported by % \lsthelper{Michael~Bachmann}{2004/07/21}{Keine label-Referenzierung % m\"oglich...}. Another chance is due to the same bug: \lst@DefRange is % redefined globally when the begin of code is found, see below. The bug was % reported by \lsthelper{Tobias~Rapp}{2004/04/06}{undetected end of range if % listing crosses page break} \lsthelper{Markus~Luisser}{2004/08/13}{Bug mit % 'linerangemarker' in umgebrochenen listings} %\lst@AddToHook{SelectCharTable}{\lst@DefRange} \lst@AddToHookExe{DeInit}{\global\let\lst@DefRange\@empty} % % Actually defining the marker (via \lst@GLI@, \lst@DefRange, \lst@CArgX as % seen above) is similar to \lst@DefDelimB---except that we unfold the first % parameter and use different ,
, and  statements.
\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}
%
% Modify labels and define |\lst@InitLstNumber| used above.
% \lsthelper{Omair-Inam~Abdul-Matin}{2004/05/10}{experimental linerange
% feature does not work with firstnumber}
\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}%
}
\lst@AddToAtTop\lsthk@PreInit
    {\ifx\lst@firstnumber\@undefined
         \def\lst@firstnumber{\lst@lineno}%
     \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}
%
%    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.
\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}
%
%    Eventually we shouldn't forget to install \lst@OnceAtEOL, which must
%    also be called in \lst@MSkipToFirst.
\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}
%
%    Finally the service macro \lst@IfNumber:
\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}
%
% b) The following is known to fail with some keys.
\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}
\def\lst@Init#1{%
    \begingroup
    \ifx\lst@float\relax\else
        \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}%
        \expandafter\@tempa
    \fi
% chmod begin
    \ifx\lst@multicols\@empty\else
        \edef\lst@next{\noexpand\multicols{\lst@multicols}}
        \expandafter\lst@next
    \fi
% chmod end
    \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
    \normalbaselines
    \abovecaptionskip\lst@abovecaption\relax
    \belowcaptionskip\lst@belowcaption\relax
    \lst@MakeCaption t%
    \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
    \lst@Let{13}\lst@MProcessListing
    \let\lst@Backslash#1%
    \lst@EnterMode{\lst@Pmode}{\lst@SelectCharTable}%
    \lst@InitFinalize}
\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
    \lst@MakeCaption b%
    \lst@ifbox
        \egroup $\hss \egroup
        \vrule\@width\lst@maxwidth\@height\z@\@depth\z@
    \else
        \lst@ifdisplaystyle
            \par\penalty-50\vspace\lst@belowskip
        \fi
    \fi
% chmod begin
    \ifx\lst@multicols\@empty\else
        \def\lst@next{\global\let\@checkend\@gobble
                      \endmulticols
                      \global\let\@checkend\lst@@checkend}
        \expandafter\lst@next
    \fi
% chmod end
    \ifx\lst@float\relax\else
        \expandafter\lst@endfloat
    \fi
    \endgroup}
\let\lst@@checkend\@checkend
%%
\endinput
%%
%% End of file `lstpatch.sty'.