Das brclc Paket und das brclc Programm

Bernd Radgen

10.09.1999 (Version 0.1.3)

Zusammenfassung

Das brclc Paket implementiert den L^{A}TEX-Befehl \clc{ }. Das Programm brclc wertet das Argument im \clc{arg} aus. Es können so mathematische Operationen ausgeführt und in L^{A}TEX eingebunden werden ohne, daß man die expliziten Ergebnisse im vorhinein kennen muß. Dies entspricht der Implementierung einer einfachen Tabellenkalkulation in den L^{A}TEX-File.

1 Einleitung

Die Idee zu diesen Paket kam mir nachdem ich es leid war beim Schreiben von Rechnungen unter L^{A}TEX jede Position von Hand auszurechnen. Das erste Ziel war somit eine Tabelle unter Angabe von Anzahl und Artikelpreis auszuwerten und die Endsumme zu berechnen. Die folgende einfache Tabelle kann mit Hilfe des \clc{}-Befehls automatisch generiert werden.

Anzahl Bezeichnung  Einzelpreis  Zusammen
(DM) (DM) (Euro)
100  Nägel  0.06  6.00  3.07
10  Bretter  5.65  56.50 28.89
12  Dachlatten  1.15  13.80  7.06
3  Winkeleisen  8.71  26.13 13.36
Summe: 102.43 52.37
15% MwSt.: 15.36 7.86
Gesamtsumme: 117.79 60.23

Nachdem dies gelungen ist, war es eine Kleinigkeit noch weitere mathematische Befehle zu implementieren. Folgende mathematische Operationen können jetzt durchgeführt werden:

 +, -, *, /, ^, exp, ln, log, sin, cos, tan, asin, acos, atan.

Die Verarbeitung erfolgt über 16bit Zahlen (double). Die Ausgabe kann mit bis zu acht Stellen hinter dem Komma erfolgen.

2 Installation

Das Programm brclc erhält man durch compilieren des Quellcodes brclc.c. Der Quellcode, sowie alle hier beschriebenen Programme und Programmteile unterliegen der GNU-GENERAL-PUPLIC-LICENSE. Zum Compilieren benötigt man den GNU-C-Compiler, folgender Aufruf liefert das brclc Programm unter LINUX:

gcc -O2 -Wall -lm -s brclc.c -o brclc

oder über den Makefile einfach:

make

unter DOS/WIN95/WINNT müßte dies ebenfalls funktionieren (brclc im Makefile in brclc.exe umbennen).

Das Programm brclc muß vor L^{A}TEX aufgerufen werden:

brclc texfilename.

Am Besten man schreibt sich ein Shellskript der Form:

brclc $1
latex $1

und übergibt den Texfilenamen an das Skript. Das Programm brclc muß natürlich im PATH gefunden werden (unter LINUX z.B. brclc nach \usr\bin kopieren).

Bemerkung: Die Zeile im Quellcode

#define MAXOP 400

gibt die maximal zur Verfügung stehenden Speicherplätze (double-Werte) für die Berechnungen an und kann je nach Speicherresourcen ”beliebig“ erhöht werden. Da die nicht mehr benötigte Speicherplätze wieder überschrieben werden können, sollten 400 Speicherplätze ausreichend sein.

Im L^{A}TEX-File muß das Paket brclc.sty eingebunden werden:

\usepackage{brclc}.

3 Beschreibung der Befehlssyntax

Der von dem Paket brclc.sty zur Verfügung gestellte Befehl \clc{arg} besitzt nur ein Argument (arg), welches einer eigenen Syntax unterliegt, die dann vom Programm brclc ausgewertet wird.

Im Folgendem wird auf die Syntax des Arguments (arg) von \clc{arg} eingegangen.

Zunächst müssen die Werte, mit denen gerechnet werden soll, dem jeweiligen Speicherplatz zugeordnet werden. Die Eingabe erfolgt über den Befehl:

