LaTeX 中的交替列布局(beamer)

LaTeX 中的交替列布局(beamer)

我已经使用 LaTeX beamer 进行演示一段时间了。我的标准幻灯片布局由一侧的项目要点和另一侧的“钩子”图像组成。为了保持视觉吸引力,我会在幻灯片之间交替显示列。

最小的代码片段如下所示:

\documentclass[a4paper]{beamer}

\usepackage{graphicx}

\title{My Title}
\author{Me}
\begin{document}

\maketitle

\begin{frame}    
\begin{columns}
\begin{column}[c]{7cm}
\begin{itemize}
   \item Point One
   \item Point Two
\end{itemize}
\end{column}
\begin{column}[c]{3cm}
\includegraphics[width=3cm]{stock/default.png}
\end{column}
\end{columns}
\end{frame}

\begin{frame}
\begin{columns}
\begin{column}[c]{3cm}
\includegraphics[width=3cm]{stock/default.png}
\end{column}
\begin{column}[c]{7cm}
\begin{itemize}
   \item Point Three
   \item Point Four
\end{itemize}
\end{column}
\end{columns}
\end{frame}


\end{document}

显然,对于较长的演示文稿,这种交替可能会让代码很烦人。此外,在演示文稿中插入或删除幻灯片意味着必须手动重新对齐其余幻灯片。(目前我主要使用 vim 宏来执行此操作。)

有没有办法让变量或参数自动切换以正确地在幻灯片之间交换列?我曾考虑过定义一种新的框架类型,该框架类型采用“对齐”参数以及相关文本和图像,但如何做到这一点,以及是否可以在 LaTeX 文档中保留和设置持久“变量”,这超出了我现有的 LaTeX 知识范围。

答案1

您可以使用类似的环境收集图像列的内容imagecolumn,并使用收集文本列textcolumn,然后通过\printcolumns以下方式打印这些列:

在此处输入图片描述

\documentclass{beamer}
\usepackage{environ}
\title{My Title}
\author{Me}

\newlength{\imagecolwidth}\setlength{\imagecolwidth}{3cm}
\newlength{\textcolwidth}\setlength{\textcolwidth}{7cm}

\makeatletter
\NewEnviron{imagecolumn}{\expandafter\gdef\expandafter\imagecolcontent\expandafter{\BODY}}
\NewEnviron{textcolumn}{\expandafter\gdef\expandafter\textcolcontent\expandafter{\BODY}}
\newcommand{\printcolumns}{%
  \begin{columns}
    \ifodd\value{page}
      \begin{column}[c]{3cm}
        \imagecolcontent
      \end{column}
      \begin{column}[c]{7cm}
        \textcolcontent
      \end{column}
    \else
      \begin{column}[c]{7cm}
        \textcolcontent
      \end{column}
      \begin{column}[c]{3cm}
        \imagecolcontent
      \end{column}
    \fi
  \end{columns}
}
\makeatother
\begin{document}

\maketitle

\begin{frame}
  \begin{imagecolumn}
    \includegraphics[width=\columnwidth]{example-image-a}
  \end{imagecolumn}
  \begin{textcolumn}
    \begin{itemize}
       \item Point One
       \item Point Two
    \end{itemize}
  \end{textcolumn}

  \printcolumns
\end{frame}

\begin{frame}
  \begin{imagecolumn}
    \includegraphics[width=\columnwidth]{example-image-b}
  \end{imagecolumn}
  \begin{textcolumn}
    \begin{itemize}
       \item Point Three
       \item Point Four
    \end{itemize}
  \end{textcolumn}

  \printcolumns
\end{frame}

\end{document}

答案2

您可以在前言中将每种类型的框架定义为宏,其中每个可能更改的元素都是一个参数。假设为了保持一致的格式,您希望列的宽度始终相同,则只需要两个参数:#1项目列表和#2图像。然后,在文档正文中,您只需写入\yourmacro{\item ... \item ...}{image}。例如:

\documentclass[a4paper]{beamer}
\title{Your Title}
\author{You}
\newcommand\LI[2]{
\begin{frame}    
\begin{columns}
\begin{column}[c]{7cm}
\begin{itemize}#1\end{itemize}
\end{column}
\begin{column}[c]{3cm}
\includegraphics[width=\linewidth]{#2}
\end{column}
\end{columns}
\end{frame}
}
\newcommand\IL[2]{
\begin{frame}
\begin{columns}
\begin{column}[c]{3cm}
\includegraphics[width=\linewidth]{#2}
\end{column}
\begin{column}[c]{7cm}
\begin{itemize} #1 \end{itemize}
\end{column}
\end{columns}
\end{frame}
}

\begin{document}

\maketitle

\LI{\item Point One \item Point Two}{example-image-a} 
\IL{\item Point Three \item Point Four}{example-image-b} 

\end{document}

如果您只需要使用一个宏来完成这项工作,那么一个解决方案就是创建一个条件循环,例如使用\iftoggle。一个简单的例子:下一个 MWE 显示一个宏,该宏第一次\OddEven{1}{2}打印,但相同的命令第二次打印,第三次再次打印,等等。122112

\documentclass[a4paper]{beamer}
\usepackage{etoolbox}
\newtoggle{FrameChange}
\toggletrue{FrameChange}
\newcommand\OddEven[2]{
%\iftoggle{FrameChange}%
{#1#2\togglefalse{FrameChange}} % if true
{#2#1\toggletrue{FrameChange}}} % if false

\begin{document}
\OddEven{1}{2} 
\OddEven{1}{2} 
\OddEven{1}{2} 
\OddEven{1}{2} 
\OddEven{1}{2} 
\end{document}

因此,您只需要将上面例子中的和 宏的全部内容#1#2进行更改即可:#2#1\LI\IL

\documentclass[a4paper]{beamer}
\usepackage{etoolbox}
\newtoggle{FrameChange}
\toggletrue{FrameChange}

\newcommand\OddEven[2]{\iftoggle{FrameChange}{
\begin{frame}    
\begin{columns}
\begin{column}[c]{7cm}
\begin{itemize}#1\end{itemize}
\end{column}
\begin{column}[c]{3cm}
\includegraphics[width=\linewidth]{#2}
\end{column}
\end{columns}
\end{frame}
\togglefalse{FrameChange}}{

\begin{frame}
\begin{columns}
\begin{column}[c]{3cm}
\includegraphics[width=\linewidth]{#2}
\end{column}
\begin{column}[c]{7cm}
\begin{itemize} #1 \end{itemize}
\end{column}
\end{columns}
\end{frame}
\toggletrue{FrameChange}}}

\begin{document}

\OddEven{\item Point One \item Point Two}{example-image-a} 
\OddEven{\item Point Three \item Point Four}{example-image-b} 

\end{document}

相关内容