\text{} o tamanho do subscrito na macro tikzmath não está correto

\text{} o tamanho do subscrito na macro tikzmath não está correto

Esta questão está relacionadaesta minha pergunta anterior sobre TeX-SE

Eu gostaria de ter um subscrito de texto adequado usando o comando \text{}. Parece não funcionar com as macros tikzmath. Por favor, veja o seguinte 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}

Como pode ser visto na saída, o tamanho do subscrito não está correto: O tamanho do subscrito não está correto

Se eu aplicar a correção sugerida, o tamanho do subscrito será corrigido: insira a descrição da imagem aqui

Minha dúvida é o uso etoolboxe robustifya forma sugerida de correção dos \textsubscritos, que pode ter alguns efeitos colaterais que posso enfrentar no futuro, ou existe uma forma mais robusta de corrigir o tamanho?

Observação:O uso de \textrmnão funciona no exemplo acima, que usei para o problema que relatei em minha postagem anterior.

Responder1

Adicione um \noexpandpode corrigi-lo diretamente. Mas penso que a abordagem de robustez faz mais sentido se este for um problema contínuo.

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

insira a descrição da imagem aqui

Responder2

Você pode ver o que está acontecendo se adicionar \show\textapós a \tikzmathdeclaração:

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

Na verdade, a definição de \texté encontrada em amstext.sty:

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

Você também precisa saber que isso \tikzmathfaz expansão total; já que \textnão é encontrado no modo matemático, simplesmente acontece \mbox. Já que no momento do letsignificado de \protectis \relax, ele continua intocado; então a condicional é expandida e como o TeX não está no modo matemático, você obtém \mbox{b}, que se torna

\leavemode\hbox{b}

e finalmente \unhbox\voidb@x\hbox{b}. Isso deve explicar a saída \showacima.

Possivelmente você deseja avaliar algo em vez de ter bno argumento to \text; neste caso, você precisa ter cuidado com o que expandir totalmente e o que não.

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

servirá, mas se em vez de bvocê tiver algo como \textbf{abc}, isso morrerá horrivelmente de qualquer maneira.

Você precisa \noexpandna frente deambosocorrências de \text, a fim de suprimir sua expansão e obter a versão correta quando \testfor realmente usado no modo matemático.

Responder3

Uma coisa simples a fazer é usar \mathrm{}. Então seria algo assim:

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

informação relacionada