使用标记分配进行伪数学大小调整

使用标记分配进行伪数学大小调整

我想\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位于两个$标记之间,因此完全不合适。

有出路吗?我看不出有出路。即使有,也不应该推广这种语法。

相关内容