diff options
author | Karl Berry <karl@freefriends.org> | 2009-04-02 18:38:05 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-04-02 18:38:05 +0000 |
commit | 876cb4219f46ce0c2c326a9c5bb78de833b52904 (patch) | |
tree | 653c80f1405c3a625624e0b52678a41343bd88a0 /Master/texmf-dist/tex | |
parent | 3cb8f358eccf25ab947870c1308dbe55b2fbac5f (diff) |
new latex package codedoc (1apr09)
git-svn-id: svn://tug.org/texlive/trunk@12603 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/codedoc/codedoc.cls | 1651 |
1 files changed, 1651 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/codedoc/codedoc.cls b/Master/texmf-dist/tex/latex/codedoc/codedoc.cls new file mode 100644 index 00000000000..956226048ff --- /dev/null +++ b/Master/texmf-dist/tex/latex/codedoc/codedoc.cls @@ -0,0 +1,1651 @@ +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This is the CodeDoc class, produced by itself +% with the `produce' option on, from `CodeDoc-manual.tex'. +% +% Date: 2009/04/01 +% Version: v.0.1 +% Author: Paul Isambert +% +% The documentation can be found in `CodeDoc-manual.pdf' +% (you can produce it with `CodeDoc-manual.tex' without the +% `produce' option). +% +% This file is published under the LaTeX Project Public License: +% +% Do whatever you want to that software, +% but if you modify it, change its name to avoid confusion, +% and if you copy part of the code please mention where it comes from. +% +% Comments, suggestions, bugs and, of course, NOTES: +% zappathustra@free.fr +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{codedoc}[2009/04/01 v.0.1 Code and documentation in one file.] +\makeatletter +\catcode`\^^?=13 + +\newif\ifcd@produce +\newif\ifcd@autoclose +\newif\ifcd@obeystop +\newif\ifcd@makeindex +\newif\ifcd@noheader +\newcount\cd@tracingmode +\cd@tracingmode1 +\def\cd@GetClass{article()} + +\DeclareOption{autoclose}{\cd@autoclosetrue} +\DeclareOption{produce}{\cd@producetrue} +\DeclareOption{index}{\cd@makeindextrue} +\DeclareOption{obeystop}{\cd@obeystoptrue} +\DeclareOption{noheader}{\cd@noheadertrue} +\DeclareOption{tracing0}{\cd@tracingmode0} +\DeclareOption{tracing1}{\cd@tracingmode1} +\DeclareOption{tracing2}{\cd@tracingmode2} +\DeclareOption*{\edef\cd@GetClass{\CurrentOption()}} +\ProcessOptions\relax + +\def\cd@end{cd@end} +\ifcd@produce +\else +\def\cd@LoadClass#1(#2){% + \def\cd@Class{#1} + \expandafter\cd@GetOptions#2;cd@end;% + \LoadClass{#1}% + \@ifnextchar({\expandafter\@gobble\@gobble}{}} +\def\cd@GetOptions#1;{% + \def\cd@TempArg{#1} + \ifx\cd@TempArg\cd@end% + \let\cd@next\relax + \else% + \PassOptionsToClass{#1}{\cd@Class}% + \let\cd@next\cd@GetOptions% + \fi\cd@next} +\expandafter\cd@LoadClass\cd@GetClass + +\ifcd@makeindex + \RequirePackage{makeidx} + \makeindex +\else + \let\printindex\relax +\fi +\ifcd@obeystop + \ifcd@makeindex + \long\def\StopHere#1{#1\relax\par\printindex\end{document}} + \else + \long\def\StopHere#1{#1\relax\par\end{document}} + \fi +\else + \long\def\StopHere#1{} +\fi +\fi + +\newif\ifcd@eTeX +\@ifundefined{eTeXversion}{\cd@eTeXfalse}{\cd@eTeXtrue} + +\def\cd@Warning{\ClassWarningNoLine{codedoc}} +\def\cd@Error#1{\ClassError{codedoc}{#1}{}} + +\def\DocStripMarginpar{\reversemarginpar\marginparpush0pt\relax\marginparwidth8pc\relax} +\def\PrintMacro#1{\noindent\marginpar{\raggedleft\strut\ttfamily#1}\ignorespaces} + +\newcount\cd@Index +\def\hyperpage#1{#1} + +\def\DescribeIndexFont#1{\gdef\cdatDescribeFont##1{{#1\hyperpage{##1}}}} +\DescribeIndexFont{} +\def\DescribeMacro{\makeatletter\cd@DescribeMacro} +\def\cd@DescribeMacro#1{% + \makeatother% + \cd@Index=0 % + \cd@MakeEntry#1\cd@EndOfEntry% + \PrintMacro{\string#1}} +\def\DescribeEnvironment{\makeatletter\cd@DescribeEnvironment} +\def\cd@DescribeEnvironment#1{% + \makeatother% + \index{#1@\texttt{#1} (environment)|cdatDescribeFont}% + \PrintMacro{\string#1}} + +\def\DefineIndexFont#1{\gdef\cdatDefineFont##1{{#1\hyperpage{##1}}}} +\DefineIndexFont{\itshape} +\def\DefineMacro{\makeatletter\cd@DefineMacro} +\def\cd@DefineMacro#1{% + \makeatother% + \cd@Index1 % + \cd@MakeEntry#1\cd@EndOfEntry% + \PrintMacro{\string#1}} +\def\DefineEnvironment{\makeatletter\cd@DefineEnvironment} +\def\DefineEnvironment#1{% + \makeatother% + \index{#1@\texttt{#1} (environment)|cdatDefineFont}% + \PrintMacro{\string#1}} + +\def\cd@MakeEntry#1#2\cd@EndOfEntry{% + \def\cd@TempEntry{}% + \begingroup\escapechar\m@ne\expandafter\cd@AnalyzeEntry\string#1\cd@end\endgroup% + \expandafter\cd@AnalyzePrefix\cd@TempEntry\cd@end% + \expandafter\cd@@MakeEntry\cd@TempEntry\cd@EndOfEntry} +\chardef\AtChar=`\@ +\def\cd@AnalyzeEntry#1{% + \let\cd@next\cd@AnalyzeEntry% + \ifx#1\cd@end% + \let\cd@next\relax% + \else\if#1@% + \expandafter\gdef\expandafter\cd@TempEntry\expandafter{\cd@TempEntry\AtChar}% + \else% + \expandafter\gdef\expandafter\cd@TempEntry\expandafter{\cd@TempEntry#1}% + \fi\fi\cd@next} + +\newcount\cd@PrefixCount +\def\IgnorePrefix#1{\cd@PrefixCount\z@\def\Prefix{}\cd@IgnorePrefix#1\cd@end} +\def\cd@IgnorePrefix#1{% + \let\cd@next\cd@IgnorePrefix% + \ifx#1\cd@end% + \def\cd@next{\expandafter\cd@ScanPrefix\Prefix\cd@end}% + \else\if#1@% + \expandafter\def\expandafter\Prefix\expandafter{\Prefix\AtChar}% + \else% + \edef\cd@PrefixLetter{\string#1}% + \expandafter\cd@MakePrefix\cd@PrefixLetter% + \fi\fi\cd@next} +\def\cd@MakePrefix#1{% + \expandafter\def\expandafter\Prefix\expandafter{\Prefix#1}}% +\def\cd@ScanPrefix#1{% + \ifx#1\cd@end% + \let\cd@next\cd@DefPrefix% + \else% + \advance\cd@PrefixCount\@ne% + \let\cd@next\cd@ScanPrefix% + \fi\cd@next} +\def\cd@DefPrefix{% + \ifcase\cd@PrefixCount% + \def\cd@AnalyzePrefix##1\cd@end{}% + \or\def\cd@AnalyzePrefix##1##2\cd@end{% + \def\cd@TempPrefix{##1}\def\cd@RestOfEntry{##2}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3\cd@end{% + \def\cd@TempPrefix{##1##2}\def\cd@RestOfEntry{##3}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3##4\cd@end{% + \def\cd@TempPrefix{##1##2##3}\def\cd@RestOfEntry{##4}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3##4##5\cd@end{% + \def\cd@TempPrefix{##1##2##3##4}\def\cd@RestOfEntry{##5}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3##4##5##6\cd@end{% + \def\cd@TempPrefix{##1##2##3##4##5}\def\cd@RestOfEntry{##6}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3##4##5##6##7\cd@end{% + \def\cd@TempPrefix{##1##2##3##4##5##6}\def\cd@RestOfEntry{##7}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3##4##5##6##7##8\cd@end{% + \def\cd@TempPrefix{##1##2##3##4##5##6##7}\def\cd@RestOfEntry{##8}\cd@ComparePrefix}% + \or\def\cd@AnalyzePrefix##1##2##3##4##5##6##7##8##9\cd@end{% + \def\cd@TempPrefix{##1##2##3##4##5##6##7##8}\def\cd@RestOfEntry{##9}\cd@ComparePrefix}% + \fi\ignorespaces} +\newif\ifcd@Prefix +\def\cd@ComparePrefix{% + \ifx\cd@TempPrefix\Prefix% + \expandafter\def\expandafter\cd@TempEntry\expandafter{\cd@RestOfEntry}% + \cd@Prefixtrue% + \else% + \cd@Prefixfalse% + \fi} +\def\cd@@MakeEntry#1\cd@EndOfEntry{% + \ifcd@Prefix% + \ifcase\cd@Index% + \index{#1@\texttt{\char\escapechar\PrintPrefix\Prefix#1}|cdatDescribeFont}% + \or% + \index{#1@\texttt{\char\escapechar\PrintPrefix\Prefix#1}|cdatDefineFont}% + \fi% + \else% + \ifcase\cd@Index% + \index{#1@\texttt{\char\escapechar#1}|cdatDescribeFont}% + \or% + \index{#1@\texttt{\char\escapechar#1}|cdatDefineFont}% + \fi% + \fi} + +\IgnorePrefix{}% +\let\PrintPrefix\relax + +\def\meta#1{{\ensuremath\langle\emph{#1}\ensuremath\rangle}} +\def\marg#1{\texttt{\{}\meta{#1}\texttt{\}}} +\def\oarg#1{\texttt{[}\meta{#1}\texttt{]}} +\def\parg#1{\texttt{(}\meta{#1}\texttt{)}} +\def\cd@bslash{\char`\\} +\def\bslash{\texorpdfstring{\cd@bslash}{\string\\}} +\AtBeginDocument{\@ifundefined{texorpdfstring}{\def\texorpdfstring#1#2{#1}}{}} +\def\cd@CharErr#1#2{% + \bgroup + \escapechar\m@ne + \cd@Error{You can't use \string#1 for \string\\#2} + \egroup} + +\newif\ifcd@BadChar + +\def\cd@BadChar#1#2{% + \cd@BadChartrue + \ifcase\catcode`#1 % \ + \cd@CharErr{\\}{#2}% + \or% { + \cd@CharErr{\{}{#2}% + \or% } + \cd@CharErr{\}}{#2}% + \or% $ + \cd@BadCharfalse% + \or% & + \cd@BadCharfalse% + \or% ^^M + \or% # + \cd@BadCharfalse% + \or% ^ + \cd@BadCharfalse% + \or% _ + \cd@BadCharfalse% + \or% Ignored + \or% Spaces + \cd@CharErr{spaces}{#2}% + \or% Letters + \cd@CharErr{letters}{#2. \MessageBreak That's really bad}% + \or% Other + \cd@BadCharfalse% + \or% Active + \cd@CharErr{#1}{#2 - it's already active}% + \or% % + \cd@CharErr{#1}{#2}% + \fi} + +\def\cd@UndoErr#1{% + \bgroup% + \escapechar\m@ne% + \cd@Error{% + There is no \string\\\string#1\space defined.\MessageBreak% + \string\\Undo\string#1\space on line \the\inputlineno\space is useless}% + \egroup} +\def\cd@DefErr#1#2{% + \bgroup% + \escapechar\m@ne% + \expandafter\xdef\csname cd@#2Error\endcsname{% + \noexpand\cd@Error{% + You've already defined \string#1 as a \string\\#2\noexpand\MessageBreak% + on l. \the\inputlineno. You can't have two.\noexpand\MessageBreak% + Say \string\\Undo#2\space and then \string\\#2\space to change}}% + \egroup} + +\newif\ifcd@ShortVerb + +\def\ShortVerb#1{% + \cd@BadChar{#1}{ShortVerb}% + \ifcd@BadChar% + \else\ifcd@ShortVerb + \cd@ShortVerbError + \else + \cd@ShortVerbtrue + \cd@DefErr{#1}{ShortVerb} + \chardef\cd@ShortVerbCat\catcode`#1% + \bgroup% + \lccode`\~=`#1% + \lowercase{% + \gdef~{\leavevmode\bgroup\ttfamily\cd@Verbatim\catcode`#1\active\cd@ShortVerb}% + \gdef\cd@ShortVerb##1~{##1\egroup}% + \gdef\UndoShortVerb{% + \ifcd@ShortVerb% + \cd@ShortVerbfalse% + \catcode`~\cd@ShortVerbCat% + \else% + \cd@UndoErr{\ShortVerb}% + \fi}}% + \egroup% + \catcode`#1=13 + \fi\fi}% +\def\UndoShortVerb{\cd@UndoErr{\ShortVerb}} + +\newif\ifcd@ShortCode +\newif\ifcd@ShortCodeChar + +\def\ShortCode{% + \@ifnextchar[ + {\cd@MakeShortCode} + {\cd@MakeShortCode[code]}} +\bgroup +\catcode`\^^M13% +\gdef\cd@MakeShortCode[#1]#2{% + \def\cd@TempEnv{#1}% + \cd@BadChar{#2}{ShortCode}% + \ifcd@BadChar% + \else\ifcd@ShortCodeChar% + \cd@ShortCodeError% + \else% + \expandafter\ifx\csname #1@cd@EOL\endcsname\relax% + \cd@Error{% + `#1' is not an example environment.\MessageBreak% + `code' is selected instead}% + \def\cd@TempEnv{code}% + \fi% + \cd@ShortCodeChartrue% + \cd@DefErr{#2}{ShortCode}% + \chardef\cd@ShortCodeCat=\catcode`#2% + \bgroup% + \lccode`\~=`#2% + \lowercase{% + \gdef~{\cd@ShortCodetrue\csname\cd@TempEnv\endcsname}% + \gdef\cd@ShortEnd{~}% + \gdef\cd@ShortCode##1^^M##2~{\cd@StartGobble##2^^?\egroup}% + \gdef\cd@ActivateShortCode{\catcode`#2=13\relax}% + \gdef\UndoShortCode{% + \ifcd@ShortCodeChar% + \catcode`~=\cd@ShortCodeCat\relax% + \let\cd@ActivateShortCode\relax% + \cd@ShortCodeCharfalse% + \else% + \cd@UndoErr{\ShortCode}% + \fi}}% + \egroup% + \catcode`#2=13 % + \fi\fi}% +\egroup +\def\UndoShortCode{\cd@UndoErr{\ShortCode}} + +\newif\ifcd@VerbBreak +\newtoks\cd@@Everypar + +\def\VerbBreak#1{% + \cd@BadChar{#1}{VerbBreak}% + \ifcd@BadChar% + \else\ifcd@VerbBreak% + \cd@VerbBreakError% + \else\cd@VerbBreaktrue + \cd@DefErr{#1}{VerbBreak}% + \bgroup% + \lccode`\~`#1 % + \lowercase{% + \gdef\cd@ActivateVerbBreak{% + \catcode`#1\active% + \gdef~{% + \cd@@Everypar\everypar% + \everypar{}% + \dimen0=\cd@FirstSpaces\fontdimen2\font\relax% + \expandafter\ifx\csname\cd@ExampleName @cd@boxwidth\endcsname\relax% + \else% + \advance\dimen0 \csname\cd@ExampleName @cd@boxwidth\endcsname\relax% + \fi% + \endgraf\leavevmode\everypar\cd@@Everypar\hbox to\dimen0{\hss}}}}% + \egroup% + \def\cd@IgnoreVerbBreak{\catcode`#1=9\relax}% + \fi\fi} +\def\UndoVerbBreak{% + \ifcd@VerbBreak% + \let\cd@ActivateVerbBreak\relax + \let\cd@IgnoreVerbBreak\relax + \cd@VerbBreakfalse + \else + \cd@UndoErr{\VerbBreak} + \fi} +\let\cd@ActivateVerbBreak\relax +\newif\ifcd@VerbCommand + +\def\VerbCommand#1#2#3{% + \cd@BadChar{#1}{VerbCommand}% + \cd@BadChar{#2}{VerbCommand}% + \cd@BadChar{#3}{VerbCommand}% + \ifcd@BadChar% + \else\ifcd@VerbCommand% + \cd@VerbCommandError + \else% + \cd@DefErr{#1, \string#2 and \string#3}{VerbCommand} + \cd@VerbCommandtrue% + \def\cd@ActivateVerbCommand{\catcode`#1=0 \catcode`#2=1 \catcode`#3=2\relax}% + \def\cd@IgnoreVerbCommand{% + \catcode`#1=13 % + \lccode`\~=`#1 % + \lowercase{\def~{\cd@GobbleLetters}}% + \catcode`#2=13 % + \lccode`\~=`#2 % + \lowercase{\def~####1#3{}}}% + \fi\fi} +\def\UndoVerbCommand{% + \ifcd@VerbCommand% + \let\cd@ActivateVerbCommand\relax% + \let\cd@IgnoreVerbCommand\relax% + \cd@VerbCommandfalse% + \else% + \cd@UndoErr{\VerbCommand}% + \fi}% +\let\cd@IgnoreVerbCommand\relax +\let\cd@ActivateVerbCommand\relax +\def\cd@GobbleLetters#1{\ifnum\catcode`#1=11 \expandafter\cd@GobbleLetters\else\expandafter#1\fi} +\newif\ifcd@CodeEscape% + +\def\CodeEscape#1{% + \cd@BadChar{#1}{CodeEscape}% + \ifcd@BadChar% + \else\ifcd@CodeEscape% + \cd@CodeEscapeError% + \else% + \cd@CodeEscapetrue% + \cd@DefErr{#1}{CodeEscape}% + \fi\fi} +\def\UndoCodeEscape{% + \ifcd@CodeEscape% + \cd@CodeEscapefalse% + \else% + \cd@UndoErr{\CodeEscape}% + \fi}% + +\newif\ifcd@Star +\newif\ifcd@NewLine +\newcount\cd@FirstSpaces + +\bgroup +\catcode`\ 12% +\gdef\cd@SpaceChar{\texttt{ }}% + +\catcode`\^^I=13\relax% +\catcode`\ =13\relax% +\gdef\cd@MakeSpace{% +\ifcd@Star% +\let\cd@ObeySpaces\cd@SpaceChar% +\else% +\let\cd@ObeySpaces\@xobeysp% +\fi% +\catcode`\ =13\relax% +\catcode`\^^I=13\relax% +\let =\cd@VerbSpace% +\let^^I=\cd@VerbTab}% +\gdef\cd@VerbSpace#1{% +\cd@ObeySpaces% +\ifcd@NewLine\advance\cd@FirstSpaces1\relax\fi% +\ifx#1^^I\else\ifx#1 \else\cd@NewLinefalse\fi\fi#1}% +\gdef\cd@VerbTab#1{% +\leavevmode\hbox% +to\cd@TabSize\fontdimen2\font{\hss}% +\ifcd@NewLine\advance\cd@FirstSpaces\cd@TabSize\fi% +\ifx#1^^I\else\ifx#1 \else\cd@NewLinefalse\fi\fi#1} +\egroup + +\def\cd@Verbatim{% + \parindent\z@% + \hfuzz=\cd@BoxTolerance% + \ifcd@ShortVerb% + \UndoShortVerb% + \fi% + \ifcd@ShortCode% + \else% + \ifcd@ShortCodeChar% + \UndoShortCode% + \fi% + \fi% + \let\do\@makeother\dospecials\@noligs% + \ifcd@ShortCode% + \cd@ActivateShortCode% + \fi% + \cd@ActivateVerbBreak% + \cd@ActivateVerbCommand% + \frenchspacing% + \catcode`\^^M=13\relax% + \cd@MakeSpace}% + +\newdimen\cd@BoxTolerance +\def\BoxTolerance#1{\cd@BoxTolerance=#1\relax} +\def\TabSize#1{\chardef\cd@TabSize=#1\relax} +\TabSize2 +\def\Gobble#1{\chardef\cd@GobbleNum=#1\relax} +\Gobble0 + +\def\CodeFont#1{\def\cd@CodeFont{#1}} +\CodeFont{\ttfamily} +\newcount\code@cd@LineNumber +\def\code@cd@boxwidth{0pt} +\def\code@cd@BoxStyle{\rmfamily\footnotesize} +\gdef\code@cd@LineNumberBox{% + \global\advance\code@cd@LineNumber1\relax% + \def\@currentlabel{\code@cd@LineNumber}% + \hbox to\code@cd@boxwidth{% + \hss% + \code@cd@BoxStyle\relax% + \the\code@cd@LineNumber\enspace}}% +\let\code@cd@EOL\iffalse% +\def\code{% + \endgraf% + \bgroup% + \def\cd@ExampleName{code}% + \cd@Verbatim% + \cd@ObeyLines% + \everypar{% + \code@cd@LineNumberBox + \cd@NewLinetrue% + \cd@FirstSpaces0\relax}% + \cd@CodeFont% + \ifcd@ShortCode% + \global\cd@ShortCodefalse% + \let\cd@next\cd@ShortCode% + \else\ifcd@Star% + \global\cd@Starfalse% + \let\cd@next\cd@StarCode% + \else% + \let\cd@next\cd@Code% + \fi\fi\cd@next} +\expandafter\def\csname code*\endcsname{\cd@Startrue\code} +\def\invisible{% + \bgroup% + \catcode`\\=12 \catcode`\{=12 \catcode`\}=12 \catcode`\^^M=13 % + \cd@Invisible} +\gdef^^?{\cd@UnlikelyCommand} +\gdef\cd@UnlikelyCommand{} + +\begingroup +\catcode`|=0 +\catcode`<=1 +\catcode`>=2 +\catcode`{=12 +\catcode`}=12 +\catcode`\^^M=13 % +\catcode`\\=12 % +|gdef|cd@Code#1^^M#2\end{code}<|cd@StartGobble#2^^?|egroup|end<code>>% +|gdef|cd@StarCode#1^^M#2\end{code*}<|cd@StartGobble#2^^?|egroup|end<code*>>% +|gdef|cd@Invisible#1^^M#2\end{invisible}<|egroup|end<invisible>|ignorespaces>% +|endgroup +\newcount\cd@GobbleCount% +\begingroup +\catcode`\^^M13\relax% +\gdef\cd@StartGobble#1{% + \ifx#1^^?% + \cd@GobbleCount=0 % + \let\cd@next\relax% + \else\ifnum\cd@GobbleCount=\cd@GobbleNum% + \cd@GobbleCount=0 % + \def\cd@next{#1}% + \else\ifx#1^^M% + \cd@GobbleCount=0 % + \def\cd@next{^^M}% + \else% + \advance\cd@GobbleCount1 % + \let\cd@next\cd@StartGobble% + \fi\fi\fi\cd@next}% +\gdef\cd@ObeyLines{% + \def^^M##1{% + \ifx##1^^?% + \cd@GobbleCount=0 % + \def\cd@next{\leavevmode\endgraf}% + \else\ifnum\cd@GobbleCount=\cd@GobbleNum% + \cd@GobbleCount=0 % + \def\cd@next{\leavevmode\endgraf##1}% + \else\ifx##1^^M% + \cd@GobbleCount=0 % + \def\cd@next{\leavevmode\endgraf^^M}% + \else% + \advance\cd@GobbleCount1 % + \let\cd@next^^M% + \fi\fi\fi\cd@next}}% +\endgroup + +\def\eTeXOn{% + \@ifundefined{eTeXversion}% + {\cd@Error{% + You're not running on eTeX.\MessageBreak% + Command \string\eTeXOn\space ignored}}% + {\cd@eTeXtrue}} +\def\eTeXOff{\cd@eTeXfalse} +\def\NewExample{% + \@ifnextchar[% + {\cd@NewExample}% + {\cd@NewExample[]}} +\def\cd@NewExample[#1]#2{% + \expandafter\ifx\csname #2\endcsname\relax + \def\cd@next{\catcode`\#=13 \cd@@NewExample{#1}{#2}}% + \else% + \let\cd@next\relax% + \cd@Error{% + Style `#2' already defined or the name\MessageBreak% + is already in use.\MessageBreak% + Use \protect\RenewExample\space if you want to redefine it}% + \let\cd@next\cd@GobbleThree% + \fi\cd@next} + +\def\RenewExample{% + \@ifnextchar[% + {\cd@RenewExample}% + {\cd@RenewExample[]}} +\def\cd@RenewExample[#1]#2{% + \expandafter\ifx\csname #2\endcsname\relax + \let\cd@next\relax% + \cd@Error{% + Style `#2' is undefined.\MessageBreak% + Use \protect\NewExample\space to redefine it}% + \let\cd@next\cd@GobbleThree% + \else\expandafter\ifx\csname #2\endcsname\code% + \def\CodeFont{% + \cd@Error{% + You have redefined the `code' environment.\MessageBreak% + \string\CodeFont\space is no longer operative}} + \fi% + \def\cd@next{\catcode`\#=13 \cd@@NewExample{#1}{#2}}% + \fi\cd@next} + +\def\cd@GobbleThree#1#2#3{} + +\begingroup +\catcode`\"=6 % +\catcode`\#=13 % +\long\gdef\cd@@NewExample"1"2"3"4"5{% + \expandafter\gdef\csname"2@cd@EOL\endcsname{\iffalse}% + \expandafter\let\csname"2@cd@LineNumberBox\endcsname\relax% + \def\cd@ExampleName{"2}% + \cd@ExampleOptions"1,cd@end,% + \expandafter\def\csname"2\endcsname{% + \gdef\CodeInput{{% + \def\cd@ExampleName{"2}% + \let#\cd@Input% + "3}}% + \gdef\CodeOutput{% + \def\cd@ExampleName{"2}% + \let#\cd@Output{"4}}% + \gdef\cd@MakeExample{{"5}}% + \cd@Example{"2}}% + \expandafter\def\csname"2*\endcsname{% + \global\cd@Startrue% + \gdef\CodeInput{{% + \def\cd@ExampleName{"2}% + \cd@Startrue% + \let#\cd@Input% + "3}}% + \gdef\CodeOutput{% + \def\cd@ExampleName{"2}% + \let#\cd@Output{"4}}% + \gdef\cd@MakeExample{{"5}}% + \cd@Example{"2*}}% + \catcode`\#=6\relax}% +\endgroup + +\def\cd@numbered{numbered} +\def\cd@continuous{continuous} +\def\cd@visibleEOL{visibleEOL} +\def\cd@empty{} +\def\cd@ExampleOptions#1,{% + \def\cd@TempOption{#1}% + \let\cd@next\cd@ExampleOptions% + \ifx\cd@TempOption\cd@end% + \let\cd@next\relax% + \else\ifx\cd@TempOption\cd@numbered% + \global\expandafter\newcount\csname\cd@ExampleName @cd@LineNumber\endcsname% + \expandafter\gdef\csname\cd@ExampleName @cd@boxwidth\endcsname{0pt}% + \expandafter\let\csname\cd@ExampleName @cd@BoxStyle\endcsname\relax% + \expandafter\gdef\csname\cd@ExampleName @cd@LineNumberBox\endcsname{% + \expandafter\advance\csname\cd@ExampleName @cd@LineNumber\endcsname1\relax% + \def\@currentlabel{\expandafter\the\csname\cd@ExampleName @cd@LineNumber\endcsname}% + \hbox to\csname\cd@ExampleName @cd@boxwidth\endcsname{% + \hss% + \csname\cd@ExampleName @cd@BoxStyle\endcsname\relax% + \expandafter\the\csname\cd@ExampleName @cd@LineNumber\endcsname\enspace}}% + \else\ifx\cd@TempOption\cd@continuous% + \expandafter\ifx\csname\cd@ExampleName @cd@LineNumber\endcsname\relax% + \global\expandafter\newcount\csname\cd@ExampleName @cd@LineNumber\endcsname% + \fi% + \expandafter\gdef\csname\cd@ExampleName @cd@boxwidth\endcsname{0pt}% + \expandafter\let\csname\cd@ExampleName @cd@BoxStyle\endcsname\relax% + \expandafter\gdef\csname\cd@ExampleName @cd@LineNumberBox\endcsname{% + \global\expandafter\advance\csname\cd@ExampleName @cd@LineNumber\endcsname1\relax% + \def\@currentlabel{\expandafter\the\csname\cd@ExampleName @cd@LineNumber\endcsname}% + \hbox to\csname\cd@ExampleName @cd@boxwidth\endcsname{% + \hss% + \csname\cd@ExampleName @cd@BoxStyle\endcsname\relax% + \expandafter\the\csname\cd@ExampleName @cd@LineNumber\endcsname\enspace}}% + \else\ifx\cd@TempOption\cd@visibleEOL% + \expandafter\gdef\csname\cd@ExampleName @cd@EOL\endcsname{\csname iftrue\endcsname}% + \else\ifx\cd@TempOption\cd@empty% + \else% + \cd@Error{`#1' is not a valid option}% + \fi\fi\fi\fi\fi\cd@next}% + +\def\LineNumber#1#2#3{% + \expandafter\ifx\csname#1@cd@EOL\endcsname\relax% + \cd@Error{`#1' is not an example environment'}% + \else\expandafter\ifx\csname #1@cd@LineNumber\endcsname\relax% + \cd@Warning{% + `#1' is not `numbered' nor `continuous'.\MessageBreak% + \string\LineNumber\space on line \the\inputlineno\space is useless}{}% + \else% + \expandafter\gdef\csname #1@cd@BoxStyle\endcsname{#2}% + \expandafter\gdef\csname #1@cd@boxwidth\endcsname{#3}% + \fi\fi% + \@ifnextchar[{\cd@SetLineNumber#1}\relax} +\def\cd@SetLineNumber#1[#2]{% + \expandafter\ifx\csname#1@cd@LineNumber\endcsname\relax% + \else% + \csname#1@cd@LineNumber\endcsname=#2\relax% + \expandafter\advance\csname#1@cd@LineNumber\endcsname\m@ne% + \fi} + +\NewExample{example}{\ttfamily#}{#}{} +\def\CodeInput{% + \cd@Error{% + No example environment has been created.\MessageBreak% + \string\CodeInput\space is void}} +\def\CodeOutput{% + \cd@Error{% + No example environment has been created.\MessageBreak% + \string\CodeOutput\space is void}} + +\begingroup +\catcode`|=0 % +\catcode`<=1 % +\catcode`>=2 % +\catcode`{=12 % +\catcode`}=12 % +\catcode`\\=12 % +|gdef|cd@Example#1<% + |bgroup% + |let|do|@makeother% + |dospecials% + |ifcd@ShortCode% + |global|let|cd@EndEnv|relax + |expandafter|cd@MakeExampleEnd|expandafter<|cd@ShortEnd>% + |global|cd@ShortCodefalse% + |cd@ActivateShortCode% + |else% + |gdef|cd@EndEnv<|end<#1>>% + |cd@MakeExampleEnd<\end{#1}>% + |ifcd@ShortCodeChar% + |UndoShortCode% + |fi% + |fi% + |ifcd@ShortVerb% + |UndoShortVerb% + |fi% + |catcode`|^^I=12 % + |catcode`|^^M=13 % + |ifcd@eTeX% + |catcode`|%=13 % + |fi% + |cd@ExampleEnd>% +|endgroup +\begingroup +\catcode`\^^M=13 % +% +\gdef\cd@MakeExampleEnd#1{% + \ifcd@eTeX% + \gdef\cd@ExampleEnd##1^^M##2#1{% + \egroup% + \cd@EndEnv% + \bgroup% + \everypar{}% + \cd@AssigneTeXInput{##2}% + \global\cd@Starfalse}% + \else% + \def\cd@ExampleEnd##1^^M##2#1{% + \expandafter\ifx\csname cd@TestRead\endcsname\relax% + \newread\cd@TestRead% + \fi% + \openin\cd@TestRead=\jobname.exp % + \ifeof\cd@TestRead\relax% + \cd@Warning{% + You're not running on eTeX or you've said \string\eTeXOff.\MessageBreak% + I create the file \jobname.exp to produce\MessageBreak% + the example environment on line \the\inputlineno.\MessageBreak% + You can delete it whenever you want, but\MessageBreak% + keeping it prevents this message from reappearing.}% + \fi% + \closein\cd@TestRead % + \expandafter\ifx\csname cd@expFile\endcsname\relax% + \newwrite\cd@expFile% + \fi% + \immediate\openout\cd@expFile=\jobname.exp % + \let^^M\cd@noeTeXEOL% + ^^M##2^^?^^M^^?% + \egroup% + \cd@EndEnv% + \immediate\closeout\cd@expFile% + \bgroup% + \everypar{}% + \cd@AssignInput% + \egroup\global\cd@Starfalse}% + \fi}% +\endgroup +\begingroup +\catcode`\^^M\active% +\gdef\cd@noeTeXEOL#1{% + \ifx#1^^?% + \cd@GobbleCount=0 % + \let^^M\relax% + \let\cd@next\relax% + \else\ifx#1^^M% + \cd@GobbleCount=0 % + \def\cd@next{\immediate\write\cd@expFile{}\cd@noeTeXEOL}% + \else\ifnum\cd@GobbleCount=\cd@GobbleNum% + \cd@GobbleCount=0 % + \def\cd@next{\cd@LineWrite#1}% + \else% + \advance\cd@GobbleCount1 % + \let\cd@next\cd@noeTeXEOL% + \fi\fi\fi\cd@next}% +\gdef\cd@LineWrite#1^^M{\immediate\write\cd@expFile{#1}\cd@noeTeXEOL}% +\newtoks\cd@Everypar +% +\gdef\cd@AssignInput{% + \gdef\cd@Input{% + \bgroup% + \cd@Everypar\everypar% + \everypar{% + \leavevmode\csname\cd@ExampleName @cd@LineNumberBox\endcsname\relax% + \cd@NewLinetrue\cd@FirstSpaces0\relax\the\cd@Everypar\relax}% + \cd@Verbatim% + \def^^M{\leavevmode\endgraf}% + \input{\jobname.exp}% + \egroup}% + \gdef\cd@Output{% + \bgroup% + \cd@IgnoreVerbBreak% + \cd@IgnoreVerbCommand% + \input{\jobname.exp}% + \egroup}% + \cd@MakeExample}% +% +\long\gdef\cd@AssigneTeXInput#1{% + \gdef\cd@Input{% + \bgroup% + \cd@Everypar\everypar% + \everypar{% + \leavevmode\csname\cd@ExampleName @cd@LineNumberBox\endcsname\relax% + \cd@NewLinetrue\cd@FirstSpaces0\relax\the\cd@Everypar\relax}% + \cd@Verbatim% + \catcode`\^^M=13 % + \let^^M\cd@eTeXStartGobble% + \catcode`\^^?13 % + \def^^?{\catcode`\^^M=9\relax}% + \scantokens{^^M#1^^?}% + \egroup}% + \gdef\cd@Output{% + \bgroup% + \cd@IgnoreVerbBreak% + \catcode`\^^?13 % + \catcode`\%=13 % + \catcode`\^^M=13 % + \csname\cd@ExampleName @cd@EOL\endcsname% + \cd@VisibleComment% + \let^^M\cd@eTeXOutVisibleEOL% + \def^^?{\let^^M\relax}% + \cd@IgnoreVerbCommand% + \scantokens{#1^^?}% + \else% + \cd@ActiveComment% + \let^^M\cd@eTeXOutEOL% + \def^^?{\catcode`\^^M9\relax}% + \xdef\cd@exinput{#1^^?}% + \cd@IgnoreVerbCommand% + \catcode`\^^M=9 % + \catcode`\^^@=9 % + \expandafter\scantokens\expandafter{\cd@exinput}% + \fi% + \egroup}% + \cd@MakeExample\egroup}% +% +\gdef\cd@eTeXStartGobble#1{% + \ifx#1^^?% + \cd@GobbleCount=0 % + \let\cd@next\relax% + \else\ifnum\cd@GobbleCount=\cd@GobbleNum% + \cd@GobbleCount=0 % + \let^^M\cd@eTeXEOL% + \def\cd@next{#1}% + \else\ifx#1^^M% + \cd@GobbleCount=0 % + \let^^M\cd@eTeXEOL% + \let\cd@next^^M% + \else% + \advance\cd@GobbleCount1 % + \let\cd@next\cd@eTeXStartGobble% + \fi\fi\fi\cd@next}% +% +\gdef\cd@eTeXEOL#1{% + \ifx#1^^?% + \cd@GobbleCount=0 % + \def\cd@next{\let^^M\relax\leavevmode\endgraf}% + \else\ifx#1^^M% + \cd@GobbleCount=0 % + \def\cd@next{\leavevmode\endgraf^^M}% + \else\ifnum\cd@GobbleCount=\cd@GobbleNum% + \cd@GobbleCount=0 % + \def\cd@next{\leavevmode\endgraf#1}% + \else% + \advance\cd@GobbleCount1 % + \let\cd@next^^M% + \fi\fi\fi\cd@next}% +% +\gdef\cd@eTeXOutVisibleEOL#1{% + \ifx#1^^?% + \let^^M\relax% + \let\cd@next\relax% + \else\ifx#1^^M% + \par% + \let\cd@next^^M% + \else% + \def\cd@next{ #1}% + \fi\fi\cd@next}% +\catcode`\^^@=12\relax% +\gdef\cd@eTeXOutEOL#1{% + \ifx#1^^?% + \else\ifx#1^^M% + \par% + \expandafter^^M% + \else% + ^^@ \expandafter\expandafter\expandafter#1% + \fi\fi}% +\catcode`\/=14\relax% +\catcode`\%=13\relax/ +\catcode`\ =12\relax/ +\catcode`\^^I=12\relax/ +\gdef\cd@VisibleComment{/ +\def%##1^^M{\cd@EatBOL}/ +\def\cd@EatBOL##1{/ +\let\cd@next\cd@EatBOL/ +\ifx##1 / +\else\ifx##1^^I/ +\else\ifx##1^^M/ +\let\cd@next\par/ +\else/ +\def\cd@next{##1}/ +\fi\fi\fi\cd@next}}/ +\gdef\cd@ActiveComment{/ +\def%##1^^M{\cd@EatBOL}/ +\def\cd@EatBOL##1{/ +\ifx##1 / +\expandafter\cd@EatBOL/ +\else\ifx##1^^I/ +\expandafter\expandafter\expandafter\cd@EatBOL/ +\else\ifx##1^^M/ +\par/ +\else/ +\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter##1/ +\fi\fi\fi}}/ +\endgroup +\def\CloseFile#1{% + \def\FileSource{% + \cd@Error{% + No file in production. \string\FileSource\space is empty}}% + \def\FileName{% + \cd@Error{% + No file in production. \string\FileName\space is empty}}% + \def\FileVersion{% + \cd@Error{% + No file in production. \string\FileVersion\space is empty}}% + \def\FileDate{% + \cd@Error{% + No file in production. \string\FileDate\space is empty}}} +\ifcd@produce% + \def\FileName{} + \def\FileVersion{} + \def\FileDate{} +\else + \CloseFile{} + \def\FileSource{} + \newcount\@cd@LineCount% +\fi +\def\ProduceFile#1{% + \ifcd@autoclose% + \code@cd@LineNumber0\relax% + \else% + \expandafter\csname\FileSource @cd@LineCount\endcsname=\code@cd@LineNumber% + \expandafter\ifx\csname #1@cd@LineCount\endcsname\relax% + \expandafter\newcount\csname #1@cd@LineCount\endcsname% + \code@cd@LineNumber0\relax% + \else% + \expandafter\code@cd@LineNumber\csname #1@cd@LineCount\endcsname% + \fi% + \fi% + \def\FileName{% + \cd@Error{% + No \string\FileName\space has been given to \FileSource}}% + \def\FileVersion{% + \cd@Error{% + No \string\FileVersion\space has been given to \FileSource}}% + \def\FileDate{% + \cd@Error{% + No \string\FileDate\space has been given to \FileSource}}% + \edef\FileSource{#1}% + \@ifnextchar[% + {\cd@GetFileName}% + \relax} +\def\cd@GetFileName[#1]{% + \edef\FileName{#1}% + \@ifnextchar[\cd@GetFileVersion\relax} +\def\cd@GetFileVersion[#1]{% + \edef\FileVersion{#1}% + \@ifnextchar[\cd@GetFileDate\relax} +\def\cd@GetFileDate[#1]{% + \edef\FileDate{#1}} + +\def\Header{\bgroup\catcode`\%=12 \cd@HeaderGobble} +\long\def\cd@HeaderGobble#1{\egroup} +\let\AddBlankLine\relax +\let\StartIgnore\relax +\let\StopIgnore\relax +\def\DangerousEnvironment#1{} + +% +% Definitions for the produce mode +% +\ifcase\cd@tracingmode + \def\cd@Tracing#1{} + \def\cd@TChar#1#2{} + \def\cd@TUChar#1{} + \let\cd@TCode\relax +\or + \def\cd@Tracing#1{} + \def\cd@TChar#1#2{} + \def\cd@TUChar#1{} + \def\cd@TCode{\immediate\write17{% + *** Code written from line \the\cd@ProduceLine\space to \the\inputlineno\space to \cd@CurrentFile. ***}} +\or + \def\cd@Tracing#1{\immediate\write17{On line \the\cd@ProduceLine: #1.}} + \def\cd@TChar#1#2{ + \bgroup + \escapechar\m@ne\cd@Tracing{`\string#1' defined as \string\\#2} + \egroup} + \def\cd@TUChar#1{ + \bgroup + \escapechar\m@ne\cd@Tracing{\string\\#1 undone} + \egroup} + \def\cd@TCode{\immediate\write17{% + *** Code written from line \the\cd@ProduceLine\space to \the\inputlineno\space to \cd@CurrentFile. ***}} +\fi +\def\cd@CDError#1{% + \immediate\write17{% + ^^J! CodeDoc Error:^^J#1^^Jl.\the\cd@ProduceLine^^J }} +\def\cd@CDWarning#1{% + \immediate\write17{% + ^^J? CodeDoc Warning: ^^J#1^^Jl.\the\cd@ProduceLine^^J }} +\def\cd@NoFileWarning{\cd@CDWarning{No file in production. This code will be lost.}} + +\ifcd@produce +\def\@documentclasshook{ + \let\do\@makeother + \dospecials + \catcode`\^^I=12\relax + \catcode`\%=14\relax + \catcode`\\\active + \let\normalsize\relax + \ifnum\cd@tracingmode>0 + \immediate\write17{^^J*** CODEDOC REPORT ***^^J} + \fi + \hfuzz=100cm% + \output={\deadcycles0\setbox0\box255} + \everypar{} + \tracingcommands\z@\tracingmacros\z@\tracingoutput\z@\tracingparagraphs\z@ + \tracingpages\z@\tracinglostchars\z@\tracingrestores\z@\tracingstats\z@} +\fi + +\begingroup +\catcode`\{=12 % +\catcode`\}=12 % +\catcode`\<=1 % +\catcode`\>=2 % +\gdef\cd@LeftBrace<{> +\gdef\cd@RightBrace<}> +\gdef\cd@LeftBracket<[> +\catcode`\ =12\relax +\catcode`\^^I=12\relax +\gdef\cd@Space< > +\gdef\cd@Tab<^^I> +\catcode`\^^M=12\relax% +\gdef\cd@EndOfLine<^^M>% +\catcode`\/=14\relax/ +\catcode`\%=12\relax/ +\gdef\cd@Comment<%>/ +\endgroup + +\newcount\cd@ProduceLine + +\begingroup +\catcode`|=0 % +\catcode`\\=13 % +|gdef|cd@Escape{\}% +|gdef\#1{% + |cd@ProduceLine|inputlineno% + |bgroup + |catcode`|^^M=12 % + |catcode`|%=12 % + |gdef|cd@MacroName{}% + |ifnum|catcode`#1=11 % + |def|cd@next{|cd@Gather#1}% + |else + |def|cd@next{|egroup|relax} + |fi + |cd@next} +|long|gdef|cd@Gather#1{% + |ifnum|catcode`#1=11 % + |xdef|cd@MacroName{|cd@MacroName#1}% + |let|cd@next|cd@Gather% + |else% + |gdef|cd@NextChar{#1}% + |let|cd@next|cd@GobbleSpace% + |fi|cd@next} +|endgroup + +\long\def\cd@GobbleSpace{% + \let\cd@next\cd@TakeNextChar + \ifx\cd@NextChar\cd@Space + \else\ifx\cd@NextChar\cd@Tab + \else\ifx\cd@NextChar\cd@EndOfLine + \else\ifx\cd@NextChar\cd@Comment + \let\cd@next\cd@GobbleEndOfLine + \else + \egroup + \def\cd@next{\expandafter\cd@Evaluate\cd@NextChar} + \fi\fi\fi\fi\cd@next} +\long\def\cd@TakeNextChar#1{\gdef\cd@NextChar{#1}\cd@GobbleSpace} +\begingroup +\catcode`\^^M=12% +\gdef\cd@GobbleEndOfLine#1^^M#2{% + \gdef\cd@NextChar{#2}% + \cd@GobbleSpace}% +\endgroup +\def\cd@Evaluate{\csname\cd@MacroName @Produce\endcsname} +\def\cd@Gobble#1{} +\def\cd@PrepareChar#1{% + \catcode`\\=0 % + \def\cd@next{\expandafter#1\cd@Gobble} + \ifx\cd@NextChar\cd@LeftBrace% + \else\ifx\cd@NextChar\cd@Escape% + \else% + \def\cd@next{#1} + \fi\fi}% + +\def\ShortVerb@Produce{\cd@PrepareChar\cd@MakeShortVerb@Produce\cd@next} +\let\DefineShortVerb@Produce\ShortVerb@Produce +\def\cd@VerbList{} +\def\cd@MakeShortVerb@Produce#1{% + \cd@TChar{#1}{ShortVerb} + \expandafter\def\expandafter\cd@VerbList\expandafter{\cd@VerbList#1,} + \lccode`\~=`#1 % + \lowercase{% + \def~{\bgroup\let\do\@makeother\dospecials\catcode`#1\active\cd@ShortVerb@Produce}% + \def\cd@ShortVerb@Produce##1~{\egroup}}% + \def\UndoShortVerb@Produce{\cd@TUChar{ShortVerb}\catcode`#1=12\relax}% + \catcode`#1=13 % + \catcode`\\=13\relax} +\let\UndoShortVerb@Produce\relax +\def\UndefineShortVerb@Produce{\cd@PrepareChar\cd@UndefineShortVerb@Produce\cd@next}% +\def\cd@UndefineShortVerb@Produce#1{ + \cd@TUChar{ShortVerb (from fancyvrb)} + \catcode`#1=12 \catcode`\\=13\relax} + +\def\VerbBreak@Produce{\cd@PrepareChar\cd@MakeVerbBreak@Produce\cd@next} +\def\cd@MakeVerbBreak@Produce#1{ + \cd@TChar{#1}{VerbBreak} + \def\cd@IgnoreVerbBreak{\catcode`#1=9\relax} + \def\UndoVerbBreak@Produce{\cd@TUChar{VerbBreak}\let\cd@IgnoreVerbBreak\relax} + \catcode`\\=13\relax} +\let\cd@IgnoreVerbBreak\relax +\let\UndoVerbBreak@Produce\relax +\def\cd@GobbleOptions#1[#2]#3{\def\cd@NextChar{#3}\expandafter#1\cd@NextChar} + +\def\ShortCode@Produce{% + \ifx\cd@NextChar\cd@LeftBracket% + \def\cd@next{\cd@GobbleOptions\ShortCode@Produce}% + \else% + \cd@PrepareChar\cd@MakeShortCode@Produce + \fi\cd@next} +\begingroup +\catcode`\^^M13% +\gdef\cd@MakeShortCode@Produce#1{% + \cd@TChar{#1}{ShortCode} + \lccode`\~=`#1% + \lowercase{% + \def~{\cd@ProduceLine\inputlineno\cd@ShortCodetrue\cd@CodeWrite}% + \def\ActivateShortCode@Produce{\catcode`#1\active}% + \def\cd@ShortWriteFile##1^^M##2~{% + ^^M##2^^?^^M^^?% + \ifx\cd@NoFileWarning\relax% + \cd@TCode% + \else% + \cd@NoFileWarning% + \fi\egroup}}% + \def\UndoShortCode@Produce{\cd@TUChar{ShortCode}\catcode`#1=12\relax}% + \catcode`\\=13 % + \catcode`#1=13\relax}% +\endgroup +\let\ActivateShortCode@Produce\relax +\let\UndoShortCode@Produce\relax + +\def\VerbCommand@Produce{\cd@PrepareChar\cd@VerbEscape@Produce\cd@next} +\def\cd@VerbEscape@Produce#1{ + \bgroup\escapechar\m@ne\xdef\cd@TempEsc{\string#1}\egroup + \def\cd@IgnoreEscape@Produce{ + \catcode`#1=13 + \lccode`\~=`#1 + \lowercase{\def~{\cd@GobbleLetters}}} + \ifx\cd@NextChar\cd@LeftBrace + \def\cd@next{\expandafter\cd@VerbBraces@Produce\cd@Gobble} + \else + \let\cd@next\cd@VerbBraces@Produce + \fi\cd@next} +\def\cd@VerbBraces@Produce{\catcode`\{=1 \catcode`\}=2 \cd@@VerbBraces@Produce} +\def\cd@@VerbBraces@Produce#1#2{% + \expandafter\cd@TChar\expandafter{\cd@TempEsc', `\string#1' and `\string#2'}{VerbCommand} + \def\cd@IgnoreBraces@Produce{% + \catcode`#1=13 + \lccode`\~=`#1 + \lowercase{\def~####1#2{}}} + \catcode`\\=13 \catcode`\{=12 \catcode`\}=12\relax} +\def\UndoVerbCommand@Produce{ + \cd@TUChar{VerbCommand} + \let\cd@IgnoreEscape@Produce\relax + \let\cd@IgnoreBraces@Produce\relax} +\let\cd@IgnoreEscape@Produce\relax +\let\cd@IgnoreBraces@Produce\relax + +\def\CodeEscape@Produce{\cd@PrepareChar\cd@CodeEscape@Produce\cd@next} +\def\cd@CodeEscape@Produce#1{% + \cd@TChar{#1}{CodeEscape} + \def\cd@ActivateCodeEscape{\catcode`#1=0\relax}\catcode`\\=13\relax} +\let\cd@ActivateCodeEscape\relax +\def\UndoCodeEscape@Produce{\cd@TUChar{CodeEscape}\let\cd@ActivateCodeEscape\relax} + +\def\NewExample@Produce{% + \ifx\cd@NextChar\cd@LeftBracket% + \def\cd@next{\cd@GobbleOptions\NewExample@Produce}% + \else% + \let\cd@next\cd@DangerousExample@Produce% + \fi\cd@next} +\let\RenewExample@Produce\NewExample@Produce + +\let\cd@@Evaluate\cd@Evaluate +\def\StartIgnore@Produce{ + \cd@Tracing{\string\StartIgnore\space found. I will ignore everything from now on} + \let\cd@Evaluate\cd@FindIgnore} +\def\cd@FindIgnore{ + \expandafter\ifx\csname cd@\cd@MacroName\endcsname\cd@StopIgnore + \cd@Tracing{\string\StopIgnore\space found. I resume my normal behavior} + \let\cd@Evaluate\cd@@Evaluate + \fi} +\def\cd@StopIgnore{\cd@StopIgnore} + +\def\verb@Produce{\count@=0 \cd@VerbEater} +\def\cd@VerbEater#1{% + \ifcase\count@ % + \ifx#1* + \count@=1 % + \let\cd@@VerbEater\cd@VerbEater + \else + \def\cd@@VerbEater##1#1{} + \fi + \else + \def\cd@@VerbEater##1#1{} + \fi\cd@@VerbEater} + +\def\DescribeMacro@Produce#1#2{} +\def\DefineMacro@Produce#1#2{} +\def\DescribeEnvironment@Produce#1#2{} +\def\DefineEnvironment@Produce#1#2{} +\def\noexpand@Produce#1{} +\def\string@Produce#1{} +\def\protect@Produce#1{} +\def\begin@Produce{ + \ifx\cd@NextChar\cd@LeftBrace + \expandafter\begin@@Produce + \fi} +\def\end@Produce{ + \ifx\cd@NextChar\cd@LeftBrace + \expandafter\end@@Produce + \fi} + +\def\Gobble@Produce#1{% + \ifx\cd@NextChar\cd@LeftBrace% + \def\cd@next{\expandafter\Gobble@@Produce\cd@NextChar} + \else + \def\cd@next{\chardef\cd@GobbleNum=#1\relax}% + \fi\cd@next} +\newif\ifcd@HeaderFirstLine +\begingroup +\catcode`\^^M=13 % +\catcode`\/=14 % +\catcode`\%=12 / +\gdef\Header@Produce{/ + \bgroup/ + \catcode`\^^M=13 / + \catcode`\%=12 / + \catcode`\\=0 / + \Header@@Produce}/ +\gdef\cd@HeaderEOL{\def^^M{^^J% }} +\endgroup + +\def\cd@DocumentString{document} +\def\cd@CodeString{code} +\def\cd@StarCodeString{code*} +\def\cd@InvisibleString{invisible} +\def\cd@StoredEnvironments{example,verbatim,Verbatim,BVerbatim,LVerbatim,SaveVerbatim,VerbatimOut,Example,CenterExample,SideBySideExample,PCenterExample,PSideBySideExample,} + +\begingroup +\catcode`\{=12 % +\catcode`\}=12 % +\catcode`\<=1 % +\catcode`\>=2 % +\long\gdef\Header@@Produce{#1}< + \gdef\cd@Header<\bgroup\cd@HeaderEOL\cd@ProduceFile<\cd@Comment\space#1>\egroup> + \egroup> + +\gdef\Gobble@@Produce{#1}<\chardef\cd@GobbleNum=#1\relax> + +\gdef\DangerousEnvironment@Produce{#1}< + \cd@Tracing<#1 added to dangerous environments> + \xdef\cd@StoredEnvironments<\cd@StoredEnvironments#1,>> +\gdef\cd@DangerousExample@Produce{#1}#2{#3}#4{#5}#6{#7}< + \cd@Tracing<#1 added to dangerous environments (CodeDoc examples)> + \xdef\cd@StoredEnvironments<\cd@StoredEnvironments#1,>> +\let\DefineVerbatimEnvironment@Produce\DangerousEnvironment@Produce + +\gdef\begin@@Produce{#1}< + \def\cd@TempArg<#1> + \ifx\cd@TempArg\cd@CodeString + \let\cd@next\cd@CodeWrite + \else\ifx\cd@TempArg\cd@StarCodeString + \cd@Startrue + \let\cd@next\cd@CodeWrite + \else\ifx\cd@TempArg\cd@InvisibleString + \cd@Invisibletrue + \let\cd@next\cd@CodeWrite + \else + \def\cd@next<\cd@CheckEnvironment<#1>> + \fi\fi\fi\cd@next> +\gdef\end@@Produce{#1}< + \def\cd@TempArg<#1> + \ifx\cd@TempArg\cd@DocumentString + \def\cd@next<\cd@Tracing<\string\end{document}> + \ifnum\cd@tracingmode=0 % + \else + \immediate\write17<^^J*** END OF CODEDOC REPORT ***^^J> + \fi\@@end> + \else + \let\cd@next\relax + \fi\cd@next> +\gdef\ProduceFile@Produce{#1}<\ProduceFile@@Produce<#1>> +\gdef\CloseFile@Produce{#1}<\CloseFile@@Produce<#1>> + +\newcount\cd@InputDepth +\gdef\input@Produce{#1}< + \cd@Tracing<\string\input\space file #1> + \expandafter\let\csname cd@MasterSource\the\cd@InputDepth\endcsname\cd@CurrentSource + \edef\cd@CurrentSource<#1 (\string\input\space in \cd@CurrentSource)> + \advance\cd@InputDepth1\relax + \@@input #1\relax + \advance\cd@InputDepth-1\relax + \expandafter\let\expandafter\cd@CurrentSource\csname cd@MasterSource\the\cd@InputDepth\endcsname> + +\catcode`\|=0 % +\catcode`\\=13 % +|gdef|cd@MakeSpecialEater#1< + |long|def|cd@SpecialEater##1\end{#1}<> + |cd@SpecialEater> +|endgroup + +\edef\cd@CurrentSource{\jobname.tex} + +\def\cd@CheckEnvironment#1{ + \def\cd@TempEnv{#1} + \expandafter\cd@@CheckEnvironment\cd@StoredEnvironments cd@end,} +\def\cd@@CheckEnvironment#1,{ + \def\cd@@TempEnv{#1} + \def\cd@@StarTempEnv{#1*} + \ifx\cd@@TempEnv\cd@end + \let\cd@next\relax + \else\ifx\cd@@TempEnv\cd@TempEnv + \def\cd@next{\cd@MakeSpecialEater{#1}} + \else\ifx\cd@@StarTempEnv\cd@TempEnv + \def\cd@next{\cd@MakeSpecialEater{#1*}} + \else + \let\cd@next\cd@@CheckEnvironment + \fi\fi\fi + \cd@next} +\def\cd@MakeOther#1,{% + \def\cd@TempArg{#1}% + \ifx\cd@TempArg\cd@end% + \else% + \catcode`#1=12 % + \expandafter\cd@MakeOther% + \fi} + +\newif\ifcd@Invisible +\begingroup +\catcode`\^^M=13\relax% +\gdef\cd@CodeWrite{% + \bgroup% + \let\do\@makeother% + \dospecials% + \catcode`\^^I=12 % + \expandafter\cd@MakeOther\cd@VerbList cd@end,% + \cd@IgnoreVerbBreak% + \ifcd@ShortCode% + \ActivateShortCode@Produce% + \else% + \let\cd@TempTUChar\cd@TUChar + \def\cd@TUChar##1{} + \UndoShortCode@Produce% + \let\cd@TUChar\cd@TempTUChar + \fi% + \cd@IgnoreEscape@Produce% + \cd@IgnoreBraces@Produce% + \cd@ActivateCodeEscape% + \catcode`\^^M=13\relax% + \let^^M\cd@produceEOL% + \ifcd@ShortCode% + \global\cd@ShortCodefalse\let\cd@next\cd@ShortWriteFile% + \else\ifcd@Star% + \global\cd@Starfalse\let\cd@next\cd@StarWriteFile% + \else\ifcd@Invisible% + \global\cd@Invisiblefalse\let\cd@next\cd@InvisibleWriteFile% + \else% + \let\cd@next\cd@WriteFile% + \fi\fi\fi\cd@next}% +\gdef\cd@produceEOL#1{% + \ifx#1^^?% + \cd@GobbleCount=0 % + \let^^M\relax% + \let\cd@next\relax% + \else\ifx#1^^M% + \cd@GobbleCount=0 % + \def\cd@next{\cd@ProduceFile{}\cd@produceEOL}% + \else\ifnum\cd@GobbleCount=\cd@GobbleNum% + \cd@GobbleCount=0 % + \def\cd@next{\cd@LineWrite@Produce#1}% + \else% + \advance\cd@GobbleCount1 % + \let\cd@next\cd@produceEOL% + \fi\fi\fi\cd@next}% +\gdef\cd@LineWrite@Produce#1^^M{\cd@ProduceFile{#1}\cd@produceEOL}% +\catcode`|=0 % +\catcode`<=1 % +\catcode`>=2 % +\catcode`{=12 % +\catcode`}=12 % +\catcode`\\=12 % +|long|gdef|cd@WriteFile#1^^M#2\end{code}<% + ^^M#2^^?^^M^^?% + |ifx|cd@NoFileWarning|relax% + |cd@TCode% + |else% + |cd@NoFileWarning% + |fi|egroup>% +|long|gdef|cd@StarWriteFile#1^^M#2\end{code*}<% + ^^M#2^^?^^M^^?% + |ifx|cd@NoFileWarning|relax% + |cd@TCode% + |else% + |cd@NoFileWarning% + |fi|egroup>% +|long|gdef|cd@InvisibleWriteFile#1^^M#2\end{invisible}<% + ^^M#2^^?^^M^^?% + |ifx|cd@NoFileWarning|relax% + |cd@TCode% + |else% + |cd@NoFileWarning% + |fi|egroup>% +|endgroup + +\def\cd@Closed{closed} +\def\cd@Open{open} +\def\cd@Wait{wait} + +\newcount\cd@ProduceCount + +\def\cd@CurrentFile{} +\chardef\@unused=17 + +\def\cd@ProduceFile#1{} +\def\AddBlankLine@Produce{\cd@ProduceFile{}} + +\def\ProduceFile@@Produce#1{% + \let\cd@next\relax + \expandafter\ifx\csname #1@Status\endcsname\cd@Closed + \cd@CDError{% + File `#1' has already been closed.^^J% + If I open it again, it will be erased.^^J% + I can't do that. I quit. Sorry.} + \let\cd@next\@@end + \else\expandafter\ifx\csname #1@Status\endcsname\cd@Open + \cd@CDWarning{% + File `#1' is currently in production.^^J% + Why do you try to open it again?} + \else\expandafter\ifx\csname #1@Status\endcsname\cd@Wait + \expandafter\let\csname #1@Status\endcsname\cd@Open + \let\cd@NoFileWarning\relax + \def\cd@ProduceFile{\immediate\write\csname #1@Stream\endcsname} + \expandafter\let\csname \cd@CurrentFile @Status\endcsname\cd@Wait + \def\cd@CurrentFile{#1} + \else\ifnum\cd@ProduceCount>15 + \chardef\cd@ProduceStream=16 + \expandafter\cd@FindStream\cd@StreamList cd@end, + \ifnum\cd@ProduceStream=16 % + \cd@CDError{% + No more stream for a new file. Close one with \string\CloseFile\space^^J% + (or use the `autoclose' option).^^J% + This situation makes me feel bad. I quit.} + \let\cd@next\@@end + \else + \cd@Tracing{I will now produce file #1} + \ifx\cd@CurrentFile\cd@empty + \else + \ifcd@autoclose + \cd@Tracing{I close file \cd@CurrentFile\space (autoclose mode)} + \expandafter\let\csname \cd@CurrentFile @Status\endcsname\cd@Closed + \else + \expandafter\let\csname \cd@CurrentFile @Status\endcsname\cd@Wait + \fi + \fi + \def\cd@CurrentFile{#1} + \expandafter\let\csname #1@Status\endcsname\cd@Open + \expandafter\chardef\csname #1@Stream\endcsname\cd@ProduceStream + \immediate\openout\cd@ProduceStream=#1 % + \let\cd@NoFileWarning\relax + \def\cd@ProduceFile{\immediate\write\cd@ProduceStream} + \let\cd@next\cd@GetFile@Produce + \fi + \else\chardef\cd@ProduceStream\cd@ProduceCount + \cd@Tracing{I will now produce file #1} + \ifx\cd@CurrentFile\cd@empty + \else + \ifcd@autoclose + \cd@Tracing{I close file \cd@CurrentFile\space (autoclose mode)} + \expandafter\let\csname \cd@CurrentFile @Status\endcsname\cd@Closed + \else + \expandafter\let\csname \cd@CurrentFile @Status\endcsname\cd@Wait + \fi + \fi + \def\cd@CurrentFile{#1} + \expandafter\let\csname #1@Status\endcsname\cd@Open + \expandafter\chardef\csname #1@Stream\endcsname\cd@ProduceStream + \immediate\openout\cd@ProduceStream=#1 % + \let\cd@NoFileWarning\relax + \def\cd@ProduceFile{\immediate\write\cd@ProduceStream} + \ifcd@autoclose + \else + \advance\cd@ProduceCount\@ne + \fi + \let\cd@next\cd@GetFile@Produce + \fi\fi\fi\fi\cd@next} + +\def\cd@GetFile@Produce{ + \bgroup + \UndoShortCode@Produce + \UndoShortVerb@Produce + \catcode`\\\z@ + \gdef\FileName{} + \gdef\FileVersion{} + \gdef\FileDate{} + \@ifnextchar[ + \cd@GetFileName@Produce + {\ifcd@noheader\else\cd@Header\fi}} +\def\cd@GetFileName@Produce[#1]{ + \xdef\FileName{#1} + \@ifnextchar[ + \cd@GetFileVersion@Produce + {\ifcd@noheader\else\cd@Header\fi\egroup}} +\def\cd@GetFileVersion@Produce[#1]{% + \xdef\FileVersion{#1} + \@ifnextchar[ + \cd@GetFileDate@Produce + {\ifcd@noheader\else\cd@Header\fi\egroup}} +\def\cd@GetFileDate@Produce[#1]{% + \xdef\FileDate{#1} + \ifcd@noheader\else\cd@Header\fi\egroup} + +\def\CloseFile@@Produce#1{ + \ifcd@autoclose + \expandafter\ifx\csname #1@Status\endcsname\relax + \cd@CDWarning{% + You haven't opened `#1'. Closing it does nothing.^^J% + Besides, you're in autoclose mode. \string\CloseFile\space is redundant.} + \else\expandafter\ifx\csname #1@Status\endcsname\cd@Closed + \cd@CDWarning{% + `#1' was already closed. Closing it again does nothing.^^J% + Besides, you're in autoclose mode. \string\CloseFile\space is redundant.} + \else + \cd@CDWarning{% + You're in autoclose mode. \string\CloseFile\space is redundant.} + \fi\fi% + \else + \expandafter\ifx\csname #1@Status\endcsname\relax + \cd@CDWarning{% + You haven't opened `#1'. Closing it does nothing.} + \else\expandafter\ifx\csname #1@Status\endcsname\cd@Closed + \cd@CDWarning{% + `#1' was already closed. Closing it again does nothing.} + \else + \cd@Tracing{I close file #1} + \expandafter\let\csname #1@Status\endcsname\cd@Closed + \def\cd@TempFile{#1} + \ifx\cd@TempFile\cd@CurrentFile + \def\cd@NoFileWarning{\cd@CDWarning{No file in production. This code will be lost.}} + \def\cd@ProduceFile##1{}% + \fi + \edef\cd@StreamList{% + \cd@StreamList\expandafter\the\csname #1@Stream\endcsname,} + \fi\fi\fi} + +\def\cd@StreamList{} +\def\cd@BuildList#1cd@end,{\def\cd@StreamList{#1}} +\newif\ifcd@stream +\def\cd@FindStream#1,{% + \def\cd@TempArg{#1} + \ifx\cd@TempArg\cd@end + \cd@streamfalse + \let\cd@@next\relax + \else + \cd@streamtrue + \chardef\cd@ProduceStream=#1 % + \let\cd@@next\cd@BuildList + \fi\cd@@next} + +\catcode`\%=12\relax +\edef\cd@Header{ +\noexpand\cd@ProduceFile{% This is \noexpand\FileName, produced by the CodeDoc class +^^J% with the `produce' option on. +^^J% +^^J% To create the documentation, compile \cd@CurrentSource +^^J% without the `produce' option. +^^J% +^^J% SOURCE: \noexpand\cd@CurrentSource +^^J% DATE: \noexpand\FileDate +^^J% VERSION: \noexpand\FileVersion +}} +\catcode`\%=14\relax + +\makeatother |