
Ich beabsichtige, ein Makro zu schreiben, das sich unterschiedlich verhält, je nachdem, ob es innerhalb \pgfmathparse
oder außerhalb eines \pgfmathparse
-Ausdrucks verwendet wird.
Beispielsweise ein Befehl \MyNicePi
, der sich auf die Sequenz pi
innerhalb eines\pgfmathparse
-Ausdrucksnicht verschachtelt zwischen "
..."
und andernfalls zum Steuerwort-Token \textpi
.
(Die Sequenz pi
ist eine erkannte Funktion innerhalb \pgfmathparse
von -Ausdrücken.
Wenn Sie das Paket textgreek laden, \textpi
wird im horizontalen und vertikalen Modus das Symbol π zurückgegeben.
"
ist der Anführungszeichenoperator in \pgfmathparse
-Ausdrücken, d. h. Dinge in Anführungszeichen werden erweitert, aber nicht von ausgewertet \pgfmathparse
.)
Die Fragen lauten also:
Bringt die mathematische Engine von PGF einen Test oder Schalter mit, um herauszufinden, ob aktuell die Auswertung eines \pgfmathparse
-Ausdrucks stattfindet?
Wenn nicht:
- Wie kann man einen solchen Test am besten selbst durchführen?
- Anhand welcher Kriterien lässt sich feststellen, ob aktuell die Auswertung eines
\pgfmathparse
-Ausdrucks stattfindet?
Etwas wie:
\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}
liefert das gleiche wie
\documentclass{article}
\usepackage{textgreek}
\usepackage{tikz}
\begin{document}
\leavevmode\textpi{} is approximately
\pgfmathparse{pi}\pgfmathprintnumber[fixed, precision=3]{\pgfmathresult}\,.
\end{document}
Antwort1
Ich sehe keine besondere Möglichkeit, um zu erkennen, ob TeX gerade die Ausführung von durchführt \pgfmathparse
, aber es ist nicht schwierig, einen Test hinzuzufügen, indem man die Tatsache ausnutzt, dass die Definition von \pgfmathparse
mit beginnt \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}
Das Beispiel zeigt, dass das auch \pgfmathsetmacro
funktioniert (weil es \pgfmathparse
intern aufruft).
Auch Phelype Oleiniks Idee, zu testen, \pgfmath@parse@next
ist gut, hat aber den Nachteil, dass sie vom jeweiligen Namen abhängt. Stattdessen\begingroup
hatausgeführt werden \pgfmathparse
. Wenn die Betreuer sich natürlich dazu entschließen, die Definition der obersten Ebene zu ändern und \begingroup
in einem anderen Makro zu verstecken, sind wir verloren.
Ich denke, dies sollte eine Funktionsanfrage an die Entwickler von Ti seinkZ/PGF.