Wie füge ich vor \pgfmathsetmacro ein \global hinzu?

Wie füge ich vor \pgfmathsetmacro ein \global hinzu?

\globalEs scheint, dass man vor a nichts hinzufügen kann, \pgfmathsetmacroda 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 \typeoutNachrichten 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 \pgfmathsetmacrofunktioniert, außer dass es seinen Status zwischen aufeinanderfolgenden Iterationen nicht speichert \foreach, was genau der \globalGrund 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

\globalRechtlich 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 etoolboxdefiniert

\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 \expandafteres erweiterbar ist, \globallösen Sie seine Erweiterung aus und Sie erhalten, \global\let\foo\barwas Sie möchten.

Andererseits \pgfmathsetmacroist definiert pgfmathcalc.code.texdurch

\def\pgfmathsetmacro#1#2{%
  \begingroup%
    \pgfmathparse{#2}%
        \let#1=\pgfmathresult
    \pgfmath@smuggleone{#1}%
  \endgroup%
}

also man kann da auf keinen Fall was \globaldavor anfügen.

Die einfachste Lösung besteht darin, zu sagen:

\pgfmathparse
  (\AverageValue * \arabic{NumberOfValidEnteries} + \NewData) /
   (\arabic{NumberOfValidEnteries} + 1)
  }%
\global\let\AverageValue\pgfmathresult

da \pgfmathparsedas Ergebnis in gespeichert wird \pgfmathresult.

verwandte Informationen