这个问题与我之前的 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
时,它会保持不变;然后条件被扩展,并且由于 TeX 不在数学模式中,您会得到,它变成let
\protect
\relax
\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}}$};