
Tengo la intención de escribir una macro que se comporte de manera diferente dependiendo de si se usa dentro de una \pgfmathparse
expresión o fuera de una \pgfmathparse
expresión.
Por ejemplo, un elogio \MyNicePi
que se expande a la secuencia pi
dentro de una \pgfmathparse
expresión.no anidado entre "
..."
y al token de palabra de control \textpi
en caso contrario.
(La secuencia pi
es una función reconocida dentro de \pgfmathparse
-expresiones.
Al cargar el paquete textgreek, \textpi
en 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 \pgfmathparse
está 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
\pgfmathparse
se 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}
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 \pgfmathparse
comienza 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 \pgfmathsetmacro
funciona (porque llama \pgfmathparse
internamente).
También la idea de Phelype Oleinik de realizar pruebas \pgfmath@parse@next
es 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 \begingroup
en otra macro, estamos condenados.
Creo que esta debería ser una solicitud de función para los desarrolladores de Ti.kZ/PGF.