%    \begin{macrocode}
\ProvidesPackage{newverbs}[2011/02/16 v1.2 Define new 'verb' commands and short verb. characters]
%    \end{macrocode}
%
% \subsection{Verb Definition Commands}
%
% \begin{macro}{\newverbcommand}
% \begin{macro}{\renewverbcommand}
% \begin{macro}{\provideverbcommand}
% This macro calls the real macro with the to be used definition macro.
%    \begin{macrocode}
\newcommand*\newverbcommand{\new@verbcommand\newcommand}
\newcommand*\renewverbcommand{\new@verbcommand\renewcommand}
\newcommand*\provideverbcommand{\new@verbcommand\providecommand}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\new@verbcommand}[4]{underlying definition macro}{macro to define}{code before}{code after}
% The trailing code is inserted by patching \cs{verb@egroup} which is called by \cs{verb}
% after the verbatim content.
%    \begin{macrocode}
\def\new@verbcommand#1#2#3#4{%
  #1*#2{%
    \begingroup
    \newverbcommand@settings
    \def\verb@egroup{\verb@orig@egroup#4\endgroup}%
    \def\newverbs@txend{#4\endgroup}%
    #3\verb
  }%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\newverbs@tabularxsupport}
% Enables support for the new verbatim macros inside \env{tabularx} environments.
% This environment defines its own almost-verbatim form of |\verb|%^^A|
% which lacks the end-macro we patch above. The following code inserts such 
% an end-macro.
%    \begin{macrocode}
\def\newverbs@tabularxsupport{%
    \begingroup
    \def\orig@TX@vb##1{\def\@tempa####1##1{\toks@{####1}\edef\@tempa{\the\toks@}%
        \expandafter\TX@v\meaning\@tempa\\\\\ifnum0=`{\fi}}\@tempa!}%
    \ifx\TX@vb\orig@TX@vb
        \endgroup
        \PackageInfo{newverbs}{Patching 'TX@vb' macro of the 'tabularx' package.}%
        \def\TX@vb##1{\def\@tempa####1##1{\toks@{####1}\edef\@tempa{\the\toks@}%
            \expandafter\TX@v\meaning\@tempa\\\\\ifnum0=`{\fi}\newverbs@txend}\@tempa!}%
    \else
        \endgroup
        \PackageWarning{newverbs}{Couldn't patch 'TX@vb' macro of the 'tabularx' package. Definition unknown.}%
    \fi
    \let\newverbs@tabularxsupport\relax
}
%    \end{macrocode}
% The end-macro is initially empty and is set for every call of a new verb macro.
%    \begin{macrocode}
\def\newverbs@txend{}
%    \end{macrocode}
% The support is activated either now or at the begin of the document if the \pkg{tabularx} is loaded.
%    \begin{macrocode}
\@ifpackageloaded{tabularx}{%
    \newverbs@tabularxsupport
}{%
    \AtBeginDocument{\@ifpackageloaded{tabularx}{\newverbs@tabularxsupport}{}}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\newverbcommand@settings}
% Some settings required for all new \cs{verb}-like commands.
% The original end group macro from \cs{verb} is saved away.
% Also the `temp box a' is provided with a user friendly name.
%    \begin{macrocode}
\def\newverbcommand@settings{%
  \let\verb@orig@egroup\verb@egroup
  \let\verbbox\@tempboxa
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Provided New Verb Commands}\label{sec:impl}
%
% \begin{macro}{\qverb}
% Quoting version of \cs{verb}. Places a quote character before and after the verbatim content: "verb".
%    \begin{macrocode}
\provideverbcommand{\qverb}{\qverbbeginquote}{\qverbendquote}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\qverbbeginquote}
% \begin{macro}{\qverbendquote}
% This macros insert the actual quotes. They can be redefined by the user to contain the required quotes.
% If available the quoting macros of \pkg{csquotes} are used.
% \changes{v1.1}{2010/04/13}{Added usage of 'csquotes' macros if loaded.}
%    \begin{macrocode}
\@ifundefined{openinnerquote}{%
  \def\qverbbeginquote{`}%
  \def\qverbendquote{'}%
}{%
  \def\qverbbeginquote{\openinnerquote}%
  \def\qverbendquote{\closeinnerquote}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\fverb}
