\pgfmathsetmacro の前に \global を追加するにはどうすればいいですか?

\pgfmathsetmacro の前に \global を追加するにはどうすればいいですか?

次のように、\globala の前に追加することはできないようです。\pgfmathsetmacro

`\begingroup' ではプレフィックスは使用できません。

しかし、それがここで必要な機能です。

リスト内の整数の平均を計算しようとしています。MWEのリストは次のようになります。

\newcommand*{\MyData}{3,7,X,Y,8,9,Z}%

メッセージには次のように\typeout表示されます:

**** NumberOfValidEnteries=1, \AverageValue=3.0
**** NumberOfValidEnteries=2, \AverageValue=3.5
**** NumberOfValidEnteries=3, \AverageValue=2.66666
**** NumberOfValidEnteries=4, \AverageValue=2.25

したがって、 は動作しているように見えます\pgfmathsetmacroが、 の連続する反復間で状態を保存していません\foreach。これは、\globalそもそも が存在する目的そのものです。

コード:

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

答え1

\global割り当てコマンドの前にのみ配置できます:

\global\def
\global\let
\global\mathchardef
\global\catcode
\global\advance

などなど。\global 望み、探すetoolbox適切なコマンドを続けて展開する。例えば、

\newrobustcmd{\cslet}[2]{%
  \expandafter\let\csname#1\endcsname#2}

合法です\global\cslet{foo}{\bar}。なぜなら、

\global\expandafter\let\csname foo\endcsname\bar

最初の拡張後ですが、\expandafter拡張可能なので、\globalその拡張がトリガーされ、希望どおりになります\global\let\foo\bar

一方、は次のよう\pgfmathsetmacroに定義される。pgfmathcalc.code.tex

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

したがって、\globalその前に追加することは絶対にできません。

最も簡単な回避策は、

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

\pgfmathparse結果を に格納します\pgfmathresult

関連情報