重大编辑:
在用户 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
为了易读性而重新分组的代码,其中包括:
Foo
代替Set
,\left(
而\right)
不是\left\{
和\right\}
,- 并与水平间距命令
\:
和\;
注释一起。
这足以获得结果的一部分。
缺少的部分如下:
我们如何控制
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
。(毕竟,你真的不想使用任何一个。)这很容易做到,使用xparse
和mleftright
括号周围的空间。\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\}%
}
虽然这显然是糟糕的排版。