From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/mwrite/mwrite.sty | 137 +++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 macros/latex/contrib/mwrite/mwrite.sty (limited to 'macros/latex/contrib/mwrite') diff --git a/macros/latex/contrib/mwrite/mwrite.sty b/macros/latex/contrib/mwrite/mwrite.sty new file mode 100644 index 0000000000..c1ef07161b --- /dev/null +++ b/macros/latex/contrib/mwrite/mwrite.sty @@ -0,0 +1,137 @@ +% 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.) + +\def\filename{Mwrite} +\def\fileversion{2.2} +\def\filedate{1999/07/01} +% +\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}{\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 +\def\iM@ismember#1\of#2\relax{\@iM@memberfalse\def\given{#1}% + \def\\##1{\def\next{##1}\ifx\next\given\@iM@membertrue\fi}#2} + + +\def\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 +} + +\def\iM@splitcol{% + { + \clearpage\relax% + \global\iM@tok{}% + \let\\=\relax% + \def\verbatim@processline{% + \iM@splitcolline{\the\verbatim@line}% + }% + \def\verbatim@startline{% + \verbatim@line{}% + \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.}% + }} + +\AtEndDocument{% + \afterpage{\closeout\iM@colout% + \iM@colopenfalse% + \iM@splitcol}% \afterpage, damit \iM@colout geschrieben ist. +} -- cgit v1.2.3