如何在評估 \pgfmathparse-表達式/if 內的 \pgfmathparse-表達式 時檢測是否發生擴展?

如何在評估 \pgfmathparse-表達式/if 內的 \pgfmathparse-表達式 時檢測是否發生擴展?

我打算編寫一個宏,其行為取決於是否在\pgfmathparse- 表達式內使用或在\pgfmathparse- 表達式之外使用。

例如,擴展為a表達式中的\MyNicePi序列的命令pi\pgfmathparse不嵌套在"...之間"否則為控製字令牌\textpi

(此序列pi是 -expressions 中可識別的函數\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 開發者的一個功能請求kZ/PGF。

相關內容