% \iffalse meta-comment, etc. %% %% Package `fancyvrb' %% %% COPYING: %% The files of this package "fancyvrb" are released under the Artistic %% License Version 2. A copy of that license is included in the file %% artistic2.txt. The package consists of the following files: %% README artistic2.txt fancyvrb.cb fancyvrb.dtx fancyvrb.ins %% %% Timothy Van Zandt %% July 17, 1998 %% % \fi % \changes{v2.7a}{2008/02/07}{NMM fixed lastline=firstline bug} % \changes{v2.7}{2000/03/21}{DG/SR changed how fancyvrb.cfg included} % \changes{v2.6}{1998/07/17}{. Three bug corrected, options numberblanklines, % label, labelposition and leftline added and few % precisions.} % \changes{v2.5}{1998/01/28}{First public release.} % \changes{v2.0 Beta}{1994/03/30}{First version personally shown by Timothy % \textsc{van Zandt}.} % % \CheckSum{3113} % % \newif\ifPostScriptFonts % \IfFileExists{times.sty}{\PostScriptFontstrue}{} % % \DoNotIndex{\\,\^} % \DoNotIndex{\@@nil,\@M,\@MM,\@auxout,\@beginparpenalty,\@bsphack} % \DoNotIndex{\@currentlabel,\@currenvir,\@currenvline,\@currsize} % \DoNotIndex{\@defpar,\@doendpe,\@eha,\@empty,\@endparenv,\@endpefalse} % \DoNotIndex{\@endpetrue,\@esphack,\@fooA,\@fooB,\@footnotetext,\@gobble} % \DoNotIndex{\@height,\@ifnextchar,\@ifstar,\@ifundefined,\@ignorefalse} % \DoNotIndex{\@inlabelfalse} % \DoNotIndex{\@input,\@labels,\@listdepth,\@makefntext,\@makeother,} % \DoNotIndex{\@minipagefalse,\@namedef,\@nameuse,\@ne,\@newlistfalse,} % \DoNotIndex{\@nil,\@nobreakfalse,\@noparlistfalse,\@noparlisttrue} % \DoNotIndex{\@parboxrestore,\@sanitize,\@spaces,\@tempa,\@tempb,\@tempboxa} % \DoNotIndex{\@tempc,\@tempcnta,\@tempcntb,\@tempdima,\@tempdimb,\@tempdimc} % \DoNotIndex{\@tempg,\@temph,\@temptokena,\@thefnmark,\@toodeep} % \DoNotIndex{\@topsep,\@topsepadd,\@totalleftmargin,\@warning,\@width} % \DoNotIndex{\active,\addpenalty,\addvspace,\advance} % \DoNotIndex{\afterassignment,\aftergroup,\arabic} % \DoNotIndex{\baselineskip,\baselinestretch,\begin,\begingroup,\bf,\bgroup} % \DoNotIndex{\box,\c@FancyVerbLine,\catcode,\ChangeBartrue,\closein} % \DoNotIndex{\closeout,\clubpenalty,\CodelineIndex,\columnwidth,\cr,\csname} % \DoNotIndex{\date,\DeclareOption,\def,\define@booleankey,\define@key} % \DoNotIndex{\divide,\do,\do@noligs,\DocInput,\documentclass,\dp,\dospecials} % \DoNotIndex{\edef,\egroup,\else,\EnableCrossrefs,\end,\endcenter} % \DoNotIndex{\endcsname,\endgroup,\endinput,\endlrbox,\endpspicture} % \DoNotIndex{\enspace,\errhelp,\errmessage,\expandafter} % \DoNotIndex{\fancyvrb@loaded,\fboxrule,\fboxsep,\fi,\filedate,\fileversion} % \DoNotIndex{\floatingpenalty,\font,\fontdimen,\fontfamily,\fontseries} % \DoNotIndex{\fontshape,\footins,\footnote,\footnotesep,\footnotesize} % \DoNotIndex{\frenchspacing,\fvset} % \DoNotIndex{\gdef,\GetFileInfo,\global,\hbadness,\hbox,\hfil,\hfuzz} % \DoNotIndex{\hrule,\hsize,\hss,\ht,\iden,\if,\if@FV@ResetMargins,\if@filesw} % \DoNotIndex{\if@inlabel,\if@nobreak,\if@noparlist,\if@noskipsec,\ifcase} % \DoNotIndex{\ifChangeBar,\ifeof,\IfFileExists,\ifmmode,\iffalse,\ifnum} % \DoNotIndex{\iftrue,\ifvmode,\ifvoid,\ifx,\ignorespaces,\immediate,\input} % \DoNotIndex{\insert,\interfootnotelinepenalty,\interlinepenalty,\jobname} % \DoNotIndex{\kern,\large,\lccode,\leaders,\leavevmode,\leftmargin,\let} % \DoNotIndex{\lineskip,\linewidth,\long,\loop,\lowercase,\lrbox} % \DoNotIndex{\m@ne,\m@th,\maketitle,\mathbf,\mathit,\mathnormal} % \DoNotIndex{\mathsl,\mathtt,\mbox,\meaning,\message,\mid,\mskip} % \DoNotIndex{\multiply,\NeedsTeXFormat,\newbox,\newcommand,\newcount} % \DoNotIndex{\newcounter,\newenvironment,\newif,\newpsobject,\newread} % \DoNotIndex{\newwrite,\next,\noexpand,\normalsize,\number} % \DoNotIndex{\Oldmakeindex,\on@line,\OnlyDescription,\openin,\openout,\or} % \DoNotIndex{\outer,\pUseMVerb,\par,\parindent,\parskip,\partopsep} % \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions,\protect} % \DoNotIndex{\protected@edef,\ProvidesPackage,\raise,\rangle,\read} % \DoNotIndex{\RecordChanges,\refstepcounter,\relax,\renewcommand} % \DoNotIndex{\renewenvironment,\repeat,\RequirePackage,\rightmargin,\rm} % \DoNotIndex{\rmfamily,\romannumeral,\rule} % \DoNotIndex{\scriptscriptstyle,\scriptstyle,\section,\selectfont,\setbox} % \DoNotIndex{\setcounter,\setkeys,\setlength,\small,\smallskip,\space} % \DoNotIndex{\splitmaxdepth,\splittopskip,\stepcounter,\string,\strip,\strut} % \DoNotIndex{\strutbox,\textbf,\textcolor,\textit,\textsc,\textsf,\textsl} % \DoNotIndex{\texttt,\textwidth,\the,\theFancyVerbLine,\tiny,\title,\topsep} % \DoNotIndex{\tt,\ttfamily,\ttyin,\tw@,\underline,\unhbox,\unitlength} % \DoNotIndex{\unskip,\usepackage,\valign,\vbox,\vcenter} % \DoNotIndex{\verbatim@nolig@list,\vfil,\voidb@x,\vrule,\vspace,\vskip} % \DoNotIndex{\vtop,\wd,\widowpenalty,\write,\xdef,\z@,\z@skip} % % \setcounter{IndexColumns}{2} % % \newcommand{\FBoxPackage}{`\textsf{fancybox}'} % \newcommand{\FVrbPackage}{`\textsf{fancyvrb}'} % % ^^A From ltugboat.cls % % ^^A Typeset the name of an environment % \providecommand\env[1]{\textsf{#1}} % \providecommand\clsname[1]{\textsf{#1}} % \providecommand\pkgname[1]{\textsf{#1}} % \providecommand\optname[1]{\textsf{#1}} % \providecommand\progname[1]{\textsf{#1}} % % ^^A A list of options for a package/class % \newenvironment{optlist}{\begin{description}% % \renewcommand\makelabel[1]{% % \descriptionlabel{\mdseries\optname{##1}}}% % \itemsep0.25\itemsep}% % {\end{description}} % % ^^A Utility macros % % ^^A Special dashes % \def\thinskip{\hskip 0.16667em\relax} % \def\endash{--} % \def\emdash{\endash-} % \def\d@sh#1#2{\unskip#1\thinskip#2\thinskip\ignorespaces} % \def\dash{\d@sh\nobreak\endash} % \def\Dash{\d@sh\nobreak\emdash} % % ^^A Example macros - adapted from the `fvrb-ex' package % ^^A --------------------------------------------------- % % ^^A Take care that we use here the "Z" character as comment character, % ^^A to avoid to use an 8 bit one which can cause portability problems. % ^^A But we can't use any more the "Z" into the example environments % ^^A of this documentation. % % \makeatletter % \newcommand{\BeginExample}[1][0]{% % \parindent=0pt % \multiply\topsep by 2 % \VerbatimEnvironment % \begin{VerbatimOut}[gobble=#1]{\jobname.tmp}} % % \newcommand{\BelowExample}[1]{% % \VerbatimInput[gobble=4,commentchar=Z,numbersep=3pt,frame=single, % numbers=left]{\jobname.tmp} % \catcode`\Z=9\relax% % #1\par} % % \newcommand{\SideBySide@Example}[1]{% % \@tempdimb=\FV@XRightMargin % \advance\@tempdimb -5mm % \vspace{2mm} % \begin{minipage}[c]{\@tempdimb} % \fvset{xrightmargin=0pt} % \catcode`\Z=9\relax% % #1 % \end{minipage}% % \@tempdimb=\textwidth % \advance\@tempdimb -\FV@XRightMargin % \advance\@tempdimb 5mm % \begin{minipage}[c]{\@tempdimb} % \VerbatimInput[commentchar=Z,numbersep=3pt,frame=single, % numbers=left,xleftmargin=5mm,xrightmargin=0pt]{\jobname.tmp} % \end{minipage} % \vspace{2mm}} % % \def\Example{% % \catcode`\^^M=\active % \@ifnextchar[{\catcode`\^^M=5\Example@}{\catcode`\^^M=5\Example@@}} % \def\Example@[#1]{\fvset{#1}\Example@@} % \def\Example@@{\BeginExample} % \def\endExample{% % \end{VerbatimOut}% % \BelowExample{\input{\jobname.tmp}}} % % \def\CenterExample{% % \catcode`\^^M=\active % \@ifnextchar[{\catcode`\^^M=5\CenterExample@} % {\catcode`\^^M=5\CenterExample@@}} % \def\CenterExample@[#1]{\fvset{#1}\CenterExample@@} % \def\CenterExample@@{\BeginExample} % \def\endCenterExample{% % \end{VerbatimOut}% % \center % \BelowExample{\input{\jobname.tmp}} % \endcenter} % % \def\SideBySideExample{% % \catcode`\^^M=\active % \@ifnextchar[{\catcode`\^^M=5\SideBySideExample@}% % {\catcode`\^^M=5\SideBySideExample@@}} % \def\SideBySideExample@[#1]{\fvset{#1}\SideBySideExample@@} % \def\SideBySideExample@@{\BeginExample[4]} % \def\endSideBySideExample{% % \end{VerbatimOut}% % \SideBySide@Example{\input{\jobname.tmp}}} % \makeatother % % ^^A End of example macros from `fvrb-ex' % % ^^A For the possible index and changes log % \setlength{\columnseprule}{0.6pt} % % ^^A Beginning of the documentation itself % % \title{The `\textsf{fancyvrb}' package\\Fancy Verbatims in \LaTeX} % \author{Timothy Van Zandt\\Princeton University\\Princeton -- USA\\ % {\footnotesize email: tvz@Princeton.EDU}\\[5mm] % {Packaging, documentation and support originally (but no longer) by}\\ % {\footnotesize Denis Girou (CNRS/IDRIS -- France)}\\[-2mm] % {\footnotesize and}\\[-2mm] % {\footnotesize Sebastian Rahtz (Elsevier -- GB)}} % \date{Version 2.7a\\ 7-Feb-2008\\ % {\small Documentation revised 7-Feb-2008}} % % \maketitle % % \begin{abstract} % This package provides very sophisticated facilities for reading and % writing verbatim \TeX{} code. Users can perform common tasks like changing % font family and size, numbering lines, framing code examples, colouring % text and conditionally processing text. % \end{abstract} % % \tableofcontents % % \section{Introduction} % % \FVrbPackage{} is the development of the \emph{verbatim} macros of the % \FBoxPackage{} package, Section 11 of \cite{FancyBox}. It offers six kinds % of extended functionality, compared to the standard \LaTeX{} % \textsf{verbatim} environment: % % \begin{enumerate} % \item verbatim commands can be used in footnotes, % \item several verbatim commands are enhanced, % \item a variety of verbatim environments are provided, with many % parameters to change the way the contents are printed; it is also possible % to define new customized verbatim environments, % \item a way is provided to save and restore verbatim text and environments, % \item there are macros to write and read files in verbatim mode, with the % usual versatility, % \item you can build \emph{example} environments (showing both result and % verbatim text), with the same versatility as normal verbatim. % \end{enumerate} % % The package works by scanning a line at a time from an environment or a % file. This allows it to pre-process each line, rejecting it, removing % spaces, numbering it, etc, before going on to execute the body of the line % with the appropriate catcodes set. % % \section{Verbatim material in footnotes} % % \ifChangeBar\begin{changebar}\fi % After a \cs{VerbatimFootnotes} macro declaration (to use after the % preamble), it is possible to put verbatim commands and environments % (the \LaTeX{} or \FVrbPackage{} ones) in footnotes, unlike in standard % \LaTeX: % \ifChangeBar\end{changebar}\fi % % \begin{Example} % \VerbatimFootnotes % We can put verbatim\footnote{\verb+_Yes!_+} text in footnotes. % \end{Example} % % \section{Improved verbatim commands} % % The \cs{DefineShortVerb} macro allows us to define a special character as % an abbreviation to enclose verbatim text and the \cs{UndefineShortVerb} % macro suppresses the special meaning of the specified character (the same % \ifChangeBar\begin{changebar}\fi % functionalities are provided in the \LaTeX{} `\textsf{shortvrb}' package): % \ifChangeBar\end{changebar}\fi % % \fvset{xrightmargin=4.8cm} % % \begin{SideBySideExample} % \DefineShortVerb{\|} % We can simply write \Verb+_verbatim_+ % material using a single |_delimiter_| % \UndefineShortVerb{\|} % \DefineShortVerb{\+} % And we can +_change_+ the character. % \end{SideBySideExample} % % To make matters more versatile, we can nominate \emph{escape} characters % in verbatim text (using the \cs{Verb} macro or with a `shortverb' character % defined), to perform formatting or similar tasks, using the % \texttt{commandchars} parameter as shown for environments in paragraph % \ref{sec:commandchars}. % % \section{Verbatim environments} % % Several verbatim environments are available, each with a lot of % parameters to customize them. In the following examples we use the % \texttt{Verbatim} environment, which is the equivalent of the standard % \texttt{verbatim}. The parameters can be set globally using the \cs{fvset} % macro or in an optional argument after the start of the % environment\footnote{For clarification in this paper, note that we % generally indent each verbatim line with two % spaces.}$^,$\footnote{This mechanism uses the % `\textbf{keyval}' package from the standard \LaTeX{} graphics % distribution, written by David \textsc{Carlisle}.}. % % \begin{SideBySideExample} % \begin{Verbatim} % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \subsection{Customization of verbatim environments} % % \ifChangeBar\begin{changebar}\fi % The appearance of verbatim environments can be changed in many and % varied ways; here we list the keys that can be set. % \ifChangeBar\end{changebar}\fi % % \subsubsection{Comments} % % \begin{optlist} % \item[commentchar (character)]: character to define comments in the % verbatim code, so that lines starting with this character will not be % printed (\emph{Default: empty}). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[commentchar=!] % % A comment % Verbatim line. % ! A comment that you will not see % \end{Verbatim} % \end{SideBySideExample} % % \ifChangeBar\begin{changebar}\fi % Take care to a special effect if the comment character is not the first % non blank one: it is because this character is in fact managed as the \TeX{} % comment one, that is to say that it gobble the newline character too. So, in % this case, the current line will be joined with the next one and, more, the % last one will be lost if it contain a comment, as \FVrbPackage{} print a % line only after finding it end character, which will never occured in this % case... % % \begin{SideBySideExample} % \begin{Verbatim}[commentchar=\%] % First line. % First line % Second. % Third line. % Third line lost... % \end{Verbatim} % \end{SideBySideExample} % \ifChangeBar\end{changebar}\fi % % \subsubsection{Initial characters to suppress} % % \begin{optlist} % \item[gobble (integer)]: number of characters to suppress at the beginning % of each line (up to a maximum of 9), mainly useful when environments are % indented % (\emph{Default: empty} \Dash no character suppressed). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim} % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[gobble=2] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[gobble=8] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \subsubsection{Customization of formatting} % % \begin{optlist} % \item[formatcom (command)]: command to execute before printing verbatim % text % (\emph{Default: empty}). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[formatcom=\color{red}] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \subsubsection{Changing individual line formatting} % % \ifChangeBar\begin{changebar}\fi % The macro \cs{FancyVerbFormatLine} defines the way each line is formatted. % Its default value is \verb+\def\FancyVerbFormatLine#1{#1}+, but we can % redefine it at our convenience (\texttt{FancyVerbLine} is the name of the % line counter): % \ifChangeBar\end{changebar}\fi % % {\fvset{fontsize=\small} % \begin{SideBySideExample} % Z\fvset{fontsize=\normalsize} % \renewcommand{\FancyVerbFormatLine}[1]{% % \makebox[0cm][l]{$\Rightarrow$}#1} % \begin{Verbatim} % First verbatim line. % Second verbatim line. % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{SideBySideExample} % \renewcommand{\FancyVerbFormatLine}[1]{% % \ifodd\value{FancyVerbLine}% % \MakeUppercase{#1}\else#1\fi} % \begin{Verbatim} % First verbatim line. % Second verbatim line. % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % } % % \subsubsection{Fonts} % % \begin{optlist} % \item[fontfamily (family name)]: font family to use. % \texttt{tt}, \texttt{courier} and \texttt{helvetica} are pre-defined % (\emph{Default:~tt}). % \end{optlist} % % \ifPostScriptFonts ^^A We can guess that PostScript fonts are available % \begin{SideBySideExample} % \begin{Verbatim}[fontfamily=helvetica] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \else % \begin{quote} % \textbf{\large Warning!} PostScript fonts seems not available on your % platform (we are looking for the file \texttt{times.sty}, so we will % not show the examplaes using such PostScript fonts. % \end{quote} % \fi % % \ifChangeBar\begin{changebar}\fi % \begin{optlist} % \item[fontsize (font size)]: size of the font to use % (\emph{Default: auto} \Dash the same as the current font). If you use the % `\textsf{relsize}' package too, you can require a change of the size % proportional to the current one (for instance: % \verb+fontsize=\relsize{-2}+). % \end{optlist} % \ifChangeBar\end{changebar}\fi % % \ifPostScriptFonts ^^A We can guess that PostScript fonts are available % \begin{SideBySideExample} % \begin{Verbatim}[fontsize=\small] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[fontfamily=courier, % fontsize=\large] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \else % \begin{SideBySideExample} % \begin{Verbatim}[fontsize=\small] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \fi % % \begin{optlist} % \item[fontshape (font shape)]: font shape to use % (\emph{Default: auto} \Dash the same as the current font). % \end{optlist} % % \ifPostScriptFonts ^^A We can guess that PostScript fonts are available % \begin{SideBySideExample} % \begin{Verbatim}[fontfamily=courier, % fontshape=it] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \else % \begin{SideBySideExample} % \begin{Verbatim}[fontshape=it] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \fi % % \begin{optlist} % \item[fontseries (series name)]: \LaTeX{} font `series' to use % (\emph{Default: auto} \Dash the same as the current font). % \end{optlist} % % \ifPostScriptFonts ^^A We can guess that PostScript fonts are available % \begin{SideBySideExample} % \begin{Verbatim}[fontfamily=courier, % fontseries=b] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \else % \begin{SideBySideExample} % \begin{Verbatim}[fontseries=b] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \fi % % \subsubsection{Types and characteristics of frames} % % \ifChangeBar\begin{changebar}\fi % \begin{optlist} % \item[frame % (none$\mid$leftline$\mid$topline$\mid$bottomline$\mid$lines$\mid$single)]: % type of frame around the verbatim environment % (\emph{Default: none} \Dash no frame). With \textsf{leftline} and % \textsf{single} modes, a space of a length given by the \LaTeX{} % \cs{fboxsep} macro is added between the left vertical line and the text. % \end{optlist} % \ifChangeBar\end{changebar}\fi % % ^^A Problem at the top of a page... % \ifChangeBar\leavevmode\mbox{}\begin{changebar}\fi % \begin{SideBySideExample} % \begin{Verbatim}[frame=leftline] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=topline] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=bottomline] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=lines] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=single] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \ifChangeBar\end{changebar}\fi % % \begin{optlist} % \item[framerule (dimension)]: width of the rule of the frame % (\emph{Default: 0.4pt if framing specified}). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=single, % framerule=1mm] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[framesep (dimension)]: width of the gap between the frame and % the text (\emph{Default: \cs{fboxsep}}). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=single, % framesep=5mm] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[rulecolor (color command)]: color of the frame rule, expressed % in the standard \LaTeX{} way % (\emph{Default: black}). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=single, % rulecolor=\color{red}] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[fillcolor (color command)]: color used to fill the space % between the frame and the text (its thickness is given by % \texttt{framesep}) % (\emph{Default: none} \Dash no color). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=single, % framerule=1mm,framesep=3mm, % rulecolor=\color{red}, % fillcolor=\color{yellow}] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \ifChangeBar\leavevmode\mbox{}\begin{changebar}\fi % \subsubsection{Label for the environment} % % \begingroup % \newcommand{\Vitem}{\SaveVerb[aftersave={\item[\UseVerb{Vitem}]}]{Vitem}} % \DefineShortVerb{\|} % \begin{optlist} % \Vitem|label ({[string]string})|: label(s) to print on top, bottom or % both frame lines of the environment to describe it content % (\emph{Default: empty} \Dash no label). % If the label(s) contains special characters, as a comma or an equal sign, % it must be put inside a group. If only one string is given, it will be % used for both top and bottom lines (if the two are printed), but if an % optional first label is given too, this one will be used for the top line % and the second one for the bottom line. Note also that, if another value % than \textsf{topline}, \textsf{bottomline}, \textsf{lines} or % \textsf{single} is used for the \textsf{frame} parameter, the label(s) % will not be printed. % \end{optlist} % \endgroup % \ifChangeBar\end{changebar}\fi % % ^^A Problem at the top of a page... % \ifChangeBar\leavevmode\mbox{}\begin{changebar}\fi % \begin{SideBySideExample} % \fvset{gobble=2} % \begin{Verbatim}[frame=single, % label=My text] % First verbatim line. % Second verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=topline, % framesep=4mm, % label=\fbox{\Large\emph{The code}}] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[labelposition (none$\mid$topline$\mid$bottomline$\mid$all)]: % position where to print the label if one is defined, which must be % coherent with the kind of frame chosen % (\emph{Default: none if the label is empty, topline if one label is % defined and all if two are defined}). % Of course, some incompatible options (like % \textsf{frame=topline,labelposition=bottomline}) will not print the % label. % \end{optlist} % \ifChangeBar\end{changebar}\fi % % ^^A Problem at the top of a page... % \ifChangeBar\leavevmode\mbox{}\begin{changebar}\fi % \begin{SideBySideExample} % \fvset{gobble=2} % \begin{Verbatim}[frame=single, % framesep=2mm, % label=Text,labelposition=all] % First verbatim line. % Second verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=lines, % label=Text,labelposition=topline] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=bottomline, % framesep=3mm, % label=\textit{Code included}, % labelposition=bottomline] % First verbatim line. % Second verbatim line. % \end{Verbatim} % % \begin{Verbatim}[frame=lines, % framesep=3mm, % label={[Beginning of code]End of code}] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \ifChangeBar\end{changebar}\fi % % \subsubsection{Line numbering} % % \begin{optlist} % \item[numbers (none$\mid$left$\mid$right)]: numbering of the verbatim lines % (\emph{Default: none} \Dash no numbering). If requested, this numbering is % done \emph{outside} the verbatim environment. % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[gobble=2,numbers=left] % First verbatim line. % Second verbatim line. % \end{Verbatim} % % \begin{Verbatim}[gobble=2, % numbers=right,numbersep=0pt] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[numbersep (dimension)]: gap between numbers and verbatim lines % (\emph{Default: 12pt}). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[gobble=2, % numbers=left,numbersep=2pt] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[firstnumber (auto$\mid$last$\mid$integer)]: number of the first line % (\emph{Default: auto} \Dash numbering starts from 1). \textsf{last} means % that the numbering is continued from the previous verbatim environment. If % an integer is given, its value will be used to start the numbering. % \end{optlist} % % \begin{SideBySideExample} % \fvset{gobble=2, % numbers=left,numbersep=3pt} % \begin{Verbatim} % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[firstnumber=last] % Verbatim line. % \end{Verbatim} % % \begin{Verbatim}[firstnumber=100] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[stepnumber (integer)]: interval at which line numbers are printed % (\emph{Default:~1} \Dash all lines are numbered). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[gobble=2,numbers=left, % numbersep=3pt,stepnumber=2] % First verbatim line. % Second verbatim line. % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % The macro \cs{theFancyVerbLine} defines the typesetting style of the % numbering, and the counter used is \texttt{FancyVerbLine}: % % \begin{SideBySideExample} % \renewcommand{\theFancyVerbLine}{% % \textcolor{red}{\small % 8.\alph{FancyVerbLine}}} % \begin{Verbatim}[gobble=2, % numbers=left,numbersep=2pt] % First verbatim line. % Second verbatim line. % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \ifChangeBar\begin{changebar}\fi % \begin{optlist} % \item[numberblanklines (boolean)]: to number or not the empty lines % (really empty or containing blank characters only) % (\emph{Default: true} \Dash all lines are numbered). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[gobble=2,numbers=left, % numbersep=3pt, % numberblanklines=false] % First verbatim line. % % % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \ifChangeBar\end{changebar}\fi % % \subsubsection{Selection of lines to print} % % \begin{optlist} % \item[firstline (integer)]: first line to print % (\emph{Default: empty} \Dash all lines from the first are printed). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[gobble=2,firstline=2, % numbers=left,numbersep=2pt] % First verbatim line. % Second verbatim line. % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[lastline (integer)]: last line to print % (\emph{Default: empty} \Dash all lines until the last one are printed). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[gobble=2,lastline=1, % numbers=left,numbersep=2pt] % First verbatim line. % Second verbatim line. % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % % Instead of specifying a firstline at which to start printing a range % of lines, you can define a start string; the start of the range is % the first line that exactly equals the string. (The comparison is made % before any characters are gobbled off the front of the line.) Similarly for a stop % string. You can mix line-numbers and strings, e.g.\ start at % firstline, and end at a stop string. Specifying the strings is a % bit klunky. Initially you must define the strings with % \cs{newcommand*} as in: % \begin{SideBySideExample} % \newcommand*\FancyVerbStartString{FROM} % \newcommand*\FancyVerbStopString{TO} % \begin{Verbatim}[gobble=2] % First verbatim line. % FROM % Second verbatim line. % TO % Third verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \noindent To redefine the strings, you must use \cs{renewcommand*}. % \subsubsection{Spaces and tab characters} % % \begin{optlist} % \item[showspaces (boolean)]: print a special character representing each % space % (\emph{Default: false} \Dash spaces not shown). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[showspaces=true] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % In practice, all verbatim environments have a~\texttt{*} variant, which % sets \texttt{showspaces=true}: % % \begin{SideBySideExample} % \begin{Verbatim*} % Verbatim line. % \end{Verbatim*} % \end{SideBySideExample} % % There are also some parameters to determine the way tab characters are % interpreted (using tabs is in fact a rather old-fashioned style of coding): % % \begin{optlist} % \item[showtabs (boolean)]: explicitly show tab characters % (\emph{Default: false} \Dash tab characters not shown). % \end{optlist} % % \begin{optlist} % \item[obeytabs (boolean)]: position characters according to the tabs % (\emph{Default: false} \Dash tab characters are added to the current % position). % \end{optlist} % % \begin{optlist} % \item[tabsize (integer)]: number of spaces given by a tab character % (\emph{Default:~8}). % \end{optlist} % % \subsubsection{Space between lines} % % \begin{optlist} % \item[baselinestretch (auto$\mid$dimension)]: value to give to the usual % `baselinestretch' \LaTeX{} parameter % (\emph{Default: auto} \Dash its current value just before the verbatim % command). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[baselinestretch=2] % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \subsubsection{Escape characters for inserting commands} % % \begin{optlist} % \item[commandchars (three characters)]: characters which define the % character which starts a macro and marks the beginning and end of a group; % thus lets us introduce \emph{escape} sequences in verbatim code. Of % course, it is better to choose special characters which are not used in % the verbatim text! (\emph{Default: empty}). % \label{sec:commandchars} % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[commandchars=\\\{\}] % \textit{% This is a comment} % First verbatim line. % \fbox{Second} verbatim line. % \textcolor{red}{Third} verbatim line. % \end{Verbatim} % % \begin{Verbatim}[commandchars=+\[\]] % +textit[\textbf{Verbatim} line]. % \end{Verbatim} % \end{SideBySideExample} % % \ifChangeBar\begin{changebar}\fi % Using this way, it is also possible to put labels to be able, later, to % make reference to some lines of the verbatim environments: % % \begin{SideBySideExample} % \begin{Verbatim}[commandchars=\\\{\}, % numbers=left,numbersep=2pt] % First verbatim line. % Second line.\label{vrb:Important} % Third verbatim line. % \end{Verbatim} % % As I previously shown % line~\ref{vrb:Important}, it is... % \end{SideBySideExample} % \ifChangeBar\end{changebar}\fi % % \subsubsection{Margins} % % \begin{optlist} % \item[xleftmargin (dimension)]: indentation to add at the start of each % line % (\emph{Default:~0pt} \Dash no left margin). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=single, % xleftmargin=5mm] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[xrightmargin (dimension)]: right margin to add after each line % (\emph{Default:~0pt} \Dash no right margin). % \end{optlist} % % \begin{SideBySideExample} % \begin{Verbatim}[frame=single, % xrightmargin=1cm] % Verbatim line. % \end{Verbatim} % \end{SideBySideExample} % % \begin{optlist} % \item[resetmargins (boolean)]: reset the left margin, which is useful if % we are inside other indented environments (\emph{Default: false} \Dash no % reset of the margin). % \end{optlist} % % {% % \DefineVerbatimEnvironment{Verbatim}{Verbatim}{gobble=0,numbers=none} % \begin{SideBySideExample} % \begin{itemize} % \item First item % \begin{Verbatim}[frame=single] % Verbatim line. % \end{Verbatim} % \item Second item % \begin{Verbatim}[frame=single, % resetmargins=true] % Verbatim line. % \end{Verbatim} % \end{itemize} % \end{SideBySideExample} % } % % \subsubsection{Overfull box messages} % % \begin{optlist} % \item[hfuzz (dimension)]: value to give to the \TeX{} \cs{hfuzz} dimension % for text to format. This can be used to avoid seeing some unimportant % \emph{Overfull box} messages (\emph{Default:~2pt}). % \end{optlist} % % \subsubsection{Page breaks} % % \begin{optlist} % \item[samepage (boolean)]: in very special circumstances, we may want to % make sure that a verbatim environment is not broken, even if it does not % fit on the current page. To avoid a page break, we can set the % \texttt{samepage} parameter to \emph{true} (\emph{Default: false}). % \end{optlist} % % \subsubsection{Catcode characters} % % \begin{optlist} % \item[codes (macro)]: to specify \emph{catcode} changes (\emph{Default: % empty}). % \end{optlist} % % For instance, this allows us to include formatted mathematics in verbatim % text: % % {\fvset{fontsize=\small} % \begin{SideBySideExample} % Z\fvset{fontsize=\normalsize} % \begin{Verbatim}[commandchars=\\\{\}, % codes={\catcode`$=3\catcode`^=7}] % x=1/sqrt(z**2) ! $\frac{1}{\sqrt{z^2}}$ % \end{Verbatim} % \end{SideBySideExample} % } % % \subsubsection{Active characters} % % \begin{optlist} % \item[defineactive (macro)]: to define the effect of \emph{active} % characters % (\emph{Default: empty}). % \end{optlist} % % This allows us to do some devious tricks: see the example in Section % \ref{sec:VerbatimInclude} on page~\pageref{sec:VerbatimInclude}. % % \subsection{Different kinds of verbatim environments} % % \subsubsection{Verbatim environment} % % This is the `normal' verbatim environment which we have been using up to % now. % % \subsubsection{BVerbatim environment} % % This environment puts the verbatim material in a \TeX{} box. Some % parameters do not work inside this environment (notably the framing ones), % but two new ones are available: % % \begin{optlist} % \item[boxwidth (auto$\mid$dimension)]: size of the box used % (\emph{Default: auto} \Dash the width of the longest line is used). % \end{optlist} % % \begin{optlist} % \item[baseline (b$\mid$c$\mid$t)]: position of the baseline (on the % \texttt{baseline}, the \texttt{center} or the \texttt{top} of the box) % (\emph{Default: b}). % \end{optlist} % % \begin{SideBySideExample} % \fvset{gobble=2} % \begin{BVerbatim} % First % Second % \end{BVerbatim} % \begin{BVerbatim}[baseline=c] % First % Second % \end{BVerbatim} % \end{SideBySideExample} % % \begin{SideBySideExample} % \begin{BVerbatim}[boxwidth=2cm] % First % Second % \end{BVerbatim} % \begin{BVerbatim}[boxwidth=2cm, % baseline=t] % First % Second % \end{BVerbatim} % \end{SideBySideExample} % % \subsubsection{LVerbatim environment} % % This environment puts verbatim material into \LaTeX{} `LR' mode (the % so-called \emph{left-to-right} mode, which in fact is the same thing that % \TeX{} itself calls \emph{restricted horizontal mode}). % % \subsubsection{Personalized environments} % % \ifChangeBar\begin{changebar}\fi % \VerbatimFootnotes% % It is easy to define personal customized environments. You can redefine % the existing ones using the \cs{RecustomVerbatimEnvironment} macro or create % your own ones, using the \cs{DefineVerbatimEnvironment} macro\footnote{% % \ifChangeBar\begin{changebar}\fi % For verbatim commands, the \cs{CustomVerbatimCommand} and % \cs{RecustomVerbatimCommand} macros also exist; for instance: % % \noindent% % \verb+\RecustomVerbatimCommand{\VerbatimInput}{VerbatimInput}{frame=lines}+ % \ifChangeBar\end{changebar}\fi}. % In each case, you specify the name of the new environment, the type of % environment on which it is based, and a set of initial option values. The % options can be overridden with an optional argument in the normal way: % % \begin{SideBySideExample} % \RecustomVerbatimEnvironment % {Verbatim}{Verbatim} % {gobble=2,frame=single} % \begin{Verbatim} % First verbatim line. % Second verbatim line. % \end{Verbatim} % \end{SideBySideExample} % \ifChangeBar\end{changebar}\fi % % \begin{SideBySideExample} % \DefineVerbatimEnvironment% % {MyVerbatim}{Verbatim} % {gobble=2,numbers=left,numbersep=2mm, % frame=lines,framerule=0.8mm} % \begin{MyVerbatim} % First verbatim line. % Second verbatim line. % \end{MyVerbatim} % % \begin{MyVerbatim}[numbers=none, % framerule=1pt] % First verbatim line. % Second verbatim line. % \end{MyVerbatim} % \end{SideBySideExample} % % \section{Saving and restoring verbatim text and environments} % % The \cs{SaveVerb} and \cs{UseVerb} macros allow us to save and restore % verbatim material. % % \begin{SideBySideExample} % \DefineShortVerb{\|} % \SaveVerb{Verb}|_verbatim_| % I have saved \UseVerb{Verb} and reuse % it later as many times as I want % \UseVerb{Verb}. % \end{SideBySideExample} % % This also provides a solution to putting verbatim text inside \LaTeX{} % commands which do not normally permit it: % % {\fvset{frame=single,xrightmargin=0cm} % \begin{Example} % \DefineShortVerb{\|} % \SaveVerb{Verb}|_OK^| % \marginpar{\UseVerb{Verb}} % \end{Example} % } % % There is a useful ability to use verbatim text as the item text in a % description list (something not normally permitted in \LaTeX), using the % \texttt{aftersave} parameter: % % \begin{optlist} % \item[aftersave (macro)]: macro to dynamically save some verbatim material % (\emph{Default: empty}). % \end{optlist} % % \begin{SideBySideExample} % \newcommand{\Vitem}{% % \SaveVerb[aftersave={% % \item[\UseVerb{Vitem}]}]{Vitem}} % \DefineShortVerb{\|} % \begin{description} % \Vitem|\MyCommand|: my command % \end{description} % \end{SideBySideExample} % % In the same way, we can use and restore (in normal, boxed and LR mode, % using \cs{UseVerbatim}, \cs{BUseVerbatim} and \cs{LUseVerbatim} respectively) % entire verbatim environments: % % \begin{SideBySideExample} % Z\fvset{gobble=0,numbers=none} % \begin{SaveVerbatim}{VerbEnv} % Verbatim line. % \end{SaveVerbatim} % \UseVerbatim{VerbEnv} % and \UseVerbatim{VerbEnv} % \end{SideBySideExample} % % \begin{SideBySideExample} % Z\fvset{gobble=0,numbers=none} % \begin{SaveVerbatim}[gobble=5]{VerbEnv} % First % Second % \end{SaveVerbatim} % % \fbox{\BUseVerbatim{VerbEnv}} % and \BUseVerbatim{VerbEnv}. % % \LUseVerbatim{VerbEnv} and % \LUseVerbatim{VerbEnv} % \end{SideBySideExample} % % \section{Writing and reading verbatim files} % \label{sec:VerbatimInclude} % % The command \cs{VerbatimInput} (the variants \cs{BVerbatimInput} and % \cs{LVerbatimInput} also exist) allows inclusion of the contents of a file % with verbatim formatting. Of course, the various parameters which we have % described for customizing can still be used: % % ^^A The file we will use for \VerbatimInput % % \typeout{*************************************} % \typeout{* Created files: hello.f90, file.txt} % \typeout{* See fancyhdr.dvi for an explanation} % \typeout{*************************************} % % \begin{VerbatimOut}{hello.f90} % ! A "hello" program % % program hello % print *,"Hello world" % end program hello % \end{VerbatimOut} % % \begin{SideBySideExample} % Z\RecustomVerbatimCommand{\VerbatimInput}{VerbatimInput}{gobble=4} % \fvset{fontsize=\small} % \VerbatimInput{hello.f90} % % \fvset{frame=single,numbers=left, % numbersep=3pt} % \VerbatimInput{hello.f90} % % \VerbatimInput[firstline=3, % rulecolor=\color{green}] % {hello.f90} % % \VerbatimInput[frame=lines, % fontshape=sl,fontsize=\footnotesize] % {hello.f90} % \end{SideBySideExample} % % We can make use of the `defineactive' parameter to set the comment lines % in the program text in a different style: % % \begin{SideBySideExample} % Z\RecustomVerbatimCommand{\VerbatimInput}{VerbatimInput}{gobble=4} % \def\ExclamationPoint{\char33} % \catcode`!=\active % \VerbatimInput% % [defineactive=% % \def!{\color{cyan}\itshape % \ExclamationPoint}] % {hello.f90} % \end{SideBySideExample} % % It is important to note that if the contents of the file does not fit on % the page, it will be automatically broken across pages as needed (unless the % \texttt{samepage} parameter has been set to \texttt{true}). % % There is also a \verb+VerbatimOut+ environment to write verbatim text to an % output file, in the same way: % % \begin{SideBySideExample} % \begin{VerbatimOut}{file.txt} % I write that. % And that too. % \end{VerbatimOut} % % \VerbatimInput[frame=single, % numbers=left,numbersep=6pt]{file.txt} % \end{SideBySideExample} % % \ifChangeBar\begin{changebar}\fi % \section{Automatic pretty printing} % % Obviously, automatic \emph{pretty printing} is outside the scope of this % package. Nevertheless, this is specially interesting for verbatim % inclusion of programming code files or fragments. In the \LaTeX{} world % (not speaking of the \emph{literate programming} way), there are software % for some special languages, as the `\textsf{C++2LaTeX}' package from Norbert % \textsc{Kiesel}, but mainly two generic ones, which use completely different % modes (an external preprocessor written in C and a \TeX{} based solution): % the `\textsf{LGrind}'~\cite{LGrind} system, currently maintened by Michael % \textsc{Piefel}, and the `\textsf{listings}'~\cite{Listings} package from % Carsten \textsc{Heinz}. % % Future versions of \FVrbPackage{} and `\textsf{listings}' packages are % planned to cooperate, which will offer great advantages to both users of the % two actual packages, and will allow \FVrbPackage{} users to have automatic % pretty printing of programming codes. % % \section{Known problems} % % \begin{itemize} % \item Vladimir \textsc{Volovich} \verb++ reported that the % special character \verb+\th+, available with T1 encoding, can't be % included as verbatim with \FVrbPackage. It can be true for other special % characters too. % \end{itemize} % % \section{Thanks} % % For interesting comments and suggestions, we would like to thank specially % (alphabetic order): Philippe \textsc{Esperet} % \texttt{}, Michael \textsc{Friendly} % \texttt{}, Rolf \textsc{Niepraschk} % \texttt{} and for bug reports Mario \textsc{Hassler} % \relax\unskip\break % \texttt{}, Mikhail \textsc{Kolodin} % \relax\unskip\break % \texttt{} and Vladimir \textsc{Volovich} % \verb++. % \ifChangeBar\end{changebar}\fi % % \section{Conclusion} % % \ifChangeBar\begin{changebar}\fi % There are a few other possibilities that we have not described here. % Note specially that it is possible to define a customization file % (\texttt{fancyvrb.cfg}) loaded at the end of the package, to store % definitions of your customized commands and environments and to redefine % the attributes of existing ones. % \ifChangeBar\end{changebar}\fi % % \begin{thebibliography}{1} % \bibitem{FancyBox} Timothy \textsc{van Zandt}, % \textit{Documentation for `fancybox': Box tips and tricks for \LaTeX}. % Available from \texttt{CTAN:} % \texttt{macros/latex/contrib/supported/fancybox}, 1993. % % \bibitem{FancyVrb} Timothy \textsc{van Zandt}, % \textit{`fancyvrb': Fancy Verbatims in \LaTeX}. % Available from \texttt{CTAN:} % \texttt{macros/latex/contrib/supported/fancyvrb}, 1998. % % \bibitem{LGrind} Various authors (current maintainer: Michael % \textsc{Piefel}), % \textit{The `LGrind' package}. % Available from \texttt{CTAN:} \texttt{support/lgrind}, 1998. % % \bibitem{Listings} Carsten \textsc{Heinz}, % \textit{The `Listings' package}. % Available from \texttt{CTAN:} % \texttt{macros/latex/contrib/supported/listings}, 1996-1997. %\end{thebibliography} % % \StopEventually{} % % ^^A .................... End of the documentation part .................... % % \section{Driver file} % % The next bit of code contains the documentation driver file for \TeX{}, % i.e., the file that will produce the documentation you are currently % reading. It will be extracted from this file by the \texttt{docstrip} % program. % % \begin{macrocode} %<*driver> \documentclass{ltxdoc} \GetFileInfo{fancyvrb.dtx} \usepackage{color} \usepackage{fancyvrb} \newif\ifChangeBar \IfFileExists{changebar.sty}% {\ChangeBartrue\usepackage[dvips,rightbars]{changebar}}{} \EnableCrossrefs \CodelineIndex \RecordChanges \OnlyDescription % Comment it for implementation details %\Oldmakeindex % Uncomment if your MakeIndex is pre-0.9 \hbadness=7000 % Over and under full box warnings \hfuzz=3pt \begin{document} \DocInput{fancyvrb.dtx} \end{document} % % \end{macrocode} % % \section{\FVrbPackage{} code} % %<*fancyvrb> % % \iffalse meta-comment, etc. %% COPYRIGHT 1992-1999, by Timothy Van Zandt %% %% This package may be distributed under the terms of the LaTeX Project Public %% License, as described in lppl.txt in the base LaTeX distribution. %% Either version 1.0 or, at your option, any later version. %% %% DESCRIPTION: %% fancyvrb.sty is a LaTeX style option, containing flexible %% verbatim environments and commands and extensive documentation. %% %% This is a companion to the `fancybox' package. %% % \fi % % \begin{quote} % \emph{\textbf{\large Disclaimer (D.G./S.R.)}: This is the original % comments of the code by Timothy \textsc{van Zandt}. We have not change % them.} % \end{quote} % % \subsection{Preambule} % % What we need. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} % \end{macrocode} % % Who we are. % \begin{macrocode} \def\fileversion{2.7a, with DG/SPQR fixes, and firstline=lastline fix} \def\filedate{2008/02/07} \ProvidesPackage{fancyvrb}[\filedate] \message{Style option: `fancyvrb' v\fileversion \space <\filedate> (tvz)} \csname fancyvrb@loaded\endcsname \let\fancyvrb@loaded\endinput % \end{macrocode} % % \subsection{Errors} % % \begin{macrocode} \def\FV@Error#1#2{% \edef\@tempc{#2}\expandafter\errhelp\expandafter{\@tempc}% \errmessage{FancyVerb Error:^^J\space\space #1^^J}} \def\FV@eha{Your command was ignored. Type to continue.} % \end{macrocode} % % \subsection{Verbatim footnotes} % % Color has to be protected. % % \noindent Won't work for some definitions of \cs{@makefntext}. % If it weren't for \cs{@makefntext}, I would do this properly by defining a % footnote environment. % % \begin{macro}{\VerbatimFootnotes} % \begin{macrocode} %% DG/SR modification begin - Jan. 21, 1998 %% Suggested by Bernard Gaulle to solve a compatibility problem with `french' %% (it introduce the restriction to put \VerbatimFootnotes AFTER the preambule) %%\def\VerbatimFootnotes{\let\@footnotetext\V@footnotetext} \let\V@footnote\footnote \def\VerbatimFootnotes{% \let\@footnotetext\V@footnotetext% \let\footnote\V@footnote} %% DG/SR modification end % \end{macrocode} % \end{macro} % % \begin{macro}{\V@footnotetext} % \begin{macrocode} \long\def\V@footnotetext{% \afterassignment\V@@footnotetext \let\@tempa} % \end{macrocode} % \end{macro} % % \begin{macro}{\V@@footnotetext} % \begin{macrocode} \def\V@@footnotetext{% \insert\footins\bgroup \csname reset@font\endcsname \footnotesize \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth\dp\strutbox \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% \@makefntext{}% \rule{\z@}{\footnotesep}% \bgroup \aftergroup\V@@@footnotetext \ignorespaces} % \end{macrocode} % \end{macro} % % \begin{macro}{\V@@@footnotetext} % \begin{macrocode} \def\V@@@footnotetext{\strut\egroup} % \end{macrocode} % \end{macro} % % \subsection{key=value} % % \begin{macrocode} \RequirePackage{keyval} % \end{macrocode} % % Extensions to keyval.sty: % % \verb+\define@booleankey{}{}{}{}+ % % Defines a \verb++ for \verb++ that executes: % % \verb++ clause when value begins with `t' or `T', or is omitted. % % \verb++ clause otherwise. % % \begin{macro}{\define@booleankey} % \begin{macrocode} \def\define@booleankey#1#2#3#4{% \@namedef{KV@#1@#2@default}{#3}% \@namedef{KV@#1@#2@false}{#4}% \@namedef{KV@#1@#2}##1{\KV@booleankey{##1}{#1}{#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@booleankey} % \begin{macrocode} \def\KV@booleankey#1#2#3{% \edef\@tempa{#1}\expandafter\KV@@booleankey\@tempa\relax\@nil{#2}{#3}} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@@booleankey} % \begin{macrocode} \def\KV@@booleankey#1#2\@nil#3#4{% \@nameuse{KV@#3@#4@\if t#1default\else\if T#1default\else false\fi\fi}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@None} % \begin{macrocode} \def\FV@None{none} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Auto} % \begin{macrocode} \def\FV@Auto{auto} % \end{macrocode} % \end{macro} % % \begin{macro}{\fvset} % \begin{macrocode} \def\fvset#1{\setkeys{FV}{#1}} % \end{macrocode} % \end{macro} % % \cs{FV@Command} is for verbatim commands. Example: % % \verb+\def\VerbatimInput{\FV@Command{}{VerbatimInput}}+ % % \verb+\FV@Command{}{}+: % % \begin{enumerate} % \item Defines \cs{FV@KeyValues} to be \verb++. % \item Looks for $*$, and adds `showspaces' to \cs{FV@KeyValues} if found. % \item Looks for \verb+[]+ argument, and adds it to % \cs{FV@KeyValues} if found. % \item Executes \verb+\FVC@+. % \end{enumerate} % % \begin{macro}{\FV@Command} % \begin{macrocode} \def\FV@Command#1#2{% \@ifstar {\def\FV@KeyValues{#1,showspaces}\FV@@Command{#2}}% {\def\FV@KeyValues{#1}\FV@@Command{#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@Command} % \begin{macrocode} \def\FV@@Command#1{% \@ifnextchar[% {\FV@GetKeyValues{\@nameuse{FVC@#1}}}% {\@nameuse{FVC@#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@GetKeyValues} % \begin{macrocode} \def\FV@GetKeyValues#1[#2]{% \expandafter\def\expandafter\FV@KeyValues\expandafter{\FV@KeyValues,#2}#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\@CustomVerbatimCommand} % \begin{macrocode} \def\@CustomVerbatimCommand#1#2#3#4{% \begingroup\fvset{#4}\endgroup % If there are errors, it easier to locate. %% DG/SR modification begin - Jan. 13, 1998 %% \def\@tempa##1##2\@nil{\def\@tempa{##2}}% %% \expandafter\@tempa\string#3\@empty\@nil %% \@ifundefined{FVC@\@tempa}% \@ifundefined{FVC@#3}% %% DG/SR modification end {\FV@Error{Command `\string#3' is not a FancyVerb command.}\@eha}% {#1{#2}{\FV@Command{#4}{#3}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\CustomVerbatimCommand} % \begin{macrocode} \def\CustomVerbatimCommand{\@CustomVerbatimCommand\newcommand} % \end{macrocode} % \end{macro} % % \begin{macro}{\RecustomVerbatimCommand} % \begin{macrocode} \def\RecustomVerbatimCommand{\@CustomVerbatimCommand\renewcommand} % \end{macrocode} % \end{macro} % % \cs{FV@Environment} is for verbatim environments. Example: % % \verb+\def\Verbatim{\FV@Environment{}{Verbatim}}+ % % \verb+\@namedef{Verbatim*}{\FV@Environment{showspaces}{Verbatim}}+ % % \verb+\FV@Environment{}{}+: % % \begin{enumerate} % \item Defines \cs{FV@KeyValues} to be \verb++. % \item Sets \verb+\catcode`\^^M=13+, checks for `[', and resets % \verb+\catcode``^^M=5+. % \item Reads \verb+[]+ and adds it to \cs{FV@KeyValues} if `[' % was found. % \item Executes \verb+\FVB@+. % \end{enumerate} % % \cs{FV@Environment} is like \cs{FV@Command}, except: % % \begin{itemize} % \item It omits step 2 (looking for $*$), and % \item It sets \verb+\catcode`\^^M=13+ when checking for the `[' of the % optional argument, so that it does not skip over \verb+^^M+ if there % is no `['. % \end{itemize} % % \begin{macro}{\FV@Environment} % \begin{macrocode} \def\FV@Environment#1#2{% \def\FV@KeyValues{#1}% \catcode`\^^M=\active \@ifnextchar[% {\catcode`\^^M=5 \FV@GetKeyValues{\@nameuse{FVB@#2}}}% {\catcode`\^^M=5 \@nameuse{FVB@#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\CustomVerbatimEnvironment} % \begin{macrocode} \def\CustomVerbatimEnvironment{\@CustomVerbatimEnvironment\newenvironment} % \end{macrocode} % \end{macro} % % \begin{macro}{\RecustomVerbatimEnvironment} % \begin{macrocode} \def\RecustomVerbatimEnvironment{\@CustomVerbatimEnvironment\renewenvironment} % \end{macrocode} % \end{macro} % % \begin{macro}{\@CustomVerbatimEnvironment} % \begin{macrocode} \def\@CustomVerbatimEnvironment#1#2#3#4{% \begingroup\fvset{#4}\endgroup % If there are errors, it easier to locate. \@ifundefined{FVB@#3}% {\FV@Error{`#3' is not a FancyVerb environment.}\@eha}% {#1{#2}{\FV@Environment{#4}{#3}}{\@nameuse{FVE@#3}}% #1{#2*}{\FV@Environment{#4,showspaces}{#3}}{\@nameuse{FVE@#3}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\DefineVerbatimEnvironment} % \begin{macrocode} \def\DefineVerbatimEnvironment#1#2#3{% \@namedef{#1}{\FV@Environment{#3}{#2}}% \@namedef{end#1}{\@nameuse{FVE@#2}}% \@namedef{#1*}{\FV@Environment{#3,showspaces}{#2}}% \@namedef{end#1*}{\@nameuse{FVE@#2}}} % \end{macrocode} % \end{macro} % % Then commands or environments set key values with \cs{FV@UseKeyValues}, % within a group. % % \begin{macro}{\FV@UseKeyValues} % \begin{macrocode} \def\FV@UseKeyValues{% \ifx\FV@KeyValues\@empty\else \def\KV@prefix{KV@FV@}% \expandafter\KV@do\FV@KeyValues,\relax,% \def\FV@KeyValues{}% \fi} % \end{macrocode} % \end{macro} % % \subsection{Scanning} % % Scanning macros: % % \begin{itemize} % \item read a line at a time from an environment or a file, % \item save the line in \cs{FV@Line}, and % \item execute \cs{FV@PreProcessLine}. % \end{itemize} % % \noindent\cs{FV@PreProcessLine}: % % \begin{itemize} % \item Determines whether line is in a user-specified ranges, and if so, % \item Strips the line of a user-specified no. of tokens, and % \item Executes \verb+\FV@ProcessLine{}+. % \end{itemize} % % Two things are common to scanning an environment or reading a file: % % \begin{itemize} % \item \cs{FV@CatCodes} $\Longrightarrow$ Change \verb+\catcode+'s. % \item \cs{FV@PreProcessLine} $\Longrightarrow$ See above. % \end{itemize} % % \subsection{Codes} % % \begin{macro}{\FV@CatCodes} % \begin{macrocode} \def\FV@CatCodes{% \let\do\@makeother\dospecials % The usual stuff. \FV@ActiveWhiteSpace % See below. \FV@FontScanPrep % See below. \FV@CatCodesHook % A style hook. \FancyVerbCodes} % A user-defined hook. % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ActiveWhiteSpace} % \begin{macrocode} \def\FV@ActiveWhiteSpace{% \catcode`\^^M=\active % End of line \catcode`\ =\active % Space \catcode`\^^I=\active} % Tab % \end{macrocode} % \end{macro} % % CM Ligatures: % % \begin{tabbing} % Left-quote: \= \verb+--+ \= \verb+---+ \= fl \= ffi \= ffl \kill % Left-quote: \> `` \> !` \> ?` \\ % Letter f: \> ff \> fi \> fl \> ffi \> ffl \\ % Hyphen: \> \verb+--+ \> \verb+---+ % \end{tabbing} % % \begin{macro}{\FV@CatCodesHook} % \begin{macrocode} \def\FV@CatCodesHook{} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@AddToHook} % \begin{macrocode} \def\FV@AddToHook#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2\relax}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FancyVerbCodes} % \begin{macrocode} \define@key{FV}{codes}[]{\def\FancyVerbCodes{#1\relax}} \define@key{FV}{codes*}{% \expandafter\def\expandafter\FancyVerbCodes\expandafter{% \FancyVerbCodes#1\relax}} \fvset{codes} % \end{macrocode} % \end{macro} % % \begin{macrocode} \define@key{FV}{commandchars}[\\\{\}]% {\def\@tempa{#1}% \ifx\@tempa\FV@None \let\FV@CommandChars\relax \else \FV@DefineCommandChars#1\relax\relax\relax \fi} % \end{macrocode} % % \begin{macro}{\FV@DefineCommandChars} % \begin{macrocode} \def\FV@DefineCommandChars#1#2#3{% \def\FV@CommandChars{% \catcode`#1=0\relax\catcode`#2=1\relax\catcode`#3=2\relax}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \FV@AddToHook\FV@CatCodesHook\FV@CommandChars % \end{macrocode} % % \begin{macro}{\FV@CommentChar} % \begin{macrocode} \define@key{FV}{commentchar}[\%]{% \def\@tempa{#1}% \ifx\@tempa\FV@None \let\FV@CommentChar\relax \else \def\FV@CommentChar{\catcode`#1=14}% \fi} % \end{macrocode} % \end{macro} % % \begin{macrocode} \FV@AddToHook\FV@CatCodesHook\FV@CommentChar % \end{macrocode} % % \begin{macrocode} \fvset{commandchars=none,commentchar=none} % \end{macrocode} % % \subsection{Preprocess line} % % These is tedious and takes up macro space, but it doesn't slow things % down much when the parameters are not used. % % \noindent\texttt{start}, \texttt{stop} and \texttt{gobble} parameters: % % \noindent if value is a number, then after the assignment the next token is % \cs{relax}. % % "Preprocessing the line" involves: % \begin{itemize} % \item Checking whether this line falls in the range specified by start or stop strings. % or \texttt{firstline} or \texttt{lastline} line-numbers, or a mixture. % \item Gobble'ing initial characters. % \end{itemize} % \begin{macrocode} \define@key{FV}{firstline}{% \afterassignment\FV@ParseStart\@tempcnta=0#1\relax\@nil{#1}} % \end{macrocode} % % \begin{macro}{\FV@ParseStart} % \begin{macrocode} \def\FV@ParseStart#1\relax\@nil#2{% \ifx\@nil#1\@nil \edef\FancyVerbStartNum{\the\@tempcnta}% \let\FancyVerbStartString\relax \else \edef\FancyVerbStartString{#2}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@firstline@default} % \begin{macrocode} \def\KV@FV@firstline@default{% \let\FancyVerbStartNum\z@ \let\FancyVerbStartString\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \define@key{FV}{lastline}{% \afterassignment\FV@ParseStop\@tempcnta=0#1\relax\@nil{#1}} % \end{macrocode} % % \begin{macro}{\FV@ParseStop} % \begin{macrocode} \def\FV@ParseStop#1\relax\@nil#2{% \ifx\@nil#1\@nil \edef\FancyVerbStopNum{\the\@tempcnta}% \let\FancyVerbStopString\relax \else \edef\FancyVerbStopString{#2}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@lastline@default} % \begin{macrocode} \def\KV@FV@lastline@default{% \let\FancyVerbStopNum\z@ \let\FancyVerbStopString\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{firstline,lastline} % \end{macrocode} % % \begin{macrocode} \newcount\FV@CodeLineNo % \end{macrocode} % % If \cs{FV@FindStartStop} determines the line should be printed, it % executes \cs{FV@@PreProcessLine} % % \begin{macro}{\FV@PreProcessLine} % \begin{macrocode} \def\FV@PreProcessLine{% \global\advance\FV@CodeLineNo\@ne \FV@FindStartStop} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@PreProcessLine} % \begin{macrocode} \def\FV@@PreProcessLine{% \FV@StepLineNo \FV@Gobble \expandafter\FV@ProcessLine\expandafter{\FV@Line}} % \end{macrocode} % \end{macro} % % The definition of \cs{FV@FindStartStop} changes, so that we don't % have to check irrelevant conditions with each line. % % Here's how it works; for simplicity we assume \texttt{firstline} and \texttt{lastline} % have been specified, rather than start or stop strings. % % The first time \cs{FV@FindStartStop} is called: % \begin{enumerate} % \item It calls % \cs{FV@DefineFindStart}. (The name roughly means "define\\ % \cs{FV@FindStartStop} to detect when we've reached the \underline{start} of the % specified range".) This checks the range parameters that have been % specified, and then redefines \cs{FV@FindStartStop} (yes, the % function that has called this code) to contain only % the necessary checks, for efficiency reasons: % % \begin{itemize} % % \item If we haven't printed any lines yet, which is true when\\ % \cs{FV@FindStartStop} is first called, we only need to check % the current line-number against \texttt{firstline}, so we redefine % \cs{FV@FindStartStop} to be\\ % \cs{FV@FindStartNum}. % % \item If \texttt{firstline} isn't set, we only have to check the % current line-number against \texttt{lastline}, so we redefine % \cs{FV@FindStartStop} to be \cs{FV@DefineFindStop}. % (The name roughly means "define\\ % \cs{FV@FindStartStop} to detect when we've reached the % \underline{stop} (end) of the % specified range", but unlike the START case, it includes code % (\cs{FV@@PreProcessLine}) to print the current line.) % % \end{itemize} % % % \item It then calls the newly-defined \cs{FV@FindStartStop} to see % if the current line being processed is within the range to be printed. % % \end{enumerate} % % \cs{FV@FindStartStop} is redefined once as described above, but it % can be redefined again: % % \begin{enumerate} % % \item When we have reached \texttt{firstline}, i.e.\ have entered the % range to be printed, we redefine % \cs{FV@FindStartStop} to be \cs{FV@DefineFindStop}. (We know % we've reached the start, so there's no point checking that again on % future calls.) % % \item When we reach \texttt{lastline} and have printed it, we won't % want to print any more lines, so we redefine % \cs{FV@FindStartStop} to \cs{relax} so we do nothing (and do % it efficiently). % % Note that when \texttt{firstline} = \texttt{lastline} (= 6, say), it is % \cs{FV@FindStartNum} (which \cs{FV@FindStartStop} has % initially been redefined to) that notices when we reach line % 6, and prints it, and redefines \cs{FV@FindStartStop} to be \cs{FV@DefineFindStop}. % Then we read line 7, so \cs{FV@DefineFindStop} has to check % whether we've passed \texttt{lastline}, and therefore shouldn't print % the current line, before % redefining \cs{FV@FindStartStop} to \cs{relax} as explained above. % % By contrast, when \texttt{firstline} is less than \texttt{lastline} (= 6, 8, say), when we % reach line 8, \cs{FV@DefineFindStop} sees that we're at the % end of the range, and \emph{does} print the line, before % redefining \cs{FV@FindStartStop} to \cs{relax} as above. % % This slight weirdness is because several of the macros are % defining themselves and one another, resulting in a slightly weird % execution flow. % % \end{enumerate} % % \begin{macro}{\FV@FindStartStop} % \begin{macrocode} \def\FV@FindStartStop{\FV@DefineFindStart\FV@FindStartStop} % \end{macrocode} % \end{macro} % % \begin{macrocode} %% \def\FV@DefinePreProcessLine{% %% \setcounter{FancyVerbLine}{0}% %% \FV@DefineFindStart} % \end{macrocode} % % \begin{macro}{\FV@DefineFindStart} % \begin{macrocode} \def\FV@DefineFindStart{% \ifx\FancyVerbStartString\relax \ifnum\FancyVerbStartNum<\tw@ \FV@DefineFindStop \else \let\FV@FindStartStop\FV@FindStartNum \fi \else \let\FV@FindStartStop\FV@FindStartString \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FindStartNum} % \begin{macrocode} \def\FV@FindStartNum{% \ifnum\FancyVerbStartNum>\FV@CodeLineNo\else \FV@DefineFindStop \expandafter\FV@@PreProcessLine \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FindStartString} % \begin{macrocode} %% SR modification begin - 1996 \def\FV@FindStartString{% \expandafter\FV@@FindStartString {\meaning\FV@Line}% {\meaning\FancyVerbStartString}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@FindStartString} % \begin{macrocode} \def\FV@@FindStartString#1#2{% \edef\@fooA{#1}\edef\@fooB{#2}% \ifx\@fooA\@fooB \FV@DefineFindStop \fi } %% SR modification end % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@DefineFindStop} % \begin{macrocode} \def\FV@DefineFindStop{% \ifx\FancyVerbStopString\relax \ifnum\FancyVerbStopNum<\@ne \let\FV@FindStartStop\FV@@PreProcessLine \else \let\FV@FindStartStop\FV@FindStopNum \fi \else \let\FV@FindStartStop\FV@FindStopString \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FindStopNum} % \begin{macrocode} \def\FV@FindStopNum{% \ifnum\FancyVerbStopNum>\FV@CodeLineNo \else \let\FV@FindStartStop\relax \ifeof\FV@InFile\else \immediate\closein\FV@InFile \fi \fi \ifnum\FancyVerbStopNum<\FV@CodeLineNo \else \FV@@PreProcessLine \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FindStopString} % \begin{macrocode} %% SR modification begin - 1996 \def\FV@FindStopString{% \expandafter\FV@@FindStopString {\meaning\FV@Line}% {\meaning\FancyVerbStopString}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@FindStopString} % \begin{macrocode} \def\FV@@FindStopString#1#2{% \edef\@fooA{#1}\edef\@fooB{#2}% \ifx\@fooA\@fooB \let\FV@FindStartStop\relax \ifeof\FV@InFile\else \immediate\closein\FV@InFile \fi \else \expandafter\FV@@PreProcessLine \fi} %% SR modification end % \end{macrocode} % \end{macro} % % Gobblings. \cs{FV@Gobble} does nothing, or strips some tokens from % the line and stores the result in \cs{FV@Line} again. We use % \LaTeX's \verb+\renewcommand+ to define a command for gobbling up to % 9 arguments. This is not the same as removing 9 tokens, but is easier. % % \begin{macro}{\FV@@Gobble} % \begin{macrocode} \def\FV@@Gobble{% \expandafter\expandafter\expandafter\FV@@@Gobble \expandafter\FV@@@@Gobble\FV@Line \@nil\@nil\@nil\@nil\@nil\@nil\@nil\@nil\@nil\@nil\@@nil} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@@Gobble} % \begin{macrocode} \def\FV@@@Gobble#1\@nil#2\@@nil{\def\FV@Line{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Gobble} % \begin{macrocode} \define@key{FV}{gobble}{% \@tempcnta=#1\relax \ifnum\@tempcnta<\@ne \let\FV@Gobble\relax \else \ifnum\@tempcnta>9 \FV@Error{gobble parameter must be less than 10}\FV@eha \else \renewcommand{\FV@@@@Gobble}[\@tempcnta]{}% \let\FV@Gobble\FV@@Gobble \fi \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@@@Gobble} % \begin{macrocode} \def\FV@@@@Gobble{} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@gobble@default} % \begin{macrocode} \def\KV@FV@gobble@default{\let\FV@Gobble\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{gobble} % \end{macrocode} % % \subsection{Scanning environments} % % \begin{macro}{\FV@Scan} % \begin{macrocode} \def\FV@Scan{% \FV@CatCodes \VerbatimEnvironment \FV@DefineCheckEnd \FV@BeginScanning} % \end{macrocode} % \end{macro} % % \cs{VerbatimEnvironment}: % % This saves the name of the current environment as % \cs{FV@EnvironName}, if the latter is not already defined. % Then \cs{FV@CheckEnd} knows how to find the end as long as either: % \begin{itemize} % \item \verb+\begin+ and \verb+\end+ are not used within the definition of % the environment, OR % \item \cs{VerbatimEnvironment} is used in the definition before the first % \verb+\begin+. % \end{itemize} % % \begin{macro}{\VerbatimEnvironment} % \begin{macrocode} \def\VerbatimEnvironment{% \ifx\FV@EnvironName\relax\xdef\FV@EnvironName{\@currenvir}\fi} % \end{macrocode} % \end{macro} % % \begin{macrocode} \let\FV@EnvironName\relax % \end{macrocode} % %\subsection{Check end} % % We have to check the argument of the first \verb+\end{}+ in each line, % compare it with \cs{FV@EnvironName}, and return \verb+\iftrue+ if it matches % and \verb+\iffalse+ otherwise. % % There are four cases (R=regular): % % \begin{tabbing} % catcode of \verb+{}+ \= : \= R \= 12 \= 12 \= 12 \kill % case \> : \> i \> ii \> iii \> iv \\ % catcode of \verb+\+ \> : \> R \> 12 \> 12 \> R \\ % catcode of \verb+{}+ \> : \> R \> R \> 12 \> 12 % \end{tabbing} % % For uniformity, we use \verb+![]+ instead of \verb+\{}+ in all the % definitions. % % We first set the catcodes of \verb+\{}+ to those in effect in the % verbatim environment. Then we define: % % \verb+!def!FV@CheckEnd#1[!FV@@CheckEnd#1\end{}!@nil]+ % % \noindent If {} have their usual catcodes, we define: % % \verb+!def!FV@@CheckEnd#1\end#2#3!@nil[!def!@tempa[#2]]+ % % \noindent If {} have catcode 12, we define: % % \verb+!def!FV@@CheckEnd#1\end{#2}#3!@nil[!def!@tempa[#2]]+ % % \begin{macrocode} \begingroup \catcode`\!=0 \catcode`\[=1 \catcode`\]=2 % \end{macrocode} % % Case i: % % \begin{macrocode} !gdef!FV@CheckEnd@i#1[!FV@@CheckEnd#1\end{}!@nil] !gdef!FV@@CheckEnd@i#1\end#2#3!@nil[!def!@tempa[#2]!def!@tempb[#3]] !gdef!FV@@@CheckEnd@i[\end{}] % \end{macrocode} % % Case ii: % % \begin{macrocode} \catcode`!\=12 !gdef!FV@CheckEnd@ii#1[!FV@@CheckEnd#1\end{}!@nil] !gdef!FV@@CheckEnd@ii#1\end#2#3!@nil[!def!@tempa[#2]!def!@tempb[#3]] !gdef!FV@@@CheckEnd@ii[\end{}] % \end{macrocode} % % Case iii: % % \begin{macrocode} !catcode`!{=12 !catcode`!}=12 !gdef!FV@CheckEnd@iii#1[!FV@@CheckEnd#1\end{}!@nil] !gdef!FV@@CheckEnd@iii#1\end{#2}#3!@nil[!def!@tempa[#2]!def!@tempb[#3]] !gdef!FV@@@CheckEnd@iii[\end{}] % \end{macrocode} % % Case iv: % % \begin{macrocode} !catcode`!\=0 !gdef!FV@CheckEnd@iv#1[!FV@@CheckEnd#1\end{}!@nil] !gdef!FV@@CheckEnd@iv#1\end{#2}#3!@nil[!def!@tempa[#2]!def!@tempb[#3]] !gdef!FV@@@CheckEnd@iv[\end{}] % \end{macrocode} % % \begin{macrocode} \endgroup % \end{macrocode} % % \begin{macro}{\FV@BadCodes} % \begin{macrocode} \def\FV@BadCodes#1{% \FV@Error {\string\catcode\space of \expandafter\@gobble\string#1 is wrong: \the\catcode`#1}% {Only the following catcode values are allowed: ^^J\@spaces \expandafter\@gobble\string\\ \space\space --> 0 or 12. ^^J\@spaces \string{ \string} --> 1 and 2, resp., or both 12. ^^JTo get this error, either you are a hacker or you got bad advice.}% \def\FV@CheckEnd##1{\iftrue}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@DefineCheckEnd} % \begin{macrocode} \def\FV@DefineCheckEnd{% \ifnum\catcode`\\=\z@ \ifnum\catcode`\{=\@ne \let\FV@CheckEnd\FV@CheckEnd@i \let\FV@@CheckEnd\FV@@CheckEnd@i \let\FV@@@CheckEnd\FV@@@CheckEnd@i \else \ifnum\catcode`\{=12 \let\FV@CheckEnd\FV@CheckEnd@iv \let\FV@@CheckEnd\FV@@CheckEnd@iv \let\FV@@@CheckEnd\FV@@@CheckEnd@iv \else \FV@BadCodes\{% \fi \fi \else \ifnum\catcode`\\=12 \ifnum\catcode`\{=\@ne \let\FV@CheckEnd\FV@CheckEnd@ii \let\FV@@CheckEnd\FV@@CheckEnd@ii \let\FV@@@CheckEnd\FV@@@CheckEnd@ii \else \ifnum\catcode`\{=12 \let\FV@CheckEnd\FV@CheckEnd@iii \let\FV@@CheckEnd\FV@@CheckEnd@iii \let\FV@@@CheckEnd\FV@@@CheckEnd@iii \else \FV@BadCodes\{% \fi \fi \else \FV@BadCodes\\% \fi \fi} % \end{macrocode} % \end{macro} % % \subsection{Line-by-line scanning} % % We first skip everything after the beginning of the environment. % % \begin{macro}{\FV@BeginScanning} % \begin{macrocode} \begingroup \catcode`\^^M=\active \gdef\FV@BeginScanning#1^^M{% \def\@tempa{#1}\ifx\@tempa\@empty\else\FV@BadBeginError\fi% \FV@GetLine}% \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@BadBeginError} % \begin{macrocode} \def\FV@BadBeginError#1{% \expandafter\@temptokena\expandafter{\@tempa}% \FV@Error {Extraneous input `\the\@temptokena' between \string\begin{\FV@EnvironName}[] and line end}% {This input will be discarded. Hit to continue.}} % \end{macrocode} % \end{macro} % % If \cs{FancyVerbGetLine} does not find a \verb+^^M+, then we are at % the end of the file, and \cs{FV@EOF} attempts to terminate the document. % Otherwise, \cs{FV@EOF} is gobbled by \cs{FancyVerbGetLine}. % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FV@GetLine} % \begin{macrocode} %% DG/SR modification begin - May. 18, 1998 (added code to turn off ligatures) %% \def\FV@GetLine{\expandafter\FV@CheckScan\FancyVerbGetLine} \def\FV@GetLine{\@noligs\expandafter\FV@CheckScan\FancyVerbGetLine} %% DG/SR modification end % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \begin{macro}{\FancyVerbGetLine} % \begin{macrocode} \begingroup \catcode`\^^M=\active \gdef\FancyVerbGetLine#1^^M{% \@nil \FV@CheckEnd{#1}% \ifx\@tempa\FV@EnvironName% % True if end is found \ifx\@tempb\FV@@@CheckEnd\else\FV@BadEndError\fi% \let\next\FV@EndScanning% \else% \def\FV@Line{#1}% \def\next{\FV@PreProcessLine\FV@GetLine}% \fi% \next}% \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@BadEndError} % \begin{macrocode} \def\FV@BadEndError{% \expandafter\@temptokena\expandafter{\@tempb}% \FV@Error {Extraneous input `\the\@temptokena' between \string\end{\FV@EnvironName} and line end}% {This input will be discarded. Type to continue.}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@EndScanning} % \begin{macrocode} \def\FV@EndScanning{% \edef\next{\noexpand\end{\FV@EnvironName}}% \global\let\FV@EnvironName\relax \next} % \end{macrocode} % \end{macro} % % \begin{macrocode} \@ifundefined{@currenvline}{\let\@currenvline\@empty}{} % \end{macrocode} % % \begin{macro}{\FV@CheckScan} % \begin{macrocode} \def\FV@CheckScan#1{\@ifnextchar\@nil{\@gobble}{\FV@EOF}} \def\FV@CheckScan#1{\ifx\@nil#1\@empty\else\expandafter\FV@EOF\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@EOF} % \begin{macrocode} \def\FV@EOF{% \FV@Error{Couldn't find `\string\end{\FV@EnvironName}' to end a verbatim environment\@currenvline.}% {Probably you mistyped the environment name or included an extraneous ^^Jspace, or are using an improperly defined verbatim environment. ^^JHit return and I will try to terminate this job.}% \FV@EndScanning \end{document}} % \end{macrocode} % \end{macro} % % \subsection{Input} % % \begin{macrocode} \newread\FV@InFile % \end{macrocode} % % \begin{macro}{\FV@Input} % \begin{macrocode} \def\FV@Input#1{% \immediate\openin\FV@InFile #1\relax \ifeof\FV@InFile \FV@Error{No verbatim file #1}\FV@eha \immediate\closein\FV@InFile \else \FV@CatCodes \expandafter\FV@@Input \fi} % \end{macrocode} % \end{macro} % % \noindent\TeX{} reports EOF when reading after the last newline character. % % \noindent Thus, we read to InLine, and if \TeX{} reports EOF: % \begin{itemize} % \item If InLine=Empty, previous line was last line in file (file ends nl). % \item Otherwise, InLine holds last line in file (file doesn't end in nl). % \end{itemize} % \cs{FV@@Input} handles both cases correctly. % % \begin{macro}{\FV@@Input} % \begin{macrocode} \def\FV@@Input{% \def\FV@Line{}% \FV@ReadLine \ifeof\FV@InFile \ifx\FV@Line\@empty\else \FV@PreProcessLine \fi \immediate\closein\FV@InFile \else \FV@PreProcessLine \expandafter\FV@@Input \fi} % \end{macrocode} % \end{macro} % % We also want to handle true comment characters correctly. This means that % we keep accumulating text in InLine until we find a \verb+^^M+ (indicating % that the line did not contain a comment character). % % \begin{macro}{\FV@ReadLine} % \begin{macrocode} \begingroup \catcode`\^^M=\active \gdef\FV@ReadLine{% \ifeof\FV@InFile\else \immediate\read\FV@InFile to\@tempa% \expandafter\FV@@ReadLine\@tempa^^M\relax^^M\@nil% \fi} % \end{macrocode} % \end{macro} % % \verb+#2+ is empty if line ends in \verb+^^M+, \verb+#2=\relax+ otherwise % % \begin{macro}{\FV@@ReadLine} % \begin{macrocode} \gdef\FV@@ReadLine#1^^M#2^^M#3\@nil{% \expandafter\def\expandafter\FV@Line\expandafter{% \FV@Line#1}% \ifx\relax#2\@empty\expandafter\FV@ReadLine\fi}% \endgroup % \end{macrocode} % \end{macro} % % \subsection{Formatting -- Common components} % % Some things that are common to all verbatim formatting: % % \begin{macro}{\FV@FormattingPrep} % \begin{macrocode} \def\FV@FormattingPrep{% \global\FV@CodeLineNo\z@ \frenchspacing % Cancels special punctuation spacing. \FV@SetupFont % See below. \FV@DefineWhiteSpace % See below. \FancyVerbDefineActive \FancyVerbFormatCom} % A user-defined hook (formatcom parameter). % \end{macrocode} % \end{macro} % % Fonts % % \changes{v2.6}{1998/07/17}{Correct a bug for the -- ligature in T1 encoding % (reported by Mario Hassler on May 12, 1998).} % % \begin{macrocode} \expandafter\ifx\csname selectfont\endcsname\relax % \end{macrocode} % % \begin{macro}{\FV@SetupFont} % \begin{macrocode} \def\FV@SetupFont{% \FV@BaseLineStretch \ifx\@currsize\small\normalsize\else\small\fi\@currsize \FV@FontSize \FV@FontFamily} \else \def\FV@SetupFont{% \FV@BaseLineStretch \FV@FontSize \FV@FontFamily \FV@FontSeries \FV@FontShape \selectfont %% DG/SR modification begin - May. 18, 1998 (added code to turn off ligatures) \@noligs} %% DG/SR modification end % \end{macrocode} % \end{macro} % % \begin{macrocode} \fi % \end{macrocode} % % \begin{macro}{\FV@FontSize} % \begin{macrocode} \define@key{FV}{fontsize}{% \def\@tempa{#1}% \ifx\@tempa\FV@Auto \let\FV@FontSize\relax \else \def\FV@FontSize{#1}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@fontsize@default} % \begin{macrocode} \def\KV@FV@fontsize@default{\let\FV@FontSize\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@BaseLineStretch} % \begin{macrocode} \define@key{FV}{baselinestretch}[auto]{% \def\@tempa{#1}% \ifx\@tempa\FV@Auto \let\FV@BaseLineStretch\relax \else \def\FV@BaseLineStretch{\def\baselinestretch{#1}}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@baselinestretch@default} % \begin{macrocode} \def\KV@FV@baselinestretch@default{\let\FV@BaseLineStretch\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \define@key{FV}{fontfamily}{% \@ifundefined{FV@fontfamily@#1}% {\def\FV@FontScanPrep{}\def\FV@FontFamily{\fontfamily{#1}}} {\csname FV@fontfamily@#1\endcsname}} % \end{macrocode} % % \begin{macro}{\FV@FontSeries} % \begin{macrocode} \define@key{FV}{fontseries}{% \def\@tempa{#1}% \ifx\@tempa\FV@Auto \let\FV@FontSeries\relax \else \def\FV@FontSeries{\fontseries{#1}}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FontShape} % \begin{macrocode} \define@key{FV}{fontshape}{% \def\@tempa{#1}% \ifx\@tempa\FV@Auto \let\FV@FontShape\relax \else \def\FV@FontShape{\fontshape{#1}}% \fi} % \end{macrocode} % \end{macro} % % Font family styles have to define \cs{FV@FontScanPrep} and % \cs{FV@FontFamily}. % % \begin{macro}{\FV@MakeActive} % \begin{macrocode} \def\FV@MakeActive#1{% \catcode`#1=\active \def\next##1{\expandafter\def\expandafter\FV@MakeUnActive\expandafter{% \FV@MakeUnActive\def##1{\string##1}}}% \begingroup\lccode`~=`#1\relax\expandafter\next\expandafter~\endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@MakeUnActive} % \begin{macrocode} \def\FV@MakeUnActive{} % \end{macrocode} % \end{macro} % % \begin{macrocode} \begingroup \catcode`\`=\active % \end{macrocode} % % \begin{macro}{\FV@fontfamily@tt} % \begin{macrocode} \gdef\FV@fontfamily@tt{% \def\FV@FontScanPrep{\FV@MakeActive\`}% %% SR modification begin - 1995 %% \def\FV@FontFamily{\tt`{{\string`}}}} \def\FV@FontFamily{\ttfamily\edef`{{\string`}}}} %% SR modification end % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@fontfamily@cmtt} % \begin{macrocode} \gdef\FV@fontfamily@cmtt{% \def\FV@FontScanPrep{\FV@MakeActive\`}% \def\FV@FontFamily{\edef`{{\string`}}\fontfamily{cmtt}}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \endgroup % \end{macrocode} % % \begin{macro}{\FV@fontfamily@cmtt-spanish} % \begin{macrocode} \@namedef{FV@fontfamily@cmtt-spanish}{% \def\FV@FontScanPrep{}% \def\FV@FontFamily{\fontfamily{cmtt}}} % \end{macrocode} % \end{macro} % % Fix me % % \begin{macro}{\FV@fontfamily@courier} % \begin{macrocode} \@namedef{FV@fontfamily@courier}{% \def\FV@FontScanPrep{}% %% SR modification begin - 1995 %% \def\FV@FontFamily{\fontfamily{rpcr}}} \def\FV@FontFamily{\fontfamily{pcr}}} %% SR modification end % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@fontfamily@helvetica} % \begin{macrocode} \@namedef{FV@fontfamily@helvetica}{% \def\FV@FontScanPrep{}% %% SR modification begin - 1995 %% \def\FV@FontFamily{\fontfamily{rphv}}} \def\FV@FontFamily{\fontfamily{phv}}} %% SR modification end % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{fontfamily=tt,fontsize=auto,fontshape=auto,fontseries=auto, baselinestretch=auto} % \end{macrocode} % % \cs{FV@DefineWhiteSpace} % % We just define the active characters to be ordinary commands, which % are easier to redefine. We do with any macros that use verbatim text. % % \begin{macrocode} \begingroup \catcode`\ =\active \catcode`\^^I=\active % \end{macrocode} % % \begin{macro}{\FV@DefineWhiteSpace} % \begin{macrocode} \gdef\FV@DefineWhiteSpace{\def {\FV@Space}\def^^I{\FV@Tab}}% % \end{macrocode} % \end{macro} % % \begin{macrocode} \endgroup % \end{macrocode} % % \begin{macro}{\FancyVerbDefineActive} % \begin{macrocode} \define@key{FV}{defineactive}[]{\def\FancyVerbDefineActive{#1\relax}} \define@key{FV}{defineactive*}{% \expandafter\def\expandafter\FancyVerbDefineActive\expandafter{% \FancyVerbDefineActive#1\relax}} \fvset{defineactive} % \end{macrocode} % \end{macro} % % \cs{FV@Space}: % % \begin{macro}{\FV@Space} % \begin{macrocode} \define@booleankey{FV}{showspaces}% {\def\FV@Space{{\FancyVerbSpace}}}% {\def\FV@Space{\ }} % \end{macrocode} % \end{macro} % % \begin{macrocode} {\catcode`\ =12 \gdef\FancyVerbSpace{\tt }} % \end{macrocode} % % \begin{macrocode} \fvset{showspaces=false} % \end{macrocode} % % \cs{FV@Tab}: % % \begin{macro}{\FV@Tab} % \begin{macrocode} \def\FV@Tab{\hbox to\FancyVerbTabSize\fontdimen2\font{\hss\FV@TabChar}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FancyVerbTabSize} % \begin{macrocode} \define@key{FV}{tabsize}{% \@tempcnta=#1\relax \ifnum\@tempcnta>100 \FV@Error{Tab size too large: `\the\@tempcnta'. (Max size = 100)}\FV@eha \else \edef\FancyVerbTabSize{\the\@tempcnta}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@TabChar} % \begin{macrocode} \define@booleankey{FV}{showtabs}% {\def\FV@TabChar{\FancyVerbTab}}% {\let\FV@TabChar\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{tabsize=8,showtabs=false} % \end{macrocode} % % Here is a weak attempt at a tab character. It may exceed the width % of a space character when the verbatim font is small. The only proper way % to do this is making it part of the verbatim font. % % \begin{macro}{\FancyVerbTab} % \begin{macrocode} \def\FancyVerbTab{% \valign{% \vfil##\vfil\cr \hbox{$\scriptscriptstyle-$}\cr \hbox to 0pt{\hss$\scriptscriptstyle\rangle\mskip -.8mu$}\cr \hbox{$\scriptstyle\mskip -3mu\mid\mskip -1.4mu$}\cr}} % \end{macrocode} % \end{macro} % % Obey Tabs: % % \begin{macrocode} \newbox\FV@TabBox % \end{macrocode} % % \begin{macro}{\FV@@ObeyTabsInit} % \begin{macrocode} \def\FV@@ObeyTabsInit{% \@tempdimb=\FancyVerbTabSize\fontdimen\tw@\font \edef\FV@ObeyTabSize{\number\@tempdimb}% \advance\@tempdimb\fontdimen\tw@\font \advance\@tempdimb-\FancyVerbTabSize sp % Allow for rounding errors. \edef\FV@@ObeyTabSize{\number\@tempdimb}% \let\FV@ObeyTabs\FV@@ObeyTabs \let\FV@Tab\FV@TrueTab} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@@ObeyTabs} % \begin{macrocode} \def\FV@@ObeyTabs#1{\setbox\FV@TabBox=\hbox{#1}\box\FV@TabBox} % \end{macrocode} % \end{macro} % % \begin{macrocode} \let\FV@ObeyTabs\relax % \end{macrocode} % % \begin{macro}{\FV@TrueTab} % \begin{macrocode} \def\FV@TrueTab{% \egroup \@tempdima=\FV@ObeyTabSize sp\relax \@tempcnta=\wd\FV@TabBox \advance\@tempcnta\FV@@ObeyTabSize\relax \divide\@tempcnta\@tempdima \multiply\@tempdima\@tempcnta \advance\@tempdima-\wd\FV@TabBox \setbox\FV@TabBox=\hbox\bgroup \unhbox\FV@TabBox\kern\@tempdima\hbox to\z@{\hss\FV@TabChar}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ObeyTabsInit} % \begin{macrocode} \define@booleankey{FV}{obeytabs}% {\let\FV@ObeyTabsInit\FV@@ObeyTabsInit}% {\let\FV@ObeyTabsInit\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{obeytabs=false} % \end{macrocode} % % \cs{FancyVerbFormatCom} % % \begin{macro}{\FancyVerbFormatCom} % \begin{macrocode} \define@key{FV}{formatcom}[]{\def\FancyVerbFormatCom{#1\relax}} \define@key{FV}{formatcom*}{% \expandafter\def\expandafter\FancyVerbFormatCom\expandafter{% \FancyVerbFormatCom#1\relax}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{formatcom} % \end{macrocode} % % \begin{macro}{\FancyVerbFormatLine} % \begin{macrocode} \def\FancyVerbFormatLine#1{\FV@ObeyTabs{#1}} % \end{macrocode} % \end{macro} % % \subsection{List environments} % % Some parameters: % % \begin{macro}{\FV@XLeftMargin} % \begin{macrocode} \define@key{FV}{xleftmargin}{\def\FV@XLeftMargin{#1}} \let\FV@XLeftMargin\z@ % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@XRightMargin} % \begin{macrocode} \define@key{FV}{xrightmargin}{\def\FV@XRightMargin{#1}} \let\FV@XRightMargin\z@ % \end{macrocode} % \end{macro} % % \begin{macro}{\if@FV@ResetMargins} % \begin{macrocode} \define@booleankey{FV}{resetmargins}% {\let\if@FV@ResetMargins\iftrue} {\let\if@FV@ResetMargins\iffalse} \fvset{resetmargins=false} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListParameterHook} % \begin{macrocode} \define@key{FV}{listparameters}{\def\FV@ListParameterHook{#1}} \def\FV@ListParameterHook{} % \end{macrocode} % \end{macro} % % \begin{macro}{\FancyVerbHFuzz} % \begin{macrocode} \define@key{FV}{hfuzz}{% \@tempdima=#1\relax \edef\FancyVerbHFuzz{\number\@tempdima sp}} \fvset{hfuzz=2pt} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@InterLinePenalty} % \begin{macrocode} \define@booleankey{FV}{samepage}% {\def\FV@InterLinePenalty{\interlinepenalty\@M}}% {\let\FV@InterLinePenalty\relax} \fvset{samepage=false} % \end{macrocode} % \end{macro} % % % \noindent Lists: % % \verb+\FV@List{}+ is a rewriting of \verb+\list{}{}\item[]+. % The rewrite gives me more control. % I might not get the vertical spacing exactly the same, but it % is more likely that it will get better than worse. % % The verbatim environment consists of a series of \verb+\hbox+'s inserted in % vertical mode. % % \noindent We need to take care of the following: % \begin{itemize} % \item leftmargin % \item rightmargin % \item topskip % \item botskip % \item toppenalty % \item botpenalty % \item interlinepenalties % \end{itemize} % % Note: A verbatim environment immediately after an \verb+\item+ starts on % the same line as the \verb+\item+'s label, unless we reset margins. % The user can instead have the environment start on a new % line by inserting \verb+`\ '+ between \verb+\item+ and the environment. % % \begin{macro}{\FV@List} % \begin{macrocode} \def\FV@List#1{% \begingroup \FV@UseKeyValues \FV@LeaveVMode \if@inlabel\else\setbox\@labels=\box\voidb@x\fi \FV@ListNesting{#1}% \FV@ListParameterHook \FV@ListVSpace \FV@SetLineWidth \FV@InterLinePenalty \let\FV@ProcessLine\FV@ListProcessLine@i \FV@CatCodes \FV@FormattingPrep \FV@ObeyTabsInit \FV@BeginListFrame} % \end{macrocode} % \end{macro} % % % \noindent Cases where we need to leave vmode: % \begin{itemize} % \item After an in-line section (\verb+\if@noskipsec=T+). % \item After an \verb+\item+ command, if we reset margins. % \end{itemize} % % Then we end \verb+\vmode+, using \verb+@noparlist+ as a flag if in vmode. % (Not the usual meaning of \verb+@noparlist+.) % % \begin{macro}{\FV@LeaveVMode} % \begin{macrocode} \def\FV@LeaveVMode{% \if@noskipsec \leavevmode \else \if@FV@ResetMargins\if@inlabel\leavevmode\fi\fi \fi \ifvmode\@noparlisttrue\else\@noparlistfalse\unskip\par\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListNesting} % \begin{macrocode} \def\FV@ListNesting#1{% \if@FV@ResetMargins \@listdepth=\z@ \else \ifnum\@listdepth>5\relax \@toodeep \else \advance\@listdepth\@ne \fi \fi \rightmargin\z@ \csname @list\romannumeral\the\@listdepth\endcsname \ifnum#1=\z@ \rightmargin\z@ \leftmargin\z@ \fi} % \end{macrocode} % \end{macro} % % % \noindent \cs{FV@ListVSpace} contains selected parts of \cs{@trivlist} and % \cs{@item}. % % \noindent Here are the cases: % % \noindent Vmode not in label or after \verb+@NOBREAK+: % \begin{tabbing} % \verb++ \= = \kill % \verb++ \> = \verb!\topsep + \partopsep + \parskip! \\ % \verb++ \> = \verb!\topsep + \partopsep! \\ % \verb++ \> = \verb+\@beginparpenalty+ \\ % \verb++ \> = \verb+\@endparpenalty+ % \end{tabbing} % % \noindent Vmode in label: % \begin{tabbing} % \verb++ \= = \verb!\topsep + \partopsep! \= \% \kill % \verb++ \> = \verb+\parskip+ \> \% Expected % anyway. \\ % \verb++ \> = \verb!\topsep + \partopsep! \> \% Omitted % in \LaTeX{} -- a bug? \\ % \verb++ \> = None \\ % \verb++ \> = \verb+\@endparpenalty+ \> \% Ditto. % \end{tabbing} % % \noindent Vmode after \verb+@nobreak+: % \begin{tabbing} % \verb++ \= = \kill % \verb++ \> = \verb+\parskip+ \\ % \verb++ \> = \verb!\topsep + \partopsep! \\ % \verb++ \> = \verb+None+ \\ % \verb++ \> = \verb+\@endparpenalty+ % \end{tabbing} % % \noindent Hmode: % \begin{tabbing} % \verb++ \= = \kill % \verb++ \> = \verb!\topsep + \parskip! \\ % \verb++ \> = \verb+\topsep+ \\ % \verb++ \> = \verb+\@beginparpenalty+ \\ % \verb++ \> = \verb+\@endparpenalty+ % \end{tabbing} % % \noindent Notes: % \begin{itemize} % \item Except when in label or after nobreak, \verb+\parskip+ is added with % \verb+\addvspace+, so that net space is: % % \verb!MAX{\topsep (+\partopsep) + \parskip , \lastskip }! % % (The usual \verb+\@item+ works the same way.) % \item \verb+\parskip+ is added afterwards by a new paragraph, if any. % \item \verb+ == \@topsepadd+ % \end{itemize} % % \begin{macro}{\FV@ListVSpace} % \begin{macrocode} \def\FV@ListVSpace{% \@topsepadd\topsep \if@noparlist\advance\@topsepadd\partopsep\fi \if@inlabel \vskip\parskip \else \if@nobreak \vskip\parskip \clubpenalty\@M \else \addpenalty\@beginparpenalty \@topsep\@topsepadd \advance\@topsep\parskip \addvspace\@topsep \fi \fi \global\@nobreakfalse \global\@inlabelfalse \global\@minipagefalse \global\@newlistfalse} % \end{macrocode} % \end{macro} % % \begin{tabbing} % \verb+\@totalleftmargin+ \= := \kill % \verb+\leftmargin+ \> := totalleftmargin \\ % \verb+\rightmargin+ \> := totalrightmargin \\ % \verb+\@totalleftmargin+ \> := totalleftmargin of enclosing environment. % \end{tabbing} % % \begin{macro}{\FV@SetLineWidth} % \begin{macrocode} \def\FV@SetLineWidth{% \if@FV@ResetMargins\else \advance\leftmargin\@totalleftmargin \fi \advance\leftmargin\FV@XLeftMargin\relax \advance\rightmargin\FV@XRightMargin\relax \linewidth\hsize \advance\linewidth-\leftmargin \advance\linewidth-\rightmargin \hfuzz\FancyVerbHFuzz\relax} % \end{macrocode} % \end{macro} % % We have to insert the right interline penalties (\verb+\interlinepenalty+, % \verb+\clubpenalty+, \verb+\widowpenalty+). We could process the environment % as one long paragraph and let \TeX{} insert the penalties, but this % might cause problems for a very long environment. % % \begin{description} % \item[Line 1] : Insert \verb+\@labels+ (maybe) plus current\_line % \item[Line 2] : Save current line % \item[Line 3] : penalty = interline + club ; Insert last line ; % Save current line. % \item[Line 4] : penalty = interline ; Insert last line ; Save current line. % \end{description} % % \noindent Then at the end: % \begin{description} % \item[Next line = 1] : Add null line. % \item[Next line = 2] : Nothing. % \item[Next line = 3] : penalty = interline + club + widow ; % Insert last line. % \item[Next line = 4] : penalty = interline + widow ; Insert last line. % \end{description} % % \begin{macro}{\FV@ListProcessLine} % \begin{macrocode} \def\FV@ListProcessLine#1{% \hbox to \hsize{% \kern\leftmargin \hbox to \linewidth{% \FV@LeftListNumber \FV@LeftListFrame \FancyVerbFormatLine{#1}\hss %% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) %% \FV@RightListFrame}% \FV@RightListFrame \FV@RightListNumber}% %% DG/SR modification end \hss}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListProcessLine@i} % \begin{macrocode} \def\FV@ListProcessLine@i#1{% \hbox{% \ifvoid\@labels\else \hbox to \z@{\kern\@totalleftmargin\box\@labels\hss}% \fi \FV@ListProcessLine{#1}}% \let\FV@ProcessLine\FV@ListProcessLine@ii} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListProcessLine@ii} % \begin{macrocode} \def\FV@ListProcessLine@ii#1{% \setbox\@tempboxa=\FV@ListProcessLine{#1}% \let\FV@ProcessLine\FV@ListProcessLine@iii} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListProcessLine@iii} % \begin{macrocode} \def\FV@ListProcessLine@iii#1{% {\advance\interlinepenalty\clubpenalty\penalty\interlinepenalty}% \box\@tempboxa \setbox\@tempboxa=\FV@ListProcessLine{#1}% \let\FV@ProcessLine\FV@ListProcessLine@iv} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListProcessLine@iv} % \begin{macrocode} \def\FV@ListProcessLine@iv#1{% \penalty\interlinepenalty \box\@tempboxa \setbox\@tempboxa=\FV@ListProcessLine{#1}}% % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@EndList} % \begin{macrocode} \def\FV@EndList{% \FV@ListProcessLastLine \FV@EndListFrame \@endparenv \endgroup \@endpetrue} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@ListProcessLastLine} % \begin{macrocode} \def\FV@ListProcessLastLine{% \ifx\FV@ProcessLine\FV@ListProcessLine@iv {\advance\interlinepenalty\widowpenalty\penalty\interlinepenalty}% \box\@tempboxa \else \ifx\FV@ProcessLine\FV@ListProcessLine@iii {\advance\interlinepenalty\widowpenalty \advance\interlinepenalty\clubpenalty \penalty\interlinepenalty}% \box\@tempboxa \else \ifx\FV@ProcessLine\FV@ListProcessLine@i \FV@Error{Empty verbatim environment}{}% \FV@ProcessLine{}% \fi \fi \fi} % \end{macrocode} % \end{macro} % % Verbatim environment: % % \DescribeEnv{Verbatim} % \begin{macrocode} \def\FV@VerbatimBegin{\FV@List\z@} \def\FV@VerbatimEnd{\FV@EndList} % \end{macrocode} % % \begin{macro}{\FVB@Verbatim} % \begin{macrocode} \def\FVB@Verbatim{\FV@VerbatimBegin\FV@Scan} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVE@Verbatim} % \begin{macrocode} \def\FVE@Verbatim{\FV@VerbatimEnd} % \end{macrocode} % \end{macro} % % \begin{macrocode} \DefineVerbatimEnvironment{Verbatim}{Verbatim}{} % \end{macrocode} % % With \cs{UseVerbatim}, we have to take care of some of the things % \verb+\end{}+ would do. % % \begin{macro}{\FV@UseVerbatim} % \begin{macrocode} \def\FV@UseVerbatim#1{% \FV@VerbatimBegin#1\FV@VerbatimEnd \@doendpe\global\@ignorefalse\ignorespaces} % \end{macrocode} % \end{macro} % % \begin{macro}{\VerbatimInput} % \begin{macrocode} \def\VerbatimInput{\FV@Command{}{VerbatimInput}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@VerbatimInput} % \begin{macrocode} \def\FVC@VerbatimInput#1{\FV@UseVerbatim{\FV@Input{#1}}} % \end{macrocode} % \end{macro} % % LVerbatim environment: % % \DescribeEnv{LVerbatim} % \begin{macrocode} \def\FV@LVerbatimBegin{\FV@List\@ne} \def\FV@LVerbatimEnd{\FV@EndList} % \end{macrocode} % % \begin{macro}{\FVB@LVerbatim} % \begin{macrocode} \def\FVB@LVerbatim{\FV@LVerbatimBegin\FV@Scan} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVE@LVerbatim} % \begin{macrocode} \def\FVE@LVerbatim{\FV@LVerbatimEnd} % \end{macrocode} % \end{macro} % % \begin{macrocode} \DefineVerbatimEnvironment{LVerbatim}{LVerbatim}{} % \end{macrocode} % % \begin{macro}{\FV@LUseVerbatim} % \begin{macrocode} \def\FV@LUseVerbatim#1{% \FV@LVerbatimBegin#1\FV@LVerbatimEnd \@doendpe\global\@ignorefalse\ignorespaces} % \end{macrocode} % \end{macro} % % \begin{macro}{\LVerbatimInput} % \begin{macrocode} \def\LVerbatimInput{\FV@Command{}{LVerbatimInput}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@LVerbatimInput} % \begin{macrocode} \def\FVC@LVerbatimInput#1{\FV@LUseVerbatim{\FV@Input{#1}}} % \end{macrocode} % \end{macro} % % Frames: % % \begin{macro}{\FV@Frame@none} % \begin{macrocode} \def\FV@Frame@none{% \let\FV@BeginListFrame\relax \let\FV@LeftListFrame\relax \let\FV@RightListFrame\relax \let\FV@EndListFrame\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Frame@single} % \begin{macrocode} \def\FV@Frame@single{% \let\FV@BeginListFrame\FV@BeginListFrame@Single \let\FV@LeftListFrame\FV@LeftListFrame@Single \let\FV@RightListFrame\FV@RightListFrame@Single \let\FV@EndListFrame\FV@EndListFrame@Single} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Frame@lines} % \begin{macrocode} \def\FV@Frame@lines{% \let\FV@BeginListFrame\FV@BeginListFrame@Lines \let\FV@LeftListFrame\relax \let\FV@RightListFrame\relax \let\FV@EndListFrame\FV@EndListFrame@Lines} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Frame@topline} % \begin{macrocode} \def\FV@Frame@topline{% \let\FV@BeginListFrame\FV@BeginListFrame@Lines \let\FV@LeftListFrame\relax \let\FV@RightListFrame\relax \let\FV@EndListFrame\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Frame@bottomline} % \begin{macrocode} \def\FV@Frame@bottomline{% \let\FV@BeginListFrame\relax \let\FV@LeftListFrame\relax \let\FV@RightListFrame\relax \let\FV@EndListFrame\FV@EndListFrame@Lines} % \end{macrocode} % \end{macro} % % \changes{v2.6}{1998/07/17}{Add ``leftline'' value for the ``frame'' parameter % (idea taken from a requirement of % Christophe Roudet on June 9, 1998).} % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FV@Frame@leftline} % \begin{macrocode} %% To define a frame with only a left line \def\FV@Frame@leftline{% % To define the \FV@FrameFillLine macro (from \FV@BeginListFrame) \ifx\FancyVerbFillColor\relax \let\FV@FrameFillLine\relax \else \@tempdima\FV@FrameRule\relax \multiply\@tempdima-\tw@ \edef\FV@FrameFillLine{% {\noexpand\FancyVerbFillColor{\vrule\@width\number\@tempdima sp}% \kern-\number\@tempdima sp}}% \fi \let\FV@BeginListFrame\relax \let\FV@LeftListFrame\FV@LeftListFrame@Single \let\FV@RightListFrame\relax \let\FV@EndListFrame\relax} % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \changes{v2.6}{1998/07/17}{Add the ``label'' and ``labelposition'' parameters % (suggested by Michael Friendly on May 15, 1998).} % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FV@BeginListFrame@Single} % \begin{macrocode} \def\FV@BeginListFrame@Single{% \lineskip\z@ \baselineskip\z@ \ifx\FancyVerbFillColor\relax \let\FV@FrameFillLine\relax \else \@tempdima\FV@FrameRule\relax \multiply\@tempdima-\tw@ \edef\FV@FrameFillLine{% {\noexpand\FancyVerbFillColor{\vrule\@width\number\@tempdima sp}% \kern-\number\@tempdima sp}}% \fi %% DG/SR modification begin - May. 19, 1998 %% \FV@SingleFrameLine \FV@SingleFrameLine{\z@}% %% DG/SR modification end \penalty\@M \FV@SingleFrameSep \penalty\@M} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Label} % \begin{macrocode} %% DG/SR modification begin - May. 19, 1998 \define@key{FV}{label}{% \def\@tempa{#1}% \ifx\@tempa\FV@None \let\FV@LabelBegin\relax \let\FV@LabelEnd\relax \else \FV@Label@i#1\@nil% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Label@i} % \begin{macrocode} \def\FV@Label@i{\@ifnextchar[{\FV@Label@ii}{\FV@Label@ii[]}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@Label@ii} % \begin{macrocode} \def\FV@Label@ii[#1]#2\@nil{% \def\@tempa{#1}% \ifx\@tempa\empty \def\FV@LabelBegin{#2}% \else \def\FV@LabelBegin{#1}% \def\FV@LabelPositionBottomLine{\@ne}% \fi \def\FV@LabelEnd{#2}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{label=none} % \end{macrocode} % % \begin{macro}{\FV@LabelPosition} % \begin{macrocode} \define@key{FV}{labelposition}[none]{% \@ifundefined{FV@LabelPosition@#1}% {\FV@Error{Label position `#1' not defined.}\FV@eha}% {\@nameuse{FV@LabelPosition@#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@LabelPosition@none} % \begin{macrocode} \def\FV@LabelPosition@none{% \let\FV@LabelPositionTopLine\relax% \let\FV@LabelPositionBottomLine\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@LabelPosition@topline} % \begin{macrocode} \def\FV@LabelPosition@topline{% \def\FV@LabelPositionTopLine{\@ne}% \let\FV@LabelPositionBottomLine\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@LabelPosition@bottomline} % \begin{macrocode} \def\FV@LabelPosition@bottomline{% \let\FV@LabelPositionTopLine\relax% \def\FV@LabelPositionBottomLine{\@ne}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@LabelPosition@all} % \begin{macrocode} \def\FV@LabelPosition@all{% \def\FV@LabelPositionTopLine{\@ne}% \def\FV@LabelPositionBottomLine{\@ne}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{labelposition=topline} %% DG/SR modification end % \end{macrocode} % % \begin{macro}{\FV@SingleFrameLine} % \begin{macrocode} %% DG/SR modification begin - May. 19, 1998 %% \def\FV@SingleFrameLine{% \def\FV@SingleFrameLine#1{% %% DG/SR modification end \hbox to\z@{% \kern\leftmargin %% DG/SR modification begin - Jun. 22, 1998 \ifnum#1=\z@ \let\FV@Label\FV@LabelBegin \else \let\FV@Label\FV@LabelEnd \fi \ifx\FV@Label\relax %% DG/SR modification end \FancyVerbRuleColor{\vrule \@width\linewidth \@height\FV@FrameRule}% %% DG/SR modification begin - Jun. 22, 1998 \else \ifnum#1=\z@ \setbox\z@\hbox{\strut\enspace\FV@LabelBegin\enspace\strut}% \else \setbox\z@\hbox{\strut\enspace\FV@LabelEnd\enspace\strut}% \fi \@tempdimb=\dp\z@ \advance\@tempdimb -.5\ht\z@ \@tempdimc=\linewidth \advance\@tempdimc -\wd\z@ \divide\@tempdimc\tw@ \ifnum#1=\z@ % Top line \ifx\FV@LabelPositionTopLine\relax \FancyVerbRuleColor{\vrule \@width\linewidth \@height\FV@FrameRule}% \else \FV@FrameLineWithLabel \fi \else % Bottom line \ifx\FV@LabelPositionBottomLine\relax \FancyVerbRuleColor{\vrule \@width\linewidth \@height\FV@FrameRule}% \else \FV@FrameLineWithLabel \fi \fi \fi %% DG/SR modification end \hss}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FrameLineWithLabel} % \begin{macrocode} %% DG/SR modification begin - May. 19, 1998 \def\FV@FrameLineWithLabel{% \ht\z@\@tempdimb\dp\z@\@tempdimb% \FancyVerbRuleColor{% \vrule \@width\@tempdimc \@height\FV@FrameRule \raise\@tempdimb\box\z@ \vrule \@width\@tempdimc \@height\FV@FrameRule}} %% DG/SR modification end % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@BeginListFrame@Lines} % \begin{macrocode} \def\FV@BeginListFrame@Lines{% \begingroup \lineskip\z@skip %% DG modification begin - June 18, 1997 (effect of \baselineskip too earlier) %% \baselineskip\z@skip %% \FV@SingleFrameLine %% DG/SR modification begin - May. 19, 1998 %% \FV@SingleFrameLine \FV@SingleFrameLine{\z@}% %% DG/SR modification end \kern-0.5\baselineskip\relax \baselineskip\z@skip %% DG modification end \kern\FV@FrameSep\relax \endgroup}% % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@EndListFrame@Lines} % \begin{macrocode} \def\FV@EndListFrame@Lines{% \begingroup \baselineskip\z@skip \kern\FV@FrameSep\relax %% DG/SR modification begin - May. 19, 1998 %% \FV@SingleFrameLine \FV@SingleFrameLine{\@ne}% %% DG/SR modification end \endgroup} % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \begin{macro}{\FV@SingleFrameSep} % \begin{macrocode} \def\FV@SingleFrameSep{% \hbox to \z@{% \kern\leftmargin \hbox to\linewidth{% \FancyVerbRuleColor{% %% DG modification begin - June 18, 1997 (\FV@FrameSep missing) \ifx\FancyVerbFillColor\relax \vrule\@width 0pt\@height\FV@FrameSep\relax \fi %% DG modification end \vrule\@width\FV@FrameRule\relax \ifx\FancyVerbFillColor\relax \hfil \else {\FancyVerbFillColor\leaders\hrule\@height\FV@FrameSep\hfil}% \fi %% DG modification begin - June 18, 1997 (\FV@FrameSep missing) \ifx\FancyVerbFillColor\relax \vrule\@width 0pt\@height\FV@FrameSep\relax \fi %% DG modification end \vrule\@width\FV@FrameRule\relax}}% \hss}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@LeftListFrame@Single} % \begin{macrocode} \def\FV@LeftListFrame@Single{% \strut {\FancyVerbRuleColor{\vrule \@width\FV@FrameRule}}% \FV@FrameFillLine %% DG modification begin - June 18, 1997 (to fill color on left side) %% \kern\FV@FrameSep} \ifx\FancyVerbFillColor\relax \kern\FV@FrameSep \else {\noexpand\leavevmode\FancyVerbFillColor{\vrule\@width\FV@FrameSep}}% \fi} %% DG modification end % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@RightListFrame@Single} % \begin{macrocode} \def\FV@RightListFrame@Single{% %% DG modification begin - June 18, 1997 (to fill color on right side) %% \kern\FV@FrameSep \ifx\FancyVerbFillColor\relax \kern\FV@FrameSep \else {\noexpand\leavevmode\FancyVerbFillColor{\vrule\@width\FV@FrameSep}}% \fi {\noexpand\leavevmode\FancyVerbRuleColor{\vrule\@width\FV@FrameRule}}} %% DG modification end % \end{macrocode} % \end{macro} % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FV@EndListFrame@Single} % \begin{macrocode} \def\FV@EndListFrame@Single{% \penalty\@M \FV@SingleFrameSep \penalty\@M %% DG/SR modification begin - May. 19, 1998 %% \FV@SingleFrameLine} \FV@SingleFrameLine{\@ne}} %% DG/SR modification end % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \begin{macro}{\FV@FrameRule} % \begin{macrocode} \define@key{FV}{framerule}{% \@tempdima=#1\relax \edef\FV@FrameRule{\number\@tempdima sp\relax}} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@framerule@default} % \begin{macrocode} \def\KV@FV@framerule@default{\let\FV@FrameRule\fboxrule} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@FrameSep} % \begin{macrocode} \define@key{FV}{framesep}{% \@tempdima=#1\relax \edef\FV@FrameSep{\number\@tempdima sp\relax}} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@framesep@default} % \begin{macrocode} \def\KV@FV@framesep@default{\let\FV@FrameSep\fboxsep} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{framerule,framesep} % \end{macrocode} % % \begin{macro}{\FancyVerbRuleColor} % \begin{macrocode} \define@key{FV}{rulecolor}{% \def\@tempa{#1}% \ifx\@tempa\FV@None \let\FancyVerbRuleColor\relax \else \let\FancyVerbRuleColor\@tempa \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\FancyVerbFillColor} % \begin{macrocode} \define@key{FV}{fillcolor}{% \def\@tempa{#1}% \ifx\@tempa\FV@None \let\FancyVerbFillColor\relax \else \let\FancyVerbFillColor\@tempa \fi} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{rulecolor=none,fillcolor=none} % \end{macrocode} % % \begin{macro}{\FV@Frame@double} % \begin{macrocode} \def\FV@Frame@double{% \let\FV@FrameBegin\FV@FrameBegin@double \let\FV@FrameLine\FV@FrameLine@double \let\FV@FrameEnd\FV@FrameEnd@double} % \end{macrocode} % \end{macro} % % \begin{macrocode} \define@key{FV}{frame}[none]{% \@ifundefined{FV@Frame@#1}% {\FV@Error{Frame style `#1' not defined.}\FV@eha}% {\@nameuse{FV@Frame@#1}}} % \end{macrocode} % % \begin{macrocode} \fvset{frame=none} % \end{macrocode} % % % Code line numbers: % % \begin{macrocode} \newcounter{FancyVerbLine} % \end{macrocode} % % \begin{macro}{\FV@SetLineNo} % \begin{macrocode} \define@key{FV}{firstnumber}[auto]{% \def\@tempa{#1}\def\@tempb{auto}% \ifx\@tempa\@tempb \def\FV@SetLineNo{% \c@FancyVerbLine\FV@CodeLineNo \advance\c@FancyVerbLine\m@ne}% \else \def\@tempb{last}% \ifx\@tempa\@tempb \let\FV@SetLineNo\relax \else %% DG/SR modification begin - Jan. 19, 1998 %% \def\FV@SetLineNo{\c@FancyVerbLine#1}% \def\FV@SetLineNo{% \c@FancyVerbLine#1 \advance\c@FancyVerbLine\m@ne}% %% DG/SR modification end \fi \fi} % \end{macrocode} % \end{macro} % % \changes{v2.6}{1998/07/17}{Add the ``numberblanklines'' parameter to allow % to don't number empty lines (suggested by % Philippe Esperet on April 25, 1998).} % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\if@FV@NumberBlankLines} % \begin{macrocode} \define@booleankey{FV}{numberblanklines}% {\let\if@FV@NumberBlankLines\iftrue} {\let\if@FV@NumberBlankLines\iffalse} \fvset{numberblanklines=true} % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \changes{v2.6}{1998/07/17}{Correct a bug which didn't allow to use the label % macro in verbatim env. % (reported by Philippe Esperet on May 20, 1998).} % % \ifChangeBar\mbox{}\begin{changebar}\fi % \begin{macro}{\FV@refstepcounter} % \begin{macrocode} %% DG/SR modification begin - May. 20, 1998 %%\def\refstepcounter#1{% Adapted from latex.ltx \def\FV@refstepcounter#1{% %% DG/SR modification end \stepcounter{#1}% \protected@edef\@currentlabel {\csname p@#1\endcsname\arabic{FancyVerbLine}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@StepLineNo} % \begin{macrocode} \def\FV@StepLineNo{% \FV@SetLineNo %% DG/SR modification begin - Apr. 28, 1998 and May 20, 1998 %% \def\FV@StepLineNo{\refstepcounter{FancyVerbLine}}% \def\FV@StepLineNo{% \if@FV@NumberBlankLines \FV@refstepcounter{FancyVerbLine} \else \ifx\FV@Line\empty \else \FV@refstepcounter{FancyVerbLine} \fi \fi}% %% DG/SR modification end \FV@StepLineNo} % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\mbox{}\fi % % \begin{macro}{\theFancyVerbLine} % \begin{macrocode} %% DG/SR modification begin - 1995 %%\def\theFancyVerbLine{\rm\tiny\arabic{FancyVerbLine}} \def\theFancyVerbLine{\rmfamily\tiny\arabic{FancyVerbLine}} %% DG/SR modification end % \end{macrocode} % \end{macro} % % \begin{macrocode} \define@key{FV}{numbers}[none]{% \@ifundefined{FV@Numbers@#1}% {\FV@Error{Numbers style `#1' not defined.}\FV@eha}% {\@nameuse{FV@Numbers@#1}}} % \end{macrocode} % % (D.G. -- Dec. 20, 1995 and Jan. 28, 1998): % % Add-on to allow a step when printing the lines counter % (``\texttt{stepnumber''} keyword) % % Add-on to allow the counter to be printed on right side % (\texttt{numbers=right}) % % \begin{macro}{\FV@Numbers@none} % \begin{macrocode} %% DG modification begin - Dec. 20, 1995 and Jan. 28, 1998 %%\def\FV@Numbers@none{\let\FV@LeftListNumber\relax} \def\FV@Numbers@none{% \let\FV@LeftListNumber\relax \let\FV@RightListNumber\relax} % \end{macrocode} % \end{macro} % % \begin{macrocode} \newcount\FV@StepNumber \define@key{FV}{stepnumber}{\FV@StepNumber#1} % \end{macrocode} % % \begin{macro}{\KV@FV@stepnumber@default} % \begin{macrocode} \def\KV@FV@stepnumber@default{\FV@StepNumber\@ne} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{stepnumber} % \end{macrocode} % % ^^A `changebar' bug... \ifChangeBar\mbox{}\begin{changebar}\fi % \begin{macro}{\FV@Numbers@left} % \begin{macrocode} %% DG modification begin - Dec. 20, 1995 %%\def\FV@Numbers@left{% %% \def\FV@LeftListNumber{\hbox to\z@{% %% \hss\theFancyVerbLine\kern\FV@NumberSep}}} \def\FV@Numbers@left{% %% DG/SR modification begin - Apr. 28, 1998 \let\FV@RightListNumber\relax %% DG/SR modification end \def\FV@LeftListNumber{% \@tempcnta=\FV@CodeLineNo \@tempcntb=\FV@CodeLineNo \divide\@tempcntb\FV@StepNumber \multiply\@tempcntb\FV@StepNumber \ifnum\@tempcnta=\@tempcntb %% DG/SR modification begin - Apr. 28, 1998 %% \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% \if@FV@NumberBlankLines \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% \else \ifx\FV@Line\empty \else \hbox to\z@{\hss\theFancyVerbLine\kern\FV@NumberSep}% \fi \fi %% DG/SR modification end \fi}} % \end{macrocode} % \end{macro} % ^^A `changebar' bug... \ifChangeBar\end{changebar}\fi % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FV@Numbers@right} % \begin{macrocode} \def\FV@Numbers@right{% %% DG/SR modification begin - Apr. 28, 1998 \let\FV@LeftListNumber\relax %% DG/SR modification end \def\FV@RightListNumber{% \@tempcnta=\FV@CodeLineNo \@tempcntb=\FV@CodeLineNo \divide\@tempcntb\FV@StepNumber \multiply\@tempcntb\FV@StepNumber \ifnum\@tempcnta=\@tempcntb %% DG/SR modification begin - Apr. 28, 1998 %% \hbox to \z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% \if@FV@NumberBlankLines \hbox to\z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% \else \ifx\FV@Line\empty \else \hbox to\z@{\kern\FV@NumberSep\theFancyVerbLine\hss}% \fi \fi %% DG/SR modification end \fi}} %% DG modification end % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \begin{macro}{\FV@NumberSep} % \begin{macrocode} \define@key{FV}{numbersep}{% \@tempdima=#1\relax \edef\FV@NumberSep{\number\@tempdima sp\relax}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{numbers=none,numbersep=12pt,firstnumber=auto} % \end{macrocode} % % \subsection{BVerbatim} % % \DescribeEnv{BVerbatim} % \begin{macrocode} \def\FV@BVerbatimBegin{% \begingroup \FV@UseKeyValues \FV@BeginVBox \let\FV@ProcessLine\FV@BProcessLine \FV@FormattingPrep \FV@ObeyTabsInit}% \def\FV@BVerbatimEnd{\FV@EndVBox\endgroup} % \end{macrocode} % % \begin{macro}{\FV@BeginVBox} % \begin{macrocode} \def\FV@BeginVBox{% \leavevmode \hbox\ifx\FV@boxwidth\relax\else to\FV@boxwidth\fi\bgroup \ifcase\FV@baseline\vbox\or\vtop\or$\vcenter\fi\bgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@EndVBox} % \begin{macrocode} \def\FV@EndVBox{\egroup\ifmmode$\fi\hfil\egroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@boxwidth} % \begin{macrocode} \define@key{FV}{boxwidth}{% \def\@tempa{#1}\def\@tempb{auto}% \ifx\@tempa\@tempb \let\FV@boxwidth\relax \else \@tempdima=#1\relax \edef\FV@boxwidth{\number\@tempdima sp}% \fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\KV@FV@boxwidth@default} % \begin{macrocode} \def\KV@FV@boxwidth@default{\let\FV@boxwidth\relax} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@baseline} % \begin{macrocode} \define@key{FV}{baseline}{% \if t#1\@empty\let\FV@baseline\@ne\else \if c#1\@empty\let\FV@baseline\tw@\else\let\FV@baseline\z@\fi \fi} % \end{macrocode} % \end{macro} % % \begin{macrocode} \fvset{baseline=b,boxwidth} % \end{macrocode} % % \begin{macro}{\FV@BProcessLine} % \begin{macrocode} \def\FV@BProcessLine#1{\hbox{\FancyVerbFormatLine{#1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVB@BVerbatim} % \begin{macrocode} \def\FVB@BVerbatim{\FV@BVerbatimBegin\FV@Scan} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVE@BVerbatim} % \begin{macrocode} \def\FVE@BVerbatim{\FV@BVerbatimEnd} % \end{macrocode} % \end{macro} % % \begin{macrocode} \DefineVerbatimEnvironment{BVerbatim}{BVerbatim}{} % \end{macrocode} % % \begin{macro}{\FV@BUseVerbatim} % \begin{macrocode} \def\FV@BUseVerbatim#1{\FV@BVerbatimBegin#1\FV@BVerbatimEnd} % \end{macrocode} % \end{macro} % % \begin{macro}{\BVerbatimInput} % \begin{macrocode} \def\BVerbatimInput{\FV@Command{}{BVerbatimInput}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@BVerbatimInput} % \begin{macrocode} \def\FVC@BVerbatimInput#1{\FV@BUseVerbatim{\FV@Input{#1}}} % \end{macrocode} % \end{macro} % % \subsection{Save verbatim} % % \DescribeEnv{SaveVerbatim} % \begin{macrocode} \def\SaveVerbatim{\FV@Environment{}{SaveVerbatim}} % \end{macrocode} % % \begin{macro}{\FVB@SaveVerbatim} % \begin{macrocode} \def\FVB@SaveVerbatim#1{% \@bsphack \begingroup \FV@UseKeyValues %% \FV@BeginVBox %% \let\FV@ProcessLine\FV@BProcessLine %% \FV@FormattingPrep %% \FV@ObeyTabsInit% %% \def\SaveVerbatim@Name{#1}% \gdef\FV@TheVerbatim{}% \def\FV@ProcessLine##1{% \expandafter\gdef\expandafter\FV@TheVerbatim\expandafter{% \FV@TheVerbatim\FV@ProcessLine{##1}}}% \gdef\FV@TheVerbatim{}% \FV@Scan} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVE@SaveVerbatim} % \begin{macrocode} \def\FVE@SaveVerbatim{% \expandafter\global\expandafter\let \csname FV@SV@\SaveVerbatim@Name\endcsname\FV@TheVerbatim %% \expandafter\gdef %% \csname FV@SV@\SaveVerbatim@Name\endcsname{\FV@TheVerbatim} %% \FV@EndVBox %% \endgroup} \endgroup\@esphack} % \end{macrocode} % \end{macro} % % \DescribeEnv{SaveVerbatim} % \begin{macrocode} \DefineVerbatimEnvironment{SaveVerbatim}{SaveVerbatim}{} % \end{macrocode} % % \begin{macro}{\FV@CheckIfSaved} % \begin{macrocode} \def\FV@CheckIfSaved#1#2{% \@ifundefined{FV@SV@#1}% {\FV@Error{No verbatim text has been saved under name `#1'}\FV@eha}% {#2{\csname FV@SV@#1\endcsname}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\UseVerbatim} % \begin{macrocode} \def\UseVerbatim{\FV@Command{}{UseVerbatim}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@UseVerbatim} % \begin{macrocode} \def\FVC@UseVerbatim#1{\FV@CheckIfSaved{#1}{\FV@UseVerbatim}} % \end{macrocode} % \end{macro} % % \begin{macro}{\LUseVerbatim} % \begin{macrocode} \def\LUseVerbatim{\FV@Command{}{LUseVerbatim}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@LUseVerbatim} % \begin{macrocode} \def\FVC@LUseVerbatim#1{\FV@CheckIfSaved{#1}{\FV@LUseVerbatim}} % \end{macrocode} % \end{macro} % % \begin{macro}{\BUseVerbatim} % \begin{macrocode} \def\BUseVerbatim{\FV@Command{}{BUseVerbatim}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@BUseVerbatim} % \begin{macrocode} \def\FVC@BUseVerbatim#1{\FV@CheckIfSaved{#1}{\FV@BUseVerbatim}} % \end{macrocode} % \end{macro} % % \subsection{Verbatim out} % % \begin{macrocode} \newwrite\FV@OutFile % \end{macrocode} % % \begin{macro}{\VerbatimOut} % \begin{macrocode} \def\VerbatimOut{\FV@Environment{}{VerbatimOut}} % \end{macrocode} % \end{macro} % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FVB@VerbatimOut} % \begin{macrocode} \def\FVB@VerbatimOut#1{% \@bsphack \begingroup \FV@UseKeyValues \FV@DefineWhiteSpace \def\FV@Space{\space}% \FV@DefineTabOut \def\FV@ProcessLine{\immediate\write\FV@OutFile}% \immediate\openout\FV@OutFile #1\relax \let\FV@FontScanPrep\relax %% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures) \let\@noligs\relax %% DG/SR modification end \FV@Scan} % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % \begin{macro}{\FVE@VerbatimOut} % \begin{macrocode} \def\FVE@VerbatimOut{\immediate\closeout\FV@OutFile\endgroup\@esphack} % \end{macrocode} % \end{macro} % % \DescribeEnv{VerbatimOut} % \begin{macrocode} \DefineVerbatimEnvironment{VerbatimOut}{VerbatimOut}{} % \end{macrocode} % % \begin{macro}{\FV@DefineTabOut} % \begin{macrocode} \def\FV@DefineTabOut{% \def\FV@Tab{}% \@tempcnta=\FancyVerbTabSize\relax \loop\ifnum\@tempcnta>\z@ \edef\FV@Tab{\FV@Tab\space}% \advance\@tempcnta\m@ne \repeat} % \end{macrocode} % \end{macro} % % \subsection{Short verbatim} % % \cs{SaveVerb} % % Note ``\verb+\outer\def^^M{}+''. This is so that verbatim commands report an % error when encountering an end-of-line, rather than scanning to % the end of the file each time there is a missing verbatim delimiter. % % If scanning fails (and thus \TeX{} ignores \cs{FV@GetVerb}), \verb+#1+ is % defined to be empty, a group is ended, but \cs{FancyVerbAfterSave} is not % invoked. % % \begin{macro}{\FV@Command} % \begin{macrocode} \def\SaveVerb{\FV@Command{}{SaveVerb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@SaveVerb} % \begin{macrocode} \begingroup \catcode`\^^M=\active% \gdef\FVC@SaveVerb#1#2{% \@namedef{FV@SV@#1}{}% \begingroup% \FV@UseKeyValues% \FV@CatCodes% \outer\def^^M{\FV@EOL}% \global\let\@tempg\FancyVerbAfterSave% \catcode`#2=12% \def\@tempa{\def\FancyVerbGetVerb####1####2}% \expandafter\@tempa\string#2{\endgroup\@namedef{FV@SV@#1}{##2}\@tempg}% \FancyVerbGetVerb\FV@EOL}% \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@EOL} % \begin{macrocode} \def\FV@EOL{% \endgroup \FV@Error% {Could not find the end delimiter of a short verb command}% {You probably just forget the end delimiter of a \string\Verb\space or \string\SaveVerb^^J% command, or you broke the literal text across input lines.^^J% Hit to procede.}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FancyVerbAfterSave} % \begin{macrocode} \define@key{FV}{aftersave}{\def\FancyVerbAfterSave{#1}} \fvset{aftersave=} % \end{macrocode} % \end{macro} % % \begin{macro}{\FV@UseVerb} % \begin{macrocode} \def\FV@UseVerb#1{\mbox{\FV@UseKeyValues\FV@FormattingPrep#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\UseVerb} % \begin{macrocode} \def\UseVerb{\FV@Command{}{UseVerb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@UseVerb} % \begin{macrocode} \def\FVC@UseVerb#1{% \@ifundefined{FV@SV@#1}% {\FV@Error{Short verbatim text never saved to name `#1'}\FV@eha}% {\FV@UseVerb{\@nameuse{FV@SV@#1}}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\Verb} % \begin{macrocode} \def\Verb{\FV@Command{}{Verb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@Verb} % \begin{macrocode} \begingroup \catcode`\^^M=\active% \gdef\FVC@Verb#1{% \begingroup% \FV@UseKeyValues% \FV@FormattingPrep% \FV@CatCodes% \outer\def^^M{}% \catcode`#1=12% \def\@tempa{\def\FancyVerbGetVerb####1####2}% \expandafter\@tempa\string#1{\mbox{##2}\endgroup}% \FancyVerbGetVerb\FV@EOL}% \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\DefineShortVerb} % \begin{macrocode} \def\DefineShortVerb{\FV@Command{}{DefineShortVerb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@DefineShortVerb} % \begin{macrocode} \def\FVC@DefineShortVerb#1{% \@ifundefined{FV@CC@\string#1}% {\FVC@@DefineShortVerb#1}% {\FV@Error{`\expandafter\@gobble\string#1' is already a short verb character.}\FV@eha}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@@DefineShortVerb} % \begin{macrocode} \def\FVC@@DefineShortVerb#1{% \begingroup \lccode`\~=`#1% \lowercase{\gdef\@tempg{\edef~}\global\let\@temph~}% \endgroup \expandafter\let\csname FV@AC@\string#1\endcsname\@temph \expandafter\edef\csname FV@CC@\string#1\endcsname{\the\catcode`#1}% \expandafter\let\csname FV@KV@\string#1\endcsname\FV@KeyValues \@tempg{% \let\noexpand\FV@KeyValues\expandafter\noexpand \csname FV@KV@\string#1\endcsname \noexpand\FVC@Verb\expandafter\@gobble\string#1}% \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do#1}% \expandafter\def\expandafter\@sanitize\expandafter{\@sanitize\@makeother#1}% \catcode`#1=\active}% % \end{macrocode} % \end{macro} % % \begin{macro}{\UndefineShortVerb} % \begin{macrocode} \def\UndefineShortVerb#1{% \@ifundefined{FV@CC@\string#1}% {\FV@Error{`\expandafter\@gobble\string#1' is not a short verb character}\FV@eha}% {\FV@UndefineShortVerb#1}} % \end{macrocode} % \end{macro} % % \changes{v2.6}{1998/07/17}{Correct a bug to undefine the macro associated % to short verbatim character % (reported by Mikhail Kolodin on June 12, 1998).} % % \ifChangeBar\begin{changebar}\fi % \begin{macro}{\FV@UndefineShortVerb} % \begin{macrocode} \def\FV@UndefineShortVerb#1{% \catcode`#1=\csname FV@CC@\string#1\endcsname %% DG/SR modification begin - Jun. 12, 1998 \expandafter\let\csname FV@CC@\string#1\endcsname\relax %% DG/SR modification end \begingroup \lccode`\~=`#1% \lowercase{\gdef\@tempg{\let~}}% \endgroup \expandafter\@tempg\csname FV@AC@\string#1\endcsname \def\@tempa##1\do#1##2\@nil##3\@nil##4\@@nil{##3\def\dospecials{##1##2}\fi}% \expandafter\@tempa\dospecials\@nil\iftrue\@nil\do#1\@nil\iffalse\@nil\@@nil \def\@tempa##1\@makeother#1##2\@nil##3\@nil##4\@@nil{% ##3\def\@sanitize{##1##2}\fi}% \expandafter\@tempa\@sanitize\@nil\iftrue\@nil\do#1\@nil\iffalse\@nil\@@nil} % \end{macrocode} % \end{macro} % \ifChangeBar\end{changebar}\fi % % Moving verbatim. Need to worry about using separate identifier % for this class of verbatim, and % % \begin{macro}{\SaveMVerb} % \begin{macrocode} \def\SaveMVerb{\FV@Command{}{SaveMVerb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@SaveMVerb} % \begin{macrocode} \begingroup \catcode`\^^M=\active% \gdef\FVC@SaveMVerb#1#2{% \@ifundefined{FV@SVM@#1}{}% {\FV@Error{Moving verbatim name `#1' already used}% {I will overwrite the old definition. Hit to continue.}}% \global\@namedef{FV@SVM@#1}{}% \begingroup% \let\FV@SavedKeyValues\FV@KeyValues% \FV@UseKeyValues% \FV@CatCodes% \outer\def^^M{}% \global\let\@tempg\FancyVerbAfterSave% \catcode`#2=12% \def\@tempa{\def\FancyVerbGetVerb####1####2}% \expandafter\@tempa\string#2{% \if@filesw \FV@DefineWhiteSpace% \let\FV@Space\space% \let\FV@Tab\space% \FV@MakeUnActive% \let\protect\string \immediate\write\@auxout{% \noexpand\SaveGVerb[\FV@SavedKeyValues]{#1}\string#2##2\string#2}% \fi \endgroup% \@namedef{FV@SV@#1}{##2}% \@tempg}% \FancyVerbGetVerb\FV@EOL}% \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\SaveGVerb} % \begin{macrocode} \def\SaveGVerb{\FV@Command{}{SaveGVerb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@SaveGVerb} % \begin{macrocode} \begingroup \catcode`\^^M=\active% \gdef\FVC@SaveGVerb#1#2{% \global\@namedef{FV@SVG@#1}{}% \begingroup% \FV@UseKeyValues% \FV@CatCodes% \outer\def^^M{}% \catcode`#2=12% \def\@tempa{\def\FancyVerbGetVerb####1####2}% \expandafter\@tempa\string#2{\endgroup\global\@namedef{FV@SVG@#1}{##2}}% \FancyVerbGetVerb\FV@EOL}% \endgroup % \end{macrocode} % \end{macro} % % \begin{macro}{\UseMVerb} % \begin{macrocode} \def\UseMVerb{\protect\pUseMVerb} % \end{macrocode} % \end{macro} % % \begin{macro}{\pUseMVerb} % \begin{macrocode} \def\pUseMVerb{\FV@Command{}{pUseMVerb}} % \end{macrocode} % \end{macro} % % \begin{macro}{\FVC@pUseMVerb} % \begin{macrocode} \def\FVC@pUseMVerb#1{% \expandafter\ifx \csname FV@SVM@#1\endcsname\relax \expandafter\ifx \csname FV@SVG@#1\endcsname\relax \@warning{Moving verbatim text not defined for name `#1'}\FV@eha {\bf ??}% \else \FV@UseVerb{\@nameuse{FV@SVG@#1}}% \fi \else \FV@UseVerb{\@nameuse{FV@SVM@#1}}% \fi} % \end{macrocode} % \end{macro} % % \begin{macrocode} \expandafter\ifx\csname documentclass\endcsname\relax % \end{macrocode} % % \DescribeEnv{lrbox} % \begin{macrocode} \def\lrbox#1{% \edef\@tempa{% \endgroup \setbox#1\hbox{% \begingroup\aftergroup}% \def\noexpand\@currenvir{\@currenvir}}% %\def\noexpand\@currenvline{\on@line}}% \@tempa \@endpefalse \bgroup \ignorespaces} \def\endlrbox{\unskip\egroup} % \end{macrocode} % % \begin{macrocode} \fi % \end{macrocode} % % \begin{macrocode} %% DG/SR modification begin - Mar 21 2000 %%\@input{fancyvrb.rc} \InputIfFileExists{fancyvrb.cfg}{}{} %% DG/SR modification end % \end{macrocode} % % \noindent Unused code - don't take care! (DG/SR) % % \noindent Error messages to void: % % \begin{verbatim} % \FV@CheckBadBegin % \FV@CheckBadEnd % % \define@key{FV}{noligs}{% % \def\FV@ActiveLigs{}% % \def\FV@DefineLigs{}% % \@tfor\@tempa:=#1\do{% % {\lccode`\~=`#1\relax\lowercase{\gdef\@tempg{~}}}% % \expandafter\FV@addtonoligs\@tempg}} % \def\FV@addtonoligs#1{% % \expandafter\def\expandafter\FV@ActiveLigs\expandafter{% % \FV@ActiveLigs\catcode`#1=\active}% % \expandafter\def\expandafter\FV@DefineLigs\expandafter{% % \FV@DefineLigs\edef#1{{\string#1}}}} % % \fvset{suppressligs=\'} % % \fvset{noligs={>,-}} % \fvset{suppressligs=\>} % \fvset{suppressligs=\<} % % \def\FV@Error#1#2{% % \edef\@tempc{#2}\expandafter\errhelp\expandafter{\@tempc}% % \typeout{% % ^^J** FancyVerb Error:\space\space % Type \space H \space for immediate help. **}% % \errmessage{#1^^J}} % \end{verbatim} % % % % \Finale % \PrintIndex % \PrintChanges % \endinput %% %% End of file `fancyvrb.dtx'