
Я намерен написать макрос, который ведет себя по-разному в зависимости от того, используется ли он внутри \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.кЗ/ПГФ.