Wie bereits in den Kommentaren erklärt wurde, dürfen die Optionen für `\includegraphics` nicht als einzelnes Makro übergeben werden. Hier bietet sich eine einstufe Expansion des Makros, das die Optionen enthält, an. Dies ist mit `\expandafter` sehr einfach zu lösen.
Ähnlich verhält es sich auch mit dem optionalen Argument für eine Gleitumgebung wie `figure`. Außerdem darf `\caption` natürlich nur in einer solchen Gleitumgebung verwendet werden. KOMA-Script bietet für nicht gleitende Umgebungen jedoch die Anweisung `\captionof`.
Mit entsprechenden Tests kann man jedoch gleitende und nicht gleitende Umgebungen über eine einzige Definition lösen:
\documentclass[a5paper,headsepline]{scrartcl}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[top=10mm]{geometry}
\usepackage{xcolor}
\pagecolor{red!12}
\usepackage{mwe}% Zu Demozwecken!
\usepackage{blindtext}% Zu Demozwecken!
\usepackage{graphicx}
%%% Weil @cis offenbar nicht in der Lage ist, seinen eigenen Code
%%% für Miniabbildungen im Abbildungsverzeichnis mit einzufügen,
%%% muss ich leider das Beispiel hier damit auch noch aufblähen.
%%% Mit der eigentlichen Frage, wie man für das Laden von Bildern
%%% einen Befehl mit key-value-Schnittstelle definieren kann, hat
%%% das allerdings nichts zu tun…
\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
}
%%% Definition mit Keys %%%%%%%%%%%%%%%%%%%
\DefineFamily{IMG}
\DefineFamilyMember[.arg]{IMG}
\makeatletter
\newcommand*\IMG[1]{%
\begingroup
\FamilyStringKey[.arg]{IMG}{options}{\IMG@options}%
\let\IMG@options\@empty% In der Voreinstellung sind die Optionen leer.
\FamilyStringKey[.arg]{IMG}{file}{\IMG@file}%
\FamilyStringKey[.arg]{IMG}{shorttitle}{\IMG@shorttitle}%
\def\IMG@shorttitle{\IMG@title}% In der Voreinstellung kopiert der
% Kurzttitel einfach den Titel.
\FamilyStringKey[.arg]{IMG}{title}{\IMG@title}%
\FamilyStringKey[.arg]{IMG}{floatto}{\IMG@floatto}%
\edef\IMG@floatto{\fps@figure}% In der Voreinstellung soll die Umgebung
% gleiten wie eine normale figure-Umgebung.
\FamilyBoolKey[.arg]{IMG}{centering}{IMG@centering}% Zentrierung
% schaltbar.
\IMG@centeringtrue% In der Voreinstellung soll zentriert werden. Soll in der
% Voreinstellung nicht zentriert werden, könnte man
% \IMG@centeringtrue einfach weglassen oder durch
% \IMG@centeringfalse ersetzen.
\FamilyExecuteOptions[.arg]{IMG}{#1}%
% Jetzt behandeln wir erst einmal den Fall, dass keine Datei angegeben wurde.
\scr@ifundefinedorrelax{IMG@file}{%
\GenericError{(\string\IMG) \@spaces\@spaces\@spaces\@spaces}%
{Command \string\IMG\space Error: file must be set}%
{Sorry, but there isn't any documentation for this.}%
{You've used \string\IMG\space without a filename given by
option `file'.\MessageBreak
I can show only images with file names, so please add
one.}%
}{%
% Als nächstes unterscheiden wir, ob eine Gleitumgebung oder eine
% nicht gleitende Umgebung verwendet werden soll. Eine nicht gleitende
% Umgebung gibt es mit `floatto=`, also wenn die Gleitoptionen auf
% leer gesetzt werden.
\ifstr{\IMG@floatto}{}{% Keine Gleitumgebung!
\vskip\intextsep\noindent
\begin{minipage}{\linewidth}%
\ifIMG@centering\centering\fi
\expandafter\includegraphics
\expandafter[\expandafter{\IMG@options}]{\IMG@file}%
% Wir erlauben auch Abbildungen ohne Titel. Keine title-Option
% bedeutet auch keine \captionof:
\scr@ifundefinedorrelax{IMG@title}{% Kein Titel
}{% Einen Titel bitte!
\captionof{figure}%
[{\lofimage{\IMG@file}\IMG@shorttitle}]%
{\IMG@title}%
}%
\par
\end{minipage}\vskip\intextsep
}{% Eine Gleitumgebung!
% Da Gleitumgebungen als Option kein Makro, sondern nur einzelne
% Buchstaben erwarten, muss der Anfang der Gleitumgebung
% expandiert werden. Das geht am einfachsten mit einem Hilfsmakro:
\edef\reserved@a{\noexpand\begin{figure}[\IMG@floatto]}%
\reserved@a
\ifIMG@centering\centering\fi
\expandafter\includegraphics
\expandafter[\expandafter{\IMG@options}]{\IMG@file}%
% Wir erlauben auch Abbildungen ohne Titel. Keine title-Option
% bedeutet auch keine \caption:
\scr@ifundefinedorrelax{IMG@title}{% Kein Titel
}{% Ein Title!
\caption[{\lofimage{\IMG@file}\IMG@shorttitle}]%
{\IMG@title}%
}%
\end{figure}
}%
}
\endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%========
\begin{document}
%========
\lofimagetrue
\listoffigures
\section{Test}
\blindtext
\IMG{title={Testtitle},file=example-image}
\Blindtext
Und jetzt folgt eine Abbildung genau hier:
\IMG{floatto={},title={Testtitel},shorttitle={Kurztesttitel},file=example-image-16x9}
\blindtext
Und jetzt ohne Zentrierung:
\IMG{floatto=htb,centering=false,options={scale=.5},title={Auch ein Titel},file=example-image}
\Blindtext
% Um die Fehlermeldung bei fehlendem file=… zu sehen, das % am Anfang
% der folgenden Zeile entfernen:
%\IMG{title={Fehlerhafte Testabbildung}}
%========
\end{document}
%========
Ich wollte mich eigentlich auf das wesentliche beschränkt und insbesondere keine Minibilder für das Abbildungsverzeichnis einbauen, denn eigentlich ist es wirklich einfach, den entsprechenden Code bei Bedarf aus dem Beispiel von @cis einzufügen. Hier wollte ich nur zeigen, wie man die key-value-Geschichte zusammen mit einigen Tests, die ebenfalls `scrbase` bereitstellt, handhaben kann. Da aber @cis darauf besteht, dass er das nicht selbst könne und es unbedingt brauche, habe ich mich erbarmt, obwohl der Code dadurch nicht gerade lesbarer wird.
Und weil @cis gerne wissen wollte, wie man das mit einem Schalter für die Zentrierung machen könnte, und das mit `scrbase` so einfach ist, habe ich das auch noch eingebaut.
Und weil ich gerade so schön in Fahrt bin und die Antwort jetzt ohnehin bereits mit unnötigem überfrachtet ist, hier auch noch eine alternative Implementierung, bei der statt eines einzelnen Schalters für Zentrierung oder nicht, eine Auswahloption für zentriert (`align=center` oder wahlweise `align=c`), linksbündig (`align=left` oder wahlweise `align=l`), rechtsbündig (`align=right` oder wahlweise `align=r`) oder im Blocksatz (`align=justified` oder wahlweise `align=j`) zur Verfügung steht:
\documentclass[a5paper,headsepline]{scrartcl}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[top=10mm]{geometry}
\usepackage{xcolor}
\pagecolor{red!12}
\usepackage{mwe}% Zu Demozwecken!
\usepackage{blindtext}% Zu Demozwecken!
\usepackage{graphicx}
%%% Weil @cis offenbar nicht in der Lage ist, seinen eigenen Code
%%% für Miniabbildungen im Abbildungsverzeichnis mit einzufügen,
%%% muss ich leider das Beispiel hier damit auch noch aufblähen.
%%% Mit der eigentlichen Frage, wie man für das Laden von Bildern
%%% einen Befehl mit key-value-Schnittstelle definieren kann, hat
%%% das allerdings nichts zu tun…
\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
}
%%% Definition mit Keys %%%%%%%%%%%%%%%%%%%
\DefineFamily{IMG}
\DefineFamilyMember[.arg]{IMG}
\makeatletter
\newcommand*\IMG[1]{%
\begingroup
\FamilyStringKey[.arg]{IMG}{options}{\IMG@options}%
\let\IMG@options\@empty% In der Voreinstellung sind die Optionen leer.
\FamilyStringKey[.arg]{IMG}{file}{\IMG@file}%
\FamilyStringKey[.arg]{IMG}{shorttitle}{\IMG@shorttitle}%
\def\IMG@shorttitle{\IMG@title}% In der Voreinstellung kopiert der
% Kurzttitel einfach den Titel.
\FamilyStringKey[.arg]{IMG}{title}{\IMG@title}%
\FamilyStringKey[.arg]{IMG}{floatto}{\IMG@floatto}%
\edef\IMG@floatto{\fps@figure}% In der Voreinstellung soll die Umgebung
% gleiten wie eine normale figure-Umgebung.
\FamilyNumericalKey[.arg]{IMG}{align}{IMG@align}{%
{center}{0},{c}{0},%
{left}{1},{l}{1},%
{right}{2},{r}{2},%
{justified}{3},{j}{3}%
}
\def\IMG@align{0}% Voreinstellung ist zentriert.
\FamilyExecuteOptions[.arg]{IMG}{#1}%
\ifcase\IMG@align
\let\IMG@align\centering
\or
\let\IMG@align\raggedright
\or
\let\IMG@align\raggedleft
\else
\let\IMG@align\relax
\fi
% Jetzt behandeln wir erst einmal den Fall, dass keine Datei angegeben wurde.
\scr@ifundefinedorrelax{IMG@file}{%
\GenericError{(\string\IMG) \@spaces\@spaces\@spaces\@spaces}%
{Command \string\IMG\space Error: file must be set}%
{Sorry, but there isn't any documentation for this.}%
{You've used \string\IMG\space without a filename given by
option `file'.\MessageBreak
I can show only images with file names, so please add
one.}%
}{%
% Als nächstes unterscheiden wir, ob eine Gleitumgebung oder eine
% nicht gleitende Umgebung verwendet werden soll. Eine nicht gleitende
% Umgebung gibt es mit `floatto=`, also wenn die Gleitoptionen auf
% leer gesetzt werden.
\ifstr{\IMG@floatto}{}{% Keine Gleitumgebung!
\vskip\intextsep\noindent
\begin{minipage}{\linewidth}%
\IMG@align
\expandafter\includegraphics
\expandafter[\expandafter{\IMG@options}]{\IMG@file}%
% Wir erlauben auch Abbildungen ohne Titel. Keine title-Option
% bedeutet auch keine \captionof:
\scr@ifundefinedorrelax{IMG@title}{% Kein Titel
}{% Einen Titel bitte!
\captionof{figure}%
[{\lofimage{\IMG@file}\IMG@shorttitle}]%
{\IMG@title}%
}%
\par
\end{minipage}\vskip\intextsep
}{% Eine Gleitumgebung!
% Da Gleitumgebungen als Option kein Makro, sondern nur einzelne
% Buchstaben erwarten, muss der Anfang der Gleitumgebung
% expandiert werden. Das geht am einfachsten mit einem Hilfsmakro:
\edef\reserved@a{\noexpand\begin{figure}[\IMG@floatto]}%
\reserved@a
\IMG@align
\expandafter\includegraphics
\expandafter[\expandafter{\IMG@options}]{\IMG@file}%
% Wir erlauben auch Abbildungen ohne Titel. Keine title-Option
% bedeutet auch keine \caption:
\scr@ifundefinedorrelax{IMG@title}{% Kein Titel
}{% Ein Title!
\caption[{\lofimage{\IMG@file}\IMG@shorttitle}]%
{\IMG@title}%
}%
\end{figure}
}%
}
\endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%========
\begin{document}
%========
\lofimagetrue
\listoffigures
\section{Test}
\blindtext
\IMG{title={Testtitle},file=example-image}
\Blindtext
Und jetzt folgt eine Abbildung genau hier:
\IMG{floatto={},title={Testtitel},shorttitle={Kurztesttitel},file=example-image-16x9}
\blindtext
Und jetzt rechtsbündig, statt zentriert:
\IMG{floatto=htb,align=r,options={scale=.5},title={Auch ein Titel},file=example-image}
\Blindtext
% Um die Fehlermeldung bei fehlendem file=… zu sehen, das % am Anfang
% der folgenden Zeile entfernen:
%\IMG{title={Fehlerhafte Testabbildung}}
%========
\end{document}
%========
Das ist tatsächliche in klein wenig aufwendiger, weil `scrbase` derzeit kein `\FamilyStringCase`, sondern nur ein `\FamilyNumericalKey` hat. Vielleicht wäre der Autor ja bereit, so etwas ggf. auch noch einzubauen.
Und weil @cis außerdem den Vorwurf geäußert hat, `scrbase` sei anscheinend furchtbar kompliziert, weil obige Lösung so lang ist, sei hier noch erwähnt, dass die Anweisung `\IMG` ohne die Möglichkeit von nicht gleitenden Umgebungen und ohne die Möglichkeit den Test auf nicht existierenden Dateinamen und nicht existierenden Titel auch sehr viel kürzer geschrieben werden könnte:
\DefineFamily{IMG}
\DefineFamilyMember[.arg]{IMG}
\makeatletter
\newcommand*\IMG[1]{%
\begingroup
\FamilyStringKey[.arg]{IMG}{options}{\IMG@options}%
\let\IMG@options\@empty% In der Voreinstellung sind die Optionen leer.
\FamilyStringKey[.arg]{IMG}{file}{\IMG@file}%
\FamilyStringKey[.arg]{IMG}{shorttitle}{\IMG@shorttitle}%
\def\IMG@shorttitle{\IMG@title}% In der Voreinstellung kopiert der
% Kurzttitel einfach den Titel.
\FamilyStringKey[.arg]{IMG}{title}{\IMG@title}%
\def\IMG@title{}% In der Voreinstellung ist der Titel einfach leer.
\FamilyStringKey[.arg]{IMG}{floatto}{\IMG@floatto}%
\def\IMG@floatto{\fps@figure}% Gleitvoreinstellung wie bei allen `figure`-Umgebungen
\FamilyExecuteOptions[.arg]{IMG}{#1}%
% Da Gleitumgebungen als Option kein Makro, sondern nur einzelne
% Buchstaben erwarten, muss der Anfang der Gleitumgebung
% expandiert werden. Das geht am einfachsten mit einem Hilfsmakro:
\edef\reserved@a{\noexpand\begin{figure}[\IMG@floatto]}%
\reserved@a
\centering
\expandafter\includegraphics
\expandafter[\expandafter{\IMG@options}]{\IMG@file}%
\caption[{\lofimage{\IMG@file}\IMG@shorttitle}]{\IMG@title}%
\end{figure}
\endgroup
}
\makeatother
Damit ist diese Fassung nun nur noch vier Codezeilen länger als seine eigene, unterstützt allerdings tatsächlich die Verwendung einer Option für das optionale Argument von `figure` und die Verwendung des langen Titels als Voreinstellung für den Kurztitel. Empfehlen würde ich allerdings wirklich die Fassung mit Fehlerbehandlung. Ob man die Fallunterscheidung für gleitende und nicht gleitende Abbildungen braucht, sei hingegen dahin gestellt.
Ebenfalls aufgegriffen habe ich den Hinweis, dass bei Verwendung von KOMA-Script, dessen key-value-Befehle die *einfachste* Lösung darstellen dürften. Jedenfalls ist es die Lösung, die keine weiteren Pakete benötigt. Die verwendeten Befehle sowohl für die key-value-Behandlung als auch für die Tests sind daher in der [KOMA-Script-Anleitung](http://www.komascript.de/scrguide) bzw. im [KOMA-Script-Buch](http://www.komascript.de/komascriptbuch) zu finden.