![LaTex 宏的 \begin 和 \end 部分分为不同的循环](https://linux22.com/image/446249/LaTex%20%E5%AE%8F%E7%9A%84%20%5Cbegin%20%E5%92%8C%20%5Cend%20%E9%83%A8%E5%88%86%E5%88%86%E4%B8%BA%E4%B8%8D%E5%90%8C%E7%9A%84%E5%BE%AA%E7%8E%AF.png)
考虑下面的最小工作示例,它逐步叠加(使用overpic
包)pdf 文件中包含的图像。
\documentclass{beamer}
\usepackage{overpic}
\begin{document}
\begin{frame}
\onslide<1->{\begin{overpic}[width=\textwidth,page=1]{MyPDF}
\onslide<2->{\begin{overpic}[width=\textwidth,page=2]{MyPDF}
\onslide<3->{\begin{overpic}[width=\textwidth,page=3]{MyPDF}
\end{overpic}}
\end{overpic}}
\end{overpic}}
\end{frame}
\end{document}
我想使用一个宏来缩短此代码,该宏将页数和 pdf 文件的名称作为参数。理想情况下,简化的代码应如下所示
\documentclass{beamer}
\usepackage{overpic}
\begin{document}
\begin{frame}
\MyMacro{3}{MyPDF}
\end{frame}
\end{document}
我尝试使用两个 for 循环(使用包)来实现这一点,pgffor
如下所示
\newcommand{\MyMacro}[2]{
\foreach \n in {1,...,#1}{\onslide<\n->\{\begin{overpic}[width=\textwidth,page=\n]{#2}}
\foreach \n in {1,...,#1}{\end{overpic}\}}
}
但是,这种方法行不通。我认为主要问题是\begin{overpic}
和\end{overpic}
部分被分成了两个独立的循环。我想不出让它工作的方法。有什么建议吗?
答案1
也许可以通过递归循环来完成:
\documentclass{beamer}
\usepackage{overpic}
\newcommand\exchange[2]{#2#1}
\newcommand\MyMacro[3]{%
\onslide<#1->{\begin{overpic}[width=\textwidth,page=#1]{#3}%
\ifnum#1<\numexpr#2\relax
\exchange{\expandafter\MyMacro\expandafter{\the\numexpr#1+1\relax}{#2}{#3}}%
\fi
\end{overpic}}%
}%
\begin{document}
\begin{frame}
\MyMacro{1}{3}{MyPDF}
\end{frame}
\end{document}
这将生成一个如下所示的 PDF 文件
由此
我的PDF.pdf看起来像这样:
如果\foreach
来自 TikZ-package/pgffor-package,那么您提出的方法就无法奏效,因为每次迭代都在其自己的本地范围内进行,即,您会得到类似的结果
\begingroup
\onslide<1->\{\begin{overpic}[width=\textwidth,page=1]{MyPDF}
\endgroup
\begingroup
\onslide<2->\{\begin{overpic}[width=\textwidth,page=2]{MyPDF}
\endgroup
\begingroup
\onslide<2->\{\begin{overpic}[width=\textwidth,page=2]{MyPDF}
\endgroup
\begingroup
\end{overpic}\}
\endgroup
\begingroup
\end{overpic}\}
\endgroup
\begingroup
\end{overpic}\}
\endgroup
除此之外:
{
和}
是类别 1(开始组)/2(结束组)的明确字符标记,而\{
和\}
是具有任何定义的控制符号标记。
因此,您不能用{
by\{
和}
by 来替换\}
,并期望参数组匹配能够起作用。
答案2
您可以尝试添加[parse=true]
选项\foreach
\foreach[parse=true] \n in ....