Ich versuche mal, den Original-Code Stück für Stück zu reparieren, damit die fraglichen Stellen klar werden. Zunächst: mit dem Code für die Minibilder ist alles in Ordnung!
###Offensichtliche Fehler###
Den Befehl `\IMG` hast Du so definiert:
\newcommand*\IMG[1][]{%
\begingroup
\setkeys{IMG}{#1}%
\includegraphics[\IMG@options\]{\IMG@file\}
\caption[\lofimage{\IMG@file\} \IMG@shorttitle]{\lofimage{\IMG@file\} \IMG@title}
\endgroup
}
Zuallererst: `\includegraphics[\IMG@options\]{\IMG@file\}`: hier haben sich zwei Backslashs eingeschlichen, weshalb alleine schon das zum *runaway argument* Fehler führt. Gerichtet sieht das so aus:
\includegraphics[\IMG@options]{\IMG@file}
Dann der gleiche Fehler noch mal in `\caption[\lofimage{\IMG@file\} \IMG@shorttitle]{\lofimage{\IMG@file\} \IMG@title}`. Richten wir auch das:
\caption[\lofimage{\IMG@file} \IMG@shorttitle]{\lofimage{\IMG@file} \IMG@title}
Jetzt bleibt der Fehler `! LaTeX Error: \caption outside float.` Klar: die Definition enthält ein `\caption`, was die Verwendung von `\IMG` außerhalb einer Gleitumgebung verbietet. Also statt
\IMG[file=foo.png]
verwenden wir im Dokument
\begin{figure}
\centering
\IMG[file=foo.png]
\end{figure}
Tada! Alles geht. Oder doch nicht? Ein Test:
\begin{figure}
\centering
\IMG[file=foo.png,title={foo bar},options={scale=.5}]
\end{figure}
Hmm, jetzt bekommen wir: `! Package xkeyval Error: `scale=.5' undefined in families `Gin'.` Das Problem ist nämlich, dass`\IMG@options` nicht rechtzeitig expandiert wird. Es *muss* einmal expandiert werden, bevor es an `\includegraphics` gereicht werden kann. Dafür verwenden wir eine `\expandafter`-Kette, mit der wir über alle Token steigen, die vorher expandiert/gesehen werden, also über `\includegraphics` und über `[`:
\expandafter\includegraphics\expandafter[\IMG@options]{\IMG@file}
Yay! An dieser Stelle können wir die Lösung noch etwas verallgemeinern. Es ist bei `\includegraphics` zwar nicht nötig, aber es ist gute Praxis, beim Bilden eines neuen Makros, das ein Argument an ein optionales weiterreicht, dass man dasselbe in geschweifte Klammern packt: `\foo[{#1}]`. Die Klammern werden beim Lesen des Arguments später wieder entfernt, erlauben aber, dass `#1` auch eine schließende eckige Klammer enthalten kann, ohne dass es zu Fehler kommt. Angewendet auf den hiesigen Fall:
\expandafter\includegraphics\expandafter[\expandafter{\IMG@options}]{\IMG@file}
Die `\expandafter`-Kette verlängert sich dadurch, weil man jetzt auch über `{` steigen muss.
Nachdem wir das gerichtet haben, funktioniert das Beispiel der Frage endlich (Tada!) und das einzige, was bleibt, sind Warnungen:
Package typearea Warning: Maybe no optimal type area settings!
(typearea) The maximum limit of line width is about 18%
(typearea) larger than the heuristically detected line width.
(typearea) You may e.g. increase DIV, decrease fontsize
(typearea) or change the papersize.
wegen des etwas seltsamen Einsatzes von `geometry` und
LaTeX Warning: Unused global option(s):
[onside,automark,open=any].
wegen unverwendeter globaler Optionen.
###Weitere Verbesserungen/versteckte Fehler###
Wenn man
\caption[\lofimage{\IMG@file} \IMG@shorttitle]{\lofimage{\IMG@file} \IMG@title}
verwendet, aber der Kurztitel nicht angegeben wurde, erhält man einen leeren Eintrag im Abbildungsverzeichnis. Darauf sollte man testen, und im Zweifelsfall das optionale Argument weglassen oder `\IMG@shorttitle` zu `\IMG@title` expandieren lassen.
Man könnte die Definitionen der Keys dafür so abwandeln, dass man vorher keine Makros definiert, sondern sie erst durch die keys selbst definiert werden. Dann kann man nämlich auf Existenz des jeweiligen Makros testen:
\define@key{IMG}{options} {\newcommand*\IMG@options{#1}}
\define@key{IMG}{file} {\newcommand*\IMG@file{#1}}
\define@key{IMG}{short-title}{\newcommand*\IMG@shorttitle{#1}}
\define@key{IMG}{title} {\newcommand*\IMG@title{#1}}
Danach könnte man `\IMG` so definieren:
\newcommand*\IMG[1]{%
\begingroup
\setkeys{IMG}{#1}%
\@ifundefined{IMG@options}
{\includegraphics{\IMG@file}}
{\expandafter\includegraphics\expandafter[\expandafter{\IMG@options}]{\IMG@file}}
\@ifundefined{IMG@title}
{\newcommand*\IMG@title{Titel fehlt! Bitte angeben.}}
{}%
\@ifundefined{IMG@shorttitle}
{\caption{\lofimage{\IMG@file} \IMG@title}}
{%
\caption
[\lofimage{\IMG@file} \IMG@shorttitle]
{\lofimage{\IMG@file} \IMG@title}%
}%
\endgroup
}
`\@ifundefined{<Makroname>}{<nicht definiert>}{<definiert>}` testet nur jeweils die einzelnen Optionen: wenn `\OMG@options` nicht gegeben wurde, braucht man auch die `\expandafter`-Kette auch nicht:
\@ifundefined{IMG@options}
{\includegraphics{\IMG@file}}
{\expandafter\includegraphics\expandafter[\expandafter{\IMG@options}]{\IMG@file}}
Wurde der Titel vergessen, geben wir einen Füllertext an:
\@ifundefined{IMG@title}
{\newcommand*\IMG@title{Titel fehlt! Bitte angeben.}}
{}%
Gibt es keinen Kurztitel, verwenden wir `\caption` ohne optionales Argument:
\@ifundefined{IMG@shorttitle}
{\caption{\lofimage{\IMG@file} \IMG@title}}
{%
\caption
[\lofimage{\IMG@file} \IMG@shorttitle]
{\lofimage{\IMG@file} \IMG@title}%
}%
Außerdem, aber das ist Geschmackssache, habe ich `\IMG` nicht mit optionalem, sondern mit obligatorischem Argument definiert. Schließlich müssen bei einer sinnvollen Verwendung sowohl `title` als auch `file` angegeben werden.
###Das komplette Beispiel###
\documentclass[a5paper]{scrartcl}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage{graphicx,mwe}
\newlength{\lofthumbsize}
\setlength{\lofthumbsize}{2em}
\newif\iflofimage
\DeclareRobustCommand*{\lofimage}[2][]{%
\iflofimage
$\vcenter to \lofthumbsize{%
\vss
\hbox to \lofthumbsize{%
\hss
\includegraphics[{
width=\lofthumbsize,
height=\lofthumbsize,
keepaspectratio=true,
#1
}]{#2}%
\hss
}%
\vss
}$%
\quad
\fi
\ignorespaces
}
\usepackage{xkeyval}
\makeatletter
\define@key{IMG}{options} {\newcommand*\IMG@options{#1}}
\define@key{IMG}{file} {\newcommand*\IMG@file{#1}}
\define@key{IMG}{short-title}{\newcommand*\IMG@shorttitle{#1}}
\define@key{IMG}{title} {\newcommand*\IMG@title{#1}}
\newcommand*\IMG[1]{%
\begingroup
\setkeys{IMG}{#1}%
\@ifundefined{IMG@options}
{\includegraphics{\IMG@file}}
{\expandafter\includegraphics\expandafter[\expandafter{\IMG@options}]{\IMG@file}}
\@ifundefined{IMG@title}
{\newcommand*\IMG@title{Titel fehlt! Bitte angeben.}}
{}%
\@ifundefined{IMG@shorttitle}
{\caption{\lofimage{\IMG@file} \IMG@title}}
{%
\caption
[\lofimage{\IMG@file} \IMG@shorttitle]
{\lofimage{\IMG@file} \IMG@title}%
}%
\endgroup
}
\makeatother
\begin{document}
\lofimagetrue
\listoffigures
\lofimagefalse
\section{Abschnittsname}
\begin{figure}[htb]
\centering
\IMG{file=example-image-a}
\end{figure}
\section{Abschnittsname}
\begin{figure}[htb]
\centering
\IMG{
options={scale=0.65},
file=example-image-a,
title=Urlaubsfoto
}
\end{figure}
\begin{figure}[htb]
\centering
\IMG{
options={scale=0.4},
file=example-image-b,
title=Graph im Koordinatensystem ,
short-title=Graph
}
\end{figure}
\end{document}\end{document}
----------
Übrigens braucht man für
\define@key{<Familie>}{<Name>}[<Leerwert>]{<Code>}
Das Paket `xkeyval` gar nicht: diese Funktionalität wird schon vom zugrunde liegenden Paket `keyval` bereitgestellt, das bei KOMA-Script automatisch geladen wird. Erst wenn man zum Beispiel `\define@cmdkey` oder `\define@boolkey` verwenden will oder die zusätzliche Option von `\define@key`, braucht man `xkeyval` tatsächlich. Mit `xkeyval` könnte man die Zeilen
\define@key{IMG}{options} {\newcommand*\IMG@options{#1}}
\define@key{IMG}{file} {\newcommand*\IMG@file{#1}}
\define@key{IMG}{short-title}{\newcommand*\IMG@shorttitle{#1}}
\define@key{IMG}{title} {\newcommand*\IMG@title{#1}}
durch folgende ersetzen:
\define@cmdkey{IMG}[IMG@]{options} {}
\define@cmdkey{IMG}[IMG@]{file} {}
\define@cmdkey{IMG}[IMG@]{short-title}{}
\define@cmdkey{IMG}[IMG@]{title} {}
mit denen obiges Beispiel immer noch funktionieren würde.
\define@cmdkey{<Familie>}[<Befehl-Präfix>]{<Name>}{<Code>}
definiert einen Befehl `\<Befehl-Präfix><Name>` mit dem Wert des Keys, man könnte sich also das eigenhändige Definieren sparen.