¿Cómo detectar si se produce expansión mientras se evalúa una \pgfmathparse-expression/if dentro de una \pgfmathparse-expression?

¿Cómo detectar si se produce expansión mientras se evalúa una \pgfmathparse-expression/if dentro de una \pgfmathparse-expression?

Tengo la intención de escribir una macro que se comporte de manera diferente dependiendo de si se usa dentro de una \pgfmathparseexpresión o fuera de una \pgfmathparseexpresión.

Por ejemplo, un elogio \MyNicePique se expande a la secuencia pidentro de una \pgfmathparseexpresión.no anidado entre "..."y al token de palabra de control \textpien caso contrario.

(La secuencia pies una función reconocida dentro de \pgfmathparse-expresiones.
Al cargar el paquete textgreek, \textpien los modos horizontal y vertical se entrega el símbolo π.
"es el operador de comillas en \pgfmathparse-expresiones, es decir, las cosas entre comillas se expanden pero no se evalúan mediante \pgfmathparse.)

Entonces las preguntas son:

¿El motor matemático de PGF trae consigo una prueba o un interruptor para averiguar si actualmente se \pgfmathparseestá llevando a cabo la evaluación de una expresión?

Si no:

  • ¿Cuál es la mejor manera de implementar una prueba de este tipo usted mismo?
  • ¿Qué criterios se pueden utilizar para determinar si actualmente \pgfmathparsese está llevando a cabo la evaluación de una expresión?

Algo como:

\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}

entregando lo mismo que

\documentclass{article}
\usepackage{textgreek}
\usepackage{tikz}

\begin{document}

\leavevmode\textpi{} is approximately
\pgfmathparse{pi}\pgfmathprintnumber[fixed, precision=3]{\pgfmathresult}\,.

\end{document}

ingrese la descripción de la imagen aquí

Respuesta1

No veo ninguna forma particular de reconocer si TeX está en medio de la ejecución \pgfmathparse, pero no es difícil agregar una prueba, aprovechando el hecho de que la definición de \pgfmathparsecomienza con \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}

El ejemplo muestra que eso también \pgfmathsetmacrofunciona (porque llama \pgfmathparseinternamente).

ingrese la descripción de la imagen aquí

También la idea de Phelype Oleinik de realizar pruebas \pgfmath@parse@nextes buena, pero tiene el defecto de depender del nombre en particular. En cambio,\begingroup tienea ser realizado por \pgfmathparse. Por supuesto, si los mantenedores deciden cambiar la definición de nivel superior y ocultarla \begingroupen otra macro, estamos condenados.

Creo que esta debería ser una solicitud de función para los desarrolladores de Ti.kZ/PGF.

información relacionada