% A framed version of \cs{verb}. Stores the verbatim content first into a box. Then the box content is framed.
%    \begin{macrocode}
\newverbcommand{\fverb}
  {\setbox\verbbox\hbox\bgroup\color@setgroup}
  {\color@endgroup\egroup\fbox{\box\verbbox}}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Make Special Short Verbatim Characters}
%
% \begin{macro}{\MakeSpecialShortVerb}[1]{verbatim macro}
% Uses the definition of \cs{MakeShortVerb} from \pkg{shortvrb} except with \cs{verb} replaced with the first argument.
% The second argument is then read by \cs{@MakeShortVerb}.
%    \begin{macrocode}
\newcommand*\MakeSpecialShortVerb[1]{%
  \@ifstar
    {\def\@shortvrbdef{#1*}\@MakeShortVerb}%
    {\def\@shortvrbdef{#1}\@MakeShortVerb}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Collect verbatim argument}
%
% \begin{macro}{\collectverb}
% Collects verbatim text which can be typeset.
% Checks for an existing star.
%    \begin{macrocode}
\newcommand*\collectverb{%
    \begingroup
    \verbatim@font
    \@ifstar
        \@scollectverb
        \@collectverb
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@collectverb}[1]{<code>}
% Changes catcodes and ensures that spaces are displayed normally.
%    \begin{macrocode}
\def\@collectverb#1{%
    \verb@eol@error
    \let\do\@makeother
    \dospecials
    \@vobeyspaces
    \frenchspacing
    \@noligs
    \@@collectverb{#1}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@scollectverb}[1]{<code>}
% Changes catcodes.
%    \begin{macrocode}
\def\@scollectverb#1{%
    \verb@eol@error
    \let\do\@makeother
    \dospecials
    \@noligs
    \@@collectverb{#1}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@collectverb}[2]{<code>}{<char>}
% Defines \Macro\@@@collectverb to read everything to the next occurrence of \meta{char}
% and feed it to the given \meta{code}.
%    \begin{macrocode}
\def\@@collectverb#1#2{%
    \ifnum`#2=`\{%
        \catcode`\}\active
    \else
        \catcode`#2\active
    \fi
    \begingroup
    \ifnum`#2=`\{%
        \lccode`\~`\}%
    \else
        \lccode`\~`#2%
    \fi
    \lowercase{\endgroup
        \def\@@@collectverb##1~}{#1{##1}\endgroup}%
    \@@@collectverb
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\Collectverb}
% Collects argument as plain verbatim and feeds it to the given code.
% The text is suitable to be printed to auxiliary files.
%    \begin{macrocode}
\newcommand*\Collectverb{%
    \begingroup
    \@ifstar
        \@sCollectverb
        \@Collectverb
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@Collectverb}
%    \begin{macrocode}
\def\@Collectverb#1{%
    \verb@eol@error
    \let\do\@makeother
    \dospecials
    \obeyspaces
    \@@Collectverb{#1}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@sCollectverb}
%    \begin{macrocode}
\def\@sCollectverb#1{%
    \verb@eol@error
    \let\do\@makeother
    \dospecials
    \@@Collectverb{#1}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@Collectverb}
%    \begin{macrocode}
\def\@@Collectverb#1#2{%
    \ifnum`#2=`\{%
        \catcode`\}\active
    \else
        \catcode`#2\active
    \fi
    \begingroup
    \ifnum`#2=`\{%
        \lccode`\~`\}%
    \else
        \lccode`\~`#2%
    \fi
    \lowercase{\endgroup
        \def\@@@Collectverb##1~}{\endgroup#1{##1}}%
    \@@@Collectverb
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\Verbdef}
%    \begin{macrocode}
\newcommand*\Verbdef{%
    \@ifstar
        {\@Verbdef*}%
        {\@Verbdef{}}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@Verbdef}
%    \begin{macrocode}
\newcommand*\@Verbdef[2]{%
    \Collectverb#1{\def#2}%
}
%    \end{macrocode}
% \end{macro}
%
