%latexg
%-------------------------------------------------------------------------
%
%   Studienarbeit
%
%   Thema: Programmierung eines Konverters RTF -> TeX
%
%   copyright (C) by MH_Soft, all rights reserved
%
%   letzte "Anderung: am 3.9.1991 um 20:09
%
%-------------------------------------------------------------------------

%\documentstyle[11pt,verbatim]{cnreport}
\documentstyle[german,11pt,tex:macros/latex/verbatim/verbatim.doc]{report}
\pagestyle{headings}

%-------------------------------------------------------------------------

%\newcommand{\listpath}{e:/c_work/rtf2tex.src/}      % C Quellcodedirectory
%-------------------------------------------------------------------------
\newcommand{\listpath}{}
\newcommand{\makecntitle}{\maketitle}

\begin{document}

%-------------------------------------------------------------------------

\title{Programmierung eines Konverters zur "Ubersetzung
       von RTF-Dateien nach \LaTeX}
\author{Markus Hoffmann}
%\typ{Studienarbeit}
%\betreuer{Dipl.-Ing. M. Junius}
%\matnr{163338}
\date{06.09.1991}

\makecntitle

%-------------------------------------------------------------------------

\tableofcontents

%-------------------------------------------------------------------------

\chapter{Einf"uhrung und Aufgabenstellung}

In zunehmendem Ma"se werden Computer unter Verwendung von
Text\-ver\-arbei\-tungs\-pro\-grammen zum Erstellen von Texten f"ur die
verschiedensten Bereiche wie t"agliche Brief\-korrespondenz, wissen\-schafliche
Arbeiten bis hin zu B"uchern verwendet.

\bigskip

Am Lehrstuhl f"ur Kommunikationsnetze
werden f"ur diese Aufgabe zwei verschiedene Programme verwendet, zum
einen die Textverarbeitung Word 5.0 von Microsoft, zum anderen das
Satzsystem \TeX. Bei Word 5.0 handelt es sich um ein 
WYSIWYG--System ({\bf W}hat {\bf Y}ou {\bf S}ee {\bf I}s {\bf W}hat
{\bf Y}ou {\bf G}et), bei dem der Text w"ahrend der Eingabe auf dem
Bildschirm genauso dargestellt wird, wie er sp"ater auch auf dem Papier
ausgedruckt wird (also Textattribute, Absatzformatierung etc.). \TeX\
hingegen ist ein komplexes Satzsystem, da"s die M"oglichkeiten des Buchsatzes
bietet und bei dem die logische Struktur des Textes mit einer
Programmiersprache beschrieben wird. Um den erstellten Text in seiner
Ausgabeform betrachten zu k"onnen mu"s dieser erst mit den Programm \TeX\
bearbeitet werden, bei der Compilierung erh"alt man eine vom sp"ateren
Ausgabe\-ge\-r"at unabh"angige Datei, die mit einem geeigneten Ger"atetreiber
ausgegeben werden kann.

\bigskip

Der Vorteil von Word 5.0 liegt darin, da"s man die Resultate seiner
Arbeit direkt auf dem Bildschirm betrachten kann, ohne einen 
(zumindest bei l"angeren Texten) zeitintensiven Compilerlauf abwarten
zu m"ussen. Daf"ur mu"s man sich mit einer im Vergleich zu \TeX\ geringeren
Ausdruckqualit"at zufrieden geben und hat nicht die hervoragenden
Satzm"oglichkeiten, die \TeX\ besonders bei mathematischen Formeln
bietet.

\bigskip

Die Aufgabe der vorliegenden Studienarbeit lag darin, einen Kon\-verter
zu pro\-gram\-mieren, der mit Word 5.0 erstellte Texte in ein mit \TeX\
bearbeitbares Format "ubersetzt, wobei auf bereits gewonnene Erkenntnisse
aus \cite{Treier} aufgebaut werden konnte. Basis der Konvertierung ist
das von Word 5.0 erzeugte RTF-Dateiformat, in dem In\-for\-ma\-tionen "uber
die Textformatierung "ahnlich wie in \TeX\ als Kommandos vor den zugeh"origen
Text gesetzt wird. Da nicht alle RTF-Kommandos mit \TeX-Kommandos
nachbildbar sind, wurde auf das zu \TeX\ geh"orende 
Macropaket \LaTeX\ zur"uckgegriffen, das einen sehr umfangreichen
Befehlssatz zur Verf"ugung stellt.

\bigskip

Die Aufgabenstellung l"a"st sich somit in folgende Schritte teilen:

\begin{itemize}
\item Analyse des Word 5.0 RTF-Dateiformats und Bestimmung der zu den
      RTF-Kommandos "aquivalenten \LaTeX-Befehle
\item Erstellung eines geeigneten Programmkonzepts zur Probleml"osung
\item Realisierung des Programms (portable Programmierung in ANSI--C)
\end{itemize}

%-------------------------------------------------------------------------

\chapter{Analyse des Word 5.0 RTF-Dateiformats}

\label{format}

RTF(Rich Text Format)-Dateien bestehen aus dem eigentlichen Text
und RTF-Kom\-man\-dos, mit denen Einflu"s auf die Darstellung des Textes
genommen werden kann, z.B. Text\-at\-tri\-bute und Absatzformatierung.
Ferner ist es m"oglich, Textteile und Komman\-dos durch die Klammern \{ und
\} zu Gruppen zusammenzufassen.
Damit entspricht das RTF-Format vom Konzept her dem Aufbau von mit
\LaTeX\ erstellten Texten (siehe \cite{Kopka}). 
Eine Auflistung (fast) aller RTF-Kommandos findet sich in \cite{Born}.

\bigskip

Jede RTF-Datei beginnt mit einem Informationsblock, der Daten "uber die
Text\-er\-stel\-lung enth"alt. Es folgt eine Fonttabelle, eine Farbtabelle und
ggf. Informationen "uber Ta\-bu\-lator\-positionen.
Diese Informationen sind f"ur die Konvertierung nach \LaTeX\ unrelevant,
da hier keine vergleichbaren Fonts zur Verf"ugung gestellt werden und
Ta\-bu\-la\-toren nur mit unvertretbarem Aufwand realisierbar sind. Zum Schlu"s
folgen In\-for\-ma\-tionen "uber das Seitenlayout des Textes. Dieses wird
in \LaTeX\ duch die verwendeten {\tt $\backslash$docu\-ment\-style}-Parameter
festgelegt.

\bigskip

Kommandos f"ur die Absatzformatierung (linker und rechter Rand,
Erstzeileneinzug, B"undigkeit) befinden sich immer am
Anfang des jeweiligen Absatzes,
bei fehlenden Absatzfor\-ma\-tier\-kommandos werden die Standardeinstellungen
verwendet (kein Rand und Erstzeileneinzug, Linksb"undig). Mit dem
{\tt $\backslash$pard}-Kommando kann nach "Anderungen wieder auf das
Standard-Absatzlayout
zur"uckgeschaltet werden. Ein Absatz wird immer durch das Kommando {\tt
$\backslash$par} beendet.

\bigskip

Wird ein \LaTeX-Absatz in eine Gruppe gesetzt,
dann k"onnen die RTF-Kommandos f"ur Absatzformatierung direkt in entsprechende
\LaTeX-Befehle "ubersetzt werden. Eine Ausnahme bilden Leerzeilen zwischen
Abs"atzen und linksb"undiger Text. W"ahrend in RTF-Dateien Leerzeilen durch
leere Abs"atze dar\-ge\-stellt
werden, m"ussen diese in \LaTeX-Texten durch {\tt $\backslash$vspace\{%
$\backslash$baselineskip\}}-Befehle erzeugt werden. Steht in RTF-Dateien
vor einem Absatz kein Kommando f"ur die B"undigkeit, dann wird der Text 
linksb"undig gesetzt. In \LaTeX\ hingegen wird in diesem Fall der Absatz
in Blocksatz gesetzt.

