我想\Huge
以某种方式实现尺寸调整函数,使它们在数学模式下也能工作。本质上,我想创建一个myHuge
映射到的{foo \myHuge bar}
命令,{foo \mbox{\Huge $bar$}}
以便尺寸调整命令处于文本模式,而其他所有命令仍处于数学模式。
这里的问题是,为了一致性,我想使用与文本模式大小调整命令相同的语法,即将命令应用于当前组末尾的所有内容。这个答案给了我一个想法,即如何\afterassignment
结合使用并赋值给 token 寄存器来实现这一点。但出于某种原因,这不能很好地与以下情况配合使用\frac
:
\documentclass[10pt]{article}
\usepackage{amsmath}
\newtoks\myToks
\def\myHuge{\afterassignment\myHugeDo\myToks=\bgroup\Huge$}
\def\myHugeDo{\bgroup\mbox{\the\myToks$\egroup}\egroup}
\begin{document}
This works: $a + {b \myHuge c} + d$ \\
This does not: $\frac{\myHuge x}{y}$ \\
This however does: $\frac{{\myHuge x}}{y}$
\end{document}
\bgroup…\egroup
我甚至在 的定义中加入了 的外层,\myHugeDo
试图让第二个示例的行为与第三个示例相似,但显然问题不在这里。使用{…}
并不能改善情况。我收到的消息是这样的:
! Missing $ inserted.
<inserted text>
$
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Missing } inserted.
<inserted text>
}
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Missing } inserted.
<inserted text>
}
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Missing } inserted.
<inserted text>
}
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Too many }'s.
<argument> \the \myToks $\egroup
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Too many }'s.
\mbox #1->\leavevmode \hbox {#1}
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Too many }'s.
\myHugeDo ...mbox {\the \myToks $\egroup }\egroup
l.9 This does not: $\frac{\myHuge x}{y}
$ \\
! Missing $ inserted.
<inserted text>
$
l.10 This however does: $\frac{{\myHuge x}}{y}
$
! Extra }, or forgotten $.
\frac #1#2->{\begingroup #1\endgroup \@@over #2}
l.10 This however does: $\frac{{\myHuge x}}{y}
$
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./t.aux) )
(\end occurred inside a group at level 1)
### simple group (level 1) entered at line 10 ({)
### bottom level
我该如何解决这个问题?我是否应该考虑其他方法?
答案1
在 LaTeX 的早期,{\rm foo}
数学模式中使用了类似的语法,现在这\mathrm{foo}
是正确的语法。
随着 1994 年 LaTeX2e 的发布,此类命令默认被禁用。出于兼容性原因,它们仍可与标准类一起使用,但不应在较新的文档中使用。
做出这种选择的原因有几个:例如,更清晰地划分用不同字体排版的内容。
大小更改命令仍然以声明的形式出现这一事实无关紧要。应避免在段落中间更改字体大小;字体大小更改命令的常见位置是在环境定义中。但是,在某些情况下,例如标题页,{\Large text\par}
可能会出现类似的事情,但这种情况很少见。
如果您确实想在数学中使用更大的字母,您可以轻松定义如下命令\mathHuge
:
\newcommand{\mathHuge}[1]{\mbox{\Huge$#1$}}
它不会受到您在 中的定义中看到的问题的影响\frac
。
为什么它在 中不起作用?这是LaTeX 中\frac
的定义:\frac
% latex.ltx, line 4355:
\def\frac#1#2{{\begingroup#1\endgroup\over#2}}
并且在本质上也是一样的amsmath
。
当你这样做时会发生什么\frac{\myHuge a}{b}
?你会得到
{\begingroup\myHuge a\endgroup\over b}
和{
被\begingroup
执行,这意味着打开相应的组类型,然后\myHuge
被展开,导致
\afterassignment\myHugeDo\myToks=\bgroup\Huge$a\endgroup\over b}
OK,\myHugeDo
被搁置并\myToks
启动;由于一个令牌寄存器分配必须以显式括号结尾,寄存器将加载
\Huge$a\endgroup\over b
由于任务已经完成,\myHugeDo
因此展开,产生
\bgroup\mbox{\the\myToks$\egroup}\egroup
开始另一组,然后用
\mbox{\Huge$a\endgroup\over b$\egroup}
这就是问题所在。
的定义\mbox
是\leavevmode\hbox{#1}
,所以我们得到
\leavevmode\hbox{\Huge$a\endgroup\over b$\egroup}
您会发现它\endgroup
位于两个$
标记之间,因此完全不合适。
有出路吗?我看不出有出路。即使有,也不应该推广这种语法。