与 csname 相反

与 csname 相反

如果我有一个\Name可以扩展为宏名的宏,我可以将其与\csnameetoolbox 中的各种工具一起使用。我可以做相反的事情,即获取宏的名称吗?

我的用例如下:我想编写一个\Mtx生成smallmatrix(来自 mathtools)的命令。可选参数应采用分隔符大小,如果未提供,则自动确定大小(这与 mathtools 对其\DeclarePairedDelimiterX定义的命令施加的语法略有不同)。

我试过

\DeclareDocumentCommand{\Mtx}{om}{
    \IfNoValueTF{#1}{
        \left(\begin{smallmatrix}#2\end{smallmatrix}\right)
    }{
        #1(\begin{smallmatrix}#2\end{smallmatrix}#1)
    }
}

但是,我认为最好分别用\big和代替#1。这样可行吗?\bigl\bigr

因此,我想,如果有一个命令\GetName可以\GetName{\command}扩展为command,那么我可以这样做:

\DeclareDocumentCommand{\Mtx}{om}{
    \IfNoValueTF{#1}{
        \left(\begin{smallmatrix}#2\end{smallmatrix}\right)
    }{
        \csuse{\GetName{#1}l}(\begin{smallmatrix}#2\end{smallmatrix}\csuse{\GetName{#1}r})
    }
}

这可能吗?我猜有人会指出缺乏错误处理。但现在我很好奇!

答案1

它是\cs_to_str:N

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\Mtx}{om}
  {
    \IfNoValueTF{#1}
      {
        \left(\begin{smallmatrix}#2\end{smallmatrix}\right)
      }
      {
        \use:c {\cs_to_str:N #1 l}(
        \begin{smallmatrix}#2\end{smallmatrix}
        \use:c {\cs_to_str:N #1 r})
      }
  }

\ExplSyntaxOff

\begin{document}

\[
\Mtx{a & b \\ c & d}
\quad
\Mtx[\big]{a & b \\ c & d}
\quad
\Mtx[\Big]{a & b \\ c & d}
\quad
\Mtx[\bigg]{a & b \\ c & d}
\quad
\Mtx[\Bigg]{a & b \\ c & d}
\]

\end{document}

不要使用\DeclareDocumentCommand,除非您知道自己在做什么。

在此处输入图片描述

答案2

在 LuaTeX 中,我们有\csstring原语。如果#1\big,那么

\csname \csstring #1l\endcsname

\bigl

相关内容