\bigskip

Kommandos zur Umschaltung von Textattributen (Fettschrift, unterstrichen,
Textgr"o"se etc.) befinden sich unmittelbar vor dem Zeichen, ab dem die
"Anderung wirksam sein soll. Mit dem RTF-Kommando {\tt $\backslash$plain}
werden die Standardeinstellungen aktiviert. Beim Mischen von
Textattributen wird zwischen der Umschaltung erst wieder
mit {\tt $\backslash$plain} in die Standardeinstellung zur"uckgeschaltet,
anschliessend kommen die At\-tri\-but\-kommandos f"ur die aktuelle Einstellung.
Dadurch ist es m"oglich, die Attributum\-schal\-tung bis auf einige
Sonderf"alle durch Gruppenbildung direkt in analoge \LaTeX-Befehle zu
"ubersetzen. Die
Sonderf"alle betreffen die Attribute f"ur Unterstreichen sowie Hoch- und
Tiefstellung. Hier befindet sich der \LaTeX-Befehl nicht innerhalb der
Gruppe, sondern vor der "offnenden Klammer.

\bigskip

Fu"snoten werden in RTF-Dateien innerhalb einer Gruppe durch {\tt
$\backslash$footnote} ge\-kenn\-zeich\-net. In \LaTeX\ befindet sich der Befehl
vor der Gruppe.

