![\text{ } размер нижнего индекса в макросе tikzmath неверный](https://rvso.com/image/390897/%5Ctext%7B%20%7D%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%BD%D0%B8%D0%B6%D0%BD%D0%B5%D0%B3%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%20%D0%B2%20%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%B5%20tikzmath%20%D0%BD%D0%B5%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B9.png)
Этот вопрос связан сэтот мой предыдущий вопрос 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
значения \protect
is \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}}$};