diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/base/docstrip.tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/base/docstrip.tex | 1094 |
1 files changed, 1094 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/base/docstrip.tex b/Master/texmf-dist/tex/latex/base/docstrip.tex new file mode 100644 index 00000000000..777fd805ab4 --- /dev/null +++ b/Master/texmf-dist/tex/latex/base/docstrip.tex @@ -0,0 +1,1094 @@ +%% +%% This is file `docstrip.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% docstrip.dtx (with options: `initex,program,stats') +%% +%% This is a generated file. +%% +%% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the LaTeX base system. +%% -------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2003/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% This file may only be distributed together with a copy of the LaTeX +%% base system. You may however distribute the LaTeX base system without +%% such generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% The list of derived (unpacked) files belonging to the distribution +%% and covered by LPPL is defined by the unpacking scripts (with +%% extension .ins) which are part of the distribution. +\catcode`\{=1 +\catcode`\}=2 +\def\filename{docstrip.dtx} +\def\fileversion{2.5c} +\def\filedate{2003/09/18} +\def\docdate {1999/03/31} +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% +%% The docstrip program for use with TeX. +%% Copyright (C) 1989-1991 Frank Mittelbach +%% Copyright (C) 1992-1995 Johannes Braams, Denys Duchier, +%% Frank Mittelbach +%% Copyright (C) 1995 Marcin Woli\'nski +%% Copyright (C) 1996-1997 Mark Wooding, Marcin Woli\'nski +%% Copyright (C) 1998-2003 LaTeX3 project and the above authors +%% All rights are reserved. +%% +\catcode`\Z=\catcode`\% +\ifnum13=\catcode`\~{\egroup\else + \catcode`\Z=9 +Z +Z \catcode`\{=1 \catcode`\}=2 +Z \catcode`\#=6 \catcode`\^=7 +Z \catcode`\@=11 \catcode`\^^L=13 +Z \let\bgroup={ \let\egroup=} +Z +Z \dimendef\z@=10 \z@=0pt \chardef\@ne=1 \countdef\m@ne=22 \m@ne=-1 +Z \countdef\count@=255 +Z +Z \def\wlog{\immediate\write\m@ne} \def\space{ } +Z +Z \count10=22 % allocates \count registers 23, 24, ... +Z \count15=9 % allocates \toks registers 10, 11, ... +Z \count16=-1 % allocates input streams 0, 1, ... +Z \count17=-1 % allocates output streams 0, 1, ... +Z +Z \def\alloc@#1#2#3{\advance\count1#1\@ne#2#3\count1#1\relax} +Z +Z \def\newcount{\alloc@0\countdef} \def\newtoks{\alloc@5\toksdef} +Z \def\newread{\alloc@6\chardef} \def\newwrite{\alloc@7\chardef} +Z +Z \def\newif#1{% +Z \count@\escapechar \escapechar\m@ne +Z \let#1\iffalse +Z \@if#1\iftrue +Z \@if#1\iffalse +Z \escapechar\count@} +Z \def\@if#1#2{% +Z \expandafter\def\csname\expandafter\@gobbletwo\string#1% +Z \expandafter\@gobbletwo\string#2\endcsname +Z {\let#1#2}} +Z +Z \def\@gobbletwo#1#2{} +Z \def\@gobblethree#1#2#3{} +Z +Z \def\loop#1\repeat{\def\body{#1}\iterate} +Z \def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +Z \let\repeat\fi +Z +Z \def\empty{} +Z +Z \def\tracingall{\tracingcommands2 \tracingstats2 +Z \tracingpages1 \tracingoutput1 \tracinglostchars1 +Z \tracingmacros2 \tracingparagraphs1 \tracingrestores1 +Z \showboxbreadth 10000 \showboxdepth 10000 \errorstopmode +Z \errorcontextlines 10000 \tracingonline1 } +Z +\bgroup}\fi\catcode`\Z=11 +\let\bgroup={ \let\egroup=} +\catcode`\@=11 +\newlinechar=`\^^J +\newif\ifGenerate +\newif\ifContinue +\newif\ifForlist +\newif\ifDefault +\newif\ifMoreFiles \MoreFilestrue +\newif\ifaskforoverwrite \askforoverwritetrue +\newcount\blockLevel \blockLevel\z@ +\newcount\emptyLines \emptyLines \z@ +\newcount\processedLines \processedLines \z@ +\newcount\commentsRemoved \commentsRemoved \z@ +\newcount\commentsPassed \commentsPassed \z@ +\newcount\codeLinesPassed \codeLinesPassed \z@ +\newcount\TotalprocessedLines \TotalprocessedLines \z@ +\newcount\TotalcommentsRemoved \TotalcommentsRemoved \z@ +\newcount\TotalcommentsPassed \TotalcommentsPassed \z@ +\newcount\TotalcodeLinesPassed \TotalcodeLinesPassed \z@ +\newcount\NumberOfFiles \NumberOfFiles\z@ +\newread\inFile +\chardef\ttyin16 +\chardef\ttyout16 +\newread\inputcheck +\newif\iftopbatchfile \topbatchfiletrue +\def\ifToplevel{\relax\iftopbatchfile + \expandafter\iden \else \expandafter\@gobble\fi} +\ifx\undefined\@@input \let\@@input\input\fi +\def\batchinput#1{% + \begingroup + \def\batchfile{#1}% + \topbatchfilefalse + \Defaultfalse + \usepreamble\org@preamble + \usepostamble\org@postamble + \let\destdir\WriteToDir + \processbatchFile + \endgroup +} +\def\skip@input#1 {} +\let\input\skip@input +\def\guardStack{} +\def\blockHead{} +\def\yes{yes} +\def\y{y} +\def\n{n} +\def\DefaultbatchFile{docstrip.cmd} +{\catcode`\%=12 + \gdef\perCent{%} + \gdef\DoubleperCent{%%} +} +\let\MetaPrefix\DoubleperCent +\def^^L{ } +\def\Name#1#2{\expandafter#1\csname#2\endcsname} +\def\@stripstring{\expandafter\@gobble\string} +\def\eltStart{} +\def\eltEnd{} +\def\qStop{\qStop} +\def\pop#1#2{% + \ifx#1\empty + \Msg{Warning: Found end guard without matching begin}% + \let#2\empty + \else + \def\tmp{\expandafter\popX #1\qStop #1#2}% + \expandafter\tmp\fi} +\def\popX\eltStart #1\eltEnd #2\qStop #3#4{\def#3{#2}\def#4{#1}} +\def\push#1#2{\expandafter\pushX #1\qStop #1{\eltStart #2\eltEnd}} +\def\pushX #1\qStop #2#3{\def #2{#3#1}} +\def\forlist#1:=#2\do#3\od{% + \edef\ListCondition{#2}% + \Forlisttrue + \loop + \edef#1{\expandafter\FirstElt\ListCondition,\empty.}% + \edef\ListCondition{\expandafter\OtherElts\ListCondition,\empty.}% + \ifx#1\empty \Forlistfalse \else#3\fi + \ifForlist + \repeat} +\def\FirstElt#1,#2.{#1} +\def\OtherElts#1,#2.{#2} +\def\whileswitch#1\fi#2{#1\loop#2#1\repeat\fi} +\ifx\@tempcnta\undefined \newcount\@tempcnta \fi +\@tempcnta=0 +\loop +\Name\chardef{s@\number\@tempcnta}=0 +\csname newcount\expandafter\endcsname% + \csname off@\number\@tempcnta\endcsname +\advance\@tempcnta1 +\ifnum\@tempcnta<16\repeat +\let\s@do\relax +\edef\@outputstreams{% + \s@do\Name\noexpand{s@0}\s@do\Name\noexpand{s@1}% + \s@do\Name\noexpand{s@2}\s@do\Name\noexpand{s@3}% + \s@do\Name\noexpand{s@4}\s@do\Name\noexpand{s@5}% + \s@do\Name\noexpand{s@6}\s@do\Name\noexpand{s@7}% + \s@do\Name\noexpand{s@8}\s@do\Name\noexpand{s@9}% + \s@do\Name\noexpand{s@10}\s@do\Name\noexpand{s@11}% + \s@do\Name\noexpand{s@12}\s@do\Name\noexpand{s@13}% + \s@do\Name\noexpand{s@14}\s@do\Name\noexpand{s@15}% + \noexpand\@nostreamerror + } +\def\@nostreamerror{\errmessage{No more output streams!}} +\def\@streamfound#1\@nostreamerror{\fi} +\bgroup\edef\x{\egroup + \def\noexpand\@stripstr\string\s@{}} +\x +\chardef\stream@closed=16 +\def\StreamOpen#1{% + \chardef#1=\stream@closed + \def\s@do##1{\ifnum##1=0 + \chardef#1=\expandafter\@stripstr\string##1 % + \global\chardef##1=1 % + \immediate\openout#1=\csname pth@\@stripstring#1\endcsname % + \@streamfound + \fi} + \@outputstreams + } +\def\StreamClose#1{% + \immediate\closeout#1% + \def\s@do##1{\ifnum#1=\expandafter\@stripstr\string##1 % + \global\chardef##1=0 % + \@streamfound + \fi} + \@outputstreams + \chardef#1=\stream@closed + } +\def\StreamPut{\immediate\write} +\def\showprogress{\let\maybeMsg\message} +\def\keepsilent{\let\maybeMsg\@gobble} +\showprogress +\def\Msg{\immediate\write\ttyout} +\def\iden#1{#1} +\def\strip#1#2 \@gobble{\def #1{#2}} +\def\@defpar{\par} +\def\Ask#1#2{% + \message{#2}\read\ttyin to #1\ifx#1\@defpar\def#1{}\else + \iden{\expandafter\strip + \expandafter#1#1\@gobble\@gobble} \@gobble\fi} +\let\OriginalAsk=\Ask +\def\askonceonly{% + \def\Ask##1##2{% + \OriginalAsk{##1}{##2}% + \global\let\Ask\OriginalAsk + \Ask\noprompt{% + By default you will be asked this question for every file.^^J% + If you enter `y' now,^^J% + I will asssume `y' for all future questions^^J% + without prompting.}% + \ifx\y\noprompt\let\noprompt\yes\fi + \ifx\yes\noprompt\gdef\Ask####1####2{\def####1{y}}\fi}} +\def\@gobble#1{} +\edef\Endinput{\expandafter\@gobble\string\\endinput} +\def\makeOther#1{\catcode`#1=12\relax} +\ifx\undefined\@@end\else\let\end\@@end\fi +\ifx\@temptokena\undefined \csname newtoks\endcsname\@temptokena\fi +\def\@addto#1#2{% + \@temptokena\expandafter{#1}% + \edef#1{\the\@temptokena#2}} +\def\@ifpresent#1#2#3#4{% + \def\tmp##1#1##2\qStop{\ifx!##2!}% + \expandafter\tmp#2#1\qStop #4\else #3\fi + } +\def\tospaces#1{% + \ifx#1\secapsot\secapsot\fi\space\tospaces} +\def\secapsot\fi\space\tospaces{\fi} +\def\@spaces{\space\space\space\space\space} +\def\uptospace#1 #2\qStop{#1} +\def\afterfi#1#2\fi{\fi#1} +\def\@ifnextchar#1#2#3{\bgroup + \def\reserved@a{\ifx\reserved@c #1 \aftergroup\@firstoftwo + \else \aftergroup\@secondoftwo\fi\egroup + {#2}{#3}}% + \futurelet\reserved@c\@ifnch + } +\def\@ifnch{\ifx \reserved@c \@sptoken \expandafter\@xifnch + \else \expandafter\reserved@a + \fi} +\def\@firstoftwo#1#2{#1} +\def\@secondoftwo#1#2{#2} +\iden{\let\@sptoken= } % +\iden{\def\@xifnch} {\futurelet\reserved@c\@ifnch} +\def\Terminal#1#2#3{% + \expandafter\ifx\csname eT@#3\endcsname\relax + \afterfi{\Terminal{#1}{#2#3}}\else + \afterfi{\TerminalX{#1}{#2}#3}\fi + } +\Name\let{eT@>}=1 +\Name\let{eT@&}=1 \Name\let{eT@!}=1 +\Name\let{eT@|}=1 \Name\let{eT@,}=1 +\Name\let{eT@(}=1 \Name\let{eT@)}=1 +\def\TerminalX#1#2{% + \ifx>#2> \errmessage{Error in expression: empty terminal}\fi + \Name\def{t@#2}##1,#2,##2\qStop{\ifx>##2>0\else1\fi}% + #1{\Name\noexpand{t@#2},##1,#2,\noexpand\qStop}% + } +\def\Primary#1#2{% + \ifcase \ifx!#20\else\ifx(#21\else2\fi\fi\space + \afterfi{\Primary{\NPrimary{#1}}}\or + \afterfi{\Expression{\PExpression{#1}}}\or + \afterfi{\Terminal{#1}{}#2}\fi + } +\def\NPrimary#1#2{% + #1{\noexpand\if1#20\noexpand\else1\noexpand\fi}% + } +\def\PExpression#1#2#3{% + \ifx)#3\else + \errmessage{Error in expression: expected right parenthesis}\fi + #1{#2}} +\def\Secondary#1{% + \Primary{\SecondaryX{#1}}} +\bgroup\catcode`\&=12 +\gdef\SecondaryX#1#2#3{% + \ifx% + \afterfi{\Secondary{\SecondaryXX{#1}{#2}}}\else + \afterfi{#1{#2}#3}\fi + } +\egroup +\def\SecondaryXX#1#2#3{% + #1{\noexpand\if0#20\noexpand\else#3\noexpand\fi}} +\def\Expression#1{% + \Secondary{\ExpressionX{#1}}} +\def\ExpressionX#1#2#3{% + \if0\ifx|#31\else\ifx,#31\fi\fi0 + \afterfi{#1{#2}#3}\else + \afterfi{\Expression{\ExpressionXX{#1}{#2}}}\fi + } +\def\ExpressionXX#1#2#3{% + #1{\noexpand\if1#21\noexpand\else#3\noexpand\fi}} +\def\StopParse#1#2{% + \ifx>#2 \else\errmessage{Error in expression: spurious #2}\fi + \edef\Expr##1{#1}} +\def\Evaluate#1{% + \Expression\StopParse#1>} +\def\normalLine#1\endLine{% + \advance\codeLinesPassed\@ne + \maybeMsg{.}% + \def\inLine{#1}% + \let\do\putline@do + \activefiles + } +\def\putline@do#1#2#3{% + \StreamPut#1{\inLine}} +\def\removeComment#1\endLine{% + \advance\commentsRemoved\@ne + \maybeMsg{\perCent}} +\bgroup\catcode`\%=12 +\iden{\egroup +\def\putMetaComment%}#1\endLine{% + \advance\commentsPassed\@ne + \edef\inLine{\MetaPrefix#1}% + \let\do\putline@do + \activefiles + } +\begingroup +\catcode`\%=12 \catcode`\*=14 +\gdef\processLine#1{* + \advance\processedLines\@ne + \ifx%#1 + \expandafter\processLineX + \else + \expandafter\normalLine + \fi + #1} +\endgroup +\begingroup +\catcode`\%=12 \catcode`\*=14 +\gdef\processLineX%#1{* + \ifcase\ifx%#10\else + \ifx<#11\else 2\fi\fi\relax + \expandafter\putMetaComment\or + \expandafter\checkOption\or + \expandafter\removeComment\fi + #1} +\endgroup +\def\checkOption<#1{% + \ifcase + \ifx*#10\else \ifx/#11\else + \ifx+#12\else \ifx-#13\else + \ifx<#14\else 5\fi\fi\fi\fi\fi\relax + \expandafter\starOption\or + \expandafter\slashOption\or + \expandafter\plusOption\or + \expandafter\minusOption\or + \expandafter\verbOption\or + \expandafter\doOption\fi + #1} +\def\doOption#1>#2\endLine{% + \maybeMsg{<#1 . >}% + \Evaluate{#1}% + \def\do##1##2##3{% + \if1\Expr{##2}\StreamPut##1{#2}\fi + }% + \activefiles + } +\def\plusOption+#1>#2\endLine{% + \maybeMsg{<+#1 . >}% + \Evaluate{#1}% + \def\do##1##2##3{% + \if1\Expr{##2}\StreamPut##1{#2}\fi + }% + \activefiles + } +\def\minusOption-#1>#2\endLine{% + \maybeMsg{<-#1 . >}% + \Evaluate{#1}% + \def\do##1##2##3{% + \if1\Expr{##2}\else \StreamPut##1{#2}\fi + }% + \activefiles + } +\def\starOption*#1>#2\endLine{% + \maybeMsg{<*#1}% + \expandafter\push\expandafter\guardStack\expandafter{\blockHead}% + \advance\blockLevel\@ne + \def\blockHead{#1}% + \Evaluate{#1}% + \let\do\checkguard@do + \outputfiles + \let\do\findactive@do + \edef\activefiles{\activefiles} + } +\def\checkguard@do#1#2#3{% + \ifnum#3>0 + \advance#3\@ne + \else + \if1\Expr{#2}\else + \advance#3\@ne\fi + \fi} +\def\findactive@do#1#2#3{% + \ifnum#3=0 + \noexpand\do#1{#2}#3\fi} +\def\slashOption/#1>#2\endLine{% + \def\tmp{#1}% + \ifnum\blockLevel<\@ne + \errmessage{Spurious end block </\tmp> ignored}% + \else + \ifx\tmp\blockHead + \pop\guardStack\blockHead + \else + \errmessage{Found </\tmp> instead of </\blockHead>}% + \fi + \maybeMsg{>}% + \advance\blockLevel\m@ne + \let\do\closeguard@do + \outputfiles + \let\do\findactive@do + \edef\activefiles{\outputfiles} + \fi + } +\def\closeguard@do#1#2#3{% + \ifnum#3>0 + \advance#3\m@ne + \fi} +\def\verbOption<#1\endLine{{% + \edef\verbStop{\perCent#1}\maybeMsg{<<<}% + \let\do\putline@do + \loop + \ifeof\inFile\errmessage{Source file ended while in verbatim + mode!}\fi + \read\inFile to \inLine + \if 1\ifx\inLine\verbStop 0\fi 1% if not inLine==verbStop + \activefiles + \maybeMsg{.}% + \repeat + \maybeMsg{>}% + }} +\def\generate#1{\begingroup + \let\inputfiles\empty \let\filestogenerate\empty + \let\file\@file + #1 + \ifx\filestogenerate\empty\else + \Msg{^^JGenerating file(s) \filestogenerate}\fi + \def\inFileName{\csname in@\outFileName\endcsname}% + \def\ReferenceLines{\csname ref@\outFileName\endcsname}% + \processinputfiles + \endgroup} +\def\processinputfiles{% + \let\newinputfiles\empty + \inputfiles + \let\inputfiles\newinputfiles + \ifx\inputfiles\empty\else + \expandafter\processinputfiles + \fi + } +\def\file#1#2{\errmessage{Command `\string\file' only allowed in + argument to `\string\generate'}} +\def\@file#1{% + \Generatetrue + \makepathname{#1}% + \ifaskforoverwrite + \immediate\openin\inFile\@pathname\relax + \ifeof\inFile\else + \Ask\answer{File \@pathname\space already exists + \ifx\empty\destdir somewhere \fi + on the system.^^J% + Overwrite it% + \ifx\empty\destdir\space if necessary\fi + ? [y/n]}% + \ifx\y \answer \else + \ifx\yes\answer \else + \Generatefalse\fi\fi\fi + \closein\inFile + \fi + \ifGenerate + \Name\let{pth@#1}\@pathname + \@addto\filestogenerate{\@pathname\space}% + \Name\@fileX{#1\expandafter}% + \else + \Msg{Not generating file \@pathname^^J}% + \expandafter\@gobble + \fi + } +\def\@fileX#1#2{% + \chardef#1=\stream@closed + \def\curout{#1}% + \let\curinfiles\empty + \let\curinnames\empty + \def\curref{\MetaPrefix ^^J% + \MetaPrefix\space The original source files were:^^J% + \MetaPrefix ^^J}% + \let\from\@from \let\needed\@needed + #2% + \let\from\err@from \let\needed\err@needed + \checkorder + \Name\@addto{e@\curin}{\noexpand\closeoutput{#1}}% + \Name\let{pre@\@stripstring#1\expandafter}\currentpreamble + \Name\let{post@\@stripstring#1\expandafter}\currentpostamble + \Name\edef{in@\@stripstring#1}{\expandafter\iden\curinnames} + \Name\edef{ref@\@stripstring#1}{\curref} + } +\def\checkorder{% + \expandafter\expandafter\expandafter + \checkorderX\expandafter\curinfiles + \expandafter\qStop\inputfiles\qStop + } +\def\checkorderX(#1)#2\qStop#3\qStop{% + \def\tmp##1\readsource(#1)##2\qStop{% + \ifx!##2! \order@error + \else\ifx!#2!\else + \checkorderXX##2% + \fi\fi}% + \def\checkorderXX##1\readsource(#1)\fi\fi{\fi\fi + \checkorderX#2\qStop##1\qStop}% + \tmp#3\readsource(#1)\qStop + } +\def\order@error#1\fi\fi{\fi + \errmessage{DOCSTRIP error: Incompatible order of input + files specified for file + `\iden{\expandafter\uptospace\curin} \qStop'.^^J + Read DOCSTRIP documentation for explanation.^^J + This is a serious problem, I'm exiting}\end + } +\def\needed#1{\errmessage{\string\needed\space can only be used in + argument to \string\file}} +\let\err@needed\needed +\def\@needed#1{% + \edef\reserved@a{#1}% + \expandafter\@need@d\expandafter{\reserved@a}} +\def\@need@d#1{% + \@ifpresent{(#1)}\curinfiles + {\@need@d{#1 }}% + {\@ifpresent{\readsource(#1)}\inputfiles + {}{\@addto\inputfiles{\noexpand\readsource(#1)}% + \Name\let{b@#1}\empty + \Name\let{o@#1}\empty + \Name\let{e@#1}\empty}% + \@addto\curinfiles{(#1)}% + \def\curin{#1}}% + } +\def\from#1#2{\errmessage{Command `\string\from' only allowed in + argument to `\string\file'}} +\let\err@from\from +\def\@from#1#2{% + \@addto\curref{\MetaPrefix\space #1 \if>#2>\else + \space (with options: `#2')\fi^^J}% + \needed{#1}% + \ifx\curinnames\empty + \Name\@addto{b@\curin}{\noexpand\openoutput\curout}% + \fi + \@addto\curinnames{ #1}% + \Name\@addto{o@\curin}{\noexpand\do\curout{#2}}% + } +\def\readsource(#1){% + \immediate\openin\inFile\uptospace#1 \qStop\relax + \ifeof\inFile + \errmessage{Cannot find file \uptospace#1 \qStop}% + \else + \processedLines\z@ + \commentsRemoved\z@ + \commentsPassed\z@ + \codeLinesPassed\z@ + \let\refusedfiles\empty + \csname b@#1\endcsname + \Name\let{b@#1}\refusedfiles + \Msg{} \def\@msg{Processing file \uptospace#1 \qStop} + \def\change@msg{% + \edef\@msg{\@spaces\@spaces\@spaces\space + \expandafter\tospaces\uptospace#1 \qStop\secapsot} + \let\change@msg\relax} + \let\do\showfiles@do + \let\refusedfiles\empty + \csname o@#1\endcsname + \ifx\refusedfiles\empty\else + \@addto\newinputfiles{\noexpand\readsource(#1)} + \fi + \let\do\makeoutlist@do + \edef\outputfiles{\csname o@#1\endcsname}% + \let\activefiles\outputfiles + \Name\let{o@#1}\refusedfiles + \makeOther\ \makeOther\\\makeOther\$% + \makeOther\#\makeOther\^\makeOther\^^K% + \makeOther\_\makeOther\^^A\makeOther\%% + \makeOther\~\makeOther\{\makeOther\}\makeOther\&% + \endlinechar-1\relax + \loop + \read\inFile to\inLine + \ifx\inLine\Endinput + \Msg{File #1 ended by \string\endinput.}% + \Continuefalse + \else + \ifeof\inFile + \Continuefalse + \else + \Continuetrue + \ifx\inLine\empty + \advance\emptyLines\@ne + \else + \emptyLines\z@ + \fi + \ifnum \emptyLines<2 + \expandafter\processLine\inLine\endLine + \else + \maybeMsg{/}% + \fi + \fi + \fi + \ifContinue + \repeat + \closein\inFile + \csname e@#1\endcsname + \Msg{Lines \space processed: \the\processedLines^^J% + Comments removed: \the\commentsRemoved^^J% + Comments \space passed: \the\commentsPassed^^J% + Codelines passed: \the\codeLinesPassed^^J}% + \global\advance\TotalprocessedLines by \processedLines + \global\advance\TotalcommentsRemoved by \commentsRemoved + \global\advance\TotalcommentsPassed by \commentsPassed + \global\advance\TotalcodeLinesPassed by \codeLinesPassed + \global\advance\NumberOfFiles by \@ne + \fi} +\def\showfiles@do#1#2{% + \ifnum#1=\stream@closed + \@addto\refusedfiles{\noexpand\do#1{#2}}% + \else + \Msg{\@msg + \ifx>#2>\else\space(#2)\fi + \space -> \@stripstring#1} + \change@msg + \csname off@\number#1\endcsname=\z@ + \fi +} +\def\makeoutlist@do#1#2{% + \ifnum#1=\stream@closed\else + \noexpand\do#1{#2}\csname off@\number#1\endcsname + \fi} +\def\openoutput#1{% + \if 1\ifnum\@maxfiles=\z@ 0\fi + \ifnum\@maxoutfiles=\z@ 0\fi1% + \advance\@maxfiles\m@ne + \advance\@maxoutfiles\m@ne + \StreamOpen#1% + \WritePreamble#1% + \else + \@addto\refusedfiles{\noexpand\openoutput#1}% + \fi + } +\def\closeoutput#1{% + \ifnum#1=\stream@closed\else + \WritePostamble#1% + \StreamClose#1% + \advance\@maxfiles\@ne + \advance\@maxoutfiles\@ne + \fi} +\def\ds@heading{% + \MetaPrefix ^^J% + \MetaPrefix\space This is file `\outFileName',^^J% + \MetaPrefix\space generated with the docstrip utility.^^J% + } +\def\AddGenerationDate{% + \def\ds@heading{% + \MetaPrefix ^^J% + \MetaPrefix\space This is file `\outFileName', generated % + on <\the\year/\the\month/\the\day> ^^J% + \MetaPrefix\space with the docstrip utility (\fileversion).^^J% + }} +\let\inFileName\relax +\let\outFileName\relax +\let\ReferenceLines\relax +\def\declarepreamble{\begingroup +\catcode`\^^M=13 \catcode`\ =12 % +\declarepreambleX} +{\catcode`\^^M=13 % +\gdef\declarepreambleX#1#2 +\endpreamble{\endgroup% + \def^^M{^^J\MetaPrefix\space}% + \edef#1{\ds@heading% + \ReferenceLines% + \MetaPrefix\space\checkeoln#2\empty}}% +\gdef\checkeoln#1{\ifx^^M#1\else\expandafter#1\fi}% +} +\def\declarepostamble{\begingroup +\catcode`\ =12 \catcode`\^^M=13 +\declarepostambleX} +{\catcode`\^^M=13 % +\gdef\declarepostambleX#1#2 +\endpostamble{\endgroup% + \def^^M{^^J\MetaPrefix\space}% + \edef#1{\MetaPrefix\space\checkeoln#2\empty^^J% + \MetaPrefix ^^J% + \MetaPrefix\space End of file `\outFileName'.% + }}% +} +\def\usepreamble#1{\def\currentpreamble{#1}} +\def\usepostamble#1{\def\currentpostamble{#1}} +\def\nopreamble{\usepreamble\empty} +\def\nopostamble{\usepostamble\empty} +\def\preamble{\usepreamble\defaultpreamble + \declarepreamble\defaultpreamble} +\def\postamble{\usepostamble\defaultpostamble + \declarepostamble\defaultpostamble} +\declarepreamble\org@preamble + +IMPORTANT NOTICE: + +For the copyright see the source file. + +Any modified versions of this file must be renamed +with new filenames distinct from \outFileName. + +For distribution of the original source see the terms +for copying and modification in the file \inFileName. + +This generated file may be distributed as long as the +original source files, as listed above, are part of the +same distribution. (The sources need not necessarily be +in the same archive or directory.) +\endpreamble +\edef\org@postamble{\string\endinput^^J% + \MetaPrefix ^^J% + \MetaPrefix\space End of file `\outFileName'.% + } +\let\defaultpreamble\org@preamble +\let\defaultpostamble\org@postamble +\usepreamble\defaultpreamble +\usepostamble\defaultpostamble +\declarepreamble\originaldefault + +IMPORTANT NOTICE: + +For the copyright see the source file. + +You are *not* allowed to modify this file. + +You are *not* allowed to distribute this file. +For distribution of the original source see the terms +for copying and modification in the file \inFileName. + +\endpreamble +\def\WritePreamble#1{% + \expandafter\ifx\csname pre@\@stripstring#1\endcsname\empty + \else + \edef\outFileName{\@stripstring#1}% + \StreamPut#1{\csname pre@\@stripstring#1\endcsname}% + \fi} +\def\WritePostamble#1{% + \expandafter\ifx\csname post@\@stripstring#1\endcsname\empty + \else + \edef\outFileName{\@stripstring#1}% + \StreamPut#1{\csname post@\@stripstring#1\endcsname}% + \fi} +\def\usedir#1{\edef\destdir{\WriteToDir}} +\def\showdirectory#1{\WriteToDir} +\def\BaseDirectory#1{% + \@setwritetodir + \let\usedir\alt@usedir + \let\showdirectory\showalt@directory + \edef\basedir{#1\dirsep}} +\def\convsep#1/#2\qStop{% + #1\ifx\qStop#2\qStop \pesvnoc\fi\convsep\dirsep#2\qStop} +\def\pesvnoc#1\qStop{\fi} +\def\alt@usedir#1{% + \Name\ifx{dir@#1}\relax + \undefined@directory{#1}% + \else + \edef\destdir{\csname dir@#1\endcsname}% + \fi} +\def\showalt@directory#1{% + \Name\ifx{dir@#1}\relax + \showundef@directory{#1}% + \else\csname dir@#1\endcsname\fi} +\def\undefined@directory#1{% + \errhelp{docstrip.cfg should specify a target directory for^^J% + #1 using \DeclareDir or \UseTDS.}% + \errmessage{You haven't defined the output directory for `#1'.^^J% + Subsequent files will be written to the current directory}% + \let\destdir\WriteToDir + } +\def\showundef@directory#1{UNDEFINED (label is #1)} +\def\undefined@TDSdirectory#1{% + \edef\destdir{% + \basedir\convsep#1/\qStop + }} +\def\showundef@TDSdirectory#1{\basedir\convsep#1/\qStop} +\def\UseTDS{% + \@setwritetodir + \let\undefined@directory\undefined@TDSdirectory + \let\showundef@directory\showundef@TDSdirectory + } +\def\DeclareDir{\@ifnextchar*{\DeclareDirX}{\DeclareDirX\basedir*}} +\def\DeclareDirX#1*#2#3{% + \@setwritetodir + \Name\edef{dir@#2}{#1#3}} +\def\generateFile#1#2#3{{% + \ifx t#2\askforoverwritetrue + \else\askforoverwritefalse\fi + \generate{\file{#1}{#3}}% + }} +\def\include#1{\def\Options{#1}} +\def\processFile#1#2#3#4{% + \generateFile{#1.#3}{#4}{\from{#1.#2}{\Options}}} +\def\processfile{\Msg{% + ^^Jplease use \string\processFile\space instead of + \string\processfile!^^J}% + \processFile} +\def\generatefile{\Msg{% + ^^Jplease use \string\generateFile\space instead of + \string\generatefile!^^J}% + \generateFile} +\newcount\@maxfiles +\def\maxfiles#1{% + \@maxfiles#1\relax + \ifnum\@maxfiles<4 + \errhelp{I'm not a magician. I need at least four^^J% + streams to be able to work properly, but^^J% + you've only let me use \the\@maxfiles.}% + \errmessage{\noexpand\maxfiles limit is too strict.}% + \@maxfiles4 + \fi +} +\maxfiles{1972} % year of my birth (MW) +\newcount\@maxoutfiles +\def\maxoutfiles#1{% + \@maxoutfiles=#1\relax + \ifnum\@maxoutfiles<1 + \@maxoutfiles1 + \errhelp{I'm not a magician. I need at least one output^^J% + stream to be able to do anything useful at all.^^J% + Please be reasonable.}% + \errmessage{\noexpand\maxoutfiles limit is insane}% + \fi +} +\maxoutfiles{16} +\def\checkfilelimit{% + \advance\@maxfiles\m@ne + \ifnum\@maxfiles<2 % + \errhelp{There aren't enough streams left to do any unpacking.^^J% + I can't do anything about this, so complain at the^^J% + person who made such a complicated installation.}% + \errmessage{Too few streams left.}% + \end + \fi +} +\def\strip@meaning#1>{} +\def\processbatchFile{% + \checkfilelimit + \let\next\relax + \openin\inputcheck \batchfile\relax + \ifeof\inputcheck + \ifDefault + \else + \errhelp + {A batchfile specified in \batchinput could not be found.}% + \errmessage{^^J% + **************************************************^^J% + * Could not find your \string\batchfile=\batchfile.^^J% + **************************************************}% + \fi + \else + \ifDefault + \Msg{**************************************************^^J% + * Batchfile \DefaultbatchFile\space found Use it? (y/n)?}% + \Ask\answer{% + **************************************************}% + \else + \let\answer\y + \fi + \ifx\answer\y + \closein\inputcheck + \def\next{\@@input\batchfile\relax}% + \fi + \fi + \next} +\def\ReportTotals{% + \ifnum\NumberOfFiles>\@ne + \Msg{Overall statistics:^^J% + Files \space processed: \the\NumberOfFiles^^J% + Lines \space processed: \the\TotalprocessedLines^^J% + Comments removed: \the\TotalcommentsRemoved^^J% + Comments \space passed: \the\TotalcommentsPassed^^J% + Codelines passed: \the\TotalcodeLinesPassed}% + \fi} +\def\SetFileNames{% + \edef\sourceFileName{\MainFileName.\infileext}% + \edef\destFileName{\MainFileName.\outfileext}} +\def\CheckFileNames{% + \ifx\sourceFileName\destFileName + \Msg{^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% + ! It is not possible to read from and write to the same file !^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% + \Continuefalse + \else + \Continuetrue + \immediate\openin\inFile \sourceFileName\relax + \ifeof\inFile + \Msg{^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% + ! Your input file `\sourceFileName' was not found !^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% + \Continuefalse + \else + \immediate\closein\inFile + \immediate\openin\inFile\destdir \destFileName\relax + \ifeof\inFile + \Continuetrue + \else + \Continuefalse + \Ask\answer{File \destdir\destFileName\space already + exists + \ifx\empty\destdir somewhere \fi + on the system.^^J% + Overwrite it% + \ifx\empty\destdir\space if necessary\fi + ? [y/n]}% + \ifx\y \answer \Continuetrue \else + \ifx\yes\answer \Continuetrue \else + \fi\fi + \fi + \fi + \fi + \closein\inFile} +\def\interactive{% + \whileswitch\ifMoreFiles\fi% + {\begingroup + \AskQuestions + \forlist\MainFileName:=\filelist + \do + \SetFileNames + \CheckFileNames + \ifContinue + \generateFile{\destFileName}{f}% + {\from{\sourceFileName}{\Options}} + \fi% + \od + \endgroup + \Ask\answer{More files to process (y/n)?}% + \ifx\y \answer\MoreFilestrue \else + \ifx\yes\answer\MoreFilestrue \else + \MoreFilesfalse\fi\fi + }} +\def\AskQuestions{% + \Msg{^^J% + ****************************************************}% + \Ask\infileext{% + * First type the extension of your input file(s): \space *}% + \Msg{****************************************************^^J^^J% + ****************************************************}% + \Ask\outfileext{% + * Now type the extension of your output file(s) \space: *}% + \Msg{****************************************************^^J^^J% + ****************************************************}% + \Ask\Options{% + * Now type the name(s) of option(s) to include \space\space: *}% + \Msg{****************************************************^^J^^J% + ****************************************************^^J% + * Finally give the list of input file(s) without \space\space*}% + \Ask\filelist{% + * extension seperated by commas if necessary % + \space\space\space\space: *}% + \Msg{****************************************************^^J}}% +\Msg{Utility: `docstrip' \fileversion\space <\filedate>^^J% + English documentation \space\space\space <\docdate>}% +\Msg{^^J% + **********************************************************^^J% + * This program converts documented macro-files into fast *^^J% + * loadable files by stripping off (nearly) all comments! *^^J% + **********************************************************^^J}% +\def\@setwritetodir{% + \let\setwritetodir\relax + \ifx\WriteToDir\@undefined + \ifx\@currdir\@undefined + \def\WriteToDir{}% + \else + \let\WriteToDir\@currdir + \fi + \fi + \let\destdir\WriteToDir + \def\tmp{[]}% + \ifx\tmp\WriteToDir + \ifx\dirsep\@undefined + \def\dirsep{.}% + \fi + \ifx\makepathname\@undefined + \def\makepathname##1{% + \edef\@pathname{\ifx\WriteToDir\destdir + \WriteToDir\else[\destdir]\fi##1}}% + \fi + \fi + \ifx\dirsep\@undefined + \def\dirsep{/}% + \def\tmp{:}% + \ifx\tmp\WriteToDir + \def\dirsep{:}% + \fi + \fi + \ifx\makepathname\@undefined + \def\makepathname##1{% + \edef\@pathname{\destdir\ifx\empty\destdir\else + \ifx\WriteToDir\destdir\else\dirsep\fi\fi##1}}% + \fi} +\immediate\openin\inputcheck=docstrip.cfg\relax +\ifeof\inputcheck + \Msg{% + ********************************************************^^J% + * No Configuration file found, using default settings. *^^J% + ********************************************************^^J}% +\else + \Msg{% + ******************************************^^J% + * Using Configuration file docstrip.cfg. *^^J% + ******************************************^^J}% + \closein\inputcheck + \afterfi{\@@input docstrip.cfg\relax} +\fi +\@setwritetodir +\def\process@first@batchfile{% + \processbatchFile + \ifnum\NumberOfFiles=\z@ + \interactive + \fi + \endbatchfile} +\def\endbatchfile{% + \iftopbatchfile + \ReportTotals + \expandafter\end + \else + \endinput + \fi} +\edef\@jobname{\lowercase{\def\noexpand\@jobname{\jobname}}}% +\@jobname +\def\@docstrip{docstrip}% +\edef\@docstrip{\expandafter\strip@meaning\meaning\@docstrip} +\Defaultfalse +\ifx\undefined\batchfile + \ifx\@jobname\@docstrip + \let\batchfile\DefaultbatchFile + \Defaulttrue + \else + \let\process@first@batchfile\relax + \fi +\fi +\process@first@batchfile +\endinput +%% +%% End of file `docstrip.tex'. |