\bigskip

Sonderzeichen (ASCII-Codes $\ge$ 128) werden als Hexadezimalzahlen in 
der Form {\tt $\backslash$'XX} innerhalb des Textes codiert.

\bigskip

Die meisten anderen RTF-Kommandos sind f"ur die "Ubersetzung nach \LaTeX\
unrelevant und k"onnen ignoriert werden. 

%-------------------------------------------------------------------------

\chapter{Programmkonzept und Realisierung}

Aufgrund der Ergebnisse der RTF-Dateiformatanalyse wurden an das
Konverter-Pro\-gramm folgende Anforderungen gestellt:

\begin{enumerate}
\item \label{command} Erkennung der RTF-Kommandos und "Ubersetzung in die entsprechenden
      \LaTeX-Be\-fehle.
\item \label{normchar} Normale Zeichen sollen unver"andert in die Zieldatei geschrieben
      werden, falls sie in \LaTeX\ zu den Befehlszeichen geh"oren in
      geeigneter "Ubersetzung (z.B. {\tt \$} nach {\tt $\backslash$\$}).
\item \label{hexvalue} Sonderzeichen in hexadezimaler Codierung sollen in geeignete
      \LaTeX-Sequenzen "ubersetzt werden, wenn dort das entsprechende
      Zeichen zur Verf"ugung steht. Deutsche Umlaute sind bei
      Verwendung des Dokumentstils {\tt german.sty} in der vereinfachten
      Darstellung auszugeben.
\item \label{umbruch} Zeilen sollen am Wortende umgebrochen werden, wenn sie
      eine vorgegebene L"ange "uberschreiten.
\end{enumerate}

Zur Unterscheidung von Kommandos, normalen Zeichen und Sonderzeichen
bot sich die Programmierung eines Token-Scanners an (Funktion {\tt gettoken()}),
der die RTF-Datei
zeichenweise einliest und den Typ des gescannten Tokens bestimmt,
wobei folgende Tokentypen unterschieden werden:

\begin{itemize}
\item RTF-Kommandos ohne Parameter
\item RTF-Kommandos mit Parameter (i.a. eine Dezimalzahl)
\item Normale Zeichen
\item Hexadezimal codierte Sonderzeichen
\item Anfang einer Gruppe durch \{
\item Ende einer Gruppe durch \}
\end{itemize}

Wird als Token ein Zeichen oder eine Hexadezimalzahl geliefert, dann 
werden die zugeh"origen "Ubersetzungstabellen (siehe Datei {\tt COMMAND.C})
durchsucht und die ent\-sprech\-ende Zeichenkette ausgegeben.

\bigskip

Handelt es sich um ein RTF-Kommando, dann wird die Befehlstabelle
durchsucht und in Abh"angigkeit des eingestellten Befehlsstatus eine der
folgenden Aktivit"aten gestartet:

\begin{itemize}
\item Verzweigung zu einer befehlsspezifischen Codegenerierungsroutine
\item RTF-Kommando ignorieren
\item RTF-Kommando als Kommentar ausgeben
\item Hinweis auf fehlende Implementierung ausgeben
\end{itemize}

Werden in RTF-Dateien gleichzeitig Textgr"o"se und Textattribute umgeschaltet,
dann sind die n"otigen Kommandos in genau umgekehrter Reihenfolge aufgef"uhrt
als in \LaTeX\ ben"otigt. Zur Behandlung der in Kapitel \ref{format} erw"ahnten
Sonderf"alle und der At\-tri\-but\-um\-schal\-tung sind daher eine Reihe von Flags
n"otig, in denen Informationen "uber die aktuelle Text\-darstellung gespeichert
werden.

\bigskip

Zur korrekten Verwaltung der Gruppen sind au"serdem einige Z"ahler
erforderlich, in denen die Verschachtelungstiefe von Gruppen gespeichert
wird.

\bigskip

Die Zeilenumbruchsteuerung wurde "uber eine Zeichenz"ahlroutine realisiert,
die die aus\-gegebenen Zeichen einer Zeile registriert. Ein Umburch erfolgt
entweder automatisch beim "Uberschreiten einer vorgegebenen Zeilenl"ange
oder direkt durch Aufruf der Z"ahl\-routine mit dem Wert Null als Anzahl
der soeben ausgegebenen Zeichen.

%-------------------------------------------------------------------------

\chapter{Bedienung des RTF2\TeX-Konverters}

\section{Programmaufruf}

Das Konvertierprogramm wird mit RTF2\TeX\ von der Kommandoebene der DOS-
oder UNIX-Rechner aus aufgerufen, wobei eine Reihe von Parametern
"ubergeben werden k"onnen, die Einflu"s auf Codeerzeugung der \TeX-Datei
und die Kommunikation mit dem Benutzer nehmen. Dabei ist zwischen
optionalen (die mit -- eingeleitet werden) und zwingenden Parametern zu
unterscheiden. die Reihenfolge der optionalen Parameter kann beliebig sein.

\bigskip

Aufruf von RTF2\TeX:

{\tt rtf2tex [-g][-h][-i][-v][-o outfile][-p docopt][-s docstyle] infile}

\begin{list}{}{\labelwidth=2.5cm \leftmargin=2.5cm}
\item[\tt -g] generate output for german \LaTeX \\
     Es wird Code f"ur die Dokumentstiloption {\tt german.sty} erzeugt,
     d.h. im Befehl {\tt $\backslash$documentstyle[...]} wird bei den
     Documentstyleoptions {\tt ger\-man} eingetragen, sofern nicht mit
     --p (s.u.) eigene Dokumentstile "uber\-ge\-ben werden. Weiterhin wird
     f"ur die Konvertierung von Sonderzeichen (ASCII-Codes $\ge$ 128)
     die deutsche "Ubersetzungstabelle benutzt (siehe Listing
     {\tt COMMAND.C}). Hier
     wer\-den im wesentlichen die deutschen Umlaute in die vereinfachte
     und besser lesbare Schreibweise "ubersetzt.
