Seite 1 von 1

\includegraphics und \ifthenelse

Verfasst: Mo 15. Feb 2010, 18:40
von FiboFreak
Ich habe ein Kompatibilitätsproblem zwischen \includegraphics und \ifthenelse, welches ich nicht verstehe. Ein Minimalbeispiel sieht so aus:
\documentclass[11pt]{article}
\usepackage{graphicx}
\usepackage{ifthen}

\begin{document}
\includegraphics{assoz1rr\ifthenelse{1<2}{g}{r}.eps}
\end{document}
(Die Grafik heißt dabei assoz1rrg.eps). Ersetzt man \includegraphics oder \ifthenelse durch andere oder durch Dummy-Befehle, dann ergibt sich kein Problem, so aber erhält man

ERROR: Illegal parameter number in definition of \filename@base.

Kann mir jemand einen Tip geben, woran das liegt?

Danke!

Verfasst: Di 16. Feb 2010, 07:35
von Rainer Unsinn
Willst Du wirklich die Ursache oder tatsächlich die Lösung wissen? Die Ursache ist die Art und Weise wie beide Pakete die Argumente der beiden Anweisungen expandieren.

\ifthenelse ist übrigens bekannt für Expansionsprobleme unterschiedlicher Art. Manchmal bekommt man das mit passend gesetzten \protect auf die Reihe, manchmal nicht. Oft ist zu empfehlen, den Test aus allen Argumenten anderer Anweisungen heraus zu ziehen. Hoppla, jetzt bin ich statt bei der Beantwortung der Frage nach der Ursache,doch bei der Lösung gelandet.

Helau!

Verfasst: Di 16. Feb 2010, 11:38
von FiboFreak
1. würde ich natürlich gerne verstehen, was die "Ursache" ist

2. wäre ich vorläufig aber auch mit einem schmutzigen Trick zufrieden, der das Problem umgeht.

Verfasst: Di 16. Feb 2010, 12:45
von Rainer Unsinn
Hast Du den bereits in der Erklärung enthaltenen Trick bereits ausprobiert? Also: Verwende nicht \ifthenelse im Argument von \includegraphics, sondern \includegraphics im zweiten und dritten Argument von \ifthenelse. Ergänze ggf. \protect vor \includegraphics.

Verfasst: Di 16. Feb 2010, 13:29
von FiboFreak
Das funktioniert schon, ist aber in meinem Fall nicht sooo toll.

Ich generiere nämlich in meinem Dokument über mehrere Befehlsebenen (d.h. größere Stacktiefe) einen Dateinamen (aus insgesamt 4 Stücken, die in unterschiedlichen Ebenen erzeugt werden), den ich dann mit \includegraphics öffnen will. Benutze ich \includegraphics innerhalb von \ifthenelse, dann muß ich alle Parameter an die tiefste Ebene weiterreichen, weil dann dort der \includegraphics-Befehl auftaucht.

Als erster Tip war es ganz hilfreich, aber es wäre schon schön, wenn es möglich wäre, zuerst in Abhängigkeit von Parametern einen String zu kreieren und ihn dann an in \includegraphics zu übergeben.

Verfasst: Di 16. Feb 2010, 14:13
von Rainer Unsinn
Dann definier innerhalb von \ifthenelse für den Dateinamen eben per \newcommand oder \renewcommand ein Makro und verwende das später innerhalb von \includegraphics. Oder definiere Dir ein Makro der Art
\newcommand*{\mygraphics}[1]{\includegraphics[width=\textwidth,height=\textheight,keepaspectratio,angle=90]{#1}}
und verwende das innerhalb von \ifthenelse. Die Optionen ersetzt Du bei der Definition natürlich durch diejenigen, die Du ständig brauchst.

Möglichkeiten gibt es wirklich reichlich. Man muss sich nur erst einmal von der erfolglosen Denkweise lösen.

Verfasst: Di 16. Feb 2010, 15:20
von phi
Verwende nicht \ifthenelse, es ist nicht expandierbar, expandiert aber sein Argument, was je nach Situation zu verschiedenen Problemen führen kann. Verwende stattdessen expandierbare Tests aus moderneren Paketen wie etoolbox oder expl3 oder primitive TeX-Tests wie \ifnum. Die sind gleich mächtig wie \ifthenelse, aber die Syntax ist anders.

Die Probleme des ifthen-Pakets werden auch in der Dokumentation erwähnt: „It is unfortunate that in order to remain compatible with ifthen syntax, it is necessary to have a two pass system. The first pass inside an \edef ‘exposes’ the \if. . . \fi tokens, so the corect clauses may be skipped on the second pass. This means that the whole \ifthenelse command does not work by expansion, and so possibly has only limited usefulness for macro code writers. The main problem with the ifthen: syntax is that (unique for LATEX) it does not uses a brace delimited argument form, and exposes the primitive TEX syntax for ⟨number⟩. Pretty much the only way of parsing 1 > 2 \or 2 < 1 is to actually evaluate the
primitive \ifnums. A syntax such as: \or{\numtest{1<2}}{\lengthtest{1pt<1in}} could easily be evaluated in a one pass way, operating directly via expansion, and leaving no extra tokens in the token stream.“

Wie genau sieht denn dein Vergleich aus? 1<2 wird es ja kaum sein.

Verfasst: Di 16. Feb 2010, 15:52
von FiboFreak
Der Test hat die Form \zahler=1 für einen vorher definierten Zähler.

Verfasst: Di 16. Feb 2010, 16:08
von FiboFreak
Es sieht so aus, also ob \ifnumequal aus dem etoolbox-Paket das Problem löst.

Danke!!!