![任意 \left\right 分隔符](https://linux22.com/image/313947/%E4%BB%BB%E6%84%8F%20%5Cleft%5Cright%20%E5%88%86%E9%9A%94%E7%AC%A6.png)
是否有一个包可以让我使用除了通常的分隔符和之外的其他符号/() [] {} |
任何\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”)具有这样的字形。因此,按照这些思路进行的方法也是可行的。
不幸的是,.tfm
PS Symbol 字体的文件psyr.tfm
不包含从这些字形构建可扩展符号的必要信息(至少psyr.tfm
我现在可以访问的发行版 TeXLive 2013 中包含的文件是这种情况——我无法在这里解释为什么我目前只能做到这一点)。但是,扩充文件.tfm
以提供缺失的信息并不是什么大问题。当然,另一种方法是使用虚拟字体:这也没什么大不了的,但目前我认为没有必要,因为扩充的文件.tfm
不应妨碍psyr
字体用于其他目的。另一方面, 确实psyr.tfm
没有定义\fontdimen7
,并且加载它(如下所述)会导致在稍后再次加载 时无法摆弄字体参数psyr.tfm
;因此,使用虚拟字体可能是必要的,但目前,我再说一遍,我会把这留待将来可能的增强。
话虽如此,让我们逐步了解如何打印可扩展积分符号!
构建增强psyr.tfm
文件
请注意,这个过程(实际上,是一个稍微更通用的过程,它定义了一个虚拟字体)已经在这个答案。
为了修改.tfm
文件,我们首先需要将其转换为人类可读的形式,然后以这种形式对其进行修改,最后将修改后的文件转换回原来的.tfm
格式。人类可读的形式是属性列表 ( ) 文件;您可以使用命令行实用程序将文件.pl
转换.tfm
为.pl
文件,然后使用 — 猜猜是什么? —程序将文件转换回文件。tftopl
.pl
.tfm
pltotf
那么,让我们开始构建修改后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
必须加载修改后的文件而不是原始文件。如果一切按预期进行,您将获得以下输出:
让我们简单描述一下我们所做的事情。
前三行代码
\makeatletter
定义了一个新的符号字体,名为myExtensibleIntegralSign
,指向该psyr
字体。此字体的系列(或 NFSS 术语中的数学组)编号由 自动分配\DeclareSymbolFont
;在这个特定情况下,事实证明myExtensibleIntegralSign
对应于系列 4,但我们对此完全不关心,因为\DeclareMathDelimiter
它本身“知道”哪个是正确的系列编号。声明
\DeclareMathDelimiter
定义了一个新的分隔符,称为\extenintsign
,可以在 之后以通常的方式使用\left
。\right
请注意,在我们的设置中,分隔符的“大”变体("F3
)永远不会被使用,因为我们在.tfm
文件本身中包含了从“小”变体("F2
)到更大变体(也是可扩展的变体)的信息;因此,指定 的{operators}{0}
最后两个参数\DeclareMathDelimiter
也可以工作(请注意,字体operators
对应于系列 0),但包括指向大且可扩展的变体的指针会使代码更加健壮,以防文件.tfm
缺少此信息。最后,在等式中,我们
\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
。
以下是一些需要进一步说明的内容:
附录 GTeXbook解释了当 Op 原子的原子核由单个字符组成时(这是通常的情况),该原子的极限都会向相反的方向移动,移动量为该字符斜体校正量的一半:参见规则 13a 中的“ 情况
\limits
”和规则 18f 中的“\nolimits
情况”,这与适用于同时具有下标和上标的原子的一般规则相吻合。这确实 不是在我们的例子中,这种情况会发生,因为我们的 Op 原子的核心不是单个字符。我们通过在下标和上标前面分别添加\!
和来弥补这一点。这个简单的修正似乎在和的情况下\,
都效果很好 ,但你可能需要微调字距量。\nolimits
\limits
但是,如果恰好选择了较小的积分符号,这种修正看起来就不够充分,至少在这种
\nolimits
情况下是这样。这个问题应该得到修复。此外,在显示样式中,积分符号的较大(且可扩展)变体不会自动选择,这再次是因为相关 Op 原子的核心不是单个字符(参见规则 13)。这也应该得到纠正。
也许有人(甚至是我自己)会自愿编写一个精心设计的包,使这个可扩展的积分符号可用,并且解决所有这些问题。
但就目前而言,我认为这已经足够了。(:-)