如何在评估 \pgfmathparse-expression/if 在 \pgfmathparse-expression 内部时检测扩展是否发生?

如何在评估 \pgfmathparse-expression/if 在 \pgfmathparse-expression 内部时检测扩展是否发生?

我打算编写一个宏,其行为会根据是在\pgfmathparse-表达式中使用还是在\pgfmathparse-表达式之外使用而有所不同。

例如,扩展为表达式中的\MyNicePi序列的表述pi\pgfmathparse不嵌套在"...之间"\textpi否则,返回控制字标记。

(序列pi是 -表达式中可识别的函数\pgfmathparse
当加载包 textgreek 时,它\textpi在水平和垂直模式下会传递符号 π。
"是 -表达式中的引号运算符\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 开发人员的功能请求Z/PGF。

相关内容