我打算编写一个宏,其行为会根据是在\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。