\item[\tt -h] help \\
     zeigt eine Hilfestellung mit allen erlaubten Parametern an.
     bei gleich\-zei\-tiger Ver\-wen\-dung von --v (s.u.) wird zus"atzlich die
     Bedeutung der Parameter aus\-ge\-ge\-ben.
\item[\tt -i] generate include file without header \\
      Es wird eine Datei erzeugt, die mit dem Kommando \nolinebreak
      {\tt $\backslash$input ...} von
      anderen \TeX-Dateien aus eingebunden werden kann, d.h. am Anfang
      der Datei fehlt {\tt $\backslash$documentstyle} und es fehlt
     die {\tt $\backslash$begin\{document\} ... $\backslash$end\{document\}
     }-Umgebung.
\item[\tt -v] verbose message output \\
     Es werden detaillierte Informationen "uber den Programmablauf
     aus\-ge\-ge\-ben.
\item[\tt -o outfile] filename for \LaTeX output \\
      Mit {\tt outfile} wird die Datei angegeben, in die RTF2\TeX\
      den erzeugten Code schreibt. Wenn dieser Parameter fehlt, erfolgt
      die Ausgabe auf das Standard-Ausgabeger"at, i.a. den Bildschirm.
\item[\tt -p docopt] documentstyle options \\
     Hier k"onnen Documentstyleoptions "ubergeben werden, die dann statt
     der Default-Werte bei {\tt $\backslash$documentstyle[...]} eingesetzt
     werden. Bei der Ver\-wen\-dung dieses Parameters wird --g nur f"ur die
     Sonder\-zeichen\-"uber\-setz\-ung verwendet (s.o.).
