添加(支持多个条形图)

添加(支持多个条形图)

我想将希尔伯特-施密特积排版为希尔伯特空间括号的刘维尔等价物,并使用双倍分隔符,如下所示:\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

相关内容