PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion zum Verdoppeln der Breite einer Abbildung



Magger
25-06-2012, 21:07
Hallo,

ich möchte eine Funktion schreiben, welche die \includegraphics-Funktion so neudefiniert, dass die per width angebene Breite stets verdoppelt wird, ohne aber die Textbreite zu überschreiten. (Hintergrund ist, dass ich aus exakt dem gleichen Quellcode ein A4-Dokument und ein Dokument ist Smartphone-Displaygröße erstellen möchte.) Alle anderen Parameter sollen trotzdem angegeben und weitergereicht werden können.

Folgendes Minimalbeispiel funktioniert noch nicht so ganz, ich weiß aber nicht warum.


\documentclass{scrartcl}

\usepackage{graphicx}

\usepackage{ifthen}

\usepackage{calc}

% alten Befehl umbenennen
\let\includegraphicsold\includegraphics
% Längenvariablen anlegen
\newlength{\largerwidth}
\newlength{\givenwidth}
\makeatletter
\def\includegraphics{\@ifnextchar[\@includegraphics{\@includegraphics[]}}
\def\@includegraphics[#1]#2{
\ifthenelse{\equal{#1}{}}{%
% keine Parameter gegeben
\includegraphicsold{#2}
}{%
% die Breite bestimmen
\setkeys{ignew}{#1}
% die doppelte Breite bestimmen
\setlength{\largerwidth}{0pt}
\addtolength{\largerwidth}{\givenwidth * \real{2}}
\ifthenelse{\lengthtest{\largerwidth<\textwidth}}{%
% Abbildung mit der doppelten Breite einfügen
%\includegraphicsold[#1,width=\largerwidth]{#2}
\includegraphicsold[width=\largerwidth,\setkeys{igold}{#1}]{#2}
}{%
% Abbildung mit der maximal möglichen Breite eingefügt
%\includegraphicsold[#1,width=\textwidth]{#2}
\includegraphicsold[width=\textwidth,\setkeys{igold}{#1}]{#2}
}
}
}
% neue Schlüssel definieren
\define@key{ignew}{width}{\setlength{\givenwidth}{ #1}}
\define@key{ignew}{height}{}
\define@key{ignew}{bb}{}
\define@key{ignew}{bbllx}{}
\define@key{ignew}{bblly}{}
\define@key{ignew}{bburx}{}
\define@key{ignew}{bbury}{}
\define@key{ignew}{hiresbb}[true]{}
\define@key{ignew}{viewport}{}
\define@key{ignew}{trim}{}
\define@key{ignew}{angle}{}
\define@key{ignew}{origin}{}
\define@key{ignew}{height}{}
\define@key{ignew}{totalheight}{}
\define@key{ignew}{keepaspectratio}[true]{}
\define@key{ignew}{scale}{}
\define@key{ignew}{draft}[true]{}
\define@key{ignew}{clip}[true]{}
\define@key{ignew}{type}{}
\define@key{ignew}{ext}{}
\define@key{ignew}{read}{}
\define@key{ignew}{command}{}
% alte Schlüssel definieren
\define@key{igold}{height}{height=#1,}
\define@key{igold}{bb}{bb=#1,}
\define@key{igold}{bbllx}{bbllx=#1,}
\define@key{igold}{bblly}{bblly=#1,}
\define@key{igold}{bburx}{bburx=#1,}
\define@key{igold}{bbury}{bbury=#1,}
\define@key{igold}{hiresbb}[true]{hiresbb=#1,}
\define@key{igold}{viewport}{viewport=#1,}
\define@key{igold}{trim}{trim=#1,}
\define@key{igold}{angle}{angle=#1,}
\define@key{igold}{origin}{origin=#1,}
\define@key{igold}{height}{height=#1,}
\define@key{igold}{width}{}
\define@key{igold}{totalheight}{totalheight=#1,}
\define@key{igold}{keepaspectratio}[true]{keepaspectratio=#1,}
\define@key{igold}{scale}{scale=#1,}
\define@key{igold}{draft}[true]{draft=#1,}
\define@key{igold}{clip}[true]{clip=#1,}
\define@key{igold}{type}{type=#1,}
\define@key{igold}{ext}{ext=#1,}
\define@key{igold}{read}{read=#1,}
\define@key{igold}{command}{command=#1,}
\makeatother

\begin{document}

\begin{center}
\includegraphics[width=0.3\textwidth,draft]{figurefile}
\end{center}

\end{document}

Beim Kompilieren erhält man zwei Fehler


! Missing \endcsname inserted.

und


! Extra \endcsname.

Die oben auskommentierten Zeilen funktionieren aber ganz gut, erscheinen mir aber programmiertechnisch nicht so sauber.

Kann mir jemand helfen?

u_fischer
26-06-2012, 10:04
\documentclass[11pt,parskip=half+]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[export]{adjustbox}

\makeatletter
\newlength\mytemplength
\newcommand\myscalefactor{2}
\define@key{Gin}{scaledwidth}{%
\mytemplength=#1\def\Gin@ewidth{\myscalefactor\myt emplength}}
\makeatother
\begin{document}
\rule{4cm}{3pt}\\*
\includegraphics[scaledwidth=2cm, max width=\linewidth]{tiger}

\def\myscalefactor{3}
\rule{6cm}{3pt}\\*
\includegraphics[scaledwidth=2cm, max width=\linewidth]{tiger}



\rule{2cm}{3pt}\\*
\includegraphics[scaledwidth=4cm, max width=2cm]{tiger}
\end{document}

Magger
28-06-2012, 09:57
Hallo Ulrike,

vielen Dank für deine Ideen. Mir war schon fast klar, das meine obige Probierlösung nicht direkt das Optimum darstellt. Mit der 'max width'-Option vom adjustbox-Paket, das ich leider vorher nicht kannte (und das ja scheinbar auch noch brandneu ist) geht es natürlich einfacher und flexibler.

Ich habe über das gleiche Problem auch mit D. P. Story, dem Autor der Acrotex-Pakete, diskutiert, und er hat folgende Lösung vorgeschlagen:


\documentclass{scrartcl}

\usepackage{graphicx}

\makeatletter
\def\adjwidth#1{{\dimen0=#1
\xdef\@djwidth{\the\dimen0}%
\dimen0=2\dimen0\relax
\xdef\@djwidth{\expandafter\the
\ifdim\dimen0<\textwidth
\dimen0 \else\textwidth\fi
}%
}}
\define@key{Gin}{width}{%
\adjwidth{#1}\edef\Gin@ewidth{\@djwidth}%
}
\makeatother

\begin{document}

\begin{center}
\includegraphics[width=0.3\textwidth]{figurefile}
\end{center}

\end{document}

Das funktioniert auch ganz hervorragend, ist aber natürlich nicht ganz so flexibel, weil man nicht für jede Abbildung einzeln die maximale Breite einstellen kann.