tikz Ergebnis in Variablen speichern

Formelsatz für Mathematik, Naturwissenschaften und Technik


Benutzeravatar
$3v|\|
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: Di 27. Mär 2012, 15:52
Wohnort: Ulm a.d. Donau

tikz Ergebnis in Variablen speichern

Beitrag von $3v|\| »

Hallo miteinander

ich versuche gerade mit tkiz etwas in LATEX zu rechnen. (nur kleinere zusammenzählungen)

ich habe folgende Probleme:

-ich kann nicht das modul fpu (Floating Point Unit Library) verwenden. Ansonsten funktioniert meine formatierte Ausgabe nicht mehr.
Ich erhalte 30 Fehlermeldungen ( ! Package pgfkeys Error: I do not know the key '/pgf/fpu' and I am going to ignore it. Perhaps you misspelled it.
...)

-ich schaff es nicht die Ergebnisse von einfachen Berechnungen in Variablen (bzw. in Makros) zu speichern. wenn ich die Variable das erste mal aufrufe klappt alles - aber beim zweitenmal nicht mehr.
Im pgfmanual.pdf wird immer mit \def gearbeitet aber laut l2tabu sollte man \def nicht verwenden, wenn es nicht unbedingt sein muss. (Wobei die Beispiele dort kapier ich auch nicht unbedingt)

- wie kann ich den Variablennamen an ein anderes Macro übergeben so dass dort die Variable bearbeitet werden kann? (siehe Macro \zuweisen)
\documentclass{article}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
%% \usepackage{amslatex} % angebliches MikTex Paket - geht aber nicht
\usepackage{tikz}

	% ich würde gerne fpu nutzen wegen der höheren Genauigkeit - allerdings funktioniert das bei mir nicht
	% was mach ich falsch?
	%\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed,precision=2,use comma,set thousands separator={ }}


