![\text{ } Indexgröße im Tikzmath-Makro ist nicht korrekt](https://rvso.com/image/390897/%5Ctext%7B%20%7D%20Indexgr%C3%B6%C3%9Fe%20im%20Tikzmath-Makro%20ist%20nicht%20korrekt.png)
Diese Frage bezieht sich aufdiese frühere TeX-SE-Frage von mir
Ich hätte gerne einen richtigen Textindex mit dem Befehl \text{}. Mit den Tikzmath-Makros scheint das nicht zu funktionieren. Bitte beachten Sie das folgende MWW:
\documentclass[]{standalone}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{math}
%%%To fix the text subscript
%\usepackage{etoolbox}
%\makeatletter
%\robustify{\text}
%\makeatother
\begin{document}
\begin{tikzpicture}
\node at (0,0) {$\text{b}_\text{b}$: Correct};
\tikzmath{let \test=\text{b}_{\text{b}};}
\node at (0,-1cm) {$\test$: Not Correct};
\end{tikzpicture}
\end{document}
Wie aus der Ausgabe ersichtlich ist, ist die Indexgröße nicht korrekt:
Wenn ich den vorgeschlagenen Fix anwende, wird die Indexgröße korrigiert:
Meine Frage betrifft die Verwendung etoolbox
und robustify
die empfohlene Methode zum Korrigieren der \text
Indizes. Dies kann möglicherweise Nebenwirkungen haben, mit denen ich in Zukunft konfrontiert werden könnte, oder gibt es eine robustere Methode zum Korrigieren der Größe?
Notiz:Die Verwendung von \textrm
funktioniert im obigen Beispiel nicht; ich habe es für das Problem verwendet, das ich in meinem früheren Beitrag gemeldet habe.
Antwort1
Hinzufügen \noexpand
kann das Problem direkt beheben. Aber ich denke, der Robustify-Ansatz ist sinnvoller, wenn es sich um ein fortlaufendes Problem handelt.
\documentclass[]{standalone}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{math}
%%%To fix the text subscript
%\usepackage{etoolbox}
%\makeatletter
%\robustify{\text}
%\makeatother
\begin{document}
\begin{tikzpicture}
\node at (0,0) {$\text{b}_\text{b}$: Correct};
\tikzmath{let \test=\text{b}_{\text{b}};}
\node at (0,-1cm) {$\test$: Not Correct};
\tikzmath{let \test=\text{b}_{\noexpand\text{b}};}
\node at (0,-2cm) {$\test$: Corrected with noexpand};
\end{tikzpicture}
\end{document}
Antwort2
Sie können sehen, was passiert, wenn Sie \show\text
nach der \tikzmath
Deklaration hinzufügen:
> \test=macro:
->\protect \unhbox \voidb@x \hbox {b}_{\protect \unhbox \voidb@x \hbox {b}}.
Tatsächlich \text
findet sich die Definition von in amstext.sty
:
% amstext.sty, line 28:
\DeclareRobustCommand{\text}{%
\ifmmode\expandafter\text@\else\expandafter\mbox\fi}
Sie müssen auch wissen, dass eine \tikzmath
vollständige Erweiterung durchführt; da \text
im mathematischen Modus nicht gefunden wird, führt es nur aus \mbox
. Da zum Zeitpunkt let
der Bedeutung von \protect
ist \relax
, bleibt es unberührt; dann wird die Bedingung erweitert und da TeX nicht im mathematischen Modus ist, erhalten Sie \mbox{b}
, was zu wird
\leavemode\hbox{b}
und schließlich \unhbox\voidb@x\hbox{b}
. Dies sollte die Ausgabe von \show
oben erklären.
Möglicherweise möchten Sie etwas auswerten, anstatt b
es im Argument zu haben \text
. In diesem Fall müssen Sie vorsichtig sein, was vollständig erweitert werden soll und was nicht.
\tikzmath{let \test=\noexpand\text{b}_{\noexpand\text{b}};}
reicht aus, aber wenn Sie stattdessen b
etwas wie haben \textbf{abc}
, wird dies trotzdem einen schrecklichen Tod bedeuten.
Sie müssen \noexpand
vorbeideVorkommen von \text
, um seine Erweiterung zu unterdrücken und die richtige Version zu erhalten, wenn \test
tatsächlich im Mathematikmodus verwendet wird.
Antwort3
Am einfachsten geht das mit \mathrm{}. Das Ganze würde dann etwa so aussehen:
\node (nodelabel) [base] {$\mathrm{Text_{subscript}}$};