\item[\tt -s docstyle] documentstyle parameter \\
      Hier kann der Documentstyle "ubergeben werden, der dann an Stelle
      des Default-Wertes in {\tt $\backslash$documentstyle\{...\}} eingesetzt
      wird.
\item[\tt infile] Bestimmt die RTF-Datei, die von RTF2\TeX\ bearbeitet wird.
\end{list}


\section{Implementierung}

In der vorliegenden Programmversion werden praktisch alle wichtigen
RTF-Kom\-man\-dos in entsprechende \TeX-Befehle umgesetzt. Dazu geh"oren
\begin{itemize}
\item Umschaltung der Textattribute 
      {\bf Fett}, {\it Kursiv}, {\sc Kapit"alchen},
      \underline{unterstrichen}, \linebreak
      \underline{\underline{doppelt unterstrichen}},
      $^{hochgestellt}$ und $_{tiefgestellt}$.
     Diese Attribute k"onnen, soweit von \TeX\ unterst"utzt, auch kombiniert
     werden.
\item Umschaltung zwischen Fontgr"o"sen, z.B. f"ur {\LARGE "Uberschriften} oder
      f"ur {\scriptsize Klein\-ge\-drucktes}. Die erzeugten Gr"o"sen entsprechen
      in etwa den Gr"o"sen im Word-Text. 
\item Erzeugung einer Absatzformatierung wie im Word-Text eingestellt, d.h.
      links\-b"undiger und rechts\-b"undiger Text sowie Text in Blocksatz. Die
      linke und rechte Einr"uckung von Abs"atzen sowie der Erstzeileneinzug
      werden ebenfalls be\-r"uck\-sich\-tigt.
\item Erzeugung von Fu"snoten am Ende jeder laufenden Seite, falls vorhanden.
\item Ber"ucksichtigung von deutschen Umlauten und sonstigen Sonderzeichen,
      sofern diese in \TeX\ ebenfalls zur Verf"ugung stehen, z.B. $\mu$.
\end{itemize}

Nicht unterst"utzt werden Kommandos f"ur Funktionen, die in \TeX\ nicht
sinn\-voll ver\-wend\-bar sind. Dazu geh"oren 

\begin{itemize}
\item Umschaltung zwischen einzelnen Fonts, da im Standardumfang von 
      \TeX\ eine Fontauswahl "ahnlich wie in Word 5.0 nicht enthalten ist.