\clc{Speicherplatz:WertAusgabe aus/ein[.Stellen Rundung an/aus]}

([ ]→ optionaler Parameter).

Möchte ich den Wert 60.56416 in den Speicherplatz 1 schreiben und die Ausgabe soll ausgeschaltet sein lautet der Befehl:

\clc{1:60.56416=}, ergibt:.

Werte die auf einem Speicherplatz stehen können über den Befehl:

\clc{Speicherplatz:>}

auslesen werden. Die Ausgabe des Wertes auf Speicherplatz 1 erfolgt über: \clc{1:>}, ergibt:60.56.

Erscheint am Ende des Eingabebefehls auch das ’>’ statt dem ’=’ erfolgt die Eingabe mit ”Echo“:

\clc{1:60.56416>}, ergibt:60.56.

Die Ausgabe läßt sich noch die Angabe des Formats manipulieren. So kann die Anzahl der ausgegebenen Kommastellen (default: 2) und die Rundung abgeschaltet werden. Folgt ein ’>.4’ ergibt dies eine gerundete Ausgabe mit 4 Kommastellen:

\clc{1:60.56416>.4}, ergibt:60.5642.

Die ungerundete Ausgabe erhält man wenn ’>,4’ folgt:

\clc{1:60.56416>,4}, ergibt:60.5641.

Die verschiedenen Ausgabe Möglichkeiten sind in der folgenden Tabelle an einem Beispiel zusammengefaßt:

Gerundet:  Ausgabe:

                  \clc{1:60.56416>.} 61
                  \clc{1:60.56416>.0} 61
                  \clc{1:60.56416>.1} 60.6
                  \clc{1:60.56416>.2} 60.56
                  \clc{1:60.56416>.3} 60.564
                  \clc{1:60.56416>.4} 60.5642

⋮  ⋮

                  \clc{1:60.56416>.8} 60.56416000

Ungerundet:  Ausgabe:

                  \clc{1:60.56416>,} 60
                  \clc{1:60.56416>,0} 60
                  \clc{1:60.56416>,1} 60.5
                  \clc{1:60.56416>,2} 60.56
                  \clc{1:60.56416>,3} 60.564
                  \clc{1:60.56416>,4} 60.5641

⋮  ⋮

                  \clc{1:60.56416>,8} 60.56416000

Es können maximal 8-Kommastellen ausgegeben werden. Die Folge ’>.’ bzw ’>,’ oder ’>.0’ bzw. ’>,0’ ergeben eine Ausgabe ohne Kommastellen.

Es folgt die Syntax zur Durchführung der Berechnungen.

Zunächst benötigen wir noch einen 2. Wert auf einer weiteren Speicherstelle:

\clc{2:30.52>}, ergibt:30.52.

Die allgemeine Recheneingabe hat die Form:

\clc{Speicherplatz:OperationSpeicherplatz2:=Speicherplatz3:[>.]}.

Möchte ich zu dem Wert von Speicherplatz 1 den Wert von Speicherplatz 2 addieren und in Speicherplatz 3 abspeichern lautet der Befehl:

\clc{1:+2:=3:>}, ergibt:91.08.

Möchte ich von dem Wert von Speicherplatz 1 den Wert von Speicherplatz 2 subtrahieren und in Speicherplatz 2 zurückspeichern (still), lautet der Befehl:

\clc{1:-2:=2:}, ergibt:.

Ausgabe des Ergebnisses: \clc{2:>}, ergibt:30.04. Das Ergebnis läßt sich somit auch direkt in einem der Ausgangsspeicherplätze zurück speichern.

Folgende Rechenoperationen sind bisher implementiert:

Befehl:  Ausgabe im dvi-File:

Addition:

$\clc{1:3>}+\clc{2:2>}=\clc{1:+2:=>.4}$  3.00 + 2.00 = 5.00

Subtraktion:

$\clc{1:3>}-\clc{2:2>}=\clc{1:-2:=>.4}$  3.00 − 2.00 = 1.00

