任意 \left\right 分隔符

任意 \left\right 分隔符

是否有一个包可以让我使用除了通常的分隔符和之外的其他符号/() [] {} |任何\left符号\right

例如,\(\left\int f(x) dx \right.\)将调整积分符号的大小以适应的高度f(x)

答案1

正如 Manuel 所言,我的scalerel包是可以使用的。但是,除非在特殊情况下,我不一定推荐这种方法。

\documentclass{article}
\usepackage{scalerel}
\usepackage{mathtools}
\begin{document}
\def\x{\begin{bmatrix*}1&1\\1&1\end{bmatrix*}}
\[{\scalerel*[2.2ex]{\int}{\x}}_{\!\!\!x=0}^{\infty}\x\,dx\]

\def\x{\begin{bmatrix*}1&1&1\\1&1&1\\1&1&1\end{bmatrix*}}
\[{\scalerel*[2.2ex]{\int}{\x}}_{\!\!\!x=0}^{\infty}\x\,dx\]

\def\x{\begin{bmatrix*}1&1&1&1\\1&1&1&1\\1&1&1&1\\1&1&1&1\end{bmatrix*}}
\[{\scalerel*[2.2ex]{\int}{\x}}_{\!\!\!x=0}^{\infty}\x\,dx\]
\end{document}

在此处输入图片描述

尽管上述的使用\scalerel将最大宽度 2.2ex 应用于积分符号,但\stretchrel可以使用宏作为替代,使用可选参数提供最大纵横比(以 % 为单位),例如\stretchrel[250]{}{}


附录:

通过将上述方法与更垂直方向的积分符号相结合(积分符号 $\int...$),人们可能会发现结果看起来不那么令人反感。

\documentclass{article}
\usepackage{scalerel}
\usepackage{mathtools}
\DeclareMathOperator*{\rint}{\ThisStyle{\rotatebox{15}{$\SavedStyle\!\int\!\!\!$}}}
\usepackage{scalerel}
\usepackage{graphicx}
\parskip 1ex

\begin{document}
\def\x{\begin{bmatrix*}1&1\\1&1\end{bmatrix*}}
\[{\scalerel*[4ex]{\rint}{\x}}_{\!x=0}^{\!\infty}\x\,dx\]

\def\x{\begin{bmatrix*}1&1&1\\1&1&1\\1&1&1\end{bmatrix*}}
\[{\scalerel*[4ex]{\rint}{\x}}_{\!\!x=0}^{\!\infty}\x\,dx\]

\def\x{\begin{bmatrix*}1&1&1&1\\1&1&1&1\\1&1&1&1\\1&1&1&1\end{bmatrix*}}
\[{\scalerel*[4ex]{\rint}{\x}}_{\!\!x=0}^{\!\infty}\x\,dx\]
\end{document}

在此处输入图片描述

答案2

