
我打算編寫一個宏,其行為取決於是否在\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。