数学运算符如何指定其极限的水平位置?

数学运算符如何指定其极限的水平位置?

当极限位于积分的上方和下方时(如\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 个数字控制倾斜量,请参阅文档:

pdfmsym 文档

例如:附加以下内容

% ======== 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并手动调整字距。

相关内容