我想将希尔伯特-施密特积排版为希尔伯特空间括号的刘维尔等价物,并使用双倍分隔符,如下所示:\Lbraket{\rho|\rho}
结果为<<rho|rho>>
。
\Braket
我试图适应布拉克特包来执行此操作,最终得到以下代码:
{\catcode`\|=\active
\xdef\Lbraket{\protect\expandafter\noexpand\csname Lbraket \endcsname}
\expandafter\gdef\csname Lbraket \endcsname#1{\begingroup
\ifx\SavedDoubleVert\relax
\let\SavedDoubleVert\|\let\|\BraDoubleVert
\fi
\mathcode`\|32768\let|\BraVert
\left\langle\kern-0.2em\left\langle{#1}\right\rangle\kern-0.2em\right\rangle\endgroup}
}
\def\BraVert{\@ifnextchar|{\|\@gobble}% turn || into \|
{\egroup\,\mid@vertical\,\bgroup}}
\def\BraDoubleVert{\egroup\,\mid@dblvertical\,\bgroup}
\let\SavedDoubleVert\relax
\begingroup
\edef\@tempa{\meaning\middle}
\edef\@tempb{\string\middle}
\expandafter \endgroup \ifx\@tempa\@tempb
\def\mid@vertical{\middle|}
\def\mid@dblvertical{\middle\SavedDoubleVert}
\else
\def\mid@vertical{\mskip1mu\vrule\mskip1mu}
\def\mid@dblvertical{\mskip1mu\vrule\mskip2.5mu\vrule\mskip1mu}
\fi
这是可行的,但是对于非常大的公式,双分隔符不够紧密,并且负字距应该更大。
另一方面,我发现一些代码允许定义双分隔符,并且似乎没有遇到同样的问题。以下是来自
新闻组发帖,它定义\lleft
和\rright
以便例如
\lleft\langle
导致<<
。
\catcode`@=11
\def\lleft#1#2\rright{\begingroup%
\def\ts@r{\nulldelimiterspace=0pt \mathsurround=0pt}%
\let\@hat=#1%
\def\sht@im{#2}%
\def\@t{{\mathchoice{\def\@fen{\displaystyle}\k@fel}%
{\def\@fen{\textstyle}\k@fel}%
{\def\@fen{\scriptstyle}\k@fel}%
{\def\@fen{\scriptscriptstyle}\k@fel}}}%
\def\g@rin{\ts@r\left\@hat\vphantom{\sht@im}\right.}%
\def\k@fel{\setbox0=\hbox{$\@fen\g@rin$}\hbox{%
$\@fen \kern.3875\wd0 \copy0 \kern-.3875\wd0%
\llap{\copy0}\kern.3875\wd0$}}%
\def\pt@h{\mathopen\@t}\pt@h\sht@im%
\rright}%
\def\rright#1{\let\@hat=#1%
\def\st@m{\mathclose\@t}%
\st@m\endgroup}
\catcode`@=12
我的问题是,是否有办法将两个代码片段组合起来,以获得具有双倍分隔符的正确调整大小的 Braket。简单地执行以下操作不起作用:
{\catcode`\|=\active
\xdef\LBraket{\protect\expandafter\noexpand\csname LBraket \endcsname}
\expandafter\gdef\csname LBraket \endcsname#1{\begingroup
\ifx\SavedDoubleVert\relax
\let\SavedDoubleVert\|\let\|\BraDoubleVert
\fi
\mathcode`\|32768\let|\BraVert
\lleft\langle{#1}\rright\rangle\endgroup}
}
这会导致出现错误消息:
! Extra \middle.
\mid@vertical ->\middle |
我对低级 TeX 的了解还远远不足以理解\lleft
和\rright
工作的实现方式,但也许有人知道这两个片段是否可以结合起来。
答案1
修改非常巧妙的\lleft
宏可以做到
\documentclass[a4paper]{article}
\makeatletter
\def\LBlleft#1#2|#3\LBrright{\begingroup
\def\ts@r{\nulldelimiterspace=0pt \mathsurround=0pt}%
\let\@hat=#1%
\def\sht@im{\ts@r\left.#2\nonscript\;\middle|\nonscript\;#3\right.}%
\def\@t{{\mathchoice{\def\@fen{\displaystyle}\k@fel}%
{\def\@fen{\textstyle}\k@fel}%
{\def\@fen{\scriptstyle}\k@fel}%
{\def\@fen{\scriptscriptstyle}\k@fel}}}%
\def\g@rin{\ts@r\left\@hat\vphantom{\sht@im}\right.}%
\def\k@fel{\setbox0=\hbox{$\@fen\g@rin$}\hbox{%
$\@fen \kern.3875\wd0 \copy0 \kern-.3875\wd0
\llap{\copy0}\kern.3875\wd0$}}%
\def\pt@h{\mathopen\@t}\pt@h\sht@im
\LBrright}%
\def\LBrright#1{\let\@hat=#1%
\def\st@m{\mathclose\@t}%
\st@m\endgroup}
\DeclareRobustCommand\LBraket[1]{\LBlleft<#1\LBrright>}
\makeatother
\begin{document}
$\displaystyle\LBraket{\frac{a}{b}|b}$
$\textstyle\LBraket{\frac{a}{b}|b}$
$\scriptstyle\LBraket{\frac{a}{b}|b}$
$\scriptscriptstyle\LBraket{\frac{a}{b}|b}$
\end{document}
添加(支持多个条形图)
\makeatletter
\def\LB@add@@{\aftergroup\LB@add@}
\def\LB@add@{\aftergroup\LB@add}
\def\LB@add{\advance\@tempcnta\@ne}
\def\LB@barsl{\ifcase\@tempcnta\or
\kern-\nulldelimiterspace\left.\or
\kern-2\nulldelimiterspace\left.\left.\fi}
\def\LB@barsr{\ifcase\@tempcnta\or
\right.\kern-\nulldelimiterspace\or
\right.\right.\kern-2\nulldelimiterspace\fi}
\def\LBlleft#1#2\LBrright{\begingroup
% count the number of bars
\mathcode`|="8000
\begingroup\lccode`~=`| \lowercase{\endgroup\def~}{\aftergroup\LB@add@@}
\@tempcnta=\z@\setbox\z@=\hbox{$\left<#2\right>$}
% now \@tempcnta has the number of bars and we redefine |
\begingroup\lccode`~=`| \lowercase{\endgroup\def~}{\nonscript\;\middle|\nonscript\;}
\def\ts@r{\nulldelimiterspace=0pt \mathsurround=0pt}%
\let\@hat=#1%
\def\sht@im{\LB@barsl#2\LB@barsr}%
\def\@t{{\mathchoice{\def\@fen{\displaystyle}\k@fel}%
{\def\@fen{\textstyle}\k@fel}%
{\def\@fen{\scriptstyle}\k@fel}%
{\def\@fen{\scriptscriptstyle}\k@fel}}}%
\def\g@rin{\ts@r\left\@hat\vphantom{\sht@im}\right.}%
\def\k@fel{\setbox0=\hbox{$\@fen\g@rin$}\hbox{%
$\@fen \kern.3875\wd0 \copy0 \kern-.3875\wd0
\llap{\copy0}\kern.3875\wd0$}}%
\def\pt@h{\mathopen\@t}\pt@h\sht@im
\LBrright}%
\def\LBrright#1{\let\@hat=#1%
\def\st@m{\mathclose\@t}%
\st@m\endgroup}
\DeclareRobustCommand\LBraket[1]{\LBlleft<#1\LBrright>}
\makeatother
它最多支持两个条,但如果需要,可以扩展宏\LB@barsl
和\LB@barsr
。