我想定义一个扩展为{ <output> }
而不是 的命令<output>
。我尝试用附加内容包装命令内容
{
/}
\bgroup
/\egroup
\begingroup
/\endgroup
\group_begin:
/\group_end:
\c_group_begin_token
/\c_group_end_token
\str_use:N \c_left_brace_str
/\str_use:N \c_right_brace_str
但无济于事。
我的用例:我希望能够用 代替\R[1][2]
,\mathbb{R}^{1 \times 2}
但也能够在下标和上标中使用它,例如0_\R[1][2]
,而不需要用括号括起来。我知道,这很具体,也许很偷懒,但老实说,从技术角度来看,我也对此很好奇。
简化的 MWE:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareDocumentCommand { \R } { o }
{
\mathbf { R }
\IfValueT { #1 } { \sp { #1 } }
}
\DeclareDocumentCommand { \Q } { m }
{
\mathbf { Q } \sp { #1 }
}
\ExplSyntaxOff
\begin{document}
$0_\R$ % throws error "Missing } inserted"
$0_\R[2]$ % throws error "Missing } inserted"
$0_\Q{2}$ % expands to $0_\mathbf{Q}^{2}$, not $0_{\mathbf{Q}^{2}}$
\end{document}
答案1
您需要命令来扩展为括号组,但上标和下标应该总是做好准备。
\documentclass{article}
% only needed in old latex releases \usepackage{xparse}
\ExplSyntaxOn
% Please don't do this
\DeclareDocumentCommand\R{}{\bgroup\Rinner}
\DeclareDocumentCommand { \Rinner } { o }
{
\mathbf { R }
\IfValueT { #1 } { \sp { #1 }}
\egroup
}
\DeclareDocumentCommand { \Q } { m }
{
{\mathbf { Q } \sp { #1 }}
}
\ExplSyntaxOff
\begin{document}
$0_\R$ % throws error "Missing } inserted"
$0_\R[2]$ % throws error "Missing } inserted"
$0_\Q{2}$ % expands to $0_\mathbf{Q}^{2}$, not $0_{\mathbf{Q}^{2}}$
\end{document}
答案2
我会避免在佩戴牙套方面偷懒。在其他方面偷懒是好事。
例如,您应该定义一些\numberset
命令以实现符号排版方式的统一(并且您以后可以决定一次性更改所有符号)。
无论如何,您都不应该使用\DeclareDocumentCommand
:您可能会在没有警告的情况下重新定义一个重要的命令。
现在抽象一下:
\documentclass{article}
\NewDocumentCommand{\numberset}{m}{\mathbf{#1}}
\NewDocumentCommand{\vecspace}{m}{\bgroup\VECSPACE{#1}}
\NewDocumentCommand{\VECSPACE}{moo}{%
#1%
\IfValueT{#2}{^{#2\IfValueT{#3}{\times #3}}}%
\egroup
}
\NewDocumentCommand{\R}{}{\vecspace{\numberset{R}}}
\NewDocumentCommand{\Q}{}{\vecspace{\numberset{Q}}}
\begin{document}
$0_\R$
$0_\R[2]$
$0_\R[2][3]$
$0_\Q$
$0_\Q[2]$
$0_\Q[2][3]$
$0_\vecspace{V}[1][2]$
$0_\vecspace{\numberset{J}}[1][2]$
\end{document}
这样你就可以适应偶尔出现的不同情况。
然而我坚持认为
0_{\R[2]}
是很多更好,而且成本也不高。为此,你只需删除一层:
\NewDocumentCommand{\vecspace}{moo}{%
#1%
\IfValueT{#2}{^{#2\IfValueT{#3}{\times #3}}}%
}