\includegraphics und \ifthenelse

Tabellen und Grafiken erstellen und anordnen


FiboFreak
Forum-Anfänger
Forum-Anfänger
Beiträge: 16
Registriert: Mi 30. Sep 2009, 00:42
Wohnort: Bielefeld

\includegraphics und \ifthenelse

Beitrag 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!

Rainer Unsinn

Beitrag 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!

FiboFreak
Forum-Anfänger
Forum-Anfänger
Beiträge: 16
Registriert: Mi 30. Sep 2009, 00:42
Wohnort: Bielefeld

Beitrag 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.

Rainer Unsinn

Beitrag 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.

FiboFreak
Forum-Anfänger
Forum-Anfänger
Beiträge: 16
Registriert: Mi 30. Sep 2009, 00:42
Wohnort: Bielefeld

Beitrag 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.

Rainer Unsinn

Beitrag 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.

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag 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.

FiboFreak
Forum-Anfänger
Forum-Anfänger
Beiträge: 16
Registriert: Mi 30. Sep 2009, 00:42
Wohnort: Bielefeld

Beitrag von FiboFreak »

Der Test hat die Form \zahler=1 für einen vorher definierten Zähler.

FiboFreak
Forum-Anfänger
Forum-Anfänger
Beiträge: 16
Registriert: Mi 30. Sep 2009, 00:42
Wohnort: Bielefeld

Beitrag von FiboFreak »

Es sieht so aus, also ob \ifnumequal aus dem etoolbox-Paket das Problem löst.

Danke!!!

Antworten