1
1

Hallo!

Kann sich jmd. erklären, warum das nicht geht?

Open in writeLaTeX
% arara: pdflatex: { shell : yes }
%shell escape erlauben!

\documentclass{article}
\usepackage{graphicx}

\usepackage{datatool}
\usepackage[overwrite=true]{getmap}

% Mapliste anlegen =========================
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
Seehalde 7, Bodman-Ludwigshafen,  Deutschland
Alte Potsdamer Straße 7, Berlin, Deutschland
\end{filecontents*}
% ======================================

\begin{document}
\DTLsetseparator{,}
\DTLloaddb[
  noheader,
  keys={Strasse,Ort,Land}
  ]{maps}{test.csv}

\verb+Das geht nicht :(+ \\

\DTLforeach*{maps}{\Strasse=Strasse,\Ort=Ort, \Land=Land}{
\getmap[file=\Ort]{\Strasse,\Ort,\Land}
\texttt{\Strasse, \Ort} \\
\includegraphics[width=7.5cm]{\Ort.png} \\
}

\verb+Einzeln geht es+

\getmap[file=bodensee1]{Seehalde 7,Bodman-Ludwigshafen,Deutschland}
\includegraphics[width=7.5cm]{bodensee1.png} \\

\getmap[file=berlin1]{Alte Potsdamer Straße 7, 10785 Berlin,Deutschland}
\includegraphics[width=7.5cm]{berlin1.png}
\end{document}

alt text

gefragt 04 Jul '14, 21:56

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

bearbeitet 04 Jul '14, 22:41

Mit Sicherheit wird \Strasse,\Ort,\Land im Argument von \getmap nicht oder nicht richtig expandiert. Schonmal mit \expandafter probiert?

(04 Jul '14, 22:46) Henri

Ähm, nein :) Wo muß das hin? Im Text wird ja scheints alles richtig, wie man im Bild sehen kann - mhhh...

(04 Jul '14, 22:49) cis

@cis @Henri mit \expandafter wirds hier schon recht mühsam, \edef ist leichter, siehe meine Antwort

(04 Jul '14, 23:37) cgnieder

Wie von @Henri vermutet, ist das ist ein Expansionsproblem. Offenbar braucht \getmap sein Argument expandiert. Das heißt, im Moment sucht \getmap[file=\Ort]{\Strasse,\Ort,\Land} nach der Adresse »\Strasse,\Ort,\Land« statt nach »Seehalde 7, Bodman-Ludwigshafen, Deutschland«. Hier lässt sich \edef zur Hilfe einsetzen, das sein gesamtes Argument soweit expandiert, wie es eben geht.

Das Prinzip heißt: mit \edef ein Hilfsmakro definieren, das den kritischen Aufruf enthält und im Argument mit \noexpand diejenigen Teile daran hindern zu expandieren, bei denen es nicht geht/problematisch wäre/unerwünscht ist, und dann das Hilfsmakro aufzurufen:

Open in writeLaTeX
\edef\x{%
  \noexpand\getmap[file=\Ort]{\Strasse,\Ort,\Land}%
}\x

Wenn man verhindern möchte, dass das Hilfsmakro aus Versehen irgendwas überschreibt (was bei \x doch eher unwahrscheinlich aber nicht unmöglich ist), kann man die Definition lokal halten, indem man vor dem \edef eine Gruppe beginnt und im \edef wieder schließt. Damit ist nach Aufruf des Hilfsmakros dessen Definition wieder vergessen:

Open in writeLaTeX
\begingroup
\edef\x{\endgroup
  \noexpand\getmap[file=\Ort]{\Strasse,\Ort,\Land}%
}\x

Da Adressen aber Umlaute und scharfes s enthalten können, muss man mit der vollständigen Expansion etwas aufpassen:

Open in writeLaTeX
\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
\edef\x{ß}\show\x
\end{document}

gibt im log:

Open in writeLaTeX
> \x=macro:
->\OT1\ss .
l.4 \edef\x{ß}\show\x

(mit anderem Font-Encoding ähnlich). Wir können aber mit etoolbox' Mitteln leicht verhindern, dass das passiert, indem wir die datatool-Variablen nur einmal expandieren. (datatool lädt etoolbox bereits). Das Makro dafür heißt \expandonce (für das man nicht wirklich etoolbox laden müsste, seine Definition ist \newcommand\expandonce[1]{\unexpanded\expandafter{#1}}).

Open in writeLaTeX
\begingroup
\edef\x{\endgroup
  \noexpand\getmap[file=\expandonce\Ort]{%
    \expandonce\Strasse,\expandonce\Ort,\expandonce\Land
  }%
}\x

Für die file Option bietet sich an, anstatt dem Ortsnamen etwas mit \DTLcurrentindex zu verwenden (Dank an @esdd für den Hinweis). Der Vorteil: wenn ein Ort mehrmals vorkommt, werden die Dateinamen trotzdem eindeutig.

Ich habe unten \getmap[file=Karte-\DTLcurrentindex] verwendet. Damit werden die Dateinamen zwar weniger deskriptiv, sind aber immer noch eindeutig und man vermeidet, dass die Dateinamen aus Versehen Umlaute, Leerzeichen oder dergleichen enthalten, die bei Dateinamen problematisch sein können.

Das komplette Beispiel (bei dem ich die seltsamen Einsätze von \\ entfernt und ggf. durch \par ersetzt habe):

Open in writeLaTeX
% arara: pdflatex: { shell : yes }
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}

\usepackage{datatool}
\usepackage[overwrite=true]{getmap}

\usepackage{filecontents}
\begin{filecontents*}{test.csv}
Seehalde 7, Bodman-Ludwigshafen, Deutschland
Alte Potsdamer Straße 7, Berlin, Deutschland
\end{filecontents*}

\begin{document}

\DTLsetseparator{,}
\DTLloaddb[
  noheader,
  keys={Strasse,Ort,Land}
  ]{maps}{test.csv}

\DTLforeach*{maps}{\Strasse=Strasse,\Ort=Ort, \Land=Land}{%
  \begingroup
  \edef\x{\endgroup
    \noexpand\getmap[file=Karte-\DTLcurrentindex]{%
      \expandonce\Strasse,\expandonce\Ort,\expandonce\Land
    }%
  }\x
  \texttt{\Strasse, \Ort} \par
  \includegraphics[width=7.5cm]{Karte-\DTLcurrentindex.png}\par
}

\end{document}

alt text

Permanenter link

beantwortet 04 Jul '14, 23:35

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 05 Jul '14, 09:10

Super! Werde es gleich nachher ausführlich testen.

(04 Jul '14, 23:49) cis

Das 2. Beispiel ist jetzt glaub wieder ein getmap-Problem. Wenn man hier die Postleitzahl ergänzt, sollte auch das gehen - ich werde mich drum kümmern, die Liste zu erweitern - vll. geht es dann.

(04 Jul '14, 23:51) cis

@cis Nein, das Problem war das scharfe s, siehe meine überarbeitete Antwort

(05 Jul '14, 00:08) cgnieder

Ich hab mir übrigens mal den »Spaß« gemacht, dieselbe Expansion nur mit \expandafter und ohne Hilfsmakros zu Basteln und habe, wenn ich mich nicht verzählt habe, 215 Stück gebraucht :)

(05 Jul '14, 15:00) cgnieder
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×17
×3

gestellte Frage: 04 Jul '14, 21:56

Frage wurde gesehen: 8,901 Mal

zuletzt geändert: 05 Jul '14, 15:00