\pgfmathparse 式内の \pgfmathparse 式/if を評価中に展開が行われたかどうかを検出するにはどうすればよいですか?

\pgfmathparse 式内の \pgfmathparse 式/if を評価中に展開が行われたかどうかを検出するにはどうすればよいですか?

\pgfmathparse-式内で使用されるか、-式の外部で使用されるかに応じて動作が異なるマクロを作成するつもりです\pgfmathparse

例えば、式内の\MyNicePiシーケンスに展開されるコマンドpi\pgfmathparse"...の間にネストされていません"それ以外の場合は、制御ワード トークンに適用されます\textpi

(シーケンスは、 -expressionspi内で認識される関数です\pgfmathparse
パッケージ textgreek をロードすると、\textpi水平モードと垂直モードでは π シンボルが出力されます。は、-expressions
"内の引用符演算子です。\pgfmathparseつまり、引用符で囲まれたものは によって展開されますが、評価されません\pgfmathparse。)

質問は次のとおりです:

PGF の数学エンジンには、現在式の評価が行われているかどうかを確認するためのテストまたはスイッチが搭載\pgfmathparseされていますか?

そうでない場合:

  • このようなテストを自分で実装する最善の方法は何ですか?
  • \pgfmathparse-式の評価が現在行われているかどうかを判断するために使用できる基準は何ですか?

何かのようなもの:

\documentclass{article}
\usepackage{textgreek}
\usepackage{tikz}

\newcommand\MyNicePi{%
  % A test for checking if pgfmathparse-evaluation takes place and either
  % pi or \textpi
}%

\begin{document}

\leavevmode\MyNicePi{} is approximately
\pgfmathparse{\MyNicePi}\pgfmathprintnumber[fixed, precision=3]{\pgfmathresult}\,.

\end{document}

同じものを提供する

\documentclass{article}
\usepackage{textgreek}
\usepackage{tikz}

\begin{document}

\leavevmode\textpi{} is approximately
\pgfmathparse{pi}\pgfmathprintnumber[fixed, precision=3]{\pgfmathresult}\,.

\end{document}

ここに画像の説明を入力してください

答え1

TeX が を実行中かどうかを認識する特別な方法は見当たりませんが、 の定義が で始まる\pgfmathparseという事実を利用してテストを追加することは難しくありません。\pgfmathparse\begingroup

\documentclass{article}
\usepackage{textgreek}
\usepackage{tikz}
\usepackage{etoolbox}

\newif\ifudparse
\patchcmd{\pgfmathparse}
  {\begingroup}
  {\begingroup\udparsetrue}
  {}{}

\newcommand\MyNicePi{\ifudparse pi\else\textpi\fi}

\begin{document}

\MyNicePi{} is approximately
\pgfmathparse{\MyNicePi}\pgfmathprintnumber[fixed, precision=3]{\pgfmathresult}\,.

\MyNicePi{} is approximately half of
\pgfmathsetmacro\foo{2*\MyNicePi}\pgfmathprintnumber[fixed, precision=3]{\foo}\,.

\end{document}

この例では、これも\pgfmathsetmacro機能することがわかります (内部的に呼び出すため\pgfmathparse)。

ここに画像の説明を入力してください

また、Phelype Oleinikのテストのアイデアは\pgfmath@parse@next良いのですが、特定の名前に依存するという欠点があります。代わりに、\begingroup もっているによって実行されます\pgfmathparse。もちろん、メンテナーがトップレベルの定義を変更して\begingroup別のマクロに隠すことに決めた場合、私たちは破滅します。

これはTiの開発者への機能リクエストになると思いますPGF。

関連情報