summaryrefslogtreecommitdiff
path: root/macros/mtex/documentation/mdoctrns.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/mtex/documentation/mdoctrns.tex')
-rw-r--r--macros/mtex/documentation/mdoctrns.tex1201
1 files changed, 1201 insertions, 0 deletions
diff --git a/macros/mtex/documentation/mdoctrns.tex b/macros/mtex/documentation/mdoctrns.tex
new file mode 100644
index 0000000000..6990fb99ad
--- /dev/null
+++ b/macros/mtex/documentation/mdoctrns.tex
@@ -0,0 +1,1201 @@
+%format plaine
+\input webmac
+\newdimen\pageheight \pageheight=25cm
+\newdimen\pagewidth \pagewidth=16cm
+\advance\topskip by 3mm
+\parindent0pt
+\frenchspacing
+\def\_{\us}
+\def\8{\char25{}}
+\catcode`\"=\active %Umlaute
+\def"{\accent'177}
+\openup -3pt
+
+\N1. Anhang B: Definitionen.
+
+\fi
+
+\M2. One of the extensions to standard \\{pascal} that we shall deal with
+is to use a default \&{case} as in \\{tangle}, \\{weave}, etc.
+
+\Y\P\D \37$\\{othercases}\S\\{otherwise}$\C{default for cases not listed
+explicitly}\par
+\P\D \37$\\{endcases}\S$ \6
+\&{end} \C{follows the default case}\par
+\P\F \37$\\{othercases}\S\\{else}$\par
+\P\F \37$\\{endcases}\S\\{end}$\par
+\fi
+
+\M3. Folgende Definitionen sind Abk"urzungen f"ur den Befehl, eine Meldung
+gleichzeitig auf den Bildschirm und in eine Datei zu schreiben.
+
+\Y\P\D \37$\\{writeln\_error}(\#)\S\\{writeln}(\\{err},\39\#)$;\5
+$\\{writeln}(\\{outterm},\39\#)$\par
+\P\D \37$\\{write\_error}(\#)\S\\{write}(\\{err},\39\#)$;\5
+$\\{write}(\\{outterm},\39\#)$\par
+\fi
+
+\N4. Anhang B: Heading und Funktion getchar.
+
+\fi
+
+\M5. Programmkopf und Variablendeklarationen\par
+Das Programm hat vier Textfiles als Parameter. \\{infile} enth"alt die
+Eingabedaten in der entwickelten Noten\-ein\-ga\-be\-sprache. Nach der
+Bearbeitung durch das vorliegende Programm werden die Daten in eine
+f"ur die Notenausgabe ben"otigte Datei \\{outfile} geschrieben.
+Syntax-Fehler in der Eingabedatei werden mit Hilfe von
+\\{outterm} auf dem Terminal angezeigt und gleichzeitig in die
+Datei \\{err} geschrieben. Mit \\{interm} sind
+Eingaben vom Terminal m"oglich.
+
+\Y\P\4\&{program}\1\ \37$\\{trans}(\\{infile},\39\\{outfile},\39\\{err},\39%
+\\{outterm},\39\\{interm})$; \6
+\4\&{label} \X18:Labels\X \6
+\4\&{type} \X44:New type\X \6
+\4\&{var} \37\X6:Files\X\X7:Globals\X\X8:Function getchar\X\X31:Procedure
+newline music\X\X62:Procedure error\X\X21:Function ausruf\X\X67:Procedure macro%
+\X\X65:Procedure backslash\X\X33:Procedure nonmusic\X\X35:Procedure music\X\par
+\fi
+
+\M6. In diesem Teil sind die ben"otigten Textfiles deklariert.
+
+\Y\P$\4\X6:Files\X\S$\6
+\4\\{infile}: \37\\{text};\6
+\4\\{outfile}: \37\\{text};\6
+\4\\{outterm}: \37\\{text};\6
+\4\\{interm}: \37\\{text};\6
+\4\\{err}: \37\\{text};\par
+\U section~5.\fi
+
+\M7. Es folgt nun die Einleseroutine \\{get\_char}
+und die Deklaration
+der daf"ur ben"otigten Variablen.
+\\{get\_char} ist eine function, die auf die folgenden Weise
+an das Programm das n"achste Zeichen - einen Character -
+zur"uckgibt.
+\par
+Die Eingabedatei \\{infile} wird zeilenweise abgearbeitet. Jede neue
+Zeile wird auf den string \\{in\_line} eingelesen, der wiederum auf
+den array \\{buffer} kopiert wird. Dieses Feld enth"alt gleichzeitig
+drei Zeilen der Eingabedatei: die letzte abgearbeitete Zeile der
+L"ange \\{last\_line\_length}; die Zeile, die gerade bearbeitet wird
+- sie hat die L"ange \\{actual\_line\_length} - und die Zeile, die als
+n"achstes gelesen werden soll mit der L"ange \\{next\_line\_length}.
+Die Variable \\{line\_ptr} gibt dabei immer an, wie weit die
+\\{actual\_line} abgearbeitet ist. \par
+Falls das Ende dieser Zeile
+erreicht ist, werden die Zeilen im \\{buffer} nach links geschoben.
+Die \\{last\_line} wird durch die \\{actual\_line}, die \\{actual\_line} durch
+die \\{next\_line} und die \\{next\_line} durch eine neue \\{in\_line}
+ersetzt.
+Bei einem Zeilenwechsel wird die Variable \\{change} auf true
+gesetzt, ansonsten hat sie den Wert false.
+\par
+Mit Hilfe der character-Variablen \\{sign} wird jeweils das n"achste
+Zeichen einer Zeile an das Programm "ubergeben.
+Die gelesenen Zeilen werden mit \\{line\_num} gez"ahlt.
+Beim ersten Einlesen von der Datei \\{in\_file} kann das
+``Weiterschieben'' im \\{buffer} unterbleiben, deshalb gibt es
+daf"ur eine gesonderte Abfrage.
+Gesondert werden ebenfalls die F"alle $\\{inline\_length}=0$ und
+$\\{actual\_line\_length}=0$ behandelt. Im ersten Fall wird der Teil des
+\\{buffer}, der nicht belegt ist, mit blanks besetzt, um falsche
+Belegung von \\{sign} zu vermeiden, im zweiten Fall erh"alt
+\\{get\_char} den Wert \.{\'\ \'}.
+\par
+\noindent\\{eof\_infile} zeigt an, wenn die Eingabedatei einschlie\8lich
+der letzten Zeile abgearbeitet ist. Diese Variable ist
+notwendig, weil das Ende der Datei mit dem Lesen der letzten Zeile
+auf \\{in\_line} erreicht ist, diese dann aber noch abgearbeitet
+werden mu\8.
+
+
+
+\Y\P$\4\X7:Globals\X\S$\6
+\4\\{buffer}: \37\&{array} $[1\to240]$ \1\&{of}\5
+\\{char};\2\6
+\4\\{in\_line}: \37$\\{string}(80)$;\6
+\4\\{sign}: \37\\{char};\6
+\4\\{last\_line\_length}: \37\\{integer};\6
+\4\\{actual\_line\_length}: \37\\{integer};\6
+\4\\{next\_line\_length}: \37\\{integer};\6
+\4\\{inline\_length}: \37\\{integer};\6
+\4\\{line\_ptr}: \37\\{integer};\6
+\4\\{line\_num}: \37\\{integer};\6
+\4\\{eof\_infile}: \37\\{boolean};\6
+\4\\{change}: \37\\{boolean};\par
+\A sections~17, 20, 36, 39, 41, 45, 50, 57, and~61.
+\U section~5.\fi
+
+\M8.
+
+\Y\P$\4\X8:Function getchar\X\S$\6
+\4\&{function}\1\ \37\\{get\_char}: \37\\{char};\6
+\4\&{var} \37\|j: \37\\{integer};\2\6
+\&{begin} \37\&{if} $\\{line\_num}=0$ \1\&{then}\6
+\&{begin} \37\&{if} $\R\\{eof}(\\{infile})$ \1\&{then}\6
+\&{begin} \37\X9:Lesen der n"achsten Zeile von infile\X;\6
+\X10:Einlesen der neuen Zeile in den buffer\X;\6
+\&{end}\6
+\4\&{else} \&{goto} \3710;\2\6
+\&{end};\2\6
+\&{if} $\\{line\_ptr}>\\{last\_line\_length}+\\{actual\_line\_length}$ \1%
+\&{then}\6
+\&{begin} \37\X11:Neubelegung der \\{actual\_line} durch \\{next\_line},
+Zeilenwechsel\X;\6
+$\\{get}(\\{infile})$;\6
+\&{if} $\R\\{eof}(\\{infile})$ \1\&{then}\6
+\&{begin} \37\X9:Lesen der n"achsten Zeile von infile\X;\6
+\&{if} $\\{inline\_length}=0$ \1\&{then}\6
+\&{begin} \37\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\X10:Einlesen der neuen Zeile in den buffer\X;\6
+\&{end};\2\6
+\&{end}\6
+\4\&{else} \&{begin} \37\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X;%
+\6
+\&{end};\2\6
+$\\{line\_ptr}\K\\{last\_line\_length}+1$;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\X13:Kein Zeilenwechsel\X;\6
+\&{end};\2\6
+\&{if} $\\{actual\_line\_length}=0$ \1\&{then}\6
+\&{begin} \37\X14:\\{actual\_line} ist Leerzeile\X;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\X15:Zeichen lesen\X;\6
+\&{end};\2\6
+$\\{line\_ptr}\K\\{line\_ptr}+1$;\5
+$\\{eof\_infile}\K(\\{eof}(\\{infile})\W(\\{line\_ptr}>\\{last\_line\_length}+%
+\\{actual\_line\_length}))$;\6
+\&{end};\par
+\U section~5.\fi
+
+\M9. Es wird eine neue Zeile aus der Eingabedatei \\{infile} gelesen.
+"Uberfl"ussigen blanks werden entfernt.
+
+\Y\P$\4\X9:Lesen der n"achsten Zeile von infile\X\S$\6
+$\\{read}(\\{infile},\39\\{in\_line})$;\5
+$\\{in\_line}\K\\{ltrim}(\\{in\_line})$;\5
+$\\{in\_line}\K\\{trim}(\\{in\_line})$;\5
+$\\{in\_line}\K\\{compress}(\\{in\_line})$;\5
+$\\{inline\_length}\K\\{length}(\\{in\_line})$;\par
+\U sections~8 and~8.\fi
+
+\M10. Die neue Zeile wird in den string \\{buffer} gelesen.
+
+\Y\P$\4\X10:Einlesen der neuen Zeile in den buffer\X\S$\6
+\&{for} $\|j\K1\mathrel{\&{to}}\\{inline\_length}$ \1\&{do}\5
+$\\{buffer}[\\{actual\_line\_length}+\\{next\_line\_length}+\|j]\K\\{in\_line}[%
+\|j]$;\2\6
+$\\{last\_line\_length}\K\\{actual\_line\_length}$;\5
+$\\{actual\_line\_length}\K\\{next\_line\_length}$;\5
+$\\{next\_line\_length}\K\\{inline\_length}$;\par
+\U sections~8 and~8.\fi
+
+\M11. Die \\{actual\_line} im \\{buffer} wird mit einer neuen Zeile, n"amlich
+der \\{next\_line} belegt. Auf \\{last\_line} wird die vorherige \\{actual%
+\_line}
+geschrieben. \\{change} wird true, da ein Zeilenwechsel
+stattfindet.
+
+\Y\P$\4\X11:Neubelegung der \\{actual\_line} durch \\{next\_line},
+Zeilenwechsel\X\S$\6
+\&{for} $\|j\K1\mathrel{\&{to}}\\{actual\_line\_length}$ \1\&{do}\5
+$\\{buffer}[\|j]\K\\{buffer}[\\{last\_line\_length}+\|j]$;\2\6
+\&{for} $\|j\K1\mathrel{\&{to}}\\{next\_line\_length}$ \1\&{do}\5
+$\\{buffer}[\\{actual\_line\_length}+\|j]\K\\{buffer}[\\{last\_line\_length}+%
+\\{actual\_line\_length}+\|j]$;\2\6
+$\\{line\_num}\K\\{line\_num}+1$;\5
+$\\{change}\K\\{true}$;\par
+\U section~8.\fi
+
+\M12. \\{in\_line} ist eine Leerzeile.
+
+\Y\P$\4\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X\S$\6
+\&{for} $\|j\K\\{actual\_line\_length}+\\{next\_line\_length}+1\mathrel{%
+\&{to}}240$ \1\&{do}\5
+$\\{buffer}[\|j]\K\.{\'\ \'}$;\2\6
+$\\{last\_line\_length}\K\\{actual\_line\_length}$;\5
+$\\{actual\_line\_length}\K\\{next\_line\_length}$;\5
+$\\{next\_line\_length}\K0$;\par
+\U sections~8 and~8.\fi
+
+\M13. Es findet kein Zeilenwechsel statt, da das Ende der \\{actual\_line} noch
+nicht erreicht ist: \\{change} ist false.
+
+\Y\P$\4\X13:Kein Zeilenwechsel\X\S$\6
+$\\{change}\K\\{false}$;\par
+\U section~8.\fi
+
+\M14. Die \\{actual\_line} ist eine Leerzeile. Da ein Wert an das Programm
+zur"uckgegeben werden mu\8, erh"alt \\{get\_char} den Wert \.{\'\ \'}.
+
+\Y\P$\4\X14:\\{actual\_line} ist Leerzeile\X\S$\6
+$\\{get\_char}\K\.{\'\ \'}$;\par
+\U section~8.\fi
+
+\M15. Ist der \\{buffer} richtig belegt, so kann das n"achste Zeichen auf
+\\{get\_char} eingelesen werden.
+
+\Y\P$\4\X15:Zeichen lesen\X\S$\6
+$\\{get\_char}\K\\{buffer}[\\{line\_ptr}]$;\par
+\U section~8.\fi
+
+\N16. Anhang B: Hauptprogramm und Function ausruf.
+
+\fi
+
+\M17. Hauptprogramm\par
+Im Hauptprogramm werden die oben definierten Textfiles zum Lesen bzw.
+Schreiben ge"offnet. Solange das Ende der Eingabedatei nicht
+erreicht ist, wird mit der Variablen \\{music\_num}
+unterschieden, ob gerade eine Noteneingabe ($\\{music\_num}=\\{true}$)
+oder eine
+Texteingabe ($\\{music\_num}=\\{false}$) bearbeitet wird.
+Je nachdem wird entweder die Routine \\{nonmusic} oder \\{music} aufgerufen.
+Texteingaben werden so wie sie in der Eingabedatei stehen in
+die Ausgabedatei \\{outfile} geschrieben, also Zeile f"ur Zeile.
+Noteneingaben werden in eine
+andere Form gebracht.
+
+Falls innerhalb einer Routine das Ende der Eingabedatei erreicht
+wird, soll das Programm beendet werden. An der entsprechenden Stelle
+in der Routine wird dann auf das Label 10 verwiesen.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{music\_num}: \37\\{boolean};\par
+\fi
+
+\M18. Labeldeklaration
+\Y\P$\4\X18:Labels\X\S$\6
+10;\par
+\U section~5.\fi
+
+\M19. Hauptprogramm.
+
+\Y\P\&{begin} \37$\\{termout}(\\{outterm})$;\5
+$\\{termin}(\\{interm})$;\5
+\X59:Setze die default-Werte\X;\6
+$\\{reset}(\\{infile})$;\5
+$\\{rewrite}(\\{outfile})$;\5
+$\\{rewrite}(\\{err})$;\5
+$\\{eof\_infile}\K(\\{eof}(\\{infile})\W(\\{line\_ptr}>\\{last\_line\_length}+%
+\\{actual\_line\_length}))$;\6
+\&{while} $\R(\\{eof\_infile})$ \1\&{do}\6
+\&{begin} \37\&{case} $\\{music\_num}$ \1\&{of}\6
+\4\\{false}: \37\\{nonmusic};\6
+\4\\{true}: \37\\{music};\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\6
+\&{end};\2\6
+\410: \37\&{end}.\par
+\fi
+
+\M20. Routine, die den Wechsel zwischen Noteneingabe und Texteingabe
+anzeigt\par
+Die Funktion berechnet als Wert, ob sich der mode ge"andert hat
+oder nicht.
+Ein Wechsel des Modes wird durch zwei aufeinanderfolgende
+Ausrufezeichen angezeigt. Die Routine wird also aufgerufen,
+sobald ein Ausrufezeichen gelesen wurde. Dann mu\8
+"uberpr"uft werden, ob ein zweites Ausrufezeichen folgt oder nicht.
+\par
+An die Routine wird der Wert von \\{change} "ubergeben, da es
+f"ur das Schreiben in \\{outfile} f"ur allem bei Texteingabe
+notwendig ist, "uber einen Zeilenwechsel Bescheid zu wissen.
+\par
+Falls es "uberhaupt kein n"achstes Zeichen gibt, also das
+Ende der Eingabedatei erreicht wurde, wird bei einer Texteingabe
+($\\{music\_num}=\\{false}$)
+das gelesene Zeichen
+in die Ausgabedatei \\{outfile} geschrieben; bei einer Noteneingabe
+zeigt das Ausrufezeichen das Ende an.\par
+Falls das n"achste Zeichen kein Ausrufezeichen ist, werden im
+Fall $\\{music\_num}=\\{false}$ das Ausrufezeichen und das neu gelesene Zeichen
+in \\{outfile} geschrieben. F"ur $\\{music\_num}=\\{true}$ wird angenommen, da%
+\8
+das zweite Ausrufezeichen vergessen wurde, also ein Wechsel
+in den nonmusic-mode stattfindet. Das neu gelesene Zeichen wird
+dann - als erstes Zeichen der Texteingabe -
+in eine neue Zeile von \\{outfile} geschrieben.
+\par
+Der dritte Fall ist, da\8 es sich bei dem neuen Zeichen um ein
+Ausrufezeichen handelt. Dann findet ein mode-Wechsel statt.
+\par\noindent
+\\{w\_column} ist die Variable, die anzeigt, in welche Spalte von \\{outfile}
+geschrieben wird.
+
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{w\_column}: \37\\{integer};\par
+\fi
+
+\M21.
+
+\Y\P$\4\X21:Function ausruf\X\S$\6
+\4\&{function}\1\ \37$\\{ausruf}(\\{help}:\\{boolean})$: \37\\{boolean};\2\6
+\&{begin} \37\&{if} $\R(\\{eof\_infile})$ \1\&{then}\5
+\X22:Lesen des n"achsten Zeichens\X\6
+\4\&{else} \X30:Ende der Eingabedatei erreicht\X;\2\6
+\&{end};\par
+\U section~5.\fi
+
+\M22. Das n"achste Zeichen wird auf \\{sign} gelesen und "uberpr"uft, ob es
+ein Ausrufezeichen ist oder nicht.
+
+\Y\P$\4\X22:Lesen des n"achsten Zeichens\X\S$\6
+\&{begin} \37$\\{sign}\K\\{get\_char}$;\6
+\&{if} $\\{sign}=\.{\'!\'}$ \1\&{then}\5
+\X23:Wechsel des modes\X\6
+\4\&{else} \X26:Kein Wechsel des modes\X\2\6
+\&{end}\par
+\U section~21.\fi
+
+\M23.
+
+\Y\P$\4\X23:Wechsel des modes\X\S$\6
+\&{begin} \37\&{case} $\\{music\_num}$ \1\&{of}\6
+\4\\{false}: \37\X24:Wechsel in music mode\X;\6
+\4\\{true}: \37\X25:Wechsel in nonmusic mode\X;\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\6
+\&{end}\par
+\U section~22.\fi
+
+\M24. Beim Wechsel in den musicmode bzw. nonmusicmode wird jeweils eine
+neue Zeile angefangen.
+
+\Y\P$\4\X24:Wechsel in music mode\X\S$\6
+\&{begin} \37\&{if} $\\{line\_num}>1$ \1\&{then}\5
+$\\{writeln}(\\{outfile})$;\2\6
+$\\{write}(\\{outfile},\39\.{\'\\beginsong\'})$;\5
+$\\{ausruf}\K\\{true}$;\5
+$\\{w\_column}\K10$;\6
+\&{end};\par
+\U section~23.\fi
+
+\M25.
+
+\Y\P$\4\X25:Wechsel in nonmusic mode\X\S$\6
+\&{begin} \37$\\{newline\_music}(9)$;\5
+$\\{writeln}(\\{outfile},\39\.{\'\\endsong\'})$;\5
+$\\{w\_column}\K0$;\5
+$\\{ausruf}\K\\{false}$;\6
+\&{end};\par
+\U section~23.\fi
+
+\M26.
+
+\Y\P$\4\X26:Kein Wechsel des modes\X\S$\6
+\&{begin} \37\&{case} $\\{music\_num}$ \1\&{of}\6
+\4\\{false}: \37\X27:Gelesene Zeichen schreiben\X;\6
+\4\\{true}: \37\&{begin} \37\X28:Ausrufezeichen fehlt\X;\6
+\X29:Ende musicmode, Zeichen schreiben\X;\6
+\&{end};\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\6
+\&{end};\par
+\U section~22.\fi
+
+\M27. Falls ein Zeilenwechsel beim Lesen des letzten Zeichens stattgefunden
+hat, wird das Ausrufezeichen in die letzte Zeile von \\{outfile}
+geschrieben, f"ur das neue Zeichen wird eine neue Zeile angefangen.
+\par
+Hat der Zeilenwechsel beim Lesen des Ausrufezeichens stattgefunden,
+werden beide Zeichen in eine neue Zeile geschrieben.
+
+\Y\P$\4\X27:Gelesene Zeichen schreiben\X\S$\6
+\&{begin} \37\&{if} $\\{change}=\\{true}$ \1\&{then}\6
+\&{begin} \37$\\{writeln}(\\{outfile},\39\.{\'!\'})$;\5
+$\\{write}(\\{outfile},\39\\{sign})$;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $\\{help}=\\{true}$ \1\&{then}\6
+\&{begin} \37$\\{writeln}(\\{outfile})$;\5
+$\\{write}(\\{outfile},\39\.{\'!\'},\39\\{sign})$;\6
+\&{end}\6
+\4\&{else} $\\{write}(\\{outfile},\39\.{\'!\'},\39\\{sign})$;\2\6
+\&{end};\2\6
+$\\{ausruf}\K\\{false}$;\6
+\&{end};\par
+\U section~26.\fi
+
+\M28.
+
+\Y\P$\4\X28:Ausrufezeichen fehlt\X\S$\6
+\&{if} $\\{change}=\\{true}$ \1\&{then}\5
+$\\{error}(\.{\'Fehlendes\ Ausrufezeichen\ gesetzt\'},\39\\{line\_num}-1)$\6
+\4\&{else} $\\{error}(\.{\'Fehlendes\ Ausrufezeichen\ gesetzt\'},\39\\{line%
+\_num})$;\2\par
+\U section~26.\fi
+
+\M29.
+
+\Y\P$\4\X29:Ende musicmode, Zeichen schreiben\X\S$\6
+$\\{ausruf}\K\\{false}$;\5
+$\\{newline\_music}(9)$;\6
+\&{if} $\\{eof}(\\{infile})$ \1\&{then}\6
+\&{begin} \37\&{if} $\\{actual\_line\_length}=0$ \1\&{then}\5
+$\\{write}(\\{outfile},\39\.{\'\\endsong\'})$\6
+\4\&{else} $\\{writeln}(\\{outfile},\39\.{\'\\endsong\'})$;\2\6
+\&{end}\6
+\4\&{else} $\\{writeln}(\\{outfile},\39\.{\'\\endsong\'})$;\2\6
+$\\{write}(\\{outfile},\39\\{sign})$;\5
+$\\{w\_column}\K1$;\par
+\U section~26.\fi
+
+\M30.
+
+\Y\P$\4\X30:Ende der Eingabedatei erreicht\X\S$\6
+\&{begin} \37\&{if} $\\{music\_num}=\\{true}$ \1\&{then}\6
+\&{begin} \37$\\{newline\_music}(8)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\endsong\'})$;\5
+$\\{error}(\.{\'Fehlendes\ Ausrufezeichen\ am\ Ende\ gesetzt\'},\39\\{line%
+\_num})$;\6
+\&{end}\6
+\4\&{else} $\\{write}(\\{outfile},\39\.{\'!\'})$;\2\6
+$\\{ausruf}\K\\{music\_num}$;\5
+\&{goto} \3710;\6
+\&{end};\par
+\U section~21.\fi
+
+\M31. F"ur das Schreiben in die Ausgabedatei wird f"ur den music-mode
+eine weitere Routine ben"otigt, die berechnet, ob
+eine neue Zeile in der Ausgabedatei begonnen werden mu\8.
+F"ur den nonmusic-mode ist das nicht n"otig, da die Zeilen
+so "ubernommen werden, wie sie in der Eingabedatei stehen.
+"Ubergeben wird zur Berechnung die L"ange des zu schreibenden Worts.
+
+\Y\P$\4\X31:Procedure newline music\X\S$\6
+\4\&{procedure}\1\ \37$\\{newline\_music}(\\{word\_length}:\\{integer})$;\2\6
+\&{begin} \37$\\{w\_column}\K\\{w\_column}+\\{word\_length}$;\6
+\&{if} $\\{w\_column}\G70$ \1\&{then}\6
+\&{begin} \37$\\{write}(\\{outfile},\39\.{\'\%\'})$;\5
+$\\{writeln}(\\{outfile})$;\5
+$\\{w\_column}\K\\{word\_length}$;\6
+\&{end};\2\6
+\&{end};\par
+\U section~5.\fi
+
+\N32. Anhang B: Prozedur nonmusic.
+
+\fi
+
+\M33. Prozedur, die normalen Text ausgibt, solange \\{music\_num} false ist.
+Ein Zeilenwechsel im Ausgabefile findet statt, wenn die
+Zeile in der Eingabedatei ebenfalls gewechselt wird. Falls
+ein Ausrufezeichen eingelesen wird, mu\8 die Funktion \\{ausruf}
+aufgerufen werden.
+
+\Y\P$\4\X33:Procedure nonmusic\X\S$\6
+\4\&{procedure}\1\ \37\\{nonmusic};\2\6
+\&{begin} \37\&{while} $\\{music\_num}=\\{false}$ \1\&{do}\6
+\&{begin} \37\&{if} $\R(\\{eof\_infile})$ \1\&{then}\6
+\&{begin} \37$\\{sign}\K\\{get\_char}$;\6
+\&{if} $\\{sign}=\.{\'!\'}$ \1\&{then}\5
+$\\{music\_num}\K\\{ausruf}(\\{change})$\6
+\4\&{else} \&{begin} \37\&{if} $\\{line\_num}=1$ \1\&{then}\5
+$\\{write}(\\{outfile},\39\\{sign})$\6
+\4\&{else} \&{begin} \37\&{if} $\\{change}=\\{false}$ \1\&{then}\5
+$\\{write}(\\{outfile},\39\\{sign})$\6
+\4\&{else} \&{begin} \37\&{if} $\\{w\_column}=0$ \1\&{then}\5
+$\\{write}(\\{outfile},\39\\{sign})$\6
+\4\&{else} \&{begin} \37$\\{writeln}(\\{outfile})$;\5
+$\\{write}(\\{outfile},\39\\{sign})$\6
+\&{end};\2\6
+\&{end};\2\6
+\&{end};\2\6
+\&{end};\2\6
+$\\{w\_column}\K\\{line\_ptr}-1$;\6
+\&{end}\6
+\4\&{else} \&{goto} \3710;\2\6
+\&{end};\2\6
+\&{end};\par
+\U section~5.\fi
+
+\N34. Anhang B: Prozedur music.
+
+
+\fi
+
+\M35. Prozedur, die Musikeingabe abarbeitet und abfragt,
+um welches Zeichen es sich gerade handelt.
+Dabei wird unterschieden,
+ob es sich um eine Tonh"ohe , um eine Pause oder
+Taktstrich, um erg"anzende Angaben zur
+Tonh"ohe (z. B. Dauer, Vorzeichen, Oktave, Punkte),
+um das Ende der Musikeingabe oder
+um den Beginn
+einer Kontrollsequenz (\\{backslash}) oder eines Kommentars handelt.
+
+
+
+\Y\P$\4\X35:Procedure music\X\S$\6
+\4\&{procedure}\1\ \37\\{music};\2\6
+\&{begin} \37\&{while} $\\{music\_num}=\\{true}$ \1\&{do}\6
+\&{begin} \37\&{if} $\R(\\{eof\_infile})$ \1\&{then}\6
+\&{begin} \37$\\{sign}\K\\{get\_char}$;\6
+\&{case} $\\{sign}$ \1\&{of}\6
+\X37:Zeichen ist Angabe zum Ton\X;\6
+\X38:Zeichen ist Tonh"ohe\X;\6
+\X51:Zeichen ist Pause oder Taktstrich\X;\6
+\X56:Zeichen bedeutet Ende der Musikeingabe\X;\6
+\X54:Zeichen ist Kommentar\X;\6
+\X55:Zeichen ist backslash\X;\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\6
+\&{end}\6
+\4\&{else} \&{goto} \3710;\2\6
+\&{end};\2\6
+\&{end};\par
+\U section~5.\fi
+
+\M36. Es folgen die Variablen, die f"ur die Prozedur \\{music} ben"otigt
+werden. Die einzelnen Programmteile werden an den entsprechenden
+Stellen erl"autert.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{octave\_num}: \37\\{integer};\6
+\4\\{dot\_num}: \37\\{integer};\6
+\4\\{nat\_num}: \37\\{integer};\6
+\4\\{b\_num}: \37\\{integer};\6
+\4\\{x\_num}: \37\\{integer};\6
+\4\\{duration}: \37\\{char};\par
+\fi
+
+\M37. In diesem Teil werden die f"ur die Note notwendigen Variablen
+besetzt.
+\\{octave\_num} z"ahlt die Hochkommata bzw. Kommata,
+die zur Angabe der Oktave
+eingegeben wurden.
+Die Tondauer mu\8 f"ur den Ausgabefile mit einer Zahl angegeben
+werden. Diese Belegung findet mit Hilfe von \\{duration} statt.
+\\{dot\_num} z"ahlt die eingegebenen Punkte.
+Etwaige Vorzeichen werden registriert. Da ein Doppelkreuz bzw. Doppel-be
+durch zwei x bzw. b eingegeben wird, werden diese mit \\{x\_num}
+bzw. \\{b\_num} gez"ahlt.
+
+
+\Y\P$\4\X37:Zeichen ist Angabe zum Ton\X\S$\6
+\4\.{\',\'}: \37$\\{octave\_num}\K\\{octave\_num}-1$;\6
+\4\.{\'\'}\.{\'\'}: \37$\\{octave\_num}\K\\{octave\_num}+1$;\6
+\4\.{\'1\'}: \37$\\{duration}\K\.{\'g\'}$;\6
+\4\.{\'2\'}: \37$\\{duration}\K\.{\'h\'}$;\6
+\4\.{\'4\'}: \37$\\{duration}\K\.{\'v\'}$;\6
+\4\.{\'8\'}: \37$\\{duration}\K\.{\'a\'}$;\6
+\4\.{\'6\'}: \37$\\{duration}\K\.{\'s\'}$;\6
+\4\.{\'5\'}: \37$\\{duration}\K\.{\'z\'}$;\6
+\4\.{\'.\'}: \37$\\{dot\_num}\K\\{dot\_num}+1$;\6
+\4\.{\'b\'}: \37$\\{b\_num}\K\\{b\_num}+1$;\6
+\4\.{\'x\'}: \37$\\{x\_num}\K\\{x\_num}+1$;\6
+\4\.{\'n\'}: \37$\\{nat\_num}\K5$;\par
+\U section~35.\fi
+
+\M38. Die oben
+beschriebene Belegung ist beendet, sobald ein Notenname eingelesen
+wird.
+Dann wird die Oktave endg"ultig berechnet,
+der Tonh"ohe wird
+eine Zahl zugeordnet, die die Stellung der Note im Notenliniensystem
+angibt und die Vorzeichen angegeben. Anschlie\8end wird die
+Note in die Ausgabedatei \\{outfile} geschrieben.
+
+\Y\P$\4\X38:Zeichen ist Tonh"ohe\X\S$\6
+\4$\.{\'c\'},\39\.{\'d\'},\39\.{\'e\'},\39\.{\'f\'},\39\.{\'g\'},\39\.{\'a\'},%
+\39\.{\'h\'}$: \37\&{begin} \37\X42:Berechnung der richtigen Oktave\X;\6
+\X40:Umsetzung der Tonh"ohe in eine Zahl\X;\6
+\X46:Gibt es ein Vorzeichen\X;\6
+\X48:Schreibe die gelesene Note\X;\6
+\X49:Schreibe die Punkte\X;\6
+\&{end};\par
+\U section~35.\fi
+
+\M39.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{pitchnum}: \37\\{integer};\par
+\fi
+
+\M40. Das Liniensystem wird mit einer Numerierung versehen. Jedem Notennamen
+wird dann mit der Variablen \\{pitchnum} die entsprechende Zahl zwischen
+-2 und 4 in Abh"angigkeit von der Lage
+im Notenliniensystem zugeordnet.
+
+\Y\P$\4\X40:Umsetzung der Tonh"ohe in eine Zahl\X\S$\6
+\&{case} $\\{sign}$ \1\&{of}\6
+\4\.{\'c\'}: \37$\\{pitchnum}\K-2$;\6
+\4\.{\'d\'}: \37$\\{pitchnum}\K-1$;\6
+\4\.{\'e\'}: \37$\\{pitchnum}\K0$;\6
+\4\.{\'f\'}: \37$\\{pitchnum}\K1$;\6
+\4\.{\'g\'}: \37$\\{pitchnum}\K2$;\6
+\4\.{\'a\'}: \37$\\{pitchnum}\K3$;\6
+\4\.{\'h\'}: \37$\\{pitchnum}\K4$;\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\par
+\A section~43.
+\U section~38.\fi
+
+\M41.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{octave}: \37\\{integer};\par
+\fi
+
+\M42. Nun wird die Oktave berechnet. Das ist wichtig f"ur
+die n-gestrichene Oktave (n$>$0), da die eingestrichene Oktave
+den Wert \\{octave}=0 erhalten soll, die zweigestrichene den Wert 1 usw.
+Weil aber zun"achst die Hochkommas gez"ahlt wurden, ist eine
+Zur"ucksetzung erforderlich.
+
+\Y\P$\4\X42:Berechnung der richtigen Oktave\X\S$\6
+\&{if} $\\{octave\_num}>0$ \1\&{then}\6
+\&{begin} \37$\\{octave}\K\\{octave\_num}-1$;\5
+$\\{octave\_num}\K0$;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $\\{octave\_num}<0$ \1\&{then}\6
+\&{begin} \37$\\{octave}\K\\{octave\_num}$;\5
+$\\{octave\_num}\K0$;\6
+\&{end}\2\6
+\&{end};\2\par
+\U section~38.\fi
+
+\M43. Nun wird die Tonh"ohe unter Ber"ucksichtigung der
+eben gesetzten Zahl \\{pitchnum} und der Oktave \\{octave}
+endg"ultig berechnet.
+
+\Y\P$\4\X40:Umsetzung der Tonh"ohe in eine Zahl\X\mathrel{+}\S$\6
+\&{if} $(-3\L\\{octave})\W(\\{octave}\L3)$ \1\&{then}\5
+$\\{pitchnum}\K\\{pitchnum}+(\\{octave})\ast7$\6
+\4\&{else} \&{begin} \37$\\{error}(\.{\'Die\ Oktave\ wurde\ falsch\ eingegeben,%
+\ default\ gesetzt\'},\39\\{line\_num})$;\5
+$\\{octave\_num}\K0$;\6
+\&{end};\2\par
+\fi
+
+\M44. Zur Berechnung der Vorzeichen mu\8.
+ein neuer Variablentyp definiert werden.
+\\{accidental} ist ein array, mit dem mit Hilfe der
+eingelesenen Anzahl der x bzw. b das Vorzeichen bestimmt werden kann.
+
+\Y\P$\4\X44:New type\X\S$\6
+$\\{accidental}=$\1\5
+\&{array} $[1\to5]$ \1\&{of}\5
+$\\{string}(2)$;\2\2\par
+\U section~5.\fi
+
+\M45.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{accid}: \37\\{accidental};\6
+\4\\{acc}: \37$\\{string}(2)$;\par
+\fi
+
+\M46. Falls \\{x\_num} bzw. \\{b\_num} von 0 verschieden sind, gibt es ein
+Vorzeichen. Ob es sich um ein Kreuz oder ein b handelt,
+wird anhand der Variablen
+\\{x\_num} bzw. \\{b\_num} deutlich. Diese integer-Zahlen werden als
+Index von \\{accid} benutzt, dieser gibt dann das Vorzeichen an.
+Danach werden \\{x\_num}, \\{b\_num} und \\{nat\_num} auf die defaults
+gesetzt.
+
+\Y\P$\4\X46:Gibt es ein Vorzeichen\X\S$\6
+\&{if} $\\{x\_num}>0$ \1\&{then}\6
+\&{begin} \37$\\{acc}\K\\{accid}[\\{x\_num}]$;\5
+$\\{x\_num}\K0$;\5
+\X47:Schreibe das Vorzeichen\X;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $\\{b\_num}>2$ \1\&{then}\6
+\&{begin} \37$\\{acc}\K\\{accid}[\\{b\_num}]$;\5
+$\\{b\_num}\K2$;\5
+\X47:Schreibe das Vorzeichen\X;\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $\\{nat\_num}=5$ \1\&{then}\6
+\&{begin} \37$\\{acc}\K\\{accid}[\\{nat\_num}]$;\5
+$\\{nat\_num}\K0$;\5
+\X47:Schreibe das Vorzeichen\X;\6
+\&{end};\2\6
+\&{end};\2\6
+\&{end};\2\par
+\U section~38.\fi
+
+\M47. Die Schreibbefehle f"ur Vorzeichen, Noten, Pausen, Punkte folgen.
+\par
+Das Vorzeichen wird geschrieben, falls vorhanden.
+Beim Schreiben m"ussen zwei F"alle unterschieden werden.
+Falls n"amlich \\{pitchnum} kleiner als 0 oder gr"o\8er als 9
+ist, mu\8 die Zahl in
+geschweifte Klammern geschrieben werden, sonst nicht.
+Die Zahl, die zu der Variablen
+\\{w\_column} (z"ahlt die Spalte in \\{outfile})
+addiert wird, ist die gr"o\8tm"ogliche.
+
+\Y\P$\4\X47:Schreibe das Vorzeichen\X\S$\6
+\&{if} $(\\{pitchnum}<0)\V(\\{pitchnum}>9)$ \1\&{then}\6
+\&{begin} \37$\\{newline\_music}(8)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{acc},\39\.{\'\{\'},\39%
+\\{pitchnum}:1,\39\.{\'\}\'})$;\6
+\&{end}\6
+\4\&{else} \&{begin} \37$\\{newline\_music}(5)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{acc},\39\\{pitchnum}:1)$;\6
+\&{end};\2\par
+\U sections~46, 46, and~46.\fi
+
+\M48. Die Note wird - "ahnlich wie das Vorzeichen - geschrieben.
+
+\Y\P$\4\X48:Schreibe die gelesene Note\X\S$\6
+\&{if} $(\\{pitchnum}<0)\V(\\{pitchnum}>9)$ \1\&{then}\6
+\&{begin} \37$\\{newline\_music}(7)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{duration},\39\.{\'\{\'},\39%
+\\{pitchnum}:1,\39\.{\'\}\'})$;\6
+\&{end}\6
+\4\&{else} \&{begin} \37$\\{newline\_music}(4)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{duration},\39\\{pitchnum}:1)$;\6
+\&{end};\2\par
+\U section~38.\fi
+
+\M49. Punkte werden geschrieben, falls vorhanden.
+Danach wird \\{dot\_num} auf 0 gesetzt.
+
+\Y\P$\4\X49:Schreibe die Punkte\X\S$\6
+\&{if} $\\{dot\_num}>0$ \1\&{then}\6
+\&{begin} \37$\\{newline\_music}(\\{dot\_num}+1)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\.{\'.\'},\39\\{dot\_num}:1)$;\5
+$\\{dot\_num}\K0$;\6
+\&{end};\2\par
+\U section~38.\fi
+
+\M50.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{bar\_line}: \37\\{char};\6
+\4\\{rest}: \37\\{char};\par
+\fi
+
+\M51. Pause und Taktstrich werden gesondert behandelt und sofort
+ausgedruckt.
+
+\Y\P$\4\X51:Zeichen ist Pause oder Taktstrich\X\S$\6
+\4$\.{\'|\'},\39\.{\'=\'}$: \37\&{begin} \37$\\{bar\_line}\K\\{sign}$;\5
+\X53:Schreibe Taktstrich\X;\6
+\&{end};\6
+\4\.{\'p\'}: \37\&{begin} \37$\\{rest}\K\\{sign}$;\5
+\X52:Schreibe Pause\X;\6
+\&{end};\par
+\U section~35.\fi
+
+\M52. Pause wird geschrieben.
+
+\Y\P$\4\X52:Schreibe Pause\X\S$\6
+$\\{newline\_music}(3)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{rest},\39\\{duration})$;\par
+\U section~51.\fi
+
+\M53. Taktstrich wird geschrieben.
+
+\Y\P$\4\X53:Schreibe Taktstrich\X\S$\6
+$\\{newline\_music}(2)$;\5
+$\\{write}(\\{outfile},\39\.{\'\\\'},\39\\{bar\_line})$;\par
+\U section~51.\fi
+
+\M54. Das Zeichen ist ein Kommentarzeichen. Der Rest der Zeile
+soll im Musikmode nicht mit"ubergeben werden. Deshalb setzen wir
+\\{line\_ptr} um eins zu hoch; daraufhin wird die n"achste Zeile
+eingelesen.
+
+\Y\P$\4\X54:Zeichen ist Kommentar\X\S$\6
+\4\.{\'\%\'}: \37$\\{line\_ptr}\K\\{last\_line\_length}+\\{actual\_line%
+\_length}+1$;\par
+\U sections~35 and~65.\fi
+
+\M55. Das Zeichen ist Beginn eines macros.
+
+\Y\P$\4\X55:Zeichen ist backslash\X\S$\6
+\4\.{\'\\\'}: \37\\{backslash};\par
+\U sections~35 and~65.\fi
+
+\M56. Es wird "uberpr"uft, ob man zum Ende der Musikeingabe gelangt ist.
+
+\Y\P$\4\X56:Zeichen bedeutet Ende der Musikeingabe\X\S$\6
+\4\.{\'!\'}: \37$\\{music\_num}\K\\{ausruf}(\\{change})$;\par
+\U section~35.\fi
+
+\M57.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\|i: \37\\{integer};\par
+\fi
+
+\N58. Anhang B: Default-Werte.
+
+
+\fi
+
+\M59. Die am Anfang notwendigen Werte werden gesetzt.
+
+\Y\P$\4\X59:Setze die default-Werte\X\S$\6
+$\\{last\_line\_length}\K0$;\5
+$\\{actual\_line\_length}\K0$;\5
+$\\{next\_line\_length}\K0$;\5
+$\\{inline\_length}\K0$;\5
+$\\{line\_ptr}\K1$;\5
+$\\{line\_num}\K0$;\5
+$\\{music\_num}\K\\{false}$;\5
+$\\{change}\K\\{false}$;\5
+$\\{w\_column}\K0$;\5
+$\\{octave\_num}\K0$;\5
+$\\{duration}\K\.{\'v\'}$;\5
+$\\{dot\_num}\K0$;\5
+$\\{x\_num}\K0$;\5
+$\\{b\_num}\K2$;\5
+$\\{nat\_num}\K0$;\5
+$\\{octave}\K0$;\5
+$\\{accid}[1]\K\.{\'x\'}$;\5
+$\\{accid}[2]\K\.{\'xx\'}$;\5
+$\\{accid}[3]\K\.{\'b\'}$;\5
+$\\{accid}[4]\K\.{\'bb\'}$;\5
+$\\{accid}[5]\K\.{\'n\'}$;\5
+$\|i\K1$;\par
+\U section~19.\fi
+
+\N60. Anhang B: Fehlermeldungen.
+
+\fi
+
+\M61. Prozedur, die f"ur manche
+Syntaxfehler Meldungen auf den Bildschirm und in einen
+Fehler--file (\\{err}) schreibt.
+Dabei wird die Zeile, in der der Fehler vorkommt bis zur falschen
+Stelle ausgedruckt, der Rest der Zeile \\{actual\_line} wird in der
+n"achsten Zeile ausgedruckt. Au\8erdem wird mit der Fehlermeldung
+auch die Zeilennummer in der der Fehler steht, ausgedruckt.
+"Ubergeben wird der Text der Fehlermeldung, ein string
+der L"ange 80, und die Zeilennummer \\{line\_num} der Zeile, in der der
+Fehler auftritt.
+
+\Y\P$\4\X7:Globals\X\mathrel{+}\S$\6
+\4\\{error\_help}: \37$\\{string}(20)$;\6
+\4\\{input\_term}: \37$\\{string}(20)$;\6
+\4\\{input\_char}: \37\\{char};\par
+\fi
+
+\M62.
+
+\Y\P$\4\X62:Procedure error\X\S$\6
+\4\&{procedure}\1\ \37$\\{error}(\\{error\_text}:\\{string}(80);\,\35\\{help}:%
+\\{integer})$;\6
+\4\&{var} \37\|i: \37\\{integer};\2\6
+\&{begin} \37$\\{writeln\_error}(\.{\'\ \'})$;\5
+$\\{writeln\_error}(\.{\'Fehler\ in\ Zeile:\ \'},\39\\{help}:1)$;\6
+\&{if} $\\{line\_ptr}-11>0$ \1\&{then}\6
+\&{begin} \37\&{for} $\|i\K10\mathrel{\&{downto}}0$ \1\&{do}\6
+\&{begin} \37$\\{write\_error}(\\{buffer}[\\{line\_ptr}-1-\|i])$;\6
+\&{end};\2\6
+$\\{writeln\_error}(\.{\'\ \'})$;\5
+$\\{write\_error}(\.{\'\ \ \ \ \ \ \ \ \ \ \ \'})$;\6
+\&{for} $\|i\K1\mathrel{\&{to}}11$ \1\&{do}\6
+\&{begin} \37$\\{write\_error}(\\{buffer}[\\{line\_ptr}-1+\|i])$;\6
+\&{end};\2\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{for} $\|i\K1\mathrel{\&{to}}(\\{line\_ptr}-1)$ \1%
+\&{do}\6
+\&{begin} \37$\\{write\_error}(\\{buffer}[\|i])$;\6
+\&{end};\2\6
+$\\{writeln\_error}(\.{\'\ \'})$;\6
+\&{for} $\|i\K1\mathrel{\&{to}}(\\{line\_ptr}-1)$ \1\&{do}\6
+\&{begin} \37$\\{write\_error}(\.{\'\ \'})$;\6
+\&{end};\2\6
+\&{for} $\|i\K1\mathrel{\&{to}}11$ \1\&{do}\6
+\&{begin} \37$\\{write\_error}(\\{buffer}[\\{line\_ptr}-1+\|i])$;\6
+\&{end};\2\6
+\&{end};\2\6
+$\\{writeln\_error}(\.{\'\ \'})$;\5
+$\\{writeln\_error}(\\{error\_text})$;\5
+\X63:Eingabe vom Terminal\X;\6
+\&{end};\par
+\U section~5.\fi
+
+\M63. Nach der Fehlermeldung kann eine Eingabe vom Terminal erfolgen.
+
+\Y\P$\4\X63:Eingabe vom Terminal\X\S$\6
+$\\{writeln}(\\{err},\39\.{\'?\'})$;\5
+$\\{writeln}(\\{outterm},\39\.{\'?\'})$;\5
+$\\{read}(\\{interm},\39\\{input\_char})$;\6
+\&{case} $\\{input\_char}$ \1\&{of}\6
+\4\.{\'i\'}: \37\&{begin} \37$\\{writeln\_error}(\.{\'input>\'})$;\5
+$\\{read}(\\{interm},\39\\{input\_term})$;\5
+$\\{error\_help}\K\\{input\_term}$;\6
+\&{end};\6
+\4\.{\'x\'}: \37\&{goto} \3710;\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\par
+\U section~62.\fi
+
+\N64. Anhang B: Prozedur backslash.
+
+\fi
+
+\M65. Prozedur, die aufgerufen wird, wenn ein backslash eingelesen
+wurde. Sie erkennt, um welches Kontrollwort es sich handelt und
+ruft die entsprechenden Unterprogramme auf.
+Daf"ur wird zun"achst das macro auf den string \\{control} gelesen.
+Das Kontrollwort ist beendet, falls $\\{macroend}=\\{true}$, d.h.
+das eingelesen Zeichen ist ein \.{\'\ \'}, \.{\'\{\'}, \.{\'\%\'} oder \.{\'%
+\\\'}.
+
+\Y\P$\4\X65:Procedure backslash\X\S$\6
+\4\&{procedure}\1\ \37\\{backslash}; \6
+\4\&{var} \37\\{control}: \37$\\{string}(80)$;\5
+\\{macroend}: \37\\{boolean}; \X67:Procedure macro\X \6
+\&{begin} \37$\\{control}\K\\{str}(\.{\'\ \'})$;\6
+\1\&{repeat} \37\&{begin} \37\X66:Einlesen der Kontrollsequenz auf \\{control}%
+\X\6
+\&{end}\6
+\4\&{until}\5
+$\\{macroend}=\\{true}$;\2\6
+$\\{control}\K\\{trim}(\\{control})$;\5
+$\\{control}\K\\{ltrim}(\\{control})$;\6
+\&{if} $((\\{control}=\.{\'\\beam\'})\V(\\{control}=\.{\'\\slur\'})\V(%
+\\{control}=\.{\'\\cresc\'})\V(\\{control}=\.{\'\\decresc\'})\V(\\{control}=\.{%
+\'\\chord\'}))$ \1\&{then}\6
+\&{begin} \37$\\{macro}(\\{control})$\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $\\{control}=\.{\'\\group\'}$ \1\&{then}\6
+\&{begin} \37$\\{macro}(\\{control})$\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $\\{control}=\.{\'\\signature\'}$ \1\&{then}\6
+\&{begin} \37$\\{macro}(\\{control})$\6
+\&{end}\6
+\4\&{else} \&{begin} \37\&{if} $((\\{control}=\.{\'\\text\'})\V(\\{control}=\.{%
+\'\\vocal\'})\V(\\{control}=\.{\'\\two\'}))$ \1\&{then}\6
+\&{begin} \37$\\{macro}(\\{control})$\6
+\&{end}\6
+\4\&{else} \&{begin} \37$\\{newline\_music}(\\{length}(\\{control}))$;\5
+$\\{write}(\\{outfile},\39\\{control})$;\6
+\&{case} $\\{sign}$ \1\&{of}\6
+\X54:Zeichen ist Kommentar\X;\6
+\X55:Zeichen ist backslash\X;\6
+\4\&{othercases} \37;\2\6
+\&{endcases};\6
+\&{end};\2\6
+\&{end};\2\6
+\&{end};\2\6
+\&{end};\2\6
+\&{end};\par
+\U section~5.\fi
+
+\M66. Dieser Teil wird von der Prozedur \\{backslash} ben"otigt und
+liest auf den String \\{control} die Kontrollsequenz ein, die durch
+backslash angezeigt wird.
+
+\Y\P$\4\X66:Einlesen der Kontrollsequenz auf \\{control}\X\S$\6
+$\\{control}\K\\{control}\\{str}(\\{sign})$;\6
+\&{if} $\R(\\{eof\_infile})$ \1\&{then}\6
+\&{begin} \37$\\{sign}\K\\{get\_char}$;\5
+$\\{macroend}\K((\\{sign}=\.{\'\{\'})\V(\\{sign}=\.{\'\%\'})\V(\\{sign}=\.{\'%
+\\\'})\V(\\{sign}=\.{\'\ \'}))$;\6
+\&{end}\6
+\4\&{else} \&{begin} \37$\\{control}\K\\{trim}(\\{control})$;\5
+$\\{newline\_music}(\\{length}(\\{control}))$;\5
+$\\{write}(\\{outfile},\39\\{control})$;\5
+\&{goto} \3710;\6
+\&{end};\2\par
+\U section~65.\fi
+
+\M67.
+
+\Y\P$\4\X67:Procedure macro\X\S$\6
+\4\&{procedure}\1\ \37$\\{macro}(\\{help}:\\{string}(80))$;\2\6
+\&{begin} \37$\\{help}\K\\{trim}(\\{help})$;\5
+$\\{help}\K\\{ltrim}(\\{help})$;\5
+$\\{help}\K\\{compress}(\\{help})$;\5
+$\\{newline\_music}(\\{length}(\\{help}))$;\5
+$\\{write}(\\{outfile},\39\\{help})$;\5
+$\\{line\_ptr}\K\\{line\_ptr}-1$;\6
+\&{end};\par
+
+\U sections~5 and~65.\fi
+
+\pageheight=23cm\vskip0.5cm \def\rhead{ANHANG B: INDEX}
+\inx
+\:\\{acc}, 45, 46, 47.
+\:\\{accid}, 45, 46, 59.
+\:\\{accidental}, 44, 45.
+\:\\{actual\_line}, 7, 11, 13, 14, 61.
+\:\\{actual\_line\_length}, 7, 8, 10, 11, 12, 19, 29, 54, 59.
+\:\\{ausruf}, \[21], 24, 25, 27, 29, 30, 33, 56.
+\:\\{b\_num}, 36, 37, 46, 59.
+\:\\{backslash}, 35, 55, \[65], 66.
+\:\\{bar\_line}, 50, 51, 53.
+\:\\{boolean}, 7, 17, 21, 65.
+\:\\{buffer}, 7, 10, 11, 12, 15, 62.
+\:\\{change}, 7, 11, 13, 20, 27, 28, 33, 56, 59.
+\:\\{char}, 7, 8, 36, 50, 61.
+\:\\{compress}, 9, 67.
+\:\\{control}, \[65], 66.
+\:\\{dot\_num}, 36, 37, 49, 59.
+\:\\{duration}, 36, 37, 48, 52, 59.
+\:\&{else}, 2.
+\:\&{end}, 2.
+\:\&{endcases}, \[2].
+\:\\{eof}, 8, 19, 29.
+\:\\{eof\_infile}, 7, 8, 19, 21, 33, 35, 66.
+\:\\{err}, 3, 5, 6, 19, 61, 63.
+\:\\{error}, 28, 30, 43, \[62].
+\:\\{error\_help}, 61, 63.
+\:\\{error\_text}, 62.
+\:\\{false}, 13, 17, 19, 20, 23, 25, 26, 27, 29, 33, 59.
+\:\\{get}, 8.
+\:\\{get\_char}, 7, \[8], 14, 15, 22, 33, 35, 66.
+\:\\{help}, 21, 27, 62, 67.
+\:\|{i}, \[62].
+\:\\{in\_file}, 7.
+\:\\{in\_line}, 7, 9, 10, 12.
+\:\\{infile}, 5, 6, 7, 8, 9, 19, 29.
+\:\\{inline\_length}, 7, 8, 9, 10, 59.
+\:\\{input\_char}, 61, 63.
+\:\\{input\_term}, 61, 63.
+\:\\{integer}, 7, 8, 20, 31, 36, 39, 41, 57, 62.
+\:\\{interm}, 5, 6, 19, 63.
+\:\|{j}, \[8].
+\:\\{last\_line}, 7, 11.
+\:\\{last\_line\_length}, 7, 8, 10, 11, 12, 19, 54, 59.
+\:\\{length}, 9, 65, 66, 67.
+\:\\{line\_num}, 7, 8, 11, 24, 28, 30, 33, 43, 59, 61.
+\:\\{line\_ptr}, 7, 8, 15, 19, 33, 54, 59, 62, 67.
+\:\\{ltrim}, 9, 65, 67.
+\:\\{macro}, 65, \[67].
+\:\\{macroend}, 65, 66.
+\:\\{music}, 17, 19, \[35], 36.
+\:\\{music\_num}, 17, 19, 20, 23, 26, 30, 33, 35, 56, 59.
+\:\\{nat\_num}, 36, 37, 46, 59.
+\:\\{newline\_music}, 25, 29, 30, \[31], 47, 48, 49, 52, 53, 65, 66, 67.
+\:\\{next\_line}, 7, 11.
+\:\\{next\_line\_length}, 7, 10, 11, 12, 59.
+\:\\{nonmusic}, 17, 19, \[33].
+\:\\{octave}, 41, 42, 43, 59.
+\:\\{octave\_num}, 36, 37, 42, 43, 59.
+\:\&{othercases}, \[2].
+\:\\{otherwise}, 2.
+\:\\{outfile}, 5, 6, 17, 19, 20, 24, 25, 27, 29, 30, 31, 33, 38, 47, 48, 49,
+52, 53, 65, 66, 67.
+\:\\{outterm}, 3, 5, 6, 19, 63.
+\:\\{pascal}, 2.
+\:\\{pitchnum}, 39, 40, 43, 47, 48.
+\:\\{read}, 9, 63.
+\:\\{reset}, 19.
+\:\\{rest}, 50, 51, 52.
+\:\\{rewrite}, 19.
+\:\\{sign}, 7, 22, 27, 29, 33, 35, 40, 51, 65, 66.
+\:\\{str}, 65, 66.
+\:\\{string}, 7, 44, 45, 61, 62, 65, 67.
+\:\\{tangle}, 2.
+\:\\{termin}, 19.
+\:\\{termout}, 19.
+\:\\{text}, 6.
+\:\\{trans}, \[5].
+\:\\{trim}, 9, 65, 66, 67.
+\:\\{true}, 11, 17, 19, 20, 23, 24, 26, 27, 28, 30, 35, 65.
+\:\\{w\_column}, 20, 24, 25, 29, 31, 33, 47, 59.
+\:\\{weave}, 2.
+\:\\{word\_length}, 31.
+\:\\{write}, 3, 24, 27, 29, 30, 31, 33, 47, 48, 49, 52, 53, 65, 66, 67.
+\:\\{write\_error}, \[3], 62.
+\:\\{writeln}, 3, 24, 25, 27, 29, 31, 33, 63.
+\:\\{writeln\_error}, \[3], 62, 63.
+\:\\{x\_num}, 36, 37, 46, 59.
+\fin
+\def\rhead{ANHANG B: NAMES OF THE SECTIONS}
+\:\X28:Ausrufezeichen fehlt\X
+\U section~26.
+\:\X42:Berechnung der richtigen Oktave\X
+\U section~38.
+\:\X63:Eingabe vom Terminal\X
+\U section~62.
+\:\X66:Einlesen der Kontrollsequenz auf \\{control}\X
+\U section~65.
+\:\X10:Einlesen der neuen Zeile in den buffer\X
+\U sections~8 and~8.
+\:\X30:Ende der Eingabedatei erreicht\X
+\U section~21.
+\:\X29:Ende musicmode, Zeichen schreiben\X
+\U section~26.
+\:\X6:Files\X
+\U section~5.
+\:\X21:Function ausruf\X
+\U section~5.
+\:\X8:Function getchar\X
+\U section~5.
+\:\X27:Gelesene Zeichen schreiben\X
+\U section~26.
+\:\X46:Gibt es ein Vorzeichen\X
+\U section~38.
+\:\X7, 17, 20, 36, 39, 41, 45, 50, 57, 61:Globals\X
+\U section~5.
+\:\X26:Kein Wechsel des modes\X
+\U section~22.
+\:\X13:Kein Zeilenwechsel\X
+\U section~8.
+\:\X18:Labels\X
+\U section~5.
+\:\X9:Lesen der n"achsten Zeile von infile\X
+\U sections~8 and~8.
+\:\X22:Lesen des n"achsten Zeichens\X
+\U section~21.
+\:\X11:Neubelegung der \\{actual\_line} durch \\{next\_line}, Zeilenwechsel\X
+\U section~8.
+\:\X44:New type\X
+\U section~5.
+\:\X65:Procedure backslash\X
+\U section~5.
+\:\X62:Procedure error\X
+\U section~5.
+\:\X67:Procedure macro\X
+\U sections~5 and~65.
+\:\X35:Procedure music\X
+\U section~5.
+\:\X31:Procedure newline music\X
+\U section~5.
+\:\X33:Procedure nonmusic\X
+\U section~5.
+\:\X52:Schreibe Pause\X
+\U section~51.
+\:\X53:Schreibe Taktstrich\X
+\U section~51.
+\:\X47:Schreibe das Vorzeichen\X
+\U sections~46, 46, and~46.
+\:\X49:Schreibe die Punkte\X
+\U section~38.
+\:\X48:Schreibe die gelesene Note\X
+\U section~38.
+\:\X59:Setze die default-Werte\X
+\U section~19.
+\:\X40, 43:Umsetzung der Tonh"ohe in eine Zahl\X
+\U section~38.
+\:\X23:Wechsel des modes\X
+\U section~22.
+\:\X24:Wechsel in music mode\X
+\U section~23.
+\:\X25:Wechsel in nonmusic mode\X
+\U section~23.
+\:\X56:Zeichen bedeutet Ende der Musikeingabe\X
+\U section~35.
+\:\X37:Zeichen ist Angabe zum Ton\X
+\U section~35.
+\:\X54:Zeichen ist Kommentar\X
+\U sections~35 and~65.
+\:\X51:Zeichen ist Pause oder Taktstrich\X
+\U section~35.
+\:\X38:Zeichen ist Tonh"ohe\X
+\U section~35.
+\:\X55:Zeichen ist backslash\X
+\U sections~35 and~65.
+\:\X15:Zeichen lesen\X
+\U section~8.
+\:\X14:\\{actual\_line} ist Leerzeile\X
+\U section~8.
+\:\X12:\\{in\_line} ist Leerzeile bzw. existiert nicht\X
+\U sections~8 and~8.
+
+\vfill\eject % finish the section names
+\rightskip 0pt \hyphenpenalty 50 \tolerance 200
+\setpage