昨天我突然想到至少存在一种字体,其中包含用于构建真正可扩展的整数符号的字形:它是 PostScript 符号字体 ( psyr),它在位置 243(八进制 '363,十六进制“F3”)、244(八进制 '364,十六进制“F4”)和 245(八进制 '365,十六进制“F5”)具有这样的字形。因此,按照这些思路进行的方法也是可行的。

不幸的是,.tfmPS Symbol 字体的文件psyr.tfm不包含从这些字形构建可扩展符号的必要信息(至少psyr.tfm我现在可以访问的发行版 TeXLive 2013 中包含的文件是这种情况——我无法在这里解释为什么我目前只能做到这一点)。但是,扩充文件.tfm以提供缺失的信息并不是什么大问题。当然,另一种方法是使用虚拟字体:这也没什么大不了的,但目前我认为没有必要,因为扩充的文件.tfm不应妨碍psyr字体用于其他目的。另一方面, 确实psyr.tfm没有定义\fontdimen7,并且加载它(如下所述)会导致在稍后再次加载 时无法摆弄字体参数psyr.tfm;因此,使用虚拟字体可能是必要的,但目前,我再说一遍,我会把这留待将来可能的增强。

话虽如此,让我们逐步了解如何打印可扩展积分符号!


构建增强psyr.tfm文件

请注意,这个过程(实际上,是一个稍微更通用的过程,它定义了一个虚拟字体)已经在这个答案

为了修改.tfm文件,我们首先需要将其转换为人类可读的形式,然后以这种形式对其进行修改,最后将修改后的文件转换回原来的.tfm格式。人类可读的形式是属性列表 ( ) 文件;您可以使用命令行实用程序将文件.pl转换.tfm.pl文件,然后使用 — 猜猜是什么? —程序将文件转换回文件。tftopl.pl.tfmpltotf

那么,让我们开始构建修改后psyr.tfm的文件。移动到您选择的目录,然后从命令行键入命令:

tftopl psyr.tfm psyr.pl

psyr.pl这将在当前目录中创建可读文件。打开此文件:其前几行应为

(FAMILY SYMBOL)
(CODINGSCHEME FONTSPECIFIC)
(DESIGNSIZE R 10.0)
(COMMENT DESIGNSIZE IS IN POINTS)
(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)
(CHECKSUM O 16264261360)
(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.25)
   (STRETCH R 0.3)
   (SHRINK R 0.1)
   (XHEIGHT R 0.4)
   (QUAD R 1.0)
   )
(CHARACTER O 40
   (CHARWD R 0.25)
   )

等等。首先,因为我们要修改文件,所以最好删除以下行:这样当我们将文件转换回格式(CHECKSUM O 16264261360)时,将重新计算校验和。.tfm

接下来,让我们开始编写补丁。转到 的定义CHARACTER O 362,即以下几行:

(CHARACTER O 362
   (CHARWD R 0.274)
   (CHARHT R 0.904)
   (CHARDP R 0.104)
   (CHARIC R 0.017)
   )

修改这些行,在下面添加另一行(CHARIC R 0.017),使字符 '362(八进制)的整个定义变为

(CHARACTER O 362
   (CHARWD R 0.274)
   (CHARHT R 0.904)
   (CHARDP R 0.104)
   (CHARIC R 0.017)
   (NEXTLARGER O 363)
   )

(我们添加了行(NEXTLARGER O 363))。实际上,这一步并不是真正必要的(见下文),但我更喜欢向字体本身添加冗余信息。现在移至下一个字符,其原始定义是

(CHARACTER O 363
   (CHARWD R 0.686)
   (CHARHT R 0.904)
   (CHARDP R 0.084)
   (CHARIC R 0.029)
   )

修改它,使其变成

(CHARACTER O 363
   (CHARWD R 0.686)
   (CHARHT R 0.904)
   (CHARDP R 0.084)
   (CHARIC R 0.029)
   (VARCHAR
      (TOP O 363)
      (BOT O 365)
      (REP O 364)
      )
   )

(添加了五行)。这一变化告诉 TeX 如何从字体的第 243、244 和 245 个槽(十进制)中包含的字形构建可扩展的整数符号;这个可扩展字符通常分配给第 243 个槽本身。

就这样:保存修改后的psyr.pl文件(当然,始终保存在你当前的私人目录中!)并将其转换回文件.tfm;比如

pltotf psyr.pl psyr.tfm

这样增强文件psyr.tfm也会保存在当前目录中。此增强文件应放置在文件系统中优先于原始psyr.tfm文件的位置:一种可能性是将其放置在您要编译的文件旁边(即,在同一目录中).tex。另一个选择是您的本地 texmf 树,但请记住,如果您这样做,修改后的psyr.tfm文件将用于全部您的文档恰好使用符号字体,这可能会产生问题:我建议选择这个仅有的如果您切换到采用虚拟字体的解决方案。


在 TeX 中定义新的分隔符

构建的这一部分很简单,因为 NFSS 为您提供了所有必要的工具。您只需模仿以下 MWE 即可:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}

\makeatletter

