我正在尝试使下标$\rangle$
正确:
对我来说,$\rangle_G$
G 值太高,结果$\rangle_{_G}$
甚至$\rangle_{\substack{\\G}}$
不正确。有什么简单的方法可以解决这个问题吗?
答案1
这是使用提供的宏的一种方法\subrangle{}
。可以调整 5pt 以适应。
\documentclass{article}
\usepackage{stackengine}
\def\subrangle#1{\stackengine{5pt}{}{$\!\scriptstyle #1$}{U}{l}{F}{F}{L}}
\begin{document}
$\langle x\rangle\subrangle{G} \langle x\rangle\subrangle{xyz}$
\end{document}
以下是将 5pt 改为 4pt 的步骤:
补充:如果希望使用_
语法来调用\subrangle
,可以使用以下序言定义:
\makeatletter
\let\save@rangle\rangle
\def\rangle{\save@rangle\@ifnextchar_{\expandafter\subrangle\@gobble}{}}
\makeatother
使用这样的语法,$\langle x\rangle_G \langle x\rangle_{xyz}$
就会产生所需的结果。
答案2
通常的补救措施是添加一个降低下标的虚拟上标。我还会添加一个小的备份\!
。
这里有两个版本。第一个版本中,输出是固定的,两个向量之间用逗号分隔。第二个版本中,输入相同,但输出可根据个人喜好进行自定义;作为示例,我将其用于\mid
分隔向量。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
% First version (simple)
\NewDocumentCommand{\inn}{mo}{%
\langle #1\rangle
\IfValueT{#2}{^{}_{\mspace{-3mu}#2}}%
}
% Second version, customizable
\NewDocumentCommand{\xinn}{>{\SplitArgument{1}{,}}mo}{%
\doinnerproduct#1
\IfValueT{#2}{^{}_{\mspace{-3mu}#2}}%
}
\NewDocumentCommand{\doinnerproduct}{mm}{%
\langle #1\mid #2\rangle % decide here how to typeset the two vectors
}
\begin{document}
$\inn{x,y}$ or $\inn{x,y}[G]$
$\xinn{x,y}$ or $\xinn{x,y}[G]$
\end{document}
\mspace{-3mu}
这是更改为时的输出\mspace{-1.5mu}
:
这是未经校正的输出:
答案3
好吧,无耻的推销。我昨天刚写了代码将下标和上标作为可选参数处理,所以我将在这里使用它。
该解决方案与 egreg 的完全相同,但是\inn{x,y}[G]
您可以编写\inn{x,y}_{G}
并获得完全相同的输出。
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \__xparse_count_type_k:w #1
{
\__xparse_single_token_check:n { #1 }
\quark_if_recursion_tail_stop_do:Nn #1 { \__xparse_bad_arg_spec:wn }
\__xparse_count_mandatory:N
}
\cs_new_protected:Npn \__xparse_count_type_K:w #1 #2
{
\__xparse_single_token_check:n { #1 }
\quark_if_recursion_tail_stop_do:nn { #2 } { \__xparse_bad_arg_spec:wn }
\__xparse_count_mandatory:N
}
\cs_new_protected:Npn \__xparse_add_type_k:w #1
{ \exp_args:NNo \__xparse_add_type_K:w #1 { \c__xparse_no_value_tl } }
\cs_new_protected:Npn \__xparse_add_type_K:w #1 #2
{
\__xparse_flush_m_args:
\__xparse_add_grabber_optional:N K
\tl_put_right:Nn \l__xparse_signature_tl { #1 { #2 } }
\__xparse_prepare_signature:N
}
\cs_new_protected:Npn \__xparse_add_expandable_type_k:w #1
{
\exp_args:NNo \__xparse_add_expandable_type_K:w #1 { \c__xparse_no_value_tl }
}
\cs_new_protected_nopar:Npn \__xparse_add_expandable_type_K:w #1 #2
{
\__msg_kernel_error:nnx { xparse } { invalid-expandable-argument-type } { K }
\__xparse_add_expandable_type_m:w
}
\cs_new_protected:Npn \__xparse_grab_K:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_long:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_trailing:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_long_trailing:w #1 #2 #3 \l__xparse_args_tl
{
\__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
{ _ignore_spaces }
}
\cs_new_protected:Npn \__xparse_grab_K_aux:NnnNn #1 #2 #3 #4 #5
{
\exp_after:wN #4 \l__xparse_fn_tl ##1
{
\__xparse_add_arg:n { ##1 }
#3 \l__xparse_args_tl
}
\use:c { peek_meaning_remove #5 :NTF } #1
{ \l__xparse_fn_tl }
{
\__xparse_add_arg:n { #2 }
#3 \l__xparse_args_tl
}
}
\prop_put:Nnn \c__xparse_shorthands_prop { a } { k \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { b } { k \sp }
\prop_put:Nnn \c__xparse_shorthands_prop { A } { K \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { B } { K \sp }
\ExplSyntaxOff
\NewDocumentCommand{\inn}{mma}{%
\langle #1,#2\rangle
\IfValueT{#3}{^{}_{\!#3}}%
}
\NewDocumentCommand{\xinn}{>{\SplitArgument{1}{,}}ma}{%
\doinnerproduct#1%
\IfValueT{#2}{^{}_{\!#2}}%
}
\NewDocumentCommand{\doinnerproduct}{mm}{%
\langle #1\mid #2\rangle
}
\begin{document}
$\inn{x}{y}$ or $\inn{x}{y}_{G}$
$\xinn{x,y}$ or $\xinn{x,y}_{G}$
\end{document}