% 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.6 2003/11/21 15:23:43 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}