我正在尝试手动强制\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}