% Mwrite -- a mechanism to write to arbitrarily many files
%
% This file has been written by Christopher Creutzig (ccr@mupad.de)
% for the MuPAD documentation.  The MuPAD group and SciFace are permitted
% to alter the contents of this file, all others may use it but must
% rename the file to something clearly different before making any changes.
%
% Purpose: Write information to arbitrarily many files with names 
%  \jobname.ext. To this end, the command \Mwrite{ext}{content} is defined.
%  The style writes to \jobname.col, you should *not* attempt to write
%  to one of the extensions col, dvi, tex, aux, log, ind, idx, bbl, bib
%  or any other one your LaTeX installation uses already.  (Redefining
%  \index to use \Mwrite{idx}{...} appears to work fine, however.)

%% Copyright 2002 SciFace Software GmbH
%
% This program may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% 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.2 or later is part of all distributions of LaTeX 
% version 1999/12/01 or later.
%
% This program consists of the files Mhelp.sty, Mhyper.sty,
% Mcompat.sty, Mbook.sty, Mreprt.sty, Mfonts.sty, Mwrite.sty,
% and MuPAD.mf.

\def\splitcvs $#1: #2.sty,v #3 #4 #5$ to #6#7#8\relax{%
        \def#6{#2}%
        \def#7{v#3}%
        \def#8{#4}%
}
\splitcvs $Id: Mwrite.sty,v 1.1.1.2 2004/10/04 17:25:17 nthiery Exp $ to %
  \filename\fileversion\filedate\relax