\DeclareFontFamily{U}{psy}{\hyphenchar\font \m@ne}
\DeclareFontShape{U}{psy}{m}{n}{<-> psyr }{}
\DeclareSymbolFont{myExtensibleIntegralSign}{U}{psy}{m}{n}
\DeclareMathDelimiter{\extenintsign}{\mathop}
    {myExtensibleIntegralSign}{"F2}
    {myExtensibleIntegralSign}{"F3} % also "{operators}{0}" would work

\makeatother



\begin{document}

Text before.
\[
    \left\extenintsign
        \begin{pmatrix}
            a & b & c & d  \\
            e & f & g & h  \\
            i & j & k & l  \\
            m & n & o & p  \\ 
        \end{pmatrix}
    \right.
    dt
\]
Text after.

\end{document}

请记住,为了使此操作有效,psyr.tfm必须加载修改后的文件而不是原始文件。如果一切按预期进行,您将获得以下输出:

第一个代码示例的输出

让我们简单描述一下我们所做的事情。

  1. 前三行代码\makeatletter定义了一个新的符号字体,名为myExtensibleIntegralSign,指向该 psyr字体。此字体的系列(或 NFSS 术语中的数学组)编号由 自动分配 \DeclareSymbolFont;在这个特定情况下,事实证明 myExtensibleIntegralSign对应于系列 4,但我们对此完全不关心,因为\DeclareMathDelimiter它本身“知道”哪个是正确的系列编号。

  2. 声明\DeclareMathDelimiter定义了一个新的分隔符,称为\extenintsign,可以在 之后以通常的方式使用\left\right 请注意,在我们的设置中,分隔符的“大”变体("F3)永远不会被使用,因为我们在 .tfm文件本身中包含了从“小”变体("F2)到更大变体(也是可扩展的变体)的信息;因此,指定 的{operators}{0}最后两个参数 \DeclareMathDelimiter也可以工作(请注意,字体operators 对应于系列 0),但包括指向大且可扩展的变体的指针会使代码更加健壮,以防文件.tfm缺少此信息。

  3. 最后,在等式中,我们\extenintsign 在普通的\left/\right结构中使用了全新的分隔符。请告诉我——在说了这么多废话之后——它看起来至少像一点点比史蒂文拉长的积分符号好多了!(:-)


添加限制

剩下的就是将积分极限添加到我们的可扩展积分符号中。考虑到以下两种不幸的情况,这并非易事:

  • TeX 将数学列表内的记录\left\right分隔符称为“边界项”;但边界项不是原子,因此它本身不能携带下标或上标。

  • 另一方面,Op 原子最多可以对应两个打印符号,即用于非显示样式的小变体和用于显示样式的大变体。TeX 没有提供考虑以下子公式的大小的规定(两种大小之间的选择完全基于当前样式),也没有提供使 Op 原子的大小随之增长的规定;只需考虑这样一个事实:也没有提供任何语法规定来确定这样的子公式将在何处结束。

这意味着我们必须采取某种手段。以下是其中一种可能性(这是一个完整的、可编译的示例):

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}

\makeatletter

\DeclareFontFamily{U}{psy}{\hyphenchar\font \m@ne}
\DeclareFontShape{U}{psy}{m}{n}{<-> psyr }{}
\DeclareSymbolFont{myExtensibleIntegralSign}{U}{psy}{m}{n}
\DeclareMathDelimiter{\extenintsign}{\mathop}
    {myExtensibleIntegralSign}{"F2}
    {myExtensibleIntegralSign}{"F3} % also "{operators}{0}" would work

\newcommand*\extenint[3]{\mathpalette\@extenint{{#1}{#2}{#3}}}
\newcommand*\@extenint[2]{\@@extenint#1#2}
\newcommand*\@@extenint[4]{%
    \mathop{\hbox{$#1\left\extenintsign\vphantom{#4}\right.\n@space$}}%
        \ilimits@ % honor amsmath.sty
        \ifx\@empty#2\@empty\else _{\!#2}\fi
        \ifx\@empty#3\@empty\else ^{\,#3}\fi
    #4
}
% We define the following two commands for testing purposes only:
\newcommand*\forcelimits  {\let \ilimits@ \limits  }
\newcommand*\forcenolimits{\let \ilimits@ \nolimits}

\makeatother



\begin{document}

With one row:
\begin{align*}
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            a & b & c & d  \\
        \end{pmatrix}}
    dt
    && \forcelimits
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            a & b & c & d  \\
        \end{pmatrix}}
    dt
\end{align*}

With two rows:
\begin{align*}
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            a & b & c & d  \\
            e & f & g & h  \\
        \end{pmatrix}}
    dt
    && \forcelimits
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            e & f & g & h  \\
            a & b & c & d  \\
        \end{pmatrix}}
    dt
\end{align*}

With four rows:
\begin{align*}
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            a & b & c & d  \\
            e & f & g & h  \\
            i & j & k & l  \\
            m & n & o & p  \\ 
        \end{pmatrix}}
    dt
    && \forcelimits
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            e & f & g & h  \\
            a & b & c & d  \\
            i & j & k & l  \\
            m & n & o & p  \\ 
        \end{pmatrix}}
    dt
\end{align*}

With six rows:
\begin{align*}
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            a & b & c & d  \\
            e & f & g & h  \\
            i & j & k & l  \\
            m & n & o & p  \\ 
            q & r & s & t  \\ 
            u & v & w & x  \\ 
        \end{pmatrix}}
    dt
    && \forcelimits
    \extenint{-\infty}{+\infty}
        {\begin{pmatrix}
            e & f & g & h  \\
            a & b & c & d  \\
            i & j & k & l  \\
            m & n & o & p  \\ 
            q & r & s & t  \\ 
            u & v & w & x  \\ 
        \end{pmatrix}}
    dt
\end{align*}

However, this does not look good:
\begin{align*}
    \extenint{-\infty}{+\infty}{dt}
    && \forcelimits
    \extenint{-\infty}{+\infty}{dt}
\end{align*}
(I mean, at least the left alternative: the right one could still look
acceptable).  Indeed, comparison with the ``normal'' integral
\begin{align*}
    \int_{-\infty}^{+\infty} dt
    && \forcelimits
    \int_{-\infty}^{+\infty} dt
\end{align*}
shows that, in display size, \verb|\extenint| is too small.

\end{document}

再次,psyr.tfm必须加载“正确”的文件;如果是这样,输出将如下所示:

第二个代码示例的输出

如您所见,我们定义了该\extenint命令,它有三个参数:积分下限、积分上限和被积函数——或者至少是积分符号应符合其大小的部分。此命令将积分符号排版为适当的大小和指定的限制,以及被积函数本身(的一部分)。请注意,使用此构造,无法添加\limits\nolimits\displaylimits添加到积分符号;但是,由于我们已经加载了数学包,我们确实尊重其\ilimits@在定义命令的代码中的定义\extenint

以下是一些需要进一步说明的内容:

  1. 附录 GTeXbook解释了当 Op 原子的原子核由单个字符组成时(这是通常的情况),该原子的极限都会向相反的方向移动,移动量为该字符斜体校正量的一半:参见规则 13a 中的“ 情况\limits”和规则 18f 中的“\nolimits情况”,这与适用于同时具有下标和上标的原子的一般规则相吻合。这确实 不是在我们的例子中,这种情况会发生,因为我们的 Op 原子的核心不是单个字符。我们通过在下标和上标前面分别添加\!和来弥补这一点。这个简单的修正似乎在和的情况下\, 都效果很好 ,但你可能需要微调字距量。\nolimits\limits

  2. 但是,如果恰好选择了较小的积分符号,这种修正看起来就不够充分,至少在这种\nolimits 情况下是这样。这个问题应该得到修复。

  3. 此外,在显示样式中,积分符号的较大(且可扩展)变体不会自动选择,这再次是因为相关 Op 原子的核心不是单个字符(参见规则 13)。这也应该得到纠正。

也许有人(甚至是我自己)会自愿编写一个精心设计的包,使这个可扩展的积分符号可用,并且解决所有这些问题。

但就目前而言,我认为这已经足够了。(:-)

相关内容