物理软件包手动调整 \ket 和 \bra 的大小

物理软件包手动调整 \ket 和 \bra 的大小

我正在尝试手动强制\ket使用物理包的大尺寸,我正在尝试以下操作:

\documentclass{article}
\usepackage{physics}
\begin{document}
$\ket\Big{a}$
\end{document}

我根据物理包文档尝试了此方法,\qty\Big{}结果应该是大括号/花括号。但是,上面的示例生成了以下编译错误:

! Argument of \bBigg@ has an extra }.
<inserted text>
                \par
l.4 $\ket\Big
             {a}$

另一方面,当我尝试时,$\abs\Big{a}$它运行良好...不确定我在这里遗漏了什么。

答案1

丑陋的代码和丑陋的语法。;-)

以下是\bra和的替代品\ket,允许为分隔符指定明确的大小。

我没有为以下事情做任何准备

\BRA\big{x}\KET\Bigg{y}

并且只考虑第一个尺寸命令。如果你喜欢它们,可以更改

\NewDocumentCommand{\BRA}

进入

\RenewDocumentCommand{\bra}

对于 也类似\NewDocumentCommand{\KET}。同时改变

  \peek_meaning_remove_ignore_spaces:NTF \KET

进入

  \peek_meaning_remove_ignore_spaces:NTF \ket

您将获得完整的替代品。

完整代码:

\documentclass{article}
\usepackage{physics}

\ExplSyntaxOn

\tl_new:N \l_braket_explicit_tl
\tl_new:N \l_braket_bra_tl
\bool_new:N \l_braket_resize_bool

\NewDocumentCommand{\BRA}{ l m }
 {
  \bool_set_true:N \l_braket_resize_bool
  \str_case:xnF { \tl_trim_spaces:n { #1 } }
   {
    { } { \tl_clear:N \l_braket_explicit_tl }
    { * } { \bool_set_false:N \l_braket_resize_bool }
   }
   {
    \bool_set_false:N \l_braket_resize_bool
    \tl_set:Nn \l_braket_explicit_tl { #1 }
   }
  \tl_set:Nn \l_braket_bra_tl { #2 }
  \peek_meaning_remove_ignore_spaces:NTF \KET
   {
    \BRAKETfinish
   }
   {
    \braket_bra:
   }
 }
\cs_generate_variant:Nn \str_case:nnF { x }

\cs_new_protected:Nn \braket_bra:
 {
  \bool_if:NTF \l_braket_resize_bool
   {
    \left\langle\l_braket_bra_tl\right\rvert
   }
   {
    \mathinner
     {
      \mathopen{\l_braket_explicit_tl\langle}
      \l_braket_bra_tl
      \mathclose{\l_braket_explicit_tl\rvert}
     }
   }
 }
\NewDocumentCommand{\BRAKETfinish}{ l m }
 {
  \bool_if:NTF \l_braket_resize_bool
   {
    \left\langle\l_braket_bra_tl\middle|#2\right\rangle
   }
   {
    \mathinner
     {
      \mathopen{\l_braket_explicit_tl\langle}
      \l_braket_bra_tl\l_braket_explicit_tl|#2
      \mathclose{\l_braket_explicit_tl\rangle}
     }
   }
 }

\NewDocumentCommand{\KET}{ l m }
 {
  \bool_set_true:N \l_braket_resize_bool
  \str_case:xnF { \tl_trim_spaces:n { #1 } }
   {
    { } { }
    { * } { \bool_set_false:N \l_braket_resize_bool }
   }
   {
    \bool_set_false:N \l_braket_resize_bool
    \tl_set:Nn \l_braket_explicit_tl { #1 }
   }
  \bool_if:NTF \l_braket_resize_bool
   {
    \left\lvert#2\right\rangle
   }
   {
    \mathinner
     {
      \mathopen{\l_braket_explicit_tl|}
      #2
      \mathclose{\l_braket_explicit_tl\rvert}
     }
   }
 }
\ExplSyntaxOff

\begin{document}

$a+\bra{x}+b$ $a+\bra*{x}+b$ $a+\bra{x}\ket{y}+b$ $a+\bra*{x}\ket*{y}+b$ $a+\ket{y}+b$

$a+\BRA{x}+b$ $a+\BRA*{x}+b$ $a+\BRA{x}\KET{y}+b$ $a+\BRA*{x}\KET*{y}+b$ $a+\KET{y}+b$

$\BRA\big{x}$ $\BRA\Big{x}\KET{y}$

\end{document}

在此处输入图片描述

您肯定会注意到原始\bra*{x}命令的间距不正确,这个问题在新版本中已得到修复。

答案2

你可以寻求数学工具包装并重新定义\ket以使其识别可选的明确大小指令。

在此处输入图片描述

\documentclass{article}

\usepackage{physics}
\let\ket\relax % undefine \ket

\usepackage{mathtools} % for "\DeclarePairedDelimiter" macro
\DeclarePairedDelimiter{\ket}{\lvert}{\rangle}

\begin{document}  % "\ket" autosizes the fences
$\ket{a} \quad \ket[\big]{a} \quad \ket[\Big]{a} \quad \ket*{\dfrac{a}{b}}$
\end{document}

相关内容