PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eigene Umgebung mit if, for und Berechnung



droptix
01-02-2006, 19:45
Ich möchte eine eigene Umgebung (newenvironment) schreiben. Dafür brauche ich aber eine if-Abfrage, eine Art for-Schleife und muss etwas rechnen... das hab ich noch nie gemacht und könnte ein wenig Hilfe gebrauchen.

Es soll ungefähr so aussehen:


\begin{imgs}
\img[caption1][label1]{path/filename1}
\img[caption2][label2]{path/filename2}
\end{imgs}

Es geht also um Bilder. Die sollen nebeneinander in eine Minipage-Umgebung gesetzt werden. Die Anzahl der Bilder darf beliebig variieren. Deren Breite muss demnach berechnet werden. Ich reserviere mindestens 0.1\linewidth für Platz dazwischen. Im Regelfall sind es bei mir zwei, maximal aber drei Bilder... Aber wenn ich das schon durchziehe, dann gleich multifunktional :D

Um alles drumrum kommt das hier:


\begin{nofloat}{figure}
...
\end{nofloat}

In einer for-Schleife soll für jedes \img das hier gesetzt werden:


\begin{minipage}[b]{Breite}
\frame{\includegraphics[width=\linewidth]{path/filename}}
\end{minipage}

Breite muss dabei berechnet werden. Es ergibt sich aus \linewidth minus 0.1\linewidth geteilt durch die Anzahl der \img-Elemente. Vom Ergebnis werden die Nachkommastellen abgeschnitten (keine Rundung -> bei PHP heißt die Funktion floor).

Also bei zwei Bildern nebeneinander macht das:


floor( (\linewidth - 0.1\linewidth) / 2 )
= floor( 0.9\linewidth / 2 )
= floor( 0.45\linewidth )
= 0.4\linewidth

Also wird ein Bild 0.4\linewidth breit. Dazwischen ist 0.2\linewidth Platz.

Bei drei Bildern sieht das so aus:


floor( (\linewidth - 0.1\linewidth) / 3 )
= floor( 0.9\linewidth / 3 )
= floor( 0.3\linewidth )
= 0.3\linewidth

Also wird ein Bild 0.3\linewidth breit. Dazwischen ist jeweils 0.0333\linewidth Platz.

Zwischen den Minipage-Umgebungen muss noch das Wörtchen


\hfill

Die optionalen Parameter caption und label müssen über eine if-Abfrage gecheckt werden. Wenn sie da sind, soll nach dem \frame{...} noch ein \caption{...} und \label{...} dazu kommen. Dafür brauch ich aber nur den Ansatz und kann den Rest bestimmt selber machen.

Kann mir jemand einen Ansatz oder die Lösung posten? D A N K E

droptix
01-02-2006, 20:14
In PHP sähe das ungefähr so hier aus:


<?php
// around whole environment
$prefix = "\\begin{nofloat}{figure}\n";
$suffix = "\n\\end{nofloat}\n";

// reserved minimum space in percent of \linewidth
$space = 10;

// image items
$imgs = array ();
$imgs[] = array ('c' => "caption1", 'l' => "label1", 'f' => "path/filename1");
$imgs[] = array ('c' => "caption2", 'l' => "label2", 'f' => "path/filename2");
$imgs[] = array ('c' => "caption3", 'l' => "label3", 'f' => "path/filename3");

// temporarily variable for image items
$tmp = array ();

// calculate width of one image
$width = floor ((100 - $space) / count ($imgs)) / 100;

foreach ($imgs as $img) {
$item = "\t\\begin{minipage}[b]{".$width."\\linewidth}\n\t\t\\frame{\\includegraphics[width=\\linewidth]{".$img['f']."}}\n";
if ($img['c']) {
$item .= "\t\t\\caption{".$img['c']."}\n";
}
if ($img['l']) {
$item .= "\t\t\\label{".$img['l']."}\n";
}
$item .= "\t\\end{minipage}";
$tmp[] = $item;
}

// concatenate $tmp
$tmp = $prefix.implode ("\n\t\\hfill\n", $tmp).$suffix;
echo ($tmp);
?>

Ergebnis:


\begin{nofloat}{figure}
\begin{minipage}[b]{0.3\linewidth}
\frame{\includegraphics[width=\linewidth]{path/filename1}}
\caption{caption1}
\label{label1}
\end{minipage}
\hfill
\begin{minipage}[b]{0.3\linewidth}
\frame{\includegraphics[width=\linewidth]{path/filename2}}
\caption{caption2}
\label{label2}
\end{minipage}
\hfill
\begin{minipage}[b]{0.3\linewidth}
\frame{\includegraphics[width=\linewidth]{path/filename3}}
\caption{caption3}
\label{label3}
\end{minipage}
\end{nofloat}

pospiech
01-02-2006, 20:24
Um ehrlich zu sein: Programmieren in LaTeX bzw eigentlich TeX ist selbst für jemanden der Skript Sprachen 1a kann eine echte Hürde. TeX kennt keine Variablen und kann nicht rechnen. Irgentwie geht beiden trotzdem aber ist vom Ansatz her nicht mit einer normalen Programmiersprache zu vergleichen.

Wenn du dich einlesen möchtest hast du hier ein bischen Literatur:
http://www.matthiaspospiech.de/latex/pakete/#tex

Matthias

droptix
02-02-2006, 08:52
Hui, ganz schön umfangreich... So tief wollte ich gar nicht einsteigen... ich brauch eigentlich "nur" die Schleife und die if-Abfrage. Die Berechnung krieg ich vielleicht auch noch alleine hin... notfalls lass ich das floor() eben weg.

pospiech
02-02-2006, 09:40
Hier eine typische if Abfrage:


\ifx\@draft\@undefined \else #1 \fi

Aber: \ifx ist kein allgemeines IF, so wie TeX auch zig verschiedene \def kennt, je nach Anwendung. Deshalb meinte ich das man kaum darum herum kommt sich einzulesen.

für die for Schleife sollte Suchen in der PDFs ausreichend sein um eine zu finden.

Matthias