summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/mwrite/mwrite.sty
blob: c1ef07161bbf1f5b094e7398dea69b7626de0252 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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.
}