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
habe.
Leider tut folgende Umsetzung nicht - was mache ich falsch?
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} %========
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 FehlerDen Befehl 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: Open in writeLaTeX
\includegraphics[\IMG@options]{\IMG@file} Dann der gleiche Fehler noch mal in Open in writeLaTeX
\caption[\lofimage{\IMG@file} \IMG@shorttitle]{\lofimage{\IMG@file} \IMG@title} Jetzt bleibt der Fehler 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: 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 Open in writeLaTeX
\expandafter\includegraphics\expandafter[\expandafter{\IMG@options}]{\IMG@file} Die 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 Open in writeLaTeX
LaTeX Warning: Unused global option(s): [onside,automark,open=any]. wegen unverwendeter globaler Optionen. Weitere Verbesserungen/versteckte FehlerWenn 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 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 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 }
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 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 Das komplette BeispielOpen 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 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 beantwortet 17 Aug '14, 19:59 cgnieder @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
(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
(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
ergänzt. Das tut wohl. Nur der
(18 Aug '14, 13:09)
cis
Vll. einfach so:
und dann:
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
(18 Aug '14, 13:35)
gast3
(18 Aug '14, 14:50)
cgnieder
@Clemens: Das Beispiel benötigt übrigens kein
(19 Aug '14, 10:36)
gast3
@Ijon gut, wenn man es nicht braucht kann man es weglassen. Betreff der Inkompatibilität mit
(19 Aug '14, 11:14)
cgnieder
@Clemens
(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 Ähnlich verhält es sich auch mit dem optionalen Argument für eine Gleitumgebung wie 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 Und weil @cis gerne wissen wollte, wie man das mit einem Schalter für die Zentrierung machen könnte, und das mit 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 ( 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 Und weil @cis außerdem den Vorwurf geäußert hat, 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 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. beantwortet 17 Aug '14, 12:36 gast3 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
(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
(17 Aug '14, 17:32)
gast3
@Ijon Tichy: Warum
(17 Aug '14, 17:49)
Henri
@Henri: Damit in
(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
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
Ergebnis 5 von 10
show 5 more comments
|
Ein Remake von @Ijon Tichys Antwort mit
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} beantwortet 17 Aug '14, 17:38 Henri 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
(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
(17 Aug '14, 19:55)
Henri
@Henri Spontan nicht, muss ich testen. Es gibt aber andere Baustellen. Man kann sicher, wenn man
(17 Aug '14, 20:03)
cgnieder
Es ist halt für mich die Hauptfrage: Soll ich wirklich in allen Details
(17 Aug '14, 20:07)
cis
@cis
(17 Aug '14, 20:09)
cgnieder
@Henri
(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
(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
(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
|
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} %======== beantwortet 17 Aug '14, 16:04 cis |
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.Boahh, jetzt habe ich grad
xkeyval
halb verstanden. A l l e im Link genannten Methoden scheinen mir nicht gerade unaufwendig :|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?)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.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.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 :()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.
@cis Dein Code ist übrigens wegen „fehlenden“ Klammern nicht lauffähig.
@Epllus siehe meine Kommentare :)
@Clemens Stimmt, aber ich wollte nochmals darauf hinweisen.
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.