
\global
Es scheint, dass man vor a nichts hinzufügen kann, \pgfmathsetmacro
da dies Folgendes ergibt:
Sie können kein Präfix mit „\begingroup“ verwenden.
Aber das ist die Funktionalität, die ich hier brauche.
Ich versuche, den Durchschnitt der Ganzzahlen in einer Liste zu berechnen. Im MWE ist die Liste, die ich habe
\newcommand*{\MyData}{3,7,X,Y,8,9,Z}%
und die \typeout
Nachrichten zeigen:
**** NumberOfValidEnteries=1, \AverageValue=3.0
**** NumberOfValidEnteries=2, \AverageValue=3.5
**** NumberOfValidEnteries=3, \AverageValue=2.66666
**** NumberOfValidEnteries=4, \AverageValue=2.25
Es scheint also, als ob es \pgfmathsetmacro
funktioniert, außer dass es seinen Status zwischen aufeinanderfolgenden Iterationen nicht speichert \foreach
, was genau der \global
Grund ist, warum es ursprünglich da war.
Code:
\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}
% http://tex.stackexchange.com/questions/50111/how-to-check-if-the-value-of-a-parameter-is-a-number
\newcommand*{\IfIsInteger}[3]{%
\IfStrEq{#1}{ }{%
#3% is a blank string
}{%
\IfInteger{#1}{#2}{#3}%
}%
}%
\newcommand*{\MyData}{3,7,X,Y,8,9,Z}%
\newcommand*{\AverageValue}{0}
\newcounter{NumberOfValidEnteries}
\newcommand*{\ComputeAverage}[1]{%
%% Initialize (in case this is used more than once)
\renewcommand*{\AverageValue}{0}
\setcounter{NumberOfValidEnteries}{0}%
%
\edef\ExpandedDataEnteries{#1}% So that #1 can be a list or a macro defined list.
\foreach \NewData in \ExpandedDataEnteries {%
\IfIsInteger{\NewData}{%
%\global% <---- I need this ????
\pgfmathsetmacro{\AverageValue}{%
(\AverageValue * \arabic{NumberOfValidEnteries} + \NewData) /
(\arabic{NumberOfValidEnteries} + 1)
}%
\stepcounter{NumberOfValidEnteries}%
\typeout{**** NumberOfValidEnteries=\arabic{NumberOfValidEnteries}, \string\AverageValue=\AverageValue}%
}{%
% Not integer data so skip it
}%
}%
}
\begin{document}
\ComputeAverage{\MyData}%
Average of integers in ``\MyData" is ``\AverageValue".
\end{document}
Antwort1
\global
Rechtlich können Sie vor einem Zuweisungsbefehl nur folgendes platzieren :
\global\def
\global\let
\global\mathchardef
\global\catcode
\global\advance
und so weiter. Man sollte beachten, dass\global
will und suchtein geeigneter Befehl, der darauf folgt und eine Erweiterung durchführt. Beispielsweise etoolbox
definiert
\newrobustcmd{\cslet}[2]{%
\expandafter\let\csname#1\endcsname#2}
so \global\cslet{foo}{\bar}
ist legal, denn es wird
\global\expandafter\let\csname foo\endcsname\bar
nach der ersten Erweiterung, aber da \expandafter
es erweiterbar ist, \global
lösen Sie seine Erweiterung aus und Sie erhalten, \global\let\foo\bar
was Sie möchten.
Andererseits \pgfmathsetmacro
ist definiert pgfmathcalc.code.tex
durch
\def\pgfmathsetmacro#1#2{%
\begingroup%
\pgfmathparse{#2}%
\let#1=\pgfmathresult
\pgfmath@smuggleone{#1}%
\endgroup%
}
also man kann da auf keinen Fall was \global
davor anfügen.
Die einfachste Lösung besteht darin, zu sagen:
\pgfmathparse
(\AverageValue * \arabic{NumberOfValidEnteries} + \NewData) /
(\arabic{NumberOfValidEnteries} + 1)
}%
\global\let\AverageValue\pgfmathresult
da \pgfmathparse
das Ergebnis in gespeichert wird \pgfmathresult
.