是否可以将“宏参数字符”传递给宏?

是否可以将“宏参数字符”传递给宏?

假设我有一个宏,可以自动将一堆图形添加到文档中:

\automagic{<figure-list>}{<caption-template>}

该宏将循环遍历逗号分隔的列表<figure-list>,添加它们,然后根据添加标题<caption-template>

现在考虑这个例子:

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}

\makeatletter
\newcommand{\automagic}[2]{%
\def\imglist{#1}% Trick to make it work
\begin{figure}
  \@for\im:=#1\do{%
    \begin{subfigure}[t]{0.33\textwidth}
      \includegraphics[width=\textwidth]{example-image-\im}
      \caption{#2}
    \end{subfigure}%
  }%
\end{figure}
}
\makeatother

\begin{document}

\automagic{a,b,c}{Figure \im\ from the set: ``\imglist''}

% \automagic{a,b,c}{Figure \im\ from the set: ``#1''}

\end{document}

为了创建上述格式的标题,我必须在宏\imglist内部定义一个宏,它将保存我在调用宏时使用的\automagic参数。#1

是否可以不使用技巧,而是在调用宏时\def\imglist{#1}使用实际参数编号?类似于注释行。#1

我四处搜索并没有发现任何类似的东西,所以如果这是不可能的,我不会感到惊讶。

答案1

当然可以:诀窍是定义一个临时宏。

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}

\makeatletter
\newcommand{\automagic}[2]{%
\def\temp##1{\caption{#2}}%
\begin{figure}
  \@for\im:=#1\do{%
    \begin{subfigure}[t]{0.33\textwidth}
      \includegraphics[width=\textwidth]{example-image-\im}
      \temp{#1}%
    \end{subfigure}%
  }%
\end{figure}
}
\makeatother

\begin{document}

\automagic{a,b,c}{Figure \im\ from the set: ``#1''}

\end{document}

这个技巧之所以有效,是因为当参数被吸收时,#1第二个参数中的 会变成。因此,在其定义后添加将得到##1\show\temp

> \temp=macro:
#1->\caption {Figure \im \ from the set: ``#1''}.

正如预期的那样。

作为练习,你可能需要看看

\documentclass{article}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\automagic}{mm}
 {
  \begin{figure}
  \clist_map_inline:nn { #1 }
   {
    \cs_set:Nn \__oleinik_automagic_temp:n { \caption { #2 } }
    \begin{subfigure}[t]{0.33\textwidth}
    \includegraphics[width=\textwidth]{example-image-##1}
    \__oleinik_automagic_temp:n { #1 }
    \end{subfigure}
   }
  \end{figure}
 }
\ExplSyntaxOff

\begin{document}

\automagic{a,b,c}{Figure #1 from the set: ``##1''}

\end{document}

这有点棘手。;-)

相关内容