Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechnen mit fp in Verbindung mit Tabelle und Makro
georginakirrin
24-03-2015, 21:53
Hallo zusammen,
kennt sich hier jemand mit fp aus? Ich habe da ein komisches Problem beim Rechnen in Verbindung mit \newcommand und Tabelle.
Ich erläutere mal...
1. Ich habe eine eigene Tabellenumgebung mit \NewEnviron gebaut. So kann man mit einem einfachen
\begin{tab}
% Tabelleninhalt
\end{tab}
eine komplexe Tabelle einfügen.
2. Die einzelnen Zeilen der Tabelle sollen per Makro eingefügt werden, damit im Hintergrund Berechnungen durchgeführt und Formatierungen eingefügt werden können:
\begin{tab}
\newrow{2}{5}
\end{tab}
Das Problem: Das Rechnen mit dem fp-Paket funktioniert grundsätzlich. Wenn ich aber versuche Berechnungsergebnisse in die Tabelle zu schreiben gibt es den Fehler "! Missing } inserted.". Kurios ist, dass die Ausgabe funktioniert, wenn vor der Tabelle schon eine Berechnung mit der gleichen Ergebnisvariable durchgeführt wird. In diesem Fall wird aber das Ergebnis der ersten Berechnung (außerhalb der Tabelle) in der Tabelle ausgegeben.
\documentclass[12pt,pdftex]{scrartcl}
\usepackage[ngerman, english]{babel}
\usepackage{tabularx}
\usepackage{fp}
\usepackage{environ}
% Rechnen ohne Tabelle und ohne Ausgabe
\newcommand{\calc}[2]{
\FPset\a{#1}
\FPset\b{#2}
\FPmul\c\a\b
\FPround\c\c{2}
}
% Rechnen mit Ausgabe einer Tabellenzeile
\newcommand{\newrow}[2]{
\FPset\a{#1}
\FPset\b{#2}
\FPmul\c\a\b
\FPround\c\c{2}
{#1}&{#2}&{\FPprint\c}\\
}
% vordefinierte Tabellenumgebung
\NewEnviron{tab}{%
\def\temp{%
\begin{tabularx}{\textwidth}{@{}XXX@{}}
\textbf{a} & \textbf{b} & \textbf{c} \\
\hline}%
\expandafter\temp\BODY%
\hline
\end{tabularx}
}
\begin{document}
% wird folgender Befehl weggelassen, dann funktioniert \newrow unten nicht mehr
\calc{1}{5} %Berechnungsergebnis ist 5.00
% wird \calc vorher aufgerufen wird die Tabelle ausgegeben
% Spalte c enthält dann aber das Ergebnis von \calc (5.00) statt das richtige Ergebnis (10.00)
\begin{tab}
\newrow{2}{5} %
\end{tab}
\end{document}
Kann mir bitte jemand helfen!?
Das Problem: Das Rechnen mit dem fp-Paket funktioniert grundsätzlich. Wenn ich aber versuche Berechnungsergebnisse in die Tabelle zu schreiben gibt es den Fehler "! Missing } inserted.". Kurios ist, dass die Ausgabe funktioniert, wenn vor der Tabelle schon eine Berechnung mit der gleichen Ergebnisvariable durchgeführt wird. In diesem Fall wird aber das Ergebnis der ersten Berechnung (außerhalb der Tabelle) in der Tabelle ausgegeben.
das Ergebnis Deiner Multiplikation ist lokal. Wenn Du das Ergebnis in einer anderen Zelle abrufen willst, hilft ggf., das Ergebnis der Multiplikation zu globalisieren (hier mit \xdef):
\documentclass[12pt]{scrartcl}
\usepackage[ngerman, english]{babel}
\usepackage{tabularx}
\usepackage{fp}
\usepackage{environ}
% Rechnen ohne Tabelle und ohne Ausgabe
\newcommand{\calc}[2]{
\FPset\a{#1}
\FPset\b{#2}
\FPmul\c\a\b
\FPround\c\c{2}
}
\newcommand*\myres{}% wird in \newrow überschrieben
% Rechnen mit Ausgabe einer Tabellenzeile
\newcommand{\newrow}[2]{%
\FPset\a{#1}%
\FPset\b{#2}%
\FPmul\c\a\b
\FPround\c\c{2}%
\xdef\myres{\c}%
{#1}&{#2}&{\FPprint\myres}\\
}
% vordefinierte Tabellenumgebung
\NewEnviron{tab}{%
\def\temp{%
\begin{tabularx}{\textwidth}{@{}XXX@{}}
\textbf{a} & \textbf{b} & \textbf{c} \\
\hline}%
\expandafter\temp\BODY%
\hline
\end{tabularx}
}
\begin{document}
\noindent\begin{tab}
\newrow{2}{5} %
\newrow{3}{7}
\end{tab}
\end{document}
MfG
georginakirrin
25-03-2015, 20:42
Danke Rainer, das hat geholfen.
georginakirrin
28-03-2015, 22:02
Hm, wieder mal was komisches...
Ich möchte Zwischenergebnisse berechnen lassen und lege dafür eine globale Variable an. Zu dieser soll bei jedem Aufruf des \newrow-Befehls das jeweilige Ergebnis der Zeile hinzugerechnet werden. Funktioniert wieder mal grundsätzlich, aber das Zwischenergebnis ist immer dreimal so groß, wie es sein sollte.
Warum? Wird da intern etwas dreimal aufgerufen? Jemand eine Idee? Rainer?
\documentclass[12pt,pdftex]{scrartcl}
\usepackage[ngerman, english]{babel}
\usepackage{tabularx}
\usepackage{fp}
\usepackage{environ}
% globale Variable zum Speichern der Zwischenergebnisse
\newcommand*\rsum{0}
% Ausgabe Zwischenergebnis
\newcommand*\result{
\FPround\rsum\rsum{2}%
Zwischenergebnis: \FPprint\rsum
}
\newcommand*\erg{}
\newcommand{\newrow}[2]{%
\FPset\a{#1}%
\FPset\b{#2}%
\FPmul\c\a\b
\FPround\c\c{2}%
\xdef\erg{\c}%
% ---------------------------
% hier wird bei jedem Aufruf von \newrow das Ergebnis zum Zwischenergebnis \rsum hinzuaddiert
\FPadd\rsum\rsum\c
\xdef\rsum{\rsum}%
%----------------------------
{#1}&{#2}&{\FPprint\erg}\\
}
\NewEnviron{tab}{%
\def\temp{%
\begin{tabularx}{\textwidth}{@{}XXX@{}}
\textbf{a} & \textbf{b} & \textbf{c} \\
\hline}%
\expandafter\temp\BODY%
\hline
\end{tabularx}
}
\begin{document}
% eine Tabelle
\begin{tab}
\newrow{2}{1}
\newrow{2}{2}
\end{tab}
\vspace{1cm}
% Zwischenergebnis
\result\ (sollte eigentlich 6 sein, ist aber das dreifache)
\vspace{1cm}
% noch eine Tabelle
\begin{tab}
\newrow{2}{3}
\end{tab}
\vspace{1cm}
% Zwischenergebnis
\result\ (sollte eigentlich 12 sein, ist aber das dreifache)
\end{document}
georginakirrin
31-03-2015, 17:27
Ich habe jetzt zumindest herausgefunden, dass das Problem beim \newrow-Makro liegt. Wenn durch \newrow eine neue Zeile in die Tabelle eingefügt wird, dann wird vor Beginn der Berechnung dieselbe schon zweimal in Hintergrund ausgeführt. Das sagt zumindest das Logfile unterstützt durch eigene Ausgaben mit Hilfe von \typeout.
Ich weiß nicht, wo ich hier ansetzen soll. Ein einfacher Workaround wäre natürlich am Ende das Ergebnis durch drei zu teilen. Aber das ist ziemlich unschön und ich weiß auch nicht, ob bei anderen TeX-Systemen, -Versionen oder Plattformen das gleiche Passiert. Ich habe hier ein aktuelles MacTeX auf (logischerweise) Mac.
Wenn keiner eine Idee zur Lösung des Problems hat, dann wäre ich froh, wenn sie oder er zumindest mal testen könnte, ob bei ihr oder ihm auch das dreifache Ergebnis rauskommt. Wenn es überall so ist, dann muss ich am Ende doch durch drei teilen.
\documentclass[12pt,pdftex]{scrartcl}
\usepackage[ngerman, english]{babel}
\usepackage{tabularx}
\usepackage{fp}
\usepackage{environ}
\FPset\rsum{0}
% Ausgabe Zwischenergebnis
\newcommand{\result}{
\FPround\rsum\rsum{2}%
Zwischenergebnis: \FPprint\rsum
}
\newcommand*\erg{}
\newcommand{\newrow}[2]{%
\typeout{1: \rsum}% schon Berechnungen, bevor Berechnung durchgeführt
\FPset\a{#1}%
\FPset\b{#2}%
\FPmul\c\a\b
\FPround\c\c{2}%
\xdef\erg{\c}%
% ---------------------------
% hier wird bei jedem Aufruf von \newrow das Ergebnis zum Zwischenergebnis \rsum hinzuaddiert
\FPadd\rsum\rsum\c
\xdef\rsum{\rsum}
\typeout{2: \rsum}
%----------------------------
{#1}&{#2}&{\FPprint\erg}\\
}
\NewEnviron{tab}{%
\def\temp{%
\begin{tabularx}{\textwidth}{@{}XXX@{}}
\textbf{a} & \textbf{b} & \textbf{c} \\
\hline}%
\expandafter\temp\BODY%
\hline
\end{tabularx}
}
\begin{document}
% eine Tabelle
\begin{tab}
\newrow{2}{1}
\newrow{2}{2}
\end{tab}
\vspace{1cm}
% Zwischenergebnis
\result\ (sollte eigentlich 6 sein, ist aber das dreifache)
\vspace{1cm}
% noch eine Tabelle
\begin{tab}
\newrow{2}{3}
\end{tab}
\vspace{1cm}
% Zwischenergebnis
\result\ (sollte eigentlich 12 sein, ist aber das dreifache)
\end{document}
Ich weiß nicht, wo ich hier ansetzen soll. Ein einfacher Workaround wäre natürlich am Ende das Ergebnis durch drei zu teilen. Aber das ist ziemlich unschön und ich weiß auch nicht, ob bei anderen TeX-Systemen, -Versionen oder Plattformen das gleiche Passiert. Ich habe hier ein aktuelles MacTeX auf (logischerweise) Mac.
ja, das kann ich unter TL2014 nachvollziehen.
Wenn ich testhalber die tabularx- durch eine tabular-Umgebung ersetze, kommt sogar das erwartete Ergebnis raus:
\NewEnviron{tab}{%
\def\temp{%
\begin{tabular}{@{}rrr@{}}
\textbf{a} & \textbf{b} & \textbf{c} \\
\hline}%
\expandafter\temp\BODY%
\hline
\end{tabular}
}
MfG
georginakirrin
31-03-2015, 20:42
Boah - was für ein Sch*
Das muss ich dann mal nach Ostern ausprobieren - d.h. wieder mal Tabellenbasteln...mannnnn
Danke für den Hinweis.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.