\text{ } Indexgröße im Tikzmath-Makro ist nicht korrekt

\text{ } Indexgröße im Tikzmath-Makro ist nicht korrekt

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: Die Indexgröße ist nicht korrekt

Wenn ich den vorgeschlagenen Fix anwende, wird die Indexgröße korrigiert: Bildbeschreibung hier eingeben

Meine Frage betrifft die Verwendung etoolboxund robustifydie empfohlene Methode zum Korrigieren der \textIndizes. 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 \textrmfunktioniert im obigen Beispiel nicht; ich habe es für das Problem verwendet, das ich in meinem früheren Beitrag gemeldet habe.

Antwort1

Hinzufügen \noexpandkann 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}

Bildbeschreibung hier eingeben

Antwort2

Sie können sehen, was passiert, wenn Sie \show\textnach der \tikzmathDeklaration hinzufügen:

> \test=macro:
->\protect \unhbox \voidb@x \hbox {b}_{\protect \unhbox \voidb@x \hbox {b}}.

Tatsächlich \textfindet 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 \tikzmathvollständige Erweiterung durchführt; da \textim mathematischen Modus nicht gefunden wird, führt es nur aus \mbox. Da zum Zeitpunkt letder Bedeutung von \protectist \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 \showoben erklären.

Möglicherweise möchten Sie etwas auswerten, anstatt bes 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 betwas wie haben \textbf{abc}, wird dies trotzdem einen schrecklichen Tod bedeuten.

Sie müssen \noexpandvorbeideVorkommen von \text, um seine Erweiterung zu unterdrücken und die richtige Version zu erhalten, wenn \testtatsä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}}$};

verwandte Informationen