当使用可变大小运算符(例如\prod
、\sum
、\bigcup
和\bigcap
)时,它们的大小通常不太可预测,这让我很恼火。我只想让它们的大小在整个文档中固定,例如,与 的垂直大小相同X_{1}^{1}
。
我尝试重新定义\prod
使用\renewcommand
和尺度因子包裹:
\renewcommand{\prod}{{\scalerel*{\prod}{X_{1}^{1}}}}
但它会引发一个错误:
TeX capacity exceeded, sorry [grouping levels=255]. \prod
应该允许使用\limits
在显示模式下对符号的顶部和底部进行限制。
您对这个问题有何评论?
编辑:
我准备了一个例子来说明这个问题:
\documentclass{article}
\usepackage{amsmath}
\usepackage{scalerel}
\newcommand{\set}[2]{\left\{{#1}~\middle|~{#2}\right\}}
\begin{document}
\begin{equation*}
\prod_{\alpha \in A} X_{\alpha}
=
\set{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}
\end{equation*}
\begin{equation*}
\begin{array}{r@{~}l}
\prod_{\alpha \in A} X_{\alpha}
&=
\set{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}\\
&=
\set{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}
\end{array}
\end{equation*}
The above two equations show the inconsistent sizing of operators.
\newcommand{\prode}{\mathop{\scalerel*{\prod}{X_{1}^{1}}}}
\newcommand{\bigcupe}{\mathop{\scalerel*{\bigcup}{X_{1}^{1}}}}
The desired result is
\begin{equation*}
\begin{array}{r@{~}l}
\prode\limits_{\alpha \in A} X_{\alpha}
=
\set{x \in A\to \bigcupe\limits_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}
\end{array}
\end{equation*}
\end{document}
在最后一个等式中,我定义了\prode
和\bigcupe
。但我只想更新\prod
和\bigcup
。我认为错误是由无限循环引起的。
找到解决方案:
我通过使用\let
发现解决了这个问题我可以重新定义一个命令来包含它自己吗?
\let\oldprod\prod
\renewcommand{\prod}{\mathop{\scalerel*{\oldprod}{X_{1}^{1}}}}
\let\oldbigcup\bigcup
\renewcommand{\bigcup}{\mathop{\scalerel*{\oldbigcup}{X_{1}^{1}}}}
谢谢你!
答案1
尺寸是是可以预测的,并且它遵循印刷传统。
无论如何,这里有一种方法可以将显示样式的尺寸减小到与文本样式相同的尺寸。
我利用这样一个事实:大操作符以统一的方式定义amsmath
,使用一个通用模板,并且操作\xyz
符在内部引用\xyz@
。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\reduceoperators}{m}
{
\clist_map_function:nN { #1 } \hermis_reduceoperator:n
}
\cs_new_protected:Nn \hermis_reduceoperator:n
{
\cs_set_eq:cc { latex@#1@ } { #1@ }
\cs_set_protected:cpx { #1@ }
{
\mathop
{
\mathchoice
{\textstyle\use:c{latex@#1@}}
{\use:c{latex@#1@}}
{\use:c{latex@#1@}}
{\use:c{latex@#1@}}
}
}
}
\ExplSyntaxOff
\reduceoperators{sum,prod,bigcup,bigcap}
\begin{document}
\begin{gather*}
\tag{samples}
\sum\prod\bigcup\bigcap
\\[4ex]
\tag{good}
\prod_{\alpha \in A} X_{\alpha} =
\bigl\{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}
\bigm| \forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}\bigr\}
\\
\tag{bad}
\prod_{\alpha \in A} X_{\alpha} =
\Bigl\{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}
\Bigm| \forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}\Bigr\}
\\
\tag{ugly}
\prod_{\alpha \in A} X_{\alpha} =
\left\{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}
\;\middle|\; \forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}\right\}
\end{gather*}
\end{document}
这个想法是将 的含义保存\sum@
到 中\latex@sum
,然后重新定义\sum@
为
\mathop\mathchoice{\textstyle\latex@sum@}{\latex@sum@}{\latex@sum@}{\latex@sum@}
因此在显示样式中我们实际上使用的是\textstyle
版本。借助expl3
技巧,我们可以一次性完成所有需要的重新定义,而无需重复代码。
我也借此机会说明一下您对\set
with\left
和的定义\right
并不好。对于表达式,您有\big
size is more than enough: already \Big
size is too much。
答案2
上述两个方程表明运算符的大小不一致。
这种不一致是由于误用了array
环境,该环境不是为显示方程式而设计的,而是为排版矩阵而设计的:它以 textstyle 而不是 displaystyle 来设置其内容。
如果使用显示对齐,则操作员将使用一致的样式。
但是这里的分隔符太大了。您可以修改 set 命令以采用可选的大小。
\documentclass{article}
\usepackage{mathtools}
\newcommand{\set}[3][]{\mathopen{#1\{}{#2}~#1|~{#3}\mathclose{#1\}}}
\begin{document}
\begin{equation*}
\prod_{\alpha \in A} X_{\alpha}
=
\set[\Big]{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}
\end{equation*}
\begin{equation*}
\begin{aligned}
\prod_{\alpha \in A} X_{\alpha}
&=
\set[\Big]{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}\\
&=
\set[\Big]{x \in A\to \bigcup_{\alpha\in A} X_{\alpha}}{\forall \alpha \in A: x_{\alpha} = x(\alpha) \in X_{\alpha}}
\end{aligned}
\end{equation*}
\end{document}