如果我有一个\Name
可以扩展为宏名的宏,我可以将其与\csname
etoolbox 中的各种工具一起使用。我可以做相反的事情,即获取宏的名称吗?
我的用例如下:我想编写一个\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
。