
Ich schreibe ein Dokument zum Generieren eines Kartenspiels. Die Werte der Karten sind in einer allgemeinen Liste gespeichert. Jede Kartenfarbe/-farbe hat einen eigenen Satz Grafikdateien, die ebenfalls in allgemeinen Listen definiert sind. Die Werte und Dateinamen sind also beliebig, aber zu Debugzwecken sind die Dateinamen im folgenden Code systematisiert.
Die Idee besteht darin, einen Index in einer For-Schleife auszuführen und sowohl den Wert als auch den Grafikdateinamen für jede Karte in der Schleife zu generieren. Der laufende Index kann über die Länge jeder Liste hinausgehen, um weitere Karten zu generieren, daher die Verwendung der MyModulo-Funktion.
Durch die Verwendung der Funktion/des Makros GetListMember zum Generieren einer Textausgabe werden die Dateinamen korrekt wiedergegeben.
Bei Verwendung der Funktion/des Makros GetListMember zusammen mit includegraphis für die Dateinamen schlägt die Kompilierung fehl:
! Unvollständig \iffalse; der gesamte Text nach Zeile 64 wurde ignoriert.
eingefügter Text
\fi
und ich kann nicht herausfinden, warum.
Ich hätte wirklich gerne eine verallgemeinerte Lösung, bei der die Dateinamen beliebig sein können. (Die Länge der verschiedenen Listen sind Primzahlen, daher ist eine Lösung mit Triolen wahrscheinlich nicht die effektivste.)
\documentclass{article}
\usepackage{ifthen}
\usepackage{pgffor}
\usepackage{graphicx}
\usepackage{intcalc}
\usepackage{xstring}
\graphicspath{{../images/}}
% Define card values and graphics
\newcommand{\MyValues}{10,Kn,D,K,E}% Values of the cards
\newcommand{\MyValuesN}{5}
\newcommand{\MyCard}{temp1,temp2,temp3}% Card images in one color
\newcommand{\MyCardN}{3}
\newcommand{\MyCardA}{tempA,tempB,tempC}% Card images in second color
\newcommand{\MyCardAN}{3}
% Define wrap around index function.
\newcommand{\MyModulo}[2]{%
\intcalcInc{\intcalcMod{\intcalcDec{#1}}{#2}}%
}
% From http://tex.stackexchange.com/questions/21559/macro-to-access-a-specific-member-of-a-list
% This works both with inline lists and with macros containing lists
\newcommand*{\GetListMember}[2]{%
\edef\dotheloop{%
\noexpand\foreach \noexpand\a [count=\noexpand\i] in {#1} {%
\noexpand\IfEq{\noexpand\i}{#2}{\noexpand\a\noexpand\breakforeach}{}%
}}%
\dotheloop%
}%
%Stand in function generating the cards, the real function is more elaborated.
\newcommand{\docard}[2]{%
!#1! % Value
\includegraphics[width=2cm]{#2} %graphics
}
\begin{document}
\foreach \n in {1,...,7} {%
%
%This works, shows the values.
%\GetListMember{\MyValues}{\MyModulo{\n}{\MyValuesN}}
%
%This works, produces the correct image file names.
%\GetListMember{\MyCard}{\MyModulo{\n}{\MyCardN}}.png
%
%This works, includes the images.
%\includegraphics[width=2cm]{temp\MyModulo{\n}{\MyCardN}.png}
%
%This does not work.
%\includegraphics[width=2cm]{\GetListMember{\MyCard}{\MyModulo{\n}{\MyCardN}}.png}
%
%This works, calls the card macro correctly.
%\docard{\GetListMember{\MyValues}{\MyModulo{\n}{\MyValuesN}}}{temp\MyModulo{\n}{\MyCardN}.png}
%
%This does not work.
\docard{\GetListMember{\MyValues}{\MyModulo{\n}{\MyValuesN}}}
{\GetListMember{\MyCard}{\MyModulo{\n}{\MyCardN}}.png}
\par
}
% Second color of cards
%\foreach \n in {1,...,7} {
% \docard{\GetListMember{\MyValues}{\MyModulo{\n}{\MyValuesN}}}
% {\GetListMember{\MyCardA}{\MyModulo{\n}{\MyCardNA}}.png}
% \par
%}
% Third colors of cards
%\foreach ...
\end{document}