LaTex 宏的 \begin 和 \end 部分分为不同的循环

LaTex 宏的 \begin 和 \end 部分分为不同的循环

考虑下面的最小工作示例,它逐步叠加(使用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 ....

相关内容