![\text{} o tamanho do subscrito na macro tikzmath não está correto](https://rvso.com/image/390897/%5Ctext%7B%7D%20o%20tamanho%20do%20subscrito%20na%20macro%20tikzmath%20n%C3%A3o%20est%C3%A1%20correto.png)
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:
Se eu aplicar a correção sugerida, o tamanho do subscrito será corrigido:
Minha dúvida é o uso etoolbox
e robustify
a forma sugerida de correção dos \text
subscritos, 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 \textrm
não funciona no exemplo acima, que usei para o problema que relatei em minha postagem anterior.
Responder1
Adicione um \noexpand
pode 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}
Responder2
Você pode ver o que está acontecendo se adicionar \show\text
após a \tikzmath
declaraçã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 \tikzmath
faz expansão total; já que \text
não é encontrado no modo matemático, simplesmente acontece \mbox
. Já que no momento do let
significado de \protect
is \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 \show
acima.
Possivelmente você deseja avaliar algo em vez de ter b
no 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 b
você tiver algo como \textbf{abc}
, isso morrerá horrivelmente de qualquer maneira.
Você precisa \noexpand
na frente deambosocorrências de \text
, a fim de suprimir sua expansão e obter a versão correta quando \test
for 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}}$};