Как определить, происходит ли расширение при вычислении \pgfmathparse-выражения/если оно находится внутри \pgfmathparse-выражения?

Как определить, происходит ли расширение при вычислении \pgfmathparse-выражения/если оно находится внутри \pgfmathparse-выражения?

Я намерен написать макрос, который ведет себя по-разному в зависимости от того, используется ли он внутри \pgfmathparseвыражения или вне \pgfmathparseвыражения.

Например, выражение \MyNicePi, которое расширяется до последовательности piвнутри \pgfmathparse-выраженияне вложен между "..."и к контрольному слову-токену \textpiв противном случае.

(Последовательность piявляется распознанной функцией внутри \pgfmathparse-expressions.
При загрузке пакета textgreek, \textpiв горизонтальном и вертикальном режимах выдает символ π.
"является оператором кавычек в \pgfmathparse-expressions, т.е. элементы в кавычках расширяются, но не оцениваются с помощью \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изнутри).

введите описание изображения здесь

Также идея Фелипе Олейника проверить \pgfmath@parse@nextэто хороша, но имеет недостаток в зависимости от конкретного имени. Вместо этого,\begingroup имеетдля выполнения \pgfmathparse. Конечно, если сопровождающие решат изменить определение верхнего уровня и спрятать его \begingroupв другом макросе, мы обречены.

Я думаю, это должно быть запросом на функцию для разработчиков Ti.кЗ/ПГФ.

Связанный контент