Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Rechnen mit fp in Verbindung mit Tabelle und Makro

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.02.2015
    Beiträge
    12

    Rechnen mit fp in Verbindung mit Tabelle und Makro

    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
    Code:
    \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:
    Code:
    \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.

    Code:
    \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!?

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Zitat Zitat von georginakirrin Beitrag anzeigen
    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):
    Code:
    \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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.02.2015
    Beiträge
    12
    Danke Rainer, das hat geholfen.

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.02.2015
    Beiträge
    12
    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?

    Code:
    \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}

  5. #5
    Registrierter Benutzer
    Registriert seit
    16.02.2015
    Beiträge
    12
    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.

    Code:
    \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}

  6. #6
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Zitat Zitat von georginakirrin Beitrag anzeigen
    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:
    Code:
    \NewEnviron{tab}{%
    \def\temp{%
    \begin{tabular}{@{}rrr@{}}
    \textbf{a} & \textbf{b} & \textbf{c} \\
    \hline}%
    \expandafter\temp\BODY%
    \hline
    \end{tabular}
    }
    MfG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  7. #7
    Registrierter Benutzer
    Registriert seit
    16.02.2015
    Beiträge
    12
    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.

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •