PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bildhöhe und -breite in Caption mit anzeigen



TeacherMC
15-01-2010, 21:18
Hallo,

ich suche nach einer Lösung für folgende
Darstellung einer Bildunterschrift:

xxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
xxx Bild xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxx
Abbilung 1: Bildtitel (70x40)

Dabei soll hinter dem Bildtitel in Klammern
die tatsächliche Bildhöhe und -breite in mm
mit angezeigt werden.

Kann mir da jemand helfen?

mechanicus
15-01-2010, 22:02
Hi,

ist gar nicht so einfach. Hier mal mit ein wenig geschustert:


\documentclass[fontsize=11pt,paper=a4,pagesize,demo]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\makeatletter
\newlength\BreiteBild
\newlength\LaengeBild
\newcommand*\BreiteBildAusgabe{}
\newcommand*\LaengeBildAusgabe{}

\let\includegraphicsOld\includegraphics
\renewcommand{\includegraphics}[2][]{%
\def\@TEMPA{\includegraphicsOld[#1]{#2}}%
\settowidth{\BreiteBild}{\@TEMPA}%
\settoheight{\LaengeBild}{\@TEMPA}%
\edef\BreiteBildAusgabe{\strip@pt\dimexpr\BreiteBi ld * 25400 / 72270 \relax mm}
\edef\LaengeBildAusgabe{\strip@pt\dimexpr\LaengeBi ld * 25400 / 72270 \relax mm}
\@TEMPA%
}
\let\captionOld\caption
\renewcommand{\caption}[1]{%
\captionOld[#1]{#1\relax\ (\BreiteBildAusgabe, \LaengeBildAusgabe)}}
\makeatother

\begin{document}
\begin{figure}[ht]\centering
\includegraphics[height=3cm]{picture}
\caption{Bildunterschrift}
\end{figure}

\begin{figure}[ht]\centering
\includegraphics[width=8cm]{picture}
\caption{Bildunterschrift}
\end{figure}


\end{document}


Gruß
Marco

TeacherMC
15-01-2010, 22:57
Hallo Marco,

echt der Wahnsinn.

Ich muss nun erst mal in Ruhe nachvollziehen,
was du da gebaut hast.

Im Minibeispiel siehts super aus.


Vielen Dank
für Deine Mühe

Gruß

Nico

TeacherMC
16-01-2010, 00:14
Hallo Marco

ich habe Dein Minibeispiel noch etwas verändert,
so dass die mm-Werte gerundet werden.


\documentclass[fontsize=11pt,paper=a4,pagesize,demo]{scrartcl}

\usepackage{fp} %runden
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\addto\captionsngerman{\renewcommand{\figurename}{ Bild}}
\usepackage[bf]{caption}
\makeatletter
\newlength\BreiteBild
\newlength\LaengeBild
\newcommand*\BreiteBildAusgabe{}
\newcommand*\LaengeBildAusgabe{}

\let\includegraphicsOld\includegraphics
\renewcommand{\includegraphics}[2][]{%
\def\@TEMPA{\includegraphicsOld[#1]{#2}}%
\settowidth{\BreiteBild}{\@TEMPA}%
\settoheight{\LaengeBild}{\@TEMPA}%
\edef\BreiteBildAusgabe{\strip@pt\dimexpr\BreiteBi ld * 25400 / 72270 \relax}
\edef\LaengeBildAusgabe{\strip@pt\dimexpr\LaengeBi ld * 25400 / 72270 \relax}

\FPround{\BreiteBildAusgabe}{\BreiteBildAusgabe}{0 }
\FPround{\LaengeBildAusgabe}{\LaengeBildAusgabe}{0 }

\@TEMPA%
}
\let\captionOld\caption
\renewcommand{\caption}[1]{%
\captionOld[#1]{#1\relax\ (\BreiteBildAusgabe x\LaengeBildAusgabe)}}
\makeatother

\begin{document}
\begin{figure}[ht]\centering
\includegraphics[height=3cm]{picture}
\caption{Bildunterschrift}
\end{figure}

\begin{figure}[ht]\centering
\includegraphics[width=8cm]{picture}
\caption{Bildunterschrift}
\end{figure}


\end{document}

ctansearch
16-01-2010, 00:40
..oder so?


\documentclass[fontsize=11pt,paper=a4,demo,pagesize]{scrartcl}
\usepackage{graphicx,xcolor}
\newcommand{\mypicture}[4]
{
\begin{figure}
\centering
\includegraphics[width=#1mm,height=#2mm]{#3}
\caption{#4 \textcolor{red}{(#1 x #2)}}
\end{figure}
}
\begin{document}
\mypicture{50}{40}{test}{Titel}
\end{document}

mechanicus
16-01-2010, 09:40
..oder so?


\documentclass[fontsize=11pt,paper=a4,demo,pagesize]{scrartcl}
\usepackage{graphicx,xcolor}
\newcommand{\mypicture}[4]
{
\begin{figure}
\centering
\includegraphics[width=#1mm,height=#2mm]{#3}
\caption{#4 \textcolor{red}{(#1 x #2)}}
\end{figure}
}
\begin{document}
\mypicture{50}{40}{test}{Titel}
\end{document}



Das wird wohl nicht funktionieren. So hast du das Problem, dass dein Bild verzerrt wird.

Gruß
Marco

ctansearch
16-01-2010, 23:42
Das wird wohl nicht funktionieren. So hast du das Problem, dass dein Bild verzerrt wird.
Gruß Marco

Ja, das kommt dann darauf an , ob man die Daten eingibt oder berechnen läßt. Kennst Du eine einfache Möglichkeit \linewidth, keepaspectratio etc in Werte umzuwandeln?

mechanicus
16-01-2010, 23:53
Hi,


Ja, das kommt dann darauf an , ob man die Daten eingibt oder berechnen läßt. Kennst Du eine einfache Möglichkeit \linewidth, keepaspectratio etc in Werte umzuwandeln?
ich könnte mir vorstellen, es als Kombination meines ersten Versuches mit dem xkeyval-Paket. Du gibt also an: width=XXX und der rest wird dementsprechend errechnet. (dito für die Höhe)

Gruß
Marco

ctansearch
17-01-2010, 00:24
Hi,
ich könnte mir vorstellen, es als Kombination meines ersten Versuches mit dem xkeyval-Paket. Du gibt also an: width=XXX und der rest wird dementsprechend errechnet. (dito für die Höhe)


In meinem Beispiel kann man \height, \width,\linewidth, keepaspectratio etc verwenden, das Bild wird dann auch korrekt berechnet, aber man bekommt in den Klammern (höhe x breite) keine Werte.

voss
17-01-2010, 10:16
In meinem Beispiel kann man \height, \width,\linewidth, keepaspectratio etc verwenden, das Bild wird dann auch korrekt berechnet, aber man bekommt in den Klammern (höhe x breite) keine Werte.

die Werte sind doch sowieso bekannt. Man braucht sie aber auch nicht.


\documentclass[fontsize=11pt,paper=a4,pagesize,demo]{scrartcl}

\usepackage{fp} %runden
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\addto\captionsngerman{\renewcommand{\figurename}{ Bild}}
\usepackage[bf]{caption}
\makeatletter
\newsavebox\BBox
\def\strip@#1.#2\@nil{#1}
\def\mm#1{\@tempdima=0.3515#1\relax
\expandafter\strip@\the\@tempdima\@nil}
\let\includegraphicsOld\includegraphics
\renewcommand{\includegraphics}[2][]{%
\sbox\BBox{\includegraphicsOld[#1]{#2}}\usebox\BBox}
\let\captionOld\caption
\renewcommand{\caption}[1]{%
\captionOld[#1]{#1~(\mm{\wd\BBox}$\times$\mm{\ht\BBox})}}
\makeatother

\begin{document}
\begin{figure}[ht]\centering
\includegraphics[height=3cm]{picture}
\caption{Bildunterschrift}
\end{figure}

\begin{figure}[ht]\centering
\includegraphics[width=8cm]{picture}
\caption{Bildunterschrift}
\end{figure}

\end{document}


Herbert

mechanicus
17-01-2010, 10:52
Hi,

kannst du bitte mal folgendes erklären:




\def\strip@#1.#2\@nil{#1}
\def\mm#1{\@tempdima=0.3515#1\relax
\expandafter\strip@\the\@tempdima\@nil}


speziell das rote Codesegment;)
Ich habe zwar gefunden, dass \@nil ein Makrobegrenzer ist, jedoch kriege ich kein einfaches Beispiel hin, um es zu verstehen.

Gruß
Marco

voss
17-01-2010, 11:09
speziell das rote Codesegment;)
Ich habe zwar gefunden, dass \@nil ein Makrobegrenzer ist, jedoch kriege ich kein einfaches Beispiel hin, um es zu verstehen.


\@nil muss man nicht nehmen, man kann es auch durch etwas ersetzen, was
definitiv nicht im Argument auftreten kann. Man nimmt nur gerne \@nil,
weil das wohl eher nicht in einem Argument auftaucht und somit gut als
Argumentbegrenzer funktioniert. Will ich z. B. wissen, ob ein Argument
ein Komma enthält, so kann ich das so feststellen:


\documentclass{minimal}
\makeatletter
\def\hatKomma#1{\expandafter\hat@Komma#1,,\@nil}
\def\hat@Komma#1,#2,#3\@nil{%
\ifx\relax#2\relax kein Komma \else Komma\fi}
\begin{document}

\hatKomma{1234}

\hatKomma{1,234}

\end{document}


Damit könnte man dann auch Argumente zulassen wie
\color{Farbe}{RGB}{12,13,88} bzw. \color{Farbe}{RGB}{12 13 88}
Beides kann verarbeitet werden und gibt keinen Fehler, weil ich feststellen
kann, ob ein Komma da ist oder nicht. Wenn ja mache ich mit A sonst mit
B weiter. Das \expandafter ist oben prophylaktisch, falls man ein Argument
hat, was erst noch zerlegt werden muss, für das einfache Beispiel wäre
es überflüssig.

Herbert

mechanicus
17-01-2010, 11:29
Hi,

so lange geht das Licht an, aber ich habe leider keinen Schalter, sondern nur einen Dimmer :D:D

Ich habe dein Beispiel mal für mich erweitert:

\documentclass{minimal}
\makeatletter
\def\hatKomma#1{\expandafter\hat@Komma#1,,\@nil}
\def\hat@Komma#1,#2,#3\@nil{%
Neue Eingabe\par Vor dem Komma #1\par Nach dem Komma #2\par
Das Komma #3\par Ergebnis:
\ifx\relax#2\relax kein Komma \else Komma\fi}
\begin{document}

\hatKomma{1234}
\vskip3em
\hatKomma{1,34245}

\end{document}

Somit ist das @nil verständlich. Jetzt kommt gleich die nächste Frage hinterher. Ich finde es faszinierend, dass LaTeX aus:

\def\hatKomma#1{\expandafter\hat@Komma#1,,\@nil}
direkt die einzelnen Segmente in \hat@Komma heraus filtert. In dem gezeigtem MB entspricht es den Eingaben #2 und #3.
Das würde ich gerne auch noch verstehen.

Danke
Marco

voss
17-01-2010, 11:55
Somit ist das @nil verständlich. Jetzt kommt gleich die nächste Frage hinterher. Ich finde es faszinierend, dass LaTeX aus:

\def\hatKomma#1{\expandafter\hat@Komma#1,,\@nil}
direkt die einzelnen Segmente in \hat@Komma heraus filtert. In dem gezeigtem MB entspricht es den Eingaben #2 und #3.
Das würde ich gerne auch noch verstehen.


es gibt beispielsweise die Eingaben für \hat@Komma

1,,\@nil -> #1=1; #2=; #3=;
1,1,,\@nil -> #1=1; #2=1; #3=,;
,,\@nil -> #1=; #2=; #3=; % alles leer


Wenn ich nur wissen will, ob ein Komma da ist und keine Zerlegung brauche,
dann geht auch

\def\hatKomma#1{\expandafter\hat@Komma#1,\@nil}
\def\hat@Komma#1,#2\@nil{%
...


Was also bewirkt das zweite Komma in \hat@Komma#1,,\@nil ?

Herbert

mechanicus
17-01-2010, 12:21
Hi,



Was also bewirkt das zweite Komma in \hat@Komma#1,,\@nil ?

Jetzt schimmert es:
Mit der Definition:

\def\hat@Komma#1,#2,#3\@nil
Mit der Anweisung gibst du an, dass die Eingabeparameter von \hat@Komma kommasepariert sind.
Das hat zur folge, dass bei der Eingabe eines Strings XY ohne Komma

#1,#2,#3
Nur #1 belegt wird und #2 und #3 bleiben leer.
Gebe ich nun einen String X,Y mit Komma ein, so verschiebt sich die Sequenz:
Aus der Darstellung

#1,#2,#3wird

X,Y,,
Somit ist die Eingabe #1 mit dem Vorkommawert belegt. Die Eingabe #2 mit dem Nachkommawert. und der Wert #3 ist das Komma selbst.

Würde nun der letzte Eingabeparameter #3 fehlen, so ergibt sich auf Grund der Verschiebung durch den String X,Y, dass der Eingabewert #2 die Darstellung: Y, hat. (Zu beachten das Komma bei Y)

Habe ich das soweit richtig verstanden?

Gruß
Marco

voss
17-01-2010, 12:31
Somit ist die Eingabe #1 mit dem Vorkommawert belegt. Die Eingabe #2 mit dem Nachkommawert. und der Wert #3 ist das Komma selbst.

Würde nun der letzte Eingabeparameter #3 fehlen, so ergibt sich auf Grund der Verschiebung durch den String X,Y, dass der Eingabewert #2 die Darstellung: Y, hat. (Zu beachten das Komma bei Y)

Habe ich das soweit richtig verstanden?


Ja, aber #3 enthält nicht das Komma der Eingabe sondern das letzte der
beiden zusätzlichen vor \@nil. #3 ist sozusagen der "Müllschlucker", damit auch
schwachsinnige Eingaben nicht zu einem Fehler führen:

\hatKomma{1,,,,,,,,,,,3}% kein Komma im Sinne der Definition
\hatKomma{1,2,,,,,,,,,,3}% hier aber Komma

Herbert

mechanicus
17-01-2010, 12:39
Hi,


#3 ist sozusagen der "Müllschlucker", damit auch
schwachsinnige Eingaben nicht zu einem Fehler führen:

so eine Eingabe habe ich nicht getestet :o - Aber es macht das "Müllschluckerprinzip" deutlich :D

Danke für die Unterrichtsstunde. Kommen bestimmt noch ein paar ;)

Gruß
Marco

ctansearch
18-01-2010, 02:09
Herbert, das ist viel Code, der aber von vielen Anwendern nicht verstanden wird..
Schau Dir bitte nochmal mein Beispiel an:


\documentclass[fontsize=11pt,paper=a4,demo,pagesize]{scrartcl}
\usepackage{graphicx,xcolor}
\newcommand{\mypicture}[4]
{
\begin{figure}
\centering
\includegraphics[width=#1mm,height=#2mm]{#3}
\caption{#4 \textcolor{red}{(#1 x #2)}}
\end{figure}
}
\begin{document}
\mypicture{50}{40}{test}{Titel}
\end{document}

Wenn man im \newcommand anstatt der Werte {50}{40}die Befehle \linewidth oder keepaspectratio etc angibt, erscheinen keine Werte in der \caption und es gibt eine Fehlermeldung, weil \linewidth nicht in eine Zahl umgesetzt wird.

Kannst Du Deinen Code in einen Präambelbefehl umsetzen , sodass er die Zahlenwerte einfügt, etwa so etwas wie "\value{\linewidth}"?

Ich denke, das würde die Sache vereinfachen.

voss
18-01-2010, 07:54
Wenn man im \newcommand anstatt der Werte {50}{40}die Befehle \linewidth oder keepaspectratio etc angibt, erscheinen keine Werte in der \caption und es gibt eine Fehlermeldung, weil \linewidth nicht in eine Zahl umgesetzt wird.

Kannst Du Deinen Code in einen Präambelbefehl umsetzen , sodass er die Zahlenwerte einfügt, etwa so etwas wie "\value{\linewidth}"?



\documentclass[fontsize=11pt,paper=a4,demo,pagesize]{scrartcl}
\usepackage{graphicx,xcolor}

\makeatletter
\def\ohneEinheit#1{\@tempdima=#1%
\@tempdima=0.3515\@tempdima\relax%
\expandafter\ohne@Einheit\the\@tempdima\@nil}
\def\ohne@Einheit#1.#2\@nil{#1}
\makeatother

\newcommand\mypicture[5][]{%
\begin{figure}\centering
\includegraphics[#1,width=#2,height=#3]{#4}
\caption{#5 \textcolor{red}{(\ohneEinheit{#2}$\times$\ohneEinh eit{#3})}}
\end{figure}}

\begin{document}
\mypicture{40mm}{50mm}{test}{Titel}

\mypicture[keepaspectratio]{\linewidth}{0.5\linewidth}{test}{Titel}
\end{document}


Herbert

ctansearch
20-01-2010, 23:30
Danke Herbert,
sehr gut!