\item Informationen f"ur Farbtabellen.
\item Informationen zur Einbindung von Graphiken.
\item Die Textattribute "`verborgen"' (dem eine andere Funktion
      zugewiesen wurde) und "`durchgetrichen"'.
\end{itemize}


Weiterhin ist ein \LaTeX-Inline implementiert. Hierzu wird das Textattirbut 
"`verborgen"' verwendet. Ist in Word 5.0 ein Textabschnitt als solcher
markiert, dann werden alle eingegebenen Zeichen ohne "Ubersetzung in die
Ausgabedatei geschrieben, RTF-Kom\-man\-dos, die sich in diesem Bereich im
Text befinden, werden ignoriert, bis wieder auf die Standardattribute
(in der RTF-Datei mit {\tt $\backslash$plain}) umgeschaltet wird. Innerhalb
des \LaTeX-Inlines d"urfen nur Zeichen mit ASCII-Codes $\le$ 127 verwendet
werden.


\section{Beispiel-Konvertierung}

Die folgenden beiden Listings zeigen eine Word 5.0 RTF-Datei und die
daraus mit dem RTF2\TeX-Konverter erzeugte \LaTeX-Datei.

\subsubsection{RTF-Datei}

{\small
\verbatiminput{\listpath beispiel.rtf}
}

\subsubsection{\LaTeX-Datei}

{\small
\verbatiminput{\listpath beispiel.tex}

%-------------------------------------------------------------------------

\begin{thebibliography}{9}

\bibitem{Treier}
   Gerhard \nolinebreak Treier, \nolinebreak {\sl Entwicklung \nolinebreak
   eines \nolinebreak Programms \nolinebreak zur \nolinebreak Konvertierung
   \nolinebreak von \nolinebreak RTF\nolinebreak--\nolinebreak for\-ma\-tier\-ten
   \nolinebreak Texten \nolinebreak
   nach \nolinebreak \LaTeX}, \nolinebreak  Studienarbeit \nolinebreak am
   \nolinebreak Lehrstuhl \nolinebreak f"ur \nolinebreak
   Kom\-mu\-ni\-ka\-tions\-netze der RWTH Aachen

\bibitem{Kopka}
   Helmut Kopka, {\sl \LaTeX -- Eine Einf"uhrung}, 3. Auflage,
   Addison--Wesley (Deutschland) GmbH, Bonn, 1991

\bibitem{Knuth}
   Donald E. Knuth, {\sl Computers and Typesetting Vol. A: The \TeX book},
   Addison--Wesley Co., Inc., Readind, MA, 1986

\bibitem{Born}
   G"unter Born, {\sl Referenzhandbuch Dateiformate}, Addison--Wesley
   (Deutschland) GmbH, Bonn, 1991
   
\end{thebibliography}

%-------------------------------------------------------------------------

\begin{appendix}

\chapter{RTF2\TeX\ Programmlistings}

\section{Hauptprogramm, Token-Scanner, Zeilenumbruch}

{\small 
\verbatiminput{\listpath rtf2tex.c}
}

\section{Defines, Strukturen und Prototypen}

{\small
\verbatiminput{\listpath rtf2tex.h}
}

\section{\LaTeX-Codeerzeugung}

{\small
\verbatiminput{\listpath codegen.c}
}

\section{RTF-Kommandos und "Ubersetzungstabellen}

{\small
\verbatiminput{\listpath command.c}
}

\section{Optionen aus Kommandozeile lesen}

{\small
\verbatiminput{\listpath getopt.c}
}

\section{Deklarationen zum Optionenscanner}

{\small
\verbatiminput{\listpath getopt.h}
}

\chapter{Liste der RTF-Kommandos}

\end{appendix}

%-------------------------------------------------------------------------

\end{document}

%------------------------------- E N D E ---------------------------------
