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, 09:50

cis's gravatar image

cis
5.4k860169
Akzeptiert: 68%

bearbeitet 17 Aug '14, 14:10

Ijon%20Tichy's gravatar image

Ijon Tichy
4.4k618

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, 09:53) Clemens

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

(16 Aug '14, 09: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, 10:03) Clemens

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, 10: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, 10:26) Clemens

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, 10: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, 11:01) cfeuersaenger

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

(16 Aug '14, 11:10) Epllus

@Epllus siehe meine Kommentare :)

(16 Aug '14, 11:13) Clemens

@Clemens Stimmt, aber ich wollte nochmals darauf hinweisen.

(16 Aug '14, 11: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, 13:39) cis
Ergebnis 5 von 11 Alle anzeigen

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, 13:59

Clemens's gravatar image

Clemens
19.0k113060

bearbeitet 20 Aug '14, 03:56

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

(17 Aug '14, 17:09) Ijon Tichy

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

(17 Aug '14, 17:16) Clemens

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, 06:42) cis

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

(18 Aug '14, 06:49) Clemens

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

(18 Aug '14, 07:03) cis

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

(18 Aug '14, 07:04) Clemens

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, 07: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, 07: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, 07:35) Ijon Tichy

\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, 08:50) Clemens

@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, 04:36) Ijon Tichy

@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, 05:14) Clemens

@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, 13:36) Ijon Tichy

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

(19 Aug '14, 16:03) Clemens

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

(19 Aug '14, 16:23) cis
Ergebnis 5 von 15 Alle anzeigen

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, 11:38

Henri's gravatar image

Henri
10.0k31730

bearbeitet 17 Aug '14, 16: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, 12: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, 13:36) Clemens

@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, 13: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, 14:03) Clemens

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, 14:07) cis

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

(17 Aug '14, 14:09) Clemens

@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, 14:59) Clemens

@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, 15:14) Clemens

@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, 15:41) Ijon Tichy

@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, 15:45) Clemens
Ergebnis 5 von 10 Alle anzeigen

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, 10:04

cis's gravatar image

cis
5.4k860169

bearbeitet 17 Aug '14, 10: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, 11:23) Ijon Tichy
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×32
×16
×5
×3
×3

Frage gestellt: 16 Aug '14, 09:50

Frage wurde angeschaut: 4,096 Mal

Zuletzt aktualisiert: 20 Aug '14, 03:56