扩展为 `{}` 而不是 ``

扩展为 `{}` 而不是 ``

我想定义一个扩展为{ <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}}}%
}

在此处输入图片描述

相关内容