Multiplikation:

$\clc{1:3>}*\clc{2:2>}=\clc{1:*2:=>.4}$  3.00 ∗ 2.00 = 6.0000

Division:

$\clc{1:3>}/\clc{2:2>}=\clc{1:/2:=>.4}$  3.00/2.00 = 1.5000

Potenz:

$\clc{1:3>}^{\clc{2:2>}}=\clc{1:^2:=>.4}$  3.00^{2.00} = 9.0000

Wurzel^{∗}:

$\clc{1:3>}^{\clc{2:0.5>}}=\clc{1:^2:=>.4}$ 3.00^{0.50} = 1.7321

Exponent:

$\exp\clc{1:3>}=\clc{1:exp=>.4}$  exp 3.00 = 20.0855

Natürlicher Logarithmus:

$\ln\clc{1:3>}=\clc{1:ln=>.4}$  ln 3.00 = 1.0986

Zehner Logarithmus:

$\ln\clc{1:3>}=\clc{1:log=>.4}$  log 3.00 = 0.4771

Sinus^{∗∗}:

$\sin\clc{1:3>}=\clc{1:sin=>.4}$  sin 3.00 = 0.1411

Cosinus^{∗∗}:

$\cos\clc{1:3>}=\clc{1:cos=>.4}$  cos 3.00 = −0.9900

Tangents^{∗∗}:

$\tan\clc{1:3>}=\clc{1:tan=>.4}$  tan 3.00 = −0.1425

Arcussinus^{∗∗}:

$\arcsin\clc{1:0.3>}=\clc{1:asin=>.4}$  arcsin 0.30 = 0.3047

Arcuscosinus^{∗∗}:

$\arccos\clc{1:0.3>}=\clc{1:acos=>.4}$  arccos 0.30 = 1.2661

Arcustangents^{∗∗}:

$\arctan\clc{1:0.3>}=\clc{1:atan=>.4}$  arctan 0.30 = 0.2915

∗ -Wurzel wird über die Potenzfunktion realisiert. ∗∗-Trigonometrische Funktionen im Bogenmaß!

Als Beispiel für die Arbeit mit \clc{} nun noch der Quellcode für die Tabelle auf Seite 1:

\clc{6:1.95583=} %Euro Faktor
\begin{center}
\label{tabelle1}
\begin{tabular}{|c|p{12em}|r|r|r|}
\hline
Anzahl & Bezeichnung& Einzelpreis &\multicolumn{2}{c|}{Zusammen}\\
&& (DM)& (DM)& (Euro)\\
\hline
\clc{1:100>.} & Nägel &\clc{2:0.06>}
&\clc{1:*2:=3:>} \clc{4:+3:=4:}& \clc{3:/6:=>}  \\
\hline
\clc{1:10>.} & Bretter  &\clc{2:5.65>}
&\clc{1:*2:=3:>} \clc{4:+3:=4:}& \clc{3:/6:=>} \\
\hline
\clc{1:12>.} & Dachlatten  &\clc{2:1.15>}
&\clc{1:*2:=3:>} \clc{4:+3:=4:}& \clc{3:/6:=>}  \\
\hline
\clc{1:3>.} & Winkeleisen  &\clc{2:8.71>}
&\clc{1:*2:=3:>} \clc{4:+3:=4:}& \clc{3:/6:=>}  \\
\hline
\hline
\multicolumn{3}{|r|}{Summe:}&\clc{4:>}  & \clc{4:/6:=>} \\
\hline
\multicolumn{3}{|r|}{15\% MwSt.:}
&\clc{7:100=}\clc{4:/7:=5:}\clc{7:15=}\clc{5:*7:=5:>}
& \clc{5:/6:=>} \\
\hline
\hline
\multicolumn{3}{|r|}{\textbf{Gesamtsumme:}}
& \textbf{\clc{4:+5:=7:>}} & \textbf{\clc{7:/6:=>}} \\
\hline
\end{tabular}
\end{center}

