修改 brackett 包,控制文本和括号之间的间距

修改 brackett 包,控制文本和括号之间的间距

重大编辑: 在用户 egreg 和 schtandard 的评论的启发下,我找到了解决我原来问题的方法。现在问题略有变化,但仍然是关于文本和括号与页面之间的控制braket


正如问题标题所示,我想修改包布拉克特(链接中的整个.sty文件相当小)来控制括号和文本之间的空间。

这个问题是我上一个问题的后续:修改 brackett 包以适应不同的括号形式

因此,我的想法是,我想调整这个sty文件,使其与其他括号一起工作(如上一个问题),并为所有这些新括号提供不同的间距。如果你想知道为什么我要修改braket而不是编写自己的宏,原因是这样做远远超出了我的水平(考虑到这个问题的水平,这并不奇怪)

这是我想要在sty文件中获取内容的一个例子。

\documentclass{article}
\usepackage{braket}

\begin{document}
$\Set { a | b }$
$A \Foo { \hspace{-0.1cm} a \hspace{-0.1cm}| \hspace{-0.1cm}b \hspace{-0.1cm} }$

\end{document}

我们可以调用\Foo与第二行相对应的命令,它应该类似于 A(a|b)。

braket为了得到我想要的结果,应该按如下方式修改该行:

{\catcode`\|=\active
  \xdef\Foo{\protect\expandafter\noexpand\csname Foo \endcsname}
  \expandafter\gdef\csname Foo \endcsname#1{\mathinner
        {\lbrace\,{\mathcode`\|32768\let|\midvert #1}\,\rbrace}}
  \xdef\Foo{\protect\expandafter\noexpand\csname Foo \endcsname}
  \expandafter\gdef\csname Foo \endcsname#1{\left(
    %
        \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi
        %\:
        {\let\|\FooDoubleVert
        \mathcode`\|32768\let|\FooVert
        #1}
        %\:
        \right)}
}

\def\midvert{\egroup\mid\bgroup}
\def\FooVert{\@ifnextchar|{\|\@gobble}% turn || into \|
        {\egroup
        %\;
        \mid@vertical
        %\;
        \bgroup}}
\def\FooDoubleVert{\egroup
    %\;
    \mid@dblvertical
    %\;
    \bgroup}

上面的代码只不过是braket为了易读性而重新分组的代码,其中包括:

  1. Foo代替Set
  2. \left(\right)不是\left\{\right\}
  3. 并与水平间距命令\:\;注释一起。

这足以获得结果的一部分。

缺少的部分如下:

我们如何控制braket代码行中A \Foo { a | b }字母“A”和括号“(”之间的空格?

这里有两个命令示例,应创建这些命令 braket才能实现以下输出。

% Command Fou
$A \hspace{3cm} \Set { \hspace{3cm} a \hspace{-0.1cm} | \hspace{-0.05cm} b \hspace{5cm} }$

%Command Fouo
$A \hspace{-0.05cm} \Set { \hspace{-0.05cm} a \hspace{-0.1cm} | \hspace{-0.1cm} b \hspace{-0.05cm} }$

任何帮助都将不胜感激!

答案1

您的问题对我来说仍然不是完全清楚,但我尝试回答一下:

  • 虽然删除所有这些空格的决定是相当值得怀疑的,但如果你想这样做,我认为最好只是编写一个新命令,而不是修改定义braket。(毕竟,你真的不想使用任何一个。)这很容易做到,使用xparsemleftright括号周围的空间。

    \documentclass{article}
    
    \usepackage{xparse}
    \usepackage{mleftright}
    
    \NewDocumentCommand\kolmin{ O{0mu} O{#1} m }{%
      \mleft\{ \mkern #1\relax #3 \mkern #2\relax \mright\}
    }
    
    \begin{document}
    
    \(X \kolmin{a|b} X\)
    
    \(X \kolmin[10mu]{a|b} X\)
    
    \(X \kolmin[10mu][5mu]{a|b} X\)
    
    \end{document}
    
  • 你得到的错误\spacefactor是由于你忘记\makeatletter在定义之前使用。请参阅这个问题寻求解释。
  • 既然你指出宏定义“超出你的理解范围”,如果你对 TeX 中宏扩展的工作原理感兴趣,但又不太深入的描述本博客系列可能是一个很好的起点。(如果有人知道现场的好答案,请随意评论。)

关于您更新的请求,您当然可以定义一个宏,例如

\NewDocumentCommand\Fou{ m m }{%
  \hspace{3cm} \Set { \hspace{3cm} #1 \hspace{-0.1cm} | \hspace{-0.05cm} #2 \hspace{5cm} }
}

来获取您指定的输出,但对我来说这似乎是一种倒退的方法。更简单、更干净的方法是不使用braket,如上所示,并根据自己的喜好调整间距,例如

\NewDocumentCommand\Fou{ m m }{%
  \mskip 150mu\relax\mleft\{ \mkern 150mu\relax #1 \middle| \mkern 5mu\relax #2 \mkern 200mu\relax \mright\}%
}

虽然这显然是糟糕的排版。

相关内容