Hallo!

Ich wollte auf das Thema: Wie erhalte ich Miniaturansichten der Abbildungen im Abbildungsverzeichnis?

Keys anwenden, damit ich für Miniabbildungen im Abbildungsverzeichnis einen Befehl

\IMG[file=foo.png, options={scale=1.65}, title={Der Titel}, shorttitle={Der Kurztitel}]

habe.

xkeyval aus dieser akzeptierten AW aus einem anderen Thema scheint mir dafür die einfachste Möglichkeit.

Leider tut folgende Umsetzung nicht - was mache ich falsch?

Hinweis: Für das Programm, werden foo.png und bar.png benötigt. Ich habe die Bilder unten angehängt.

Ich hoffe, man kann beim Code noch durchsteigen.

Open in writeLaTeX
\documentclass[a5paper, onside, automark, open=any, headsepline]{scrartcl}

\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[top=10mm]{geometry}

\usepackage{xcolor}
 \pagecolor{red!12}

 % Mini-Bilder im Abbildungsverzeichnis =========
 \usepackage{graphicx}
\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 klassisch %%%%%%%%%%%%%%%%%%%
%\img{<graphicx options>}{FILE.png}{<caption text>}
\newcommand{\img}[3]{%
%\def\
\includegraphics[#1]{#2}
  \caption[\lofimage{#2} ooo]{\lofimage{#2} #3}
}%
% ===============================

\usepackage{xkeyval}
%%% Definition mit Keys %%%%%%%%%%%%%%%%%%%
\makeatletter
\newcommand*\IMG@options{}
\newcommand*\IMG@file{}
\newcommand*\IMG@shorttitle{}
\newcommand*\IMG@title{}

\define@key{IMG}{options}  {\renewcommand*\IMG@options{#1}}
\define@key{IMG}{file} {\renewcommand*\IMG@file{#1}}
\define@key{IMG}{shorttitle}{\renewcommand*\IMG@shorttitle{#1}}
\define@key{IMG}{title}{\renewcommand*\IMG@title{#1}}

\newcommand*\IMG[1][]{%
\begingroup
\setkeys{IMG}{#1}%
   \includegraphics[\IMG@options\]{\IMG@file\}
 \caption[\lofimage{\IMG@file\} \IMG@shorttitle]{\lofimage{\IMG@file\}  \IMG@title}
\endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%========
\begin{document}
%========
\lofimagetrue
\listoffigures
\lofimagefalse
\vspace{2cm}

\IMG[file=foo.png] %%%%%%%%%%% TUT NICHT!

\section{Abschnittsname}
\begin{figure}[htb]
\centering
\img{scale=0.65}{foo.png}{Urlaubsfoto}
\end{figure}

\begin{figure}[htb]
\centering
\img{scale=0.4}{bar.png}{Graph im Koordinatensystem}
\end{figure}
%========
\end{document}
%========

alt text

alt text

gefragt 16 Aug '14, 15:50

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

bearbeitet 17 Aug '14, 20:10

gast3's gravatar image

gast3
(ausgesetzt)

Bezüglich »xkeyval [...] scheint mir dafür die einfachste Möglichkeit.« – da Du eine KOMA-Klasse verwendet, scheint mir eigentlich KOMA-Scripts eigene Möglichkeit die einfachste Möglichkeit.

(16 Aug '14, 15:53) cgnieder

Boahh, jetzt habe ich grad xkeyval halb verstanden. A l l e im Link genannten Methoden scheinen mir nicht gerade unaufwendig :|

(16 Aug '14, 15:55) cis

Du musst \IMG@options vermutlich expandieren, bevor Du sie an \includegraphics weiterreichen kannst. Ändere mal \includegraphics[\IMG@options\]{\IMG@file\} in \expandafter\includegraphics\expandafter[\IMG@options]{\IMG@file}. Das sollte funktionieren. (\] und \} sind vermutlich Tippfehler?)

(16 Aug '14, 16:03) cgnieder

Ja, die Grafik erscheint so. Allerdings tut dann die caption nicht: \caption outside float. Das mit dem Tippfehler weiß ich nicht, beim verlinkten Thema gab es auch manchmal solche zweiten Backslashs, mmmhhh.

(16 Aug '14, 16:10) cis

Seh ich in den verlinkten Fragen und Antworten nirgends... Aber die sollten die ja alleine schon wegen runaway arguments aufgefallen sein. Du hast doch in der Definition von \IMG ein \caption drin: dann kannst Du's auch nur in Gleitumgebungen einsetzen, sonst gibt's eben den \caption outside float Fehler. Außerdem fehlt Dir die schließende Klammer von \caption in der Definition.

(16 Aug '14, 16:26) cgnieder

Aja, dann baut man vll. besser die figure-Umgebung gleich mit in das Kommando ein. Ich glaub, ich habe es soweit. Ich wollte jetzt \begin{figure}[\IMG@figureoptions] einbauen. Mit dem Default: \newcommand*\IMG@figureoptions{htb} - aber irgendwie habe ich den Verdacht, daß das nicht tut, weil es das Bild um jeden Preis oben an die Seite setzen will. Verdammte Gleitumgebungen :()

(16 Aug '14, 16:53) cis

Dies ist keine Antwort auf Deine Frage, sondern eine hoffentlich hilfreiche Bemerkung: unter http://www.tug.org/TUGboat/tb30-1/tb94wright-keyval.pdf gibt es einen echt guten Einfuehrungsartikel, der meines Wissens auch xkeyval gut erklaert. Vielleicht interessiert Dich aber auch folgende Bemerkung: nachdem ich vor zig Jahren von xkeyval auf das neuere pgfkeys umgestiegen bin, will ich es nicht mehr missen. Letzteres ist auch in dem genannten Artikel erlaeutert. Disclaimer: ich habe den Artikel mit geschrieben.

(16 Aug '14, 17:01) cfeuersaenger

@cis Dein Code ist übrigens wegen „fehlenden“ Klammern nicht lauffähig.

(16 Aug '14, 17:10) Epllus

@Epllus siehe meine Kommentare :)

(16 Aug '14, 17:13) cgnieder

@Clemens Stimmt, aber ich wollte nochmals darauf hinweisen.

(16 Aug '14, 17:15) Epllus

Ja, ganz ehrlich: Ich hätte egtl. auch lieber pgfkeys verwendet, keyval erschien mir jetzt fürs erste einfacher. Ich werde mich heute abend nochmal damit befassen und dann auch möglichst eine AW posten.

(16 Aug '14, 19:39) cis
Ergebnis 5 von 11 show 6 more comments

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:

Open in writeLaTeX
\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:

Open in writeLaTeX
\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:

Open in writeLaTeX
\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

Open in writeLaTeX
\IMG[file=foo.png]

verwenden wir im Dokument

Open in writeLaTeX
\begin{figure}
  \centering
  \IMG[file=foo.png]
\end{figure}

Tada! Alles geht. Oder doch nicht? Ein Test:

Open in writeLaTeX
\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 [:

Open in writeLaTeX
\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:

Open in writeLaTeX
\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:

Open in writeLaTeX
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

Open in writeLaTeX
LaTeX Warning: Unused global option(s):
    [onside,automark,open=any].

wegen unverwendeter globaler Optionen.

Weitere Verbesserungen/versteckte Fehler

Wenn man

Open in writeLaTeX
\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:

Open in writeLaTeX
\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:

Open in writeLaTeX
\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:

Open in writeLaTeX
\@ifundefined{IMG@options}
  {\includegraphics{\IMG@file}}
  {\expandafter\includegraphics\expandafter[\expandafter{\IMG@options}]{\IMG@file}}

Wurde der Titel vergessen, geben wir einen Füllertext an:

Open in writeLaTeX
\@ifundefined{IMG@title}
  {\newcommand*\IMG@title{Titel fehlt! Bitte angeben.}}
  {}%

Gibt es keinen Kurztitel, verwenden wir \caption ohne optionales Argument:

Open in writeLaTeX
\@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

Open in writeLaTeX
\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}

Übrigens braucht man für

Open in writeLaTeX
\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

Open in writeLaTeX
\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:

Open in writeLaTeX
\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.

Open in writeLaTeX
\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.

Permanenter link

beantwortet 17 Aug '14, 19:59

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 20 Aug '14, 09:56

@Clemens: Du hast das Problem mit dem leeren \IMG@shorttitle vergessen …

(17 Aug '14, 23:09) gast3

@Ijon Ups... Das werde ich morgen ergänzen, wenn ich wieder etwas wacher bin. Danke für den Hinweis

(17 Aug '14, 23:16) cgnieder

Aja, sehr gut; ich verstehe. Das ifundefined war im Grunde die "einfache Option" nach der ich im anderen Thread fragte. Eine Sache fällt mir hier auf, wenn das neue Kommando explizit die caption-Optionen für die figure-Umgebung enthält, sollte diese dann nicht Teil des neuen Kommandos sein? Das zieht natürlich einen weiteren Key "figureoptions" mit Default "htb" nach sich.

(18 Aug '14, 12:42) cis

@cis kann man machen und hat @Ijon in seinem Beispiel ja auch gemacht :) Ich hab's absichtlich weggelassen.

(18 Aug '14, 12:49) cgnieder

Ferner könnte \centering ein boolscher key sein, mit dem Default true. Ich versuche das mal.

(18 Aug '14, 13:03) cis

@cis Viele Sachen sind vorstellbar. Deiner Fantasie sind keine Grenzen gesetzt. :)

(18 Aug '14, 13:04) cgnieder

Ich habe

\define@key{IMG}{figureoptions} {\newcommand*\IMG@figureoptions{#1}}

\begin{figure}[\@ifundefined{IMG@figureoptions}{htb}{}]

ergänzt. Das tut wohl. Nur der boolsche Key für centering macht mir Kopfweh.

(18 Aug '14, 13:09) cis

Vll. einfach so:

\define@boolkey{IMG}{center} {\newcommand*\IMG@center{#1}}

\@ifundefined{IMG@center}{\centering}{}

und dann:

\IMG{options={scale=0.65}, file=example-image-a, title=Urlaubsfoto, center=false}

scheint zu tun, weiß aber nicht, ob das so richtig ist.

(18 Aug '14, 13:28) cis

@cis: Ich glaube nicht, dass Dein Code für figureoptions funktioniert. Außerdem ist es in dem Fall einfacher, die Voreinstellung vorzugeben, also \IMG@figureoptions anders vorzudefinieren (siehe meine Antwort). Extra für Dich habe ich in meiner Antwort übrigens auch noch einen Schalter für das Zentrieren eingebaut.

(18 Aug '14, 13:35) gast3

\begin{figure}[\@ifundefined{IMG@figureoptions}{htb}{}] funktioniert sicher sicht, wenn mich nicht alles täuscht. Ich bin mir relativ sicher, dass \figure sein optionales Argument nicht expandiert. Mit fixltx2e dürftest Du damit eine Reihe von Fehlern der Art ! LaTeX Error: Unknown float option `\'. bekommen. Das ist der Grund, warum @Ijon in seiner Antwort den Umweg über \edef\reserved@a{ geht... vielleicht interessant für Dich: How to pass figure position to keyval macro?

(18 Aug '14, 14:50) cgnieder

@Clemens: Das Beispiel benötigt übrigens kein xkeyval. Da es nur die keyval-Funktionalität nutzt und diese bei KOMA-Script immer vorhanden ist (ist die Grundlage für scrbase) kann man das Paket weglassen. AFAIK gibt es mit Version 2.6c von xkeyval außerdem Probleme beispielsweise mit biblatex, so dass es sicher keine schlechte Idee ist, das Paket nur zu laden, wenn man es wirklich braucht.

(19 Aug '14, 10:36) gast3

@Ijon gut, wenn man es nicht braucht kann man es weglassen. Betreff der Inkompatibilität mit biblatex: ich kann auf die Schnelle keine Referenz dafür finden... (abgesehen davon, dass die aktuelle Version 2.7 ist). Ich kann allerdings finden, dass ein Update von keyval mit dem 2e-Release vom 1. Mai 2014 biblatex gebrochen hat, was durch ein Laden von xkeyval wieder gerichtet werden konnte, also quasi das Gegenteil: http://tex.stackexchange.com/questions/175982/miktex-2-9-latest-package-update-broke-biblatex-bibliography und http://article.gmane.org/gmane.comp.tex.latex.latex3/3202

(19 Aug '14, 11:14) cgnieder

@Clemens xkeyval hat genau dieselbe Änderung, die bei keyval zu einem Problem wurde, ebenfalls durchgeführt. Bei keyval wurde die Änderung am 8. Mai bereits zurückgenommen. Bei xkeyval theoretisch am 9. Mai. mit Version 2.6d. Seltsamer Weise kam bei mir die mit TeX Live aber nie an sondern erst die 2.7 gut zwei Wochen später, wobei ich nicht weiß, ob das an dem Mirror lag oder generell die 2.6d aus irgendwelchen Gründen bei TeX Live ausgefallen war. Aber egal, jedenfalls braucht man xkeyval für das Beispiel nicht (und keyval wird bereits indirekt von der Klasse geladen).

(19 Aug '14, 19:36) gast3

@Ijon Ich werde der Antwort einen diesbezüglichen Kommentar hinzufügen.

(19 Aug '14, 22:03) cgnieder

Das Thema hält euch ja ganz schön auf Trap. Danke jedenfalls für rege Anteilnahme.

(19 Aug '14, 22:23) cis
Ergebnis 5 von 15 show 10 more comments

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:

Open in writeLaTeX
\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:

Open in writeLaTeX
\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:

Open in writeLaTeX
\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 bzw. im KOMA-Script-Buch zu finden.

Permanenter link

beantwortet 17 Aug '14, 12:36

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 18 Aug '14, 13:51

Ja danke für die AW. Zumindest für mich gehören die Probleme Keys und Miniabbildungen im Abbildungsverzeichnis schon untrennbar zusammen. Ich hatte nämlich bei der klassischen Lösung (siehe Startpost) das Problem, einen Kurztitel sinnvoll einzubauen. Bei meiner Lösung ist das nun einigermaßen behoben - allerdings -muß- ein Kurztitel angegeben werden; läßt man ihn weg, steht da auch nichts. Das ist also nur 90%ig perfekt.

(17 Aug '14, 16:10) cis

Das ist jetzt ein anderer Punkt, aber die KOMA-Lösung ist ja grauenvoll lang und vor allem nicht mehr ganz einfach nachvollziehbar bzw. reproduzierbar. Da werde ich mir glaube eher mal pgfkeys anschauen.

(17 Aug '14, 16:11) cis

@cis: Lang ist sie nur deshalb, weil sie all die Dinge abfängt, die sich in der Diskussion andeuteten. Wenn Du beispielsweise den Fall, dass kein Titel angegeben ist, nicht behandeln willst, dann entfällt die Sonderbehandlung dafür. Wenn Du nur eine Gleitumgebung aber nicht einen nicht gleitende Alternative haben willst, dann entfällt die Sonderbehandlung dafür. Wenn Du keine Gleitoptionen erlauben willst, dann brauchst Du auch nicht dafür zu sorgen, dass diese expandiert werden. Wenn Du keine sinnvolle Fehlermeldung produzieren willst, wenn keine Datei angegeben ist, dann entfällt diese.

(17 Aug '14, 17:22) gast3

@cis: Wie erklärt ist es ein leichtes, zusätzlich den Code für die Minibilder einzufügen. Ich wollte nur den Code für die Demonstration der key-value-Schnittstelle nicht zusätzlich mit Makros belasten, die das nur unübersichtlich machen. Deinen \logimage-Code hast Du je bereits erfolgreich implementiert und kannst den sicher mit Leichtigkeit hinzufügen. Darauf hatte ich auch explizit hingewiesen. Ich habe jetzt nur noch ein paar zusätzliche Kommentare eingebaut, um Dir zu erläutern, was ich an zusätzlichen Fällen behandle.

(17 Aug '14, 17:32) gast3

@Ijon Tichy: Warum \expandafter[\expandafter{\IMG@options}] und nicht einfach \expandafter[\IMG@options]?

(17 Aug '14, 17:49) Henri

@Henri: Damit in \IMG@options eckige Klammern verwendet werden können. Ist zwar in diesem Fall wohl nicht notwendig, da \includegraphics bisher wohl keine Optionen kennt, in denen eckige Klammern vorkommen könnten, aber ich verwende gerne einheitliche Lösungen. Und wer weiß, was \includegraphics in den nächsten Jahren noch an Optionen bekommt. In Deiner Lösung muss der Anwender selbst darauf achten, weil dort bereits das Argument von \IMG durch eckige Klammern bestimmt wird.

(17 Aug '14, 17:58) gast3

Müssen diese vielen zynischen Anspielungen egtl. sein? :() Ich kann das auch rein theoretisch aufziehen, mit einem inhaltslosen Beispiel. Dann würde es heißen: "Ja, das ist ja gar nicht konkretisiert! Was willst Du übh. machen? ... "

(18 Aug '14, 14:28) cis

@cis Welche zynischen Anspielungen?

(18 Aug '14, 14:34) gast3

Jetzt stell Dich nicht doof - Du weißt schon, welche Textstellen ich meine. ^^ Ich werde hier auch noch ca. 2 Sachen rausziehen (müssen). Danke jedenfalls für den Beitrag.

(18 Aug '14, 20:42) cis

@cis Da ich nicht weiß, welche zynischen Anspielungen Du meinst, bleibt mir leider nur, den Beitrag zu löschen.

(18 Aug '14, 20:46) gast3
Ergebnis 5 von 10 show 5 more comments

alt text

Hinweis: Die 1. Zeile aus

Open in writeLaTeX
%\begin{figure}[\IMG@figureoptions]   % GEHT NICHT gut - Besser     htb      ???
\begin{figure}[htb]

führt zum Effekt, daß das die Bilder seltsam platziert werden, unabhängig von der Einstellung. Evtl. mache ich hier noch etwas falsch, evtl. soll das so sein bei der Gleitumgebung.

Open in writeLaTeX
\documentclass[a5paper, onside, automark, open=any, headsepline]{scrartcl}

\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[top=10mm]{geometry}

\usepackage{xcolor}
 \pagecolor{red!42!green!20}
% ===============================
% Mini-Bilder im Abbildungsverzeichnis =========
 \usepackage{graphicx}
\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}
%%% Definition mit Keys %%%%%%%%%%%%%%%%%%%
\makeatletter
\newcommand*\IMG@figureoptions{htb}
\newcommand*\IMG@options{}
\newcommand*\IMG@file{}
\newcommand*\IMG@shorttitle{}
\newcommand*\IMG@title{}

\define@key{IMG}{figureoptions}  {\renewcommand*\IMG@figureoptions{#1}}
\define@key{IMG}{options}  {\renewcommand*\IMG@options{#1}}
\define@key{IMG}{file} {\renewcommand*\IMG@file{#1}}
\define@key{IMG}{shorttitle}{\renewcommand*\IMG@shorttitle{#1}}
\define@key{IMG}{title}{\renewcommand*\IMG@title{#1}}

\newcommand*\IMG[1][]{%
\begingroup
\setkeys{IMG}{#1}%
%\begin{figure}[\IMG@figureoptions]   % GEHT NICHT gut - Besser     htb      ???
\begin{figure}[htb]
\expandafter\includegraphics\expandafter[\IMG@options]{\IMG@file}
\caption[\lofimage{\IMG@file}  \IMG@shorttitle]{\lofimage{\IMG@file}  \IMG@title}
\end{figure}
\endgroup
}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ===============================
% ===============================
%========
\begin{document}
%========
\lofimagetrue
\listoffigures \par
\lofimagefalse
\vspace{2cm}

\section{Abschnittsname}
\IMG[file=foo.png, title=fooTitel, options={scale=1.05}, shorttitle={fooKurztitel}, figureoptions={h}]

\IMG[file=bar.png, title=barTitel, options={scale=0.25}, shorttitle={barKurztitel}, figureoptions={h}]

%========
\end{document}
%========
Permanenter link

beantwortet 17 Aug '14, 16:04

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

bearbeitet 17 Aug '14, 16:13

@cis Du hast keinerlei Fehlerbehandlung für den Fall, dass keine Datei oder kein Titel angegeben wird. Und figureoptions wird überhaupt nicht verwendet. In meiner Lösung findest Du hingegen derartige Dinge behandelt.

(17 Aug '14, 17:23) gast3

Ein Remake von @Ijon Tichys Antwort mit l3keys. Um mehr über das Zeug zu lernen empfehle ich die beiden Artikel von Joseph Wright aus TUGboat:


Open in writeLaTeX
\documentclass{article}
\usepackage{mwe,blindtext,graphicx,caption,xparse}
\ExplSyntaxOn
\keys_define:nn { cis }
  {
    options      .tl_set:N  = \l_cis_options_tl     ,
    file         .tl_set:N  = \l_cis_file_tl        ,
    title        .tl_set:N  = \l_cis_title_tl       ,
    shorttitle   .tl_set:N  = \l_cis_shorttitle_tl  ,
    shorttitle   .initial:n = \l_cis_title_tl       ,
    floatto      .tl_set:N  = \l_cis_floatto_tl     ,
    lofthumbsize .tl_set:N  = \l_cis_lofthumbsize_tl,
    lofthumbsize .initial:n = 2em                   ,
    file         .value_required:                   ,
  }

%\keys_set:nn { cis } { lofthumbsize = 4em }

\cs_new_protected:Npn \cis_img:n #1
  {
    \group_begin:
      \keys_set:nn { cis } { #1 }
      \tl_if_empty:NTF \l_cis_floatto_tl
      {
        \cis_img_nofloat:
      }
      {
        \cis_img_float:
      }
    \group_end:
  }

\cs_new_protected:Npn \cis_img_nofloat:
  {
  \vskip\intextsep\noindent
  \begin{minipage}{\linewidth}
    \centering
      \exp_args:NNo \includegraphics[\l_cis_options_tl]{\l_cis_file_tl}
    \tl_if_empty:NF \l_cis_title_tl
      {
        \captionof{figure}[
        \lofimage{\l_cis_lofthumbsize_tl}{\l_cis_file_tl}
        \l_cis_shorttitle_tl
        ]{\l_cis_title_tl}
      }
    \par
  \end{minipage}
  \vskip\intextsep
  }

\cs_new_protected:Npn \cis_img_float:
  {
    \exp_args:Nnno \begin{figure}[\l_cis_floatto_tl]
      \centering
      \exp_args:NNo\includegraphics[\l_cis_options_tl]{\l_cis_file_tl}
      \tl_if_empty:NF \l_cis_title_tl
        {
          \caption[
          \lofimage{\l_cis_lofthumbsize_tl}{\l_cis_file_tl}
          \l_cis_shorttitle_tl
          ]{\l_cis_title_tl}
        }
    \end{figure}
  }

\box_new:N \l_cis_lofimage_box
\NewDocumentCommand \lofimage { m m }
  {
    \hbox_set_to_wd:Nnn \l_cis_lofimage_box { #1 }
      {
        \hss
        \includegraphics[
        width=#1,height=#1,keepaspectratio=true
        ]{#2}
        \hss
      }
    $\tex_vcenter:D to #1 { \vss \box_use:N \l_cis_lofimage_box \vss }$
    \quad
  }

\NewDocumentCommand \IMG { r[] }
  {
    \cis_img:n { #1 }
  }
\ExplSyntaxOff

\begin{document}
\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
\IMG[floatto=p,options={scale=.5},title={Auch ein Titel},file=example-image]

\Blindtext

\end{document}
Permanenter link

beantwortet 17 Aug '14, 17:38

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 17 Aug '14, 22:59

Aja, danke. Ein key cis - ich fühle mich geehrt. Vorweg: Ihr baut alle die Miniabbildungen im Abbildungsverzeichnis wieder aus. Das ist Teil des Problems und das ist das A und O und das braucht man :() Aber, ja l3keys... Also ich weiß nicht, welches key-Paket man nehmen sollte. Wenn ich mich festlegen müßte, würde ich wahrscheinlich pgfkeys nehmen. Ich find eben xkeyval auf anhieb durchschaubarer.

(17 Aug '14, 18:01) cis
1

@cis das cis im Namen der Bafehle ist letzlich nicht nötig, folgt aber der empfohlenen expl3-Praxis, Befehle einem Modul zuzuordnen. Auf TeX.sx hat egreg damit angefangen, dafür immer die Nutzernamen der Fragesteller zu verwenden. Ich nehme an, dass Henri sich das dort abgeschaut hat.

Die Minibilder in dem Code der Frage sind nicht teil des Problems: sie funktionieren ja! Ich habe den Verdacht, dass Du die eigentlichen Stellen, an denen das problem der Frage repariert wird, gar nicht verstanden hast?

(17 Aug '14, 19:36) cgnieder

@cis: Jetzt mit Bildern. @Clemens: Kannst Du mir erklären warum ich keinen LaTeX3 kernel error bekomme wenn ich file=... weglasse obwohl file .value_required ist?

(17 Aug '14, 19:55) Henri

@Henri Spontan nicht, muss ich testen. Es gibt aber andere Baustellen. Man kann sicher, wenn man \exp_after:wN verwendet, dass man expl3 noch nicht richtig ausnützt. Dass braucht man eigentlich nie, außer in wirklich Lowlevel-Code. Ich vermite auch, dass man das \tex_vcenter:D-Konstrukt (mit :D wie don't use) besser basteln könnte.

(17 Aug '14, 20:03) cgnieder

Es ist halt für mich die Hauptfrage: Soll ich wirklich in allen Details l3keys erforschen oder lieber gleich pgfkeys nehmen, weil das ggf. auch andere Vorteile hat. Andererseits stehen die pgfkeys-Sachen versteckt im Tikz-Handbuch; ich werde nacher mal nach einem Skript suchen. Ich find bei allen diesen key-Paketen den Forschungsaufwand nicht minder.

(17 Aug '14, 20:07) cis

@cis l3keys zu erforschen ohne komplett expl3 zu lernen halte ich ehrlich gesagt für wenig zielführend

(17 Aug '14, 20:09) cgnieder

@Henri .value_reuired: bedeutet nicht, dass der Key gesetzt werden muss (das ergäbe auch keinen Sinn), sondern dass er nicht ohne Wert verwendet werden kann, also nicht \keys_set:nn {...} { file }.

(17 Aug '14, 20:59) cgnieder

@Henri ich hätte ja eine expl3-Version ohne Lowlevel-Befehle, aber ich will eigentlich nicht noch eine Antwort posten... Für einen Kommentar ist es zu lang... Was anderes: einen verlangten Wert als Option zu setzen ist eigentlich widersprüchlich. Besser wäre IMHO eine Syntax \IMG[<Optionen>]{<Datei>} wie es bei \includegraphics schließlich auch ist.

(17 Aug '14, 21:14) cgnieder

@Clemens: Bezüglich der Argumente stimme ich Dir bis zu einem gewissen Grad zu. Bei vielen obligatorischen Argumenten hat allerdings eine key-value-Syntax durchaus auch Vorteile. Würde mich emacs nicht gezielt danach fragen, hätte ich schon bei \rule Schwierigkeiten mit zu merken, ob erst die Breite oder erst die Höhe kommt. Wie dem auch sei: @cis wollte gemäß seinem Beispiel alles in einem Argument. Ob das nun obligatorisch oder optional ist, ist eine Glaubensfrage …

(17 Aug '14, 21:41) gast3

@Ijon, einverstanden: sobald es mehrere obligatorische werden, ist keyval durchaus vorteilhaft. Ich glaube, dennoch wäre es dann sinnvoll, die optionalen Keys in einem optionalen Argument abzufragen, und die obligatorischen in einem obligatorischen... aber darüber kann man natürlich ewig philosophieren, was denn nun das beste wäre...

(17 Aug '14, 21:45) cgnieder
Ergebnis 5 von 10 show 5 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×46
×21
×5
×3
×3

gestellte Frage: 16 Aug '14, 15:50

Frage wurde gesehen: 17,938 Mal

zuletzt geändert: 20 Aug '14, 09:56