Como detectar se a expansão ocorre ao avaliar uma \pgfmathparse-expression/if dentro de uma \pgfmathparse-expression?

Como detectar se a expansão ocorre ao avaliar uma \pgfmathparse-expression/if dentro de uma \pgfmathparse-expression?

Pretendo escrever uma macro que se comporte de maneira diferente dependendo se é usada dentro de uma \pgfmathparseexpressão ou fora de uma \pgfmathparseexpressão.

Por exemplo, um elogio \MyNicePique se expande para a sequência pidentro de \pgfmathparse-expressõesnão aninhado entre "..."e para o token da palavra de controle \textpicaso contrário.

(A sequência pié uma função reconhecida dentro de \pgfmathparse-expressions.
Ao carregar o pacote textgreek, então \textpinos modos horizontal e vertical entrega o símbolo π.
"é o operador de cotação em \pgfmathparse-expressions, ou seja, as coisas entre aspas são expandidas, mas não avaliadas por \pgfmathparse.)

Então as perguntas são:

O mecanismo matemático do PGF traz consigo um teste ou uma opção para descobrir se a avaliação de uma \pgfmathparseexpressão está ocorrendo atualmente?

Se não:

  • Qual é a melhor maneira de implementar esse teste sozinho?
  • Que critérios podem ser usados ​​para determinar se a avaliação de uma \pgfmathparseexpressão está ocorrendo atualmente?

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 o mesmo que

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

\begin{document}

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

\end{document}

insira a descrição da imagem aqui

Responder1

Não vejo nenhuma maneira específica de reconhecer se o TeX está no meio do desempenho \pgfmathparse, mas não é difícil adicionar um teste, explorando o fato de que a definição de \pgfmathparsecomeça com \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}

O exemplo mostra que também \pgfmathsetmacrofunciona (porque chama \pgfmathparseinternamente).

insira a descrição da imagem aqui

Além disso, a ideia de testar Phelype Oleinik \pgfmath@parse@nexté boa, mas tem o defeito de depender do nome específico. Em vez de,\begingroup tema ser realizado por \pgfmathparse. Claro, se os mantenedores decidirem mudar a definição de nível superior e se esconder \begingroupem outra macro, estaremos condenados.

Eu acho que isso deveria ser uma solicitação de recurso para os desenvolvedores do TikZ/PGF.

informação relacionada