\newcommand{\AUSGEBEN}[2][3]{ % Es werden zwei Argumente verwendet - das erste wird mit "`3"' vorbelegt
	\pgfmathparse{#2} 	% führt die Rechnung durch (mit dem zweiten Argument
	\pgfkeys{			% gibt die Ausgabeformatierung vor
		/pgf/number  format/.cd,	% Formatierung für "`Number"'
		fixed zerofill,	% Füllt die Nachkommastellen mit Nullen auf
		precision=#1,	% Anzahl der Nachkommastellen wird mit dem Argument übergeben
		use comma,		% verwendet bei der Ausgabe ein Komma - Achtung: beim Speichern muss ein Punkt verwendet werden
		% set thousands separator={.}	% verwendet Punkt als Tausender seperator 
		set thousands separator={ }	% verwendet keinen Tausender seperator - default: "`,"'
	} 
	\pgfmathprintnumber{\pgfmathresult} %gibt das Ergebnis aus
}

\newcommand{\ZUWEISEN}[2]{ % Es werden zwei Argumente verwendet
	\pgfmathparse{#2} 	% führt die Rechnung durch (mit dem zweiten Argument)
	\renewcommand{#1}{\pgfmathresult} % speichert das Ergebnis in der bereits existierenden Variablen
%	\renewcommand{\mygammadrei}{\pgfmathresult} % das würde funktionieren
}



\begin{document}

\newcommand{\mygammaeins}{4.2} % richtige Eingabe
\newcommand{\mygammazwei}{4,2} % falsche Eingabe

\newcommand{\mygammadrei}{0}

eins: \AUSGEBEN{\mygammaeins}\\
zwei: \AUSGEBEN{\mygammazwei}\\
drei: \AUSGEBEN{\mygammadrei}

% eins: \AUSGEBEN{\mygammaeins*10000}\\ % Fehler -> Dimension too large
eins: \AUSGEBEN{\mygammaeins*1000}\\ % Ergebnis = eins: 4199,997 und nicht eins: 4200
%zwei: \AUSGEBEN{\mygammazwei*1000}\\ % geht natürlich nicht, da in \mygammazwei keine Zahl steht
\pgfmathparse{\mygammaeins*100}
\renewcommand{\mygammadrei}{\pgfmathresult}
drei: \AUSGEBEN{\mygammadrei}\\	% das erste mal funktioniert es
%drei: \AUSGEBEN{\mygammadrei}\\	% dann nicht mehr -> erzeugt vier Fehler

%drei: \AUSGEBEN{\mygammadrei}\\%erzeugt noch viel mehr Fehler
%drei: \AUSGEBEN{\mygammadrei}\\



%%  \ZUWEISEN[{mygammadrei}]{\mygammaeins+2000} % ich kann keine Makronamen übergeben
eins: \AUSGEBEN{\mygammaeins}\\
%drei: \AUSGEBEN{\mygammadrei}
%erzeugt drei  Fehler
\end{document}

Fehler:
  • ! Undefined control sequence.
    \pgfmath@dimen@ ...men@@ #1=0.0pt\relax \pgfmath@

    l.54 drei: \AUSGEBEN{\mygammadrei}
    % dann nicht mehr
    The control sequence at the end of the top line
    of your error message was never \def'ed. If you have
    misspelled it (e.g., `\hobx'), type `I' and the correct
    spelling (e.g., `I\hbox'). Otherwise just continue,
    and I'll forget about whatever was undefined.

    ! Missing number, treated as zero.
    <to be read again>
    \
    l.54 drei: \AUSGEBEN{\mygammadrei}
    % dann nicht mehr
    A number should have been here; I inserted `0'.
    (If you can't figure out why I needed to see a number,
    look up `weird error' in the index to The TeXbook.)

    Runaway argument?
    pgfmath@bgroup\expandafter \def \expandafter \pgfmath@number \expandafter \ETC.
    ! Paragraph ended before \pgfmath@dimen@@ was complete.
    <to be read again>
    \par
    l.54 drei: \AUSGEBEN{\mygammadrei}
    % dann nicht mehr
    I suspect you've forgotten a `}', causing me to apply this
    control sequence to too much text. How can we recover?
    My plan is to forget the whole thing and hope for the best.


    ! Package PGF Math Error: Could not parse input '420{,}000' as a floating point
    number, sorry. The unreadable part was near ',000'. (in '420{,}000').

    See the PGF Math package documentation for explanation.
    Type H <return> for immediate help.
    ...

    l.54 drei: \AUSGEBEN{\mygammadrei}
    % dann nicht mehr
    This error message was generated by an \errmessage
    command, so I can't give any explicit help.
    Pretend that you're Hercule Poirot: Examine all clues,
    and deduce the truth by order and method.

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Hallo du kannst natürlich \def verwenden wenn du weißt was du tuts.
Wichtig ist hier eine TeX primitive,die sich edef nennt. Damit werden die replacements genau ein mal expandiert.
\documentclass{article} 

\usepackage{etex}
\usepackage{tikz} 

\newcommand{\calc}[2]{ 
% Es werden zwei Argumente verwendet 
   \pgfmathparse{#2}    % führt die Rechnung durch (mit dem zweiten Argument) 
   \xdef#1{\pgfmathresult} % 
} 
\newcommand{\showme}[2][ 4 ]{%
   \pgfkeys{         % gibt die Ausgabeformatierung vor 
      /pgf/number  format/.cd,   % Formatierung für "`Number"' 
      fixed zerofill,   % Füllt die Nachkommastellen mit Nullen auf 
     precision=#1,  % Anzahl der Nachkommastellen wird mit dem Argument übergeben 
      use comma,      %
      % set thousands separator={.}   % verwendet Punkt als Tausender seperator 
      set thousands separator={\ }   % verwendet keinen Tausender seperator - default: "`,"' 
   } %
\pgfmathprintnumber{#2}
}

\begin{document} 

\newcommand{\mygammaeins}{4.2} % richtige Eingabe 
\newcommand{\mygammazwei}{120} % falsche Eingabe 

\newcommand{\mygammadrei}{0} 


\calc{\mygammadrei}{2*\mygammaeins}
\mygammaeins\\
\mygammazwei\\
\mygammadrei\\

\calc{\mygammazwei}{\mygammazwei*2}
xxx\\
\mygammaeins\\
\mygammazwei\\
\mygammadrei\\
\calc{\mygammazwei}{\mygammazwei*\mygammadrei*5}
yyy\\
\mygammaeins\\
\showme[9]{\mygammazwei}\\
\mygammadrei\\
\end{document}
Ich habe das jetzt mal etwas vereinfacht, mir war dein Wuscht etwas zu undurchschaubar für heute abend. Ich hoffe das ist etwa was du willst.

Ob es eine gute Idee ist bei jedem \showme Aufruf die pgfkeys neu zu setzten weiß ich nicht. Wenn du die Möglichkeit hast das global (einmal) zu setzten, dann solltest du das tun. so was kostet natürlich Rechenzeit.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Benutzeravatar
$3v|\|
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: Di 27. Mär 2012, 15:52
Wohnort: Ulm a.d. Donau

"/pgf/fpu" (Floating Point Unit Library) mit tikz

Beitrag von $3v|\| »

Vielen Dank für die schnelle Antwort

Das bringt mich schon mal ein ganzes Stück voran. Ich hätte noch ein paar Fragen:

- wo verwendest Du "edef" oder hast Du das "xdef" gemeint?
(ich hab beide noch nicht gekannt - habe Tex-Befehle so gut wie möglich vermieden nachdem ich am Anfang noch ganz viele in meinem Quelltext hatte)

- was versteht man unter "die replacements werden genau ein mal expandiert"? Kann ich das so verstehen, dass "\renewcommand{\mygammadrei}{\pgfmathresult}" einen Link auf das Ergebnis macht und bei jedem Aufruf von "\mygammadrei" eigentlich "\pgfmathresult" aufgerufen wird - bei "\xdef\mygammadrei{\pgfmathresult}" wird "\pgfmathresult" genau einmal aufgerufen und das Ergebnis wird in "\mygammadrei" gespeichert ???
(das ist genau das was ich wollte)
Zumindest bekomme ich bei erneutem Aufruf des Ergebnisses einer Berechnung keine Fehlermeldungen mehr - Danke !!!!

-Wie bekomm ich die "/pgf/fpu" (Floating Point Unit Library) zum laufen? "\showme[9]{\mygammavier}\\" liefert 10 079,992680000. Das Richtige Ergebniss wäre aber 10080,000000000 (=120 * 2 * 2 * 4,2 * 5). Ich vermute dass auch mehr als 5 Nachkommastellen nicht ausgewertet werden - daher auch der recht große Fließkommafehler.
Bei großen Zahlen erhalte ich immer noch die Fehlermeldung: "Dimension too large"
Auf http://texcatalogue.sarovar.org/bytopic ... alculating hab ich noch fltpoint und fp gefunden. Allerdings arbeiten die soviel ich weis mit polnisch rekursiver Schreibweise, Befehlen anstelle von Operatoren und man kann die Ausgabe nicht so hübsch formatieren. Ausserdem möchte ich mich jetzt nicht unbedingt in ein weiteres Paket halblebig einarbeiten sondern erst mal das verstehen was ich bisher verwende, vorallem da tikz das ja auch können sollte.


-Das mit dem dauerhaften Aufruf von "pgfkeys" überleg ich mir nochmal. Wie du bei den vorgegebenen Optionen sehen kannst möchte ich an verschiedenen Stellen mehrfach die Formatierung möglichst einfach ändern. Vielleicht schreibe ich mir noch ein extra Makro das dies dann machen kann.

Gruz $3v|\|

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Hallo
- xdef ist nichts anderes als \global\edef. Ich denke du kannst auch ohne es nachzulesen (zB im texbytopic) erraten was \global macht. \edef expandiert wie gesagt die Inhalte (repalcements) ein mal. Es wird sozusagen der aktuelle Stand der übergebenen Macros eingelagert. Du kannst edef ja mal mit def ersetzten.
- Wie du fpu zum Laufen bringst, kannst du leicht in der Dokumentation nachlesen. In folgendem Beispiel habe ich das mal gemacht:
\documentclass{article} 

\usepackage{etex}
\usepackage{tikz} 
\usetikzlibrary{fpu}
\pgfkeys{/pgf/fpu=true}
\pgfkeys{/pgf/fpu/output format=fixed}
\newcommand{\calc}[2]{ 
   \pgfmathparse{#2}    %   
   \xdef#1{\pgfmathresult} % 
} 
\newcommand{\showme}[2][ 4 ]{%
   \pgfkeys{         % gibt die Ausgabeformatierung vor 
      /pgf/number  format/.cd,   % Formatierung für "`Number"' 
      fixed zerofill,   % Füllt die Nachkommastellen mit Nullen auf 
     precision=#1,  % Anzahl der Nachkommastellen wird mit dem Argument übergeben 
      use comma,      % verw
      % set thousands separator={.}   % verwendet Punkt als Tausender seperator 
      set thousands separator={\ }   % verwendet keinen Tausender seperator - default: "`,"' 
   } %
\pgfmathprintnumber{#2}
}

\begin{document} 

\newcommand{\mygammaeins}{4.2} % richtige Eingabe 
\newcommand{\mygammazwei}{120} % falsche Eingabe 

\newcommand{\mygammadrei}{0} 


\calc{\mygammadrei}{2*\mygammaeins}
\mygammaeins\\
\mygammazwei\\
\mygammadrei\\

\calc{\mygammazwei}{\mygammazwei*2}
xxx\\
\showme{\mygammaeins}\\
\showme{\mygammazwei}\\
\showme{\mygammadrei}\\
\calc{\mygammazwei}{\mygammazwei*\mygammadrei*10e10}
yyy\\
\mygammaeins\\
\showme[9]{\mygammazwei}\\
\showme[9]{\mygammadrei}\\
\end{document}
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Benutzeravatar
$3v|\|
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: Di 27. Mär 2012, 15:52
Wohnort: Ulm a.d. Donau

Beitrag von $3v|\| »

Super - vielen Dank

hab die Doku zwar mehrmals gelesen hab aber irgendwie immer wieder "\usetikzlibrary{fpu} % LATEX and plain TEX when using Tik Z" überlesen oder nicht kapiert - ich weis es nicht mehr

Jetzt bekomme ich bei großen Zahlen keine Fehlermeldung mehr.

Allerdings hatte ich mir mehr erhofft von "the IEEE double precision data range":
\calc{\mygammaeins}{120*2*2*4.2*5}
\showme[9]{\mygammaeins}\\
liefert mir anstelle von "10 079,992680000" jetzt "10 080,001800000"
(Das Richtige Ergebniss wäre aber 10080,000000000 wie schon oben erwähnt)
auch wenn ich keine Kommazahlen sondern nur integer verwende kommt es zu einem nicht erheblichen Fließkommafehler:
\calc{\mygammaeins}{1200*20*20*420*50}
\pgfmathprintnumber{\mygammaeins}\\
liefert "1,00800018 *10^10"

ich vermute dass die Genauigkeit maximal zwei Nachkommastellen beträgt (bzw. 5 führende Stellen + Runden der 6. Stelle).
zehn neuntel = eins komma Periode eins\\
\calc{\mygammaeins}{10/9}
\mygammaeins\\
\showme[20]{\mygammaeins}\\

acht neuntel = null Komma Periode acht\\
\calc{\mygammaeins}{8/9}
\mygammaeins\\
\showme[20]{\mygammaeins}\\
liefert:
zehn neuntel = eins komma Periode eins
1.111000000000
1,11100000000000000000
acht neuntel = null Komma Periode acht
0.88889
0,88889000000000000000

von "-1 *10^324,..., 1 *10^324" merk ich bisher noch nichts - Wie kann ich die Fließkommaungenauigkeit minimieren?
Ab der zehnten Nachkommastelle würde es mich nicht mehr stören (vorausgesetzt 1+1 ist nicht 1,9999999999999).
Zuletzt geändert von $3v|\| am Di 24. Jul 2012, 15:03, insgesamt 1-mal geändert.

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Das mit dem double bezieht sich auf den Datentyp nicht auf die Rechengenauigkeit. (Zumindest verstehe ich das so). Irgendwo spricht er von 5 digits Genauigkeit. Das kommt schon eher hin.

In latex3 ist auch ein float point Mechanismus enthalten. Den kannst du dir ja mal anschauen:
texdoc interface3
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Benutzeravatar
$3v|\|
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: Di 27. Mär 2012, 15:52
Wohnort: Ulm a.d. Donau

Beitrag von $3v|\| »

Dankeschön

glaub das reicht erst mal um den Status auf beantwortet zu ändern - auch wenn mir noch nicht alles klar ist.

Muss jetzt erst mal lesen und rumprobieren.

PS: Latex3 war mir bisher noch nicht bekannt. Ich hab nur was von Luatex und Context gehört - wobei ich noch nicht verstanden hab was die einzelnen Vorteile der Projekte sind.

Bevor ich mit Latex angefangen hab, war ich der Meinung, dass alle alten Projekte weiterhin übersetzt werden können und es nur Weiterentwicklungen gibt - inzwischen hab ich festgestellt, dass man nicht ohne weiteres ein Latex (1) Script nehmen und in Latex 2e einfügen kann - was als Anfänger sehr verwirrend ist, da man immer wieder über alte Codefragmente in den Untiefen des I-nets stolpert.

Ich möchte hier niemandem von Latex abraten, aber ich würde mir nochmal überlegen ob ich versuch meine Bachelorarbeit ohne Vorkenntnisse in Latex zu schreiben ;-)

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

Hi da darf man da macro sprache nicht mit einem Kompiler verwechseln. Während latex3 eine neues Macropaket auf Basis von TeX ist, ist zB lualatex eine Maschiene, die tex und natürlich latex versteht. Context ist wie LaTeX(3/2e/2.09) eine Macro Sprache, aber auch eine Maschine (kompliziert ich weiß). latex ist im übrigen auch noch der Name einer Maschine.

Und was das mit der Bachelorarbeit angeht: Frage doch an deine Hochschule nach ob die nicht LaTeX Kurse anbieten wollen.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Benutzeravatar
$3v|\|
Forum-Anfänger
Forum-Anfänger
Beiträge: 23
Registriert: Di 27. Mär 2012, 15:52
Wohnort: Ulm a.d. Donau

zur Info

Beitrag von $3v|\| »

Ich hab mal mit den Zahlenwerten rumgespielt und hab rausgefunden, dass es nicht egal ist in welcher Reihenfolge die Werte in der Rechnung stehen.

Beispielcode:
120*2*2*4.2*5=\calc{\mygammaeins}{120*2*2*4.2*5}
\mygammaeins\\
Ergebnisse:
120*2*2*4.2=2016.000000000
2016*5=10080.0018000000000

120*2*2*5=2400.0000000
2400*4.2=10080.00000000 ->Richtig

120*2*2*4.2*5=10080.0018000000000
120*2*2*5*4.2=10080.00000000 ->Richtig

wobei an der Kommazahl (4.2) liegt das nicht. Interessant ist, dass sogar einfache Rechnungen (2016*5=10080.0018) schief gehen.

PS: ich glaub nicht dass in unserem Rechenzentrum irgendeiner schon mal was von LATEX gehört hat :-(
Ausserdem haben die schon genug mit ihrer Telefonanlage zu schaffen, die sie nicht am laufen halten können.

Für was ist eigentlich das etex-Paket http://ctan.org/pkg/etex/
Das einzige was ich wirklich kapiert hab ist, dass es nicht in meiner MiKTeX-Distribution enthalten ist.

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag von bloodworks »

etex fürht u.a. dazu dass man mehr Register hat. Ich glaube in dem konkreten Beispiel wird es nicht benötigt, ich deklariere das aber bei so rechenintensiven Aufgaben immer mit ein. Solltest du mal den Fehler bekommen "no mor room for new dimension" dann ist dieses paket dein Freund.
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Antworten