内部的数学\text
丢失了它在下标内部的信息$X_{a+b,\text{\ensuremath{a+b}}}$
。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
$X_{a+b,\text{\ensuremath{a+b}}}$
\end{document}
我想找到不同的方法来“解决”这个问题。
背景:这是我的 mhchem 包。目前我想不出有什么突出的用例。它更像是一个“使其一致”的功能。
例如,如果您\ce{H2O}
在文本模式下使用,那么我的包将使用当前文本字体正确排版,因此它在标题和目录中看起来也不错。它基本上使用数学模式和一些\text
s。我让用户可以自由地在他们希望的任何地方插入数学,他们甚至可以写类似\ce{NO_{2n + $\sum_i x_i + y_i$}
或其他内容。我不得不选择这样一个奇怪的例子,因为所有合理的表达式(n、2n、2n+1)都已经得到特殊处理。但是,我仍然希望允许任何数学表达式在那里,无论多么奇怪和嵌套。
答案1
宏\text
确实丢失了它在下标或上标中使用的信息。
这是一个可能的补丁,但使用不同的宏可能更好。如果您打算在您的包中使用它,则应警告用户它与\text
定义的标准命令的区别amsmath
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xpatch}
\makeatletter
\newcommand{\remove@spaces}{%
\thickmuskip=0mu
\medmuskip=0mu
}
\xpatchcmd{\text@}
{\textdef@\textstyle\sf@size}
{\textdef@{\textstyle\remove@spaces}\sf@size}
{}{}
\xpatchcmd{\text@}
{\textdef@\textstyle\ssf@size}
{\textdef@{\textstyle\remove@spaces}\ssf@size}
{}{}
\makeatletter
\begin{document}
$X_{a+b<c\sin x,\text{text $a+b<c\sin x$}}$
$\displaystyle x+\text{text $a+b<c\sin x$}$
$x+\text{text $a+b<c\sin x$}$
\end{document}
如果你想定义一个新命令,比如说\ttext
,你可以这样做(\usepackage{amsmath}
当然是用)
\makeatletter
\newcommand{\remove@spaces}{%
\thickmuskip=0mu
\medmuskip=0mu
}
\DeclareRobustCommand{\ttext}{%
\ifmmode\expandafter\ttext@\else\expandafter\mbox\fi}
\def\ttext@#1{{\mathchoice
{\textdef@\displaystyle\f@size{#1}}%
{\textdef@\textstyle\f@size{\firstchoice@false #1}}%
{\textdef@{\textstyle\remove@spaces}\sf@size{\firstchoice@false #1}}%
{\textdef@{\textstyle\remove@spaces}\ssf@size{\firstchoice@false #1}}%
\check@mathfonts
}%
}
\makeatother
这\mathchoice
仅调用一次。
答案2
与 egreg 的答案方法相同。但形式更适合我的想法。(我创建它是为了看看我对 egreg 解决方案的理解是否正确。)
\documentclass{article}
\usepackage{amsmath}
\newcommand\ttext[1]{\mathchoice%
{\text{#1}}%
{\text{#1}}%
{\thickmuskip=0mu\medmuskip=0mu\text{#1}}%
{\thickmuskip=0mu\medmuskip=0mu\text{#1}}}
\begin{document}
$X_{a+b<c\sin x,\ttext{text $a+b<c\sin x$}},a+b<c$
$\displaystyle x+\ttext{text $a+b<c\sin x$}$
$x+\ttext{text $a+b<c\sin x$}$
\end{document}