我想以 foreach 循环方式重用 mathtools DeclarePairedDelimiter,但我之前从未进行过任何低级 (La)TeXing。这是我的代码:
\documentclass{article}
\usepackage{mathtools}
\usepackage{expl3}
\ExplSyntaxOn
\clist_map_inline:nn{angle,brace,brack,paren,vert,Vert}
{
\expandafter\DeclarePairedDelimiter
\csname lr#1A\endcsname
{{\csname l#1\endcsname}}
{{\csname r#1\endcsname}}
\expandafter\DeclarePairedDelimiter
\csname lr#1B\endcsname
{\csname l#1\endcsname}
{\csname r#1\endcsname}
}
\ExplSyntaxOff
\begin{document}
\[
\lrparenA{\frac{x}{y}}\quad
\lrparenA*{\frac{x}{y}}\quad% <- doesn't work
\lrparenA[\Bigg]{\frac{x}{y}}\quad
\lrparenB{\frac{x}{y}}\quad
\lrparenB*{\frac{x}{y}}\quad
\lrparenB[\Bigg]{\frac{x}{y}}% <- doesn't work
\]
\end{document}
我不知道为什么第一个解决方案不适用于星型版本,为什么第二个解决方案不适用于可选参数。
有没有像我尝试过的那样重用实现的通用方法?假设我想重用 xparse 中的 NewDocumentCommand,例如
\NewDocumentCommand{\I}{E{_^}{{a+}{\alpha}}m}{
{\mathrm{I}_{#1}^{#2}#3}
}
其中将\I
被改为\<some letter>
和\mathrm{I}
?\mathrm{<some letter>}
也许我必须使用 pgffor?
答案1
我建议采用不同的方法expl3
,而不将传统编程与之混合:
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse} % also loads expl3
\ExplSyntaxOn
\NewDocumentCommand{\definedelimiters}{m}
{
\clist_map_inline:nn { #1 }
{
\serafiel_definedelimiters:ccc { lr##1 } { l##1 } { r##1 }
}
}
\cs_new_protected:Nn \serafiel_definedelimiters:NNN
{
\DeclarePairedDelimiter #1 #2 #3
}
\cs_generate_variant:Nn \serafiel_definedelimiters:NNN { ccc }
\ExplSyntaxOff
\definedelimiters{angle,brace,brack,paren,vert,Vert}
\begin{document}
\[
\lrparen{\frac{x}{y}}\quad
\lrparen*{\frac{x}{y}}\quad% <- doesn't work
\lrparen[\Bigg]{\frac{x}{y}}\quad
\]
\end{document}
您的定义的问题是明确使用\csname
以及使用附加括号。
我不会对第二个请求发表任何评论,因为它不太清楚。问一个更精确(不同)的问题:就目前情况而言,的定义\I
不起作用。