假设我有一个宏,可以自动将一堆图形添加到文档中:
\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}
这有点棘手。;-)