%
\ProvidesPackage{\filename}[\filedate]
\immediate\typeout{Package: `\filename'
    \fileversion \space \filedate \space (ccr)}
\RequirePackage{afterpage}
% Sammeldatei, wird von \Mwrite beschrieben:
\newwrite\iM@colout
\newwrite\iM@splitout

\immediate\openout\iM@colout=\jobname.col\relax%

\newif\ifiM@colopen
\iM@colopentrue

%
% Eine allgemeine Routine zum Schreiben von Text in eine Sammeldatei,
% die anschließend wieder gesplittet wird. Aufruf: \Mwrite{ext}{Text}.
% ext ist die Extension, die die Datei nach dem Splitten bekommen soll,
% Text ist der in diese Datei zu schreibende Text. ext darf keinen 
% Doppelpunkt und keinen Zeilenwechsel enthalten. Gesplittet wird am
% Ende des LaTeX-Durchlaufs.
\newcommand{\Mwrite}[2] {%
% Nur, falls \iM@colout noch geoeffnet ist:
 \ifiM@colopen
% Zeilenenden escapen:
        \iMescapeChar{^^J}{^^J#1:}{#1:#2}%
        \immediate\write\iM@colout{\iMescaped}%
 \fi
% Sonst auch keine Warnungen. Nicht unbedingt immer richtig,
% aber sonst kommen sehr viele Warnungen bzgl. hyp/lab
% Vielleicht besser: Nur keine Warnungen, falls hyp/lab?
}

\newcommand{\iM@protected@Mwrite}[2] {%
 \ifiM@colopen
        \iMescapeChar{^^J}{^^J#1:}{#1:#2}%
        \protected@write\iM@colout{\let\iM@therealpage\relax%
          \def\mupad{\noexpand\noexpand\noexpand\mupad}%
          \def\Mmath{\noexpand\noexpand\noexpand\Mmath}%
          \def\Mdmath{\noexpand\noexpand\noexpand\Mdmath}%
          \def\Mup{\noexpand\noexpand\noexpand\Mup}%
          \def\Mex{\noexpand\noexpand\noexpand\Mex}%
          \def\Mupc{\noexpand\noexpand\noexpand\Mupc}%
          \def\TeX{\noexpand\noexpand\noexpand\TeX}}{\iMescaped}%
 \fi
}

\newcommand{\iM@flat@Mwrite}[2] {%
 \ifiM@colopen
        \iMescapeChar{^^J}{^^J#1:}{#1:#2}%
        \protected@write\iM@colout{\let\iM@therealpage\relax%
          \def\mupad{MuPAD}%
          \def\Mmath##1##2{##1}%
          \def\Mdmath##1##2{##1}%
          \renewcommand*\Mup[2][]{##2}%
          \def\Mex##1{##1}%
          \def\Mupx##1{##1}%
          \renewcommand*\Mupc[3][]{##2(##3)}%
          \def\TeX{TeX}}{\iMescaped}%
 \fi
}

%%
%% Jetzt kommt ein haariger Teil.  Die unterwegs geschriebene Datei
%% \jobname.col muß wieder zerlegt werden.  Dazu braucht die folgende Routine
%% zum Zerlegen in n Dateien n+1 Durchläufe durch \jobname.col.  Sie liest in
%% jedem Durchgang \jobname.sol zeilenweise ein, und sobald sie eine Zeile
%% findet, die in eine Datei geschrieben werden soll, die noch nicht gefunden
%% wurde, wird diese Datei geöffnet und in diesem Durchgang wird nur diese
%% Datei geschrieben. Im letzten Durchlauf stellt sie lediglich fest, daß
%% keine weitere Datei zu schreiben ist.

% Analog zur Definition von \loop..\repeat:
% Ja, die Syntax ist etwas quer, aber Schleifenkonstrukte aus anderen
% Sprachelementen zusammenzubasteln, ist auch krank. ccr.
\def\iM@repeat#1\iM@break{\def\body{#1}\iM@iterate}
\def\iM@iterate{\body\let\next=\relax\else\let\next=\iM@iterate\fi\next}
\let\iM@break=\fi

% Aus dem \TeX-Buch:
\newif\if@iM@member
\newcommand*{\iM@ismember}{}
\def\iM@ismember#1\of#2\relax{\@iM@memberfalse\def\given{#1}%
  \def\\##1{\def\next{##1}\ifx\next\given\@iM@membertrue\fi}#2}


\newcommand*{\iM@splitcolline}[1]{%
  % Am ":" trennen, wobei wir hier im Verbatim-Modus aufgerufen werden:
  \def\iM@split@colline##1:##2\to##3##4{%
    \def##3{##1}%
    \def##4{##2}%
    }%
  \expandafter\iM@split@colline#1\to\temp@a\temp@b%
  % erster Fall:  Noch keine Datei geöffnet
  \ifx\iM@curout\relax
  % Haben wir diesen Dateityp schon beschrieben?
    \expandafter\expandafter\expandafter\iM@ismember\expandafter\temp@a%
      \expandafter\of\the\iM@tok\relax%
    \relax
    \if@iM@member\else
      \xdef\iM@curout{\temp@a}%
      \global\iM@tok\expandafter\expandafter\expandafter{\expandafter\the%
        \expandafter\iM@tok\expandafter\\\expandafter{\temp@a}}%
      \message{\jobname.\temp@a }
      \immediate\openout\iM@splitout=\jobname.\temp@a
      \immediate\write\iM@splitout{\temp@b}%
    \fi
  % zweiter Fall: Datei geöffnet
  \else
    \ifx\iM@curout\temp@a
      \immediate\write\iM@splitout{\temp@b}%
    \fi
  \fi
}

\newcommand*{\iM@splitcol}{%
  {%
    \immediate\closeout\iM@colout%
    \iM@colopenfalse%    
    \clearpage\relax%
    \global\iM@tok{}%
    \let\\=\relax%
    \def\verbatim@processline{%
      \iM@splitcolline{\the\verbatim@line}%
      }%
    \def\verbatim@startline{%
      \verbatim@line{}%
      \catcode`\ =12%
      \catcode`\§=12%
      \catcode`\·=12%
      }%
    \let\verbatim@finish\relax%
    \immediate\write16{}% neue Zeile...
    \message{Mhelp.sty: Splitting \jobname.col: }%
    \def\verbatim@font{}% Do not make <, > etc. special
    \iM@repeat%
     \global\let\iM@curout=\relax%
     \verbatiminput{\jobname.col}%
    \ifx\iM@curout\relax\iM@break%
    \immediate\write16{done splitting.}%
    }}

% The \AtEndDocument hook is evaluated too early.
\newcommand*{\iM@old@@end}{}
\let\iM@old@@end\@@end
\def\@@end{\iM@splitcol\iM@old@@end}