4 Beschreibung der Arbeitsweise von brclc

Zunächst sucht brclc im L^{A}TEX-File nach dem Paket brclc.sty. Bei der weiteren Bearbeitung wird nach dem \clc{}-Befehl, nach Umgebungen (insbesondere verbatim) und den Befehlen \verb, \input{}, \include{} gesucht. Jeder bearbeitete Befehl \clc{} ergibt einen ’.’ bei der Bildschirmausgabe. Jeder gefundene Befehl \verb und jede verbatim-Umgebung ergibt ein ’*’. Ein \includeonly{} oder ein passiver \include{} wird mit einem ’#’ quitiert.

Das Programm brclc erzeugt beim Bearbeiten des Texfiles zwei Ausgabefiles: Filename.clc - Der clc-File ist der File, der bei der folgenden L^{A}TEX-Bearbeitung eingebunden wird. Der clc-File enthält die Definitionen, die jedem \clc{}-Befehl zugeordnet wird. Filename.clg - Der clg-File ist der Log-File von brclc, in ihm wird die Bearbeitung protokolliert. Es wird jede gefundene Umgebung und jeder bearbeitet \clc{}- Befehl samt Interpretation aufgeführt.

Bei Fehlern stoppt brclc die Bearbeitung und liefert einen Wert ungleich 0 als Statusvariable. Beim darauf folgenden L^{A}TEX-Lauf kommt es meist zu einer Fehlermeldung der Form:

Package: brclc 1999/09/10 v0.1.3 calculations with brclc
v0.1.3 1999-09-10
(brclc.clc)
Runaway definition?
#1->\ifcase #1\def \@clc@tmp {}\or \def \@clc@tmp {100}\or \def \@clc@tmp \ETC.
! File ended while scanning definition of \@clc@include.
<inserted text>
                }
l.35 \input{\jobname.clc}
?

Falls ein Fehler in der Bearbeitung von brclc auftritt, der nicht bemerkt worden ist, kommt es meist zu einem Durcheinander in der Ausgabe der einzelnen \clc{}- Befehle. Anhand des clg-File kann man versuchen den Fehler zu lokalisieren.

5 Einschränkungen/Probleme

Wichtig: Der \clc{}-Befehl verhält sich nicht, wie die meisten anderen L^{A}TEX-Befehle. Er darf auf keinen Fall in weitere Befehls Definitionen einbezogen werden, da das brclc-Programm diese nicht auswerten kann. Er funktioniert also nur bei direkten Aufruf und nicht beim indirekten Aufruf über andere Befehle.

Probleme ergeben sich bei der Benutzung des \clc{}-Befehles unter Befehlen und Umgebungen in denen ein virtueller Druck zur Ermittlung von Abständen durchgeführt wird. Die tabularx-Umgebung, bei der dies der Fall ist, sollte ab der Version 0.1.3 in dieser Hinsicht keine Probleme mehr machen.

Zur verbatim-Ausgabe der \clc{}-Sequenzen dürfen nur der \verb||-Befehl (Begrenzer beliebig) und die verbatim-Umgebung benutzt werden.

Die Befehle \include{}, \input{}, \includeonly{} können erst nach dem Befehl \usepackage{brclc} verwendet werden. Der Paketaufruf muß somit im Hauptfile stehen!

Bei der Benutzung des brclc-Programms bleibt der Original-Texfile völlig unberührt, so daß keine Schäden am Code entstehen können. Trotzdem übernimmt der Autor keine Gewährleistungsansprüche jeglicher Art, die mit dem Betrieb des Paketes brclc.sty und dem Programm brclc im Zusammenhang stehen. Bei weiteren Problemen, sowie für Anregungen und Hilfestellungen bin ich erreichbar unter:

radgen@physik.uni-frankfurt.de  ◯ ◯^{B}_{R} 09/1999 brclc.tex