\text{ } размер нижнего индекса в макросе tikzmath неверный

\text{ } размер нижнего индекса в макросе tikzmath неверный

Этот вопрос связан сэтот мой предыдущий вопрос TeX-SE

Я хотел бы иметь правильный текстовый индекс с помощью команды \text{}. Похоже, это не работает с макросами tikzmath. Пожалуйста, см. следующий 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}

Как видно из вывода, размер нижнего индекса неверен: Неверный размер нижнего индекса

Если я применяю предложенное исправление, размер нижнего индекса корректируется: введите описание изображения здесь

Мой вопрос касается использования etoolboxи robustifyпредлагаемого способа исправления \textнижних индексов, которые могут иметь некоторые побочные эффекты, с которыми я могу столкнуться в будущем, или есть более надежный способ исправления размера?

Примечание:Использование \textrmне работает в приведенном выше примере, который я использовал для решения проблемы, о которой сообщил в предыдущем сообщении.

решение1

Добавить \noexpandможно исправить напрямую. Но я думаю, что подход с усилением имеет больше смысла, если это постоянная проблема.

\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}

введите описание изображения здесь

решение2

Вы можете увидеть, что происходит, если добавите \show\textпосле \tikzmathобъявления:

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

Действительно, определение \textможно найти в amstext.sty:

% amstext.sty, line 28:
\DeclareRobustCommand{\text}{%
  \ifmmode\expandafter\text@\else\expandafter\mbox\fi}

Вы также должны знать, что \tikzmathвыполняет полное расширение; поскольку \textне находится в математическом режиме, он просто делает \mbox. Поскольку во время letзначения \protectis \relax, он остается нетронутым; затем условное выражение расширяется, и поскольку TeX не находится в математическом режиме, вы получаете \mbox{b}, что становится

\leavemode\hbox{b}

и наконец \unhbox\voidb@x\hbox{b}. Это должно объяснить вывод \showвыше.

Возможно, вы хотите оценить что-то вместо того, чтобы иметь bаргумент \text; в этом случае вам нужно быть осторожным с тем, что полностью раскрывать, а что нет.

\tikzmath{let \test=\noexpand\text{b}_{\noexpand\text{b}};}

подойдет, но если вместо этого bу вас будет что-то вроде \textbf{abc}, это в любом случае ужасно умрет.

Вам нужно \noexpandпередобавхождения \text, чтобы подавить его расширение и получить правильную версию, когда \testдействительно используется в математическом режиме.

решение3

Проще всего использовать \mathrm{}. Так что это будет выглядеть примерно так:

  \node (nodelabel) [base] {$\mathrm{Text_{subscript}}$};

Связанный контент