
Ich habe ein Bildverzeichnis mit mehreren Bildern:
p1.jpg
p2.jpg
p3.jpg
p4.jpg
Ich habe außerdem folgende Umgebung, die das Hintergrundbild auf einen Rahmen setzt:
\newenvironment{imageframe}[1]
{% Set background image
\usebackgroundtemplate{%
\begin{tikzpicture}[remember picture,overlay]%
\node[inner sep=0] at (current page.center) {\includegraphics[width=\paperwidth,height=\paperheight]{#1}};%
\end{tikzpicture}%
}%
\begin{frame}%
}
{
\end{frame}%
}
Es wird wie folgt verwendet:
\begin{imageframe}{p1.jpg}
\frametitle{Nothing was the same.}
Always felt like my vision been bigger than the bigger picture.
\end{imageframe}
Ich möchte eine Variable (oder einen Befehl) erstellen, die die Liste der gültigen Hintergrundbilder (p1.jpg, ..., p4.jpg) enthält, und dann den Bildpfad nicht explizit angeben, wenn die Umgebung aufgerufen wird. Stattdessen sollte das erste Bild (p1.jpg) beim ersten Aufruf von imageframe ausgewählt werden, das zweite Bild (p2.jpg) sollte beim zweiten Mal aufgerufen werden und so weiter. Overflow sollte zu p1.jpg zurückkehren.
Antwort1
Ohne Zähler und ohne dass die Anzahl der Bilder im Voraus angegeben werden muss: Definieren Sie einfach die Liste der Bilder auf die gezeigte Weise und fertig.
\documentclass{beamer}
\usepackage{tikz}
\newenvironment{autoimageframe}
{% Set background image
\usebackgroundtemplate{%
\begin{tikzpicture}[remember picture,overlay]
\node[inner sep=0] at (current page.center) {%
\includegraphics[width=\paperwidth,height=\paperheight]{\currentbgimage}%
};
\end{tikzpicture}%
\expandafter\swapbgimage\bgimagelist
}%
\begin{frame}}
{\end{frame}}
\newcommand\currentbgimage{\expandafter\usebgimage\bgimagelist}
\newcommand{\usebgimage}{}
\def\usebgimage#1#2\bgimagelist{#1}
\newcommand{\swapbgimage}{}
\def\swapbgimage#1#2\bgimagelist{%
\gdef\bgimagelist{#2{#1}\bgimagelist}%
}
% Define here the list of images
% Each image is in a braced group
% REMEMBER to have \bgimagelist at the end
\newcommand\bgimagelist{
{example-image}
{example-image-a}
{example-image-b}
{example-image-c}
\bgimagelist
}
\begin{document}
% Thanks to Percusse for the code here
\foreach\x in{1,...,9}{
\begin{autoimageframe}
\frametitle{Nothing was the same.}
Always felt like my vision been bigger than the bigger picture.
\end{autoimageframe}
}
\end{document}
Das \currentbgimage
Makro verwendet das erste Element in der Liste und \swapbgimage
fügt das erste Element dann am Ende ein.
Antwort2
Sie können einige Makros und eine Namensliste generieren und diese über eine mod
Operation durchlaufen.
\documentclass{beamer}
\usepackage{tikz,mwe}% For dummy images
\newcounter{backgroundimagecounter}
\setcounter{backgroundimagecounter}{0}
\newenvironment{autoimageframe}
{% Set background image
\usebackgroundtemplate{%
\begin{tikzpicture}[remember picture,overlay]%
\pgfmathsetmacro\currentbackgroundimage{\backgroundimagenamelist[int(Mod(\value{backgroundimagecounter},\numberofbackgroundimages))]}%
\node[inner sep=0] at (current page.center) {\includegraphics[width=\paperwidth,height=\paperheight]{\currentbackgroundimage}};%
\end{tikzpicture}%
\stepcounter{backgroundimagecounter}%
}%
\begin{frame}%
}
{
\end{frame}%
}
\def\backgroundimagenamelist{{
"example-image",
"example-image-a",
"example-image-b",
"example-image-c"}}
\def\numberofbackgroundimages{4}
\begin{document}
\foreach\x in{1,...,9}{
\begin{autoimageframe}
\frametitle{Nothing was the same.}
Always felt like my vision been bigger than the bigger picture.
\end{autoimageframe}
}
\end{document}