
Pretendo escrever uma macro que se comporte de maneira diferente dependendo se é usada dentro de uma \pgfmathparse
expressão ou fora de uma \pgfmathparse
expressão.
Por exemplo, um elogio \MyNicePi
que se expande para a sequência pi
dentro de \pgfmathparse
-expressõesnão aninhado entre "
..."
e para o token da palavra de controle \textpi
caso contrário.
(A sequência pi
é uma função reconhecida dentro de \pgfmathparse
-expressions.
Ao carregar o pacote textgreek, então \textpi
nos 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 \pgfmathparse
expressã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
\pgfmathparse
expressã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}
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 \pgfmathparse
começ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 \pgfmathsetmacro
funciona (porque chama \pgfmathparse
internamente).
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 \begingroup
em outra macro, estaremos condenados.
Eu acho que isso deveria ser uma solicitação de recurso para os desenvolvedores do TikZ/PGF.