当极限位于积分的上方和下方时(如\int\limits_0^1
),每个极限都放置在正确的水平位置。它们不直接位于彼此的上方和下方。上限位于积分符号的右侧,靠近顶部,下限位于符号的左侧,靠近底部。
这些水平位置是如何指定?
特别是,如果我定义自己的自定义运算符,我该如何指定它的极限应该所在的水平位置?
举一个具体的例子,假设我制作一个看起来像巨大反斜杠的运算符,如\mathchardef\myop="130F
。由于它看起来像反斜杠,我希望上限位于更左边,下限位于更右边。我不希望我的运算符的用户手动定位,我希望它自动工作。
答案1
对于大运算符,TeX (ab) 使用标准度量信息。让我们看看\intop
,它是
\mathchardef\intop="1352
因此我们可以查看以下指标信息cmex10
(CHARACTER O 122
(CHARWD R 0.472223)
(CHARDP R 1.111122)
(CHARIC R 0.194446)
(NEXTLARGER O 132)
)
(CHARACTER O 132
(CHARWD R 0.555557)
(CHARDP R 2.222246)
(CHARIC R 0.444446)
)
因为十六进制"52
是八进制`122
。如您所见,显示样式积分符号的斜体校正相当大。这用于在\nolimits
和的\limits
情况下放置极限(参见 TeXbook 中的附录 G)。
对于你的操作员,我们需要以某种方式模拟行为。只需\myop\limits_{a}^{b}
生成
所以我们需要左右移动限制。
概念证明。
\documentclass{article}
\DeclareMathSymbol{\myopsymbol}{\mathop}{largesymbols}{"0F}
\NewDocumentCommand{\myop}{t\limits e{_^}}{%
\IfBooleanTF{#1}{\myoplimits{#2}{#3}}{\myopnolimits{#2}{#3}}%
}
\makeatletter
\newcommand{\myoplimits}[2]{%
\begingroup
\sbox\z@{$\m@th\displaystyle\myopsymbol$}%
\myopsymbol\limits
\IfValueT{#1}{_{\,\kern0.5\wd\z@#1}}%
\IfValueT{#2}{^{#2\kern0.5\wd\z@\,}}%
\endgroup
}
\newcommand{\myopnolimits}[2]{%
\begingroup
\sbox\z@{$\m@th\displaystyle\myopsymbol$}%
\myopsymbol\nolimits
\IfValueT{#1}{_{#1}}%
\IfValueT{#2}{^{\kern-0.5\wd\z@\!#2}}%
\endgroup
}
\makeatother
\begin{document}
\[
\myop\limits_{a}^b \qquad \myop_{a}^{b}
\]
\end{document}
答案2
有新包裹pdfmsym
可以解决这个问题。(我是从作者的回答。
(请注意,它不是 LaTeX 包,因此请使用\input
而不是\usepackage
。)
\documentclass{article}
\makeatletter
\input pdfmsym
\pdfmsymsetscalefactor{\f@size} % specify font size. Alternatively \pdfmsymsetscalefactor{10}
\DeclareMathSymbol{\myopsymbol}{\mathop}{largesymbols}{"0F}
\newcommand\myopb{%
\@skewedlim@op{\myopsymbol}{10}{-1}{10}{-12}{10}{-1}\nolimits
}
这 6 个数字控制倾斜量,请参阅文档:
例如:附加以下内容
% ======== egreg's code below ========
\NewDocumentCommand{\myop}{t\limits e{_^}}{%
\IfBooleanTF{#1}{\myoplimits{#2}{#3}}{\myopnolimits{#2}{#3}}%
}
\newcommand{\myoplimits}[2]{%
\begingroup
\sbox\z@{$\m@th\displaystyle\myopsymbol$}%
\myopsymbol\limits
\IfValueT{#1}{_{\,\kern0.5\wd\z@#1}}%
\IfValueT{#2}{^{#2\kern0.5\wd\z@\,}}%
\endgroup
}
\newcommand{\myopnolimits}[2]{%
\begingroup
\sbox\z@{$\m@th\displaystyle\myopsymbol$}%
\myopsymbol\nolimits
\IfValueT{#1}{_{#1}}%
\IfValueT{#2}{^{\kern-0.5\wd\z@\!#2}}%
\endgroup
}
\makeatother
\begin{document}
egreg's version:
\[
\myop\limits_{a}^b f(x) dx
\myop_{a}^{b} f(x) dx
\]
pdfmsym version:
\[
\myopb\limits_a^b f(x) dx
\myopb_a^b f(x) dx
\]
\end{document}
结果:
不可否认,上标/下标的字距调整并不完全正确\textstyle
(但 egreg 的答案中也不正确),读者可以尝试使用\mathchoice
并手动调整字距。