Betriebsystemunabhängig: SVG-Grafiken in LaTeX

Da ich im Moment unter Windows TeXe lag es nahe meine Arbeitsumgebung universell einsetzbar zu machen. Eigentlich gab es nicht viel zu tun:

Und dann das ganze Setup etwas anpassen, damit editor und PDF-Viewer schön zusammenspielen. Wichtig dabei: Die -shell-escape Option für pdflatex/miktex.

Um sowohl unter Windows, als auch unter Linux und Mac OS einfach SVG-Vektorgrafiken einbinden zu können habe ich den Code-Schnipsel aus meinem alten Artikel folgendermaßen angepasst.

% https://laclaro.wordpress.com/2011/07/30/svg-vektorgrafiken-in-latex-dokumente-einbinden/
\newcommand{\executeiffilenewer}[3]{%
  \ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
  {\pdffilemoddate{#2}}>0%
  {\immediate\write18{#3}}\fi%
}
% set inkscape binary path according to operating-system
\IfFileExists{/dev/null}{%
  \newcommand{\Inkscape}{inkscape }%
  }{%
  \newcommand{\Inkscape}{"C:/Program Files (x86)/Inkscape/inkscape.exe" }%
}
% includesvg[scale]{file} command
\newcommand{\includesvg}[2][1]{%
  \executeiffilenewer{#2.svg}{#2.pdf}{%
  \Inkscape -z -D --file="#2.svg" --export-pdf="#2.pdf" --export-latex}%
  \scalebox{#1}{\input{#2.pdf_tex}}%
}

Wir bekommen damit ein Kommando

\includesvg[scale]{file-without-extension}

welches eine vorhandene Datei file-without-extension.svg mit Inkscape in zwei Dateien .pdf und .pdf_tex umwandelt und als Grafik einbindet. Der Text wird dabei als LaTeX-Text behandelt, womit uns sämtliche im Dokument nutzbare Kommandos wie $\mathbb{N_\alpha}$, als \mathbb{N_{\alpha}}, zur Verfügung stehen und im einheitlichen Stil des Dokumentes gesetzt werden!

Fröhliches ge \TeX e!

About

Peter Pan. Kann fliegen mit Feenstaub.

Tagged with: , , , , , ,
Posted in LaTeX, Technik
33 comments on “Betriebsystemunabhängig: SVG-Grafiken in LaTeX
  1. […] >> Neuer Bloseintrag: includesvg sowohl unter windows als auch linux mit nur einem Codeschnipsel. […]

  2. Anonymous says:

    Hallo Laclaro!
    ich vernwende miktex 2.9 und pdflatex aber ich bekomme die automatische umwandlung einfach nicht zum laufen😦
    Der inkscape aufruf funktionier wenn ich ihn in der Kommandozeile eintippe, aber wenn ich die Datei mit pdflatex kompiliere wird inkscape nicht gestartet und die pdf_tex Datei wird dann natürlich nicht gefunden.
    Ich habe es sowohl mit der -shell-escape als auch mit der -enable-write18 Option ausprobiert.
    Weiterhin habe ich das Minimalbeispiel aus deinem alten Blogeintrag verwendet.

    Es will einfach nicht funktionieren😦
    Haben Sie vielleicht eine Idee woran das liegen könnte?

    Vielen Dank

  3. Anonymous says:

    Hallo nochmal,

    ein kleines Update: -shell-escape funktioniert mit gnuplot… nur immer noch nicht mit inkscape.

    Falls ich es hinbekommen sollte schreib ich hier natürlich meinen fix!

    Grüße
    Nikolai

  4. laclaro says:

    Ich benutze in verschiedenen Arbeitsumgebungen genau den obigen Code. Wie kompilierst du denn dein LaTeX-Dokument (das macht üblicherweise dein Editor intern irgendwo)?

    Woran merkst du, dass Inkscape nicht aufgerufen wird? Könnte inkscape aus irgendeinem Grund die Grafik nicht finden?

  5. Anonymous says:

    Hallo!

    ich kompiliere das über TeXMaker, aber auch wenn ich die Kompilierung aus der Kommandozeile mit pdflatex starte funtioniert es nicht.
    Der Prozess erscheint nicht im Task-Manager, auch wenn er nur kurz auftaucht sieht man das.
    Wenn die Grafik nicht gefunden werden würde, sollte dies doch in der Kommandozeile stehen oder?

    Vielen Dank
    Nikolai Sterionow

  6. Anonymous says:

    Hallo zusammen,
    ich habe versucht nach der Anleitung vorzugehen. Allerdings erhalte ich einen Fehler und die BILD.pdf_tex Datei wird überhaupt nicht erstellt. Mein Code im TexStudio

    \newcommand{\executeiffilenewer}[3]{%
    \ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
    {\pdffilemoddate{#2}}>0%
    {\immediate\write18{#3}}\fi%
    }
    % set inkscape binary path according to operating-system
    \IfFileExists{/dev/null}{%
    \newcommand{\Inkscape}{/usr/bin/inkscape}%
    }{%
    \newcommand{\Inkscape}{“C:/Program Files (x86)/Inkscape/inkscape.exe”}%
    }
    % includesvg[scale]{file} command
    \newcommand{\includesvg}[2][1]{%
    \executeiffilenewer{#1.svg}{#1.pdf}{%
    \Inkscape -z -D –file=”#1.svg” –export-pdf=”#1.pdf” –export-latex}%
    \scalebox{#1}{\input{#2.pdf_tex}}%
    }
    \begin{document}

    \begin{figure}
    \centering
    \includesvg[{BILD}
    \end{figure}

    Die Einstellung für PDF sieht im TexStudio folgendermaßen aus:
    pdflatex -synctex=1 –enable-write18 -shell-escape -interaction=nonstopmode %.tex

    WAS mache ich jetzt noch falsch? Ich danke euch für eure Hilfe und Bemühungen.
    Mit freundlichen Grüßen
    Henrik

  7. laclaro says:

    Schreibt mir eine EMail mit eurem TeX-Dokument. Dann kann ich wenigstens sehen, ob es ein LaTeX-Fehler ist oder eine Einstellung in eurem Editor das Problem auslöst.

  8. laclaro says:

    Tip: Wenn es nicht funktioniert und ihr nicht wisst, ob es am TeX-Editor oder an pdflatex liegt: Kompiliert in der Windows/Linux Kommandozeile.
    Windows:
    Ausführen->cmd-> C:\Programme\Pfad\zu\pdflatex.exe -shell-escape -interaction=nonstopmode Dokument.tex
    Linux:
    Terminal öffnen->pdflatex -shell-escape -interaction=nonstopmode Dokument.tex

    Wenn er da schon meckert müsst ihr erst diesen Fehler beheben.

    • theresa says:

      Hi!
      wenn ich Ausführen->cmd-> C:\Programme\Pfad\zu\pdflatex.exe -shell-escape -interaction=nonstopmode Dokument.tex eingebe kommt ” I can`t write on file `Dokument.log’. Was passt da nicht?? (Ich verwende Texmaker mit MikTex und Windows7)
      Viele Grüße,
      Theresa

  9. Anonymous says:

    Hallo laclaro,

    vielen Dank für deine Antworten. Selbst in der Kommandozeile funktioniert es nicht, mein TeX-Dokument ist das Beispieldokument aus deinem alten Post.
    Der Fehler lautet einfach nur:
    “! LaTeX Error: File `svg-filename-without-ext.pdf_tex’ not found.”

  10. laclaro says:

    Du hast recht, da waren gleich zwei Fehler drin: Es wurde kein Leerzeichen hinter mein \Inkscape-Kommando gesetzt und außerdem waren die #1 und #2 an einer Stelle vertauscht. #1 ist nur die Skalierung (Standart: 1) und #2 der Dateiname OHNE ENDUNG. Korrigiert funktioniert es jetzt.

    Danke und viele Grüße,
    Henning

  11. ben says:

    Hi, das erzeugen funktioniert bei mir. Wenn ich allerdings den oben angegebenen Befehl ($\mathbb{N_\alpha}$, oder auch nur \latex) für mathematische Zeichen in Inkscape einfüge, funktioniert es nicht mehr.

    Fehler: !Undefined Control Sequence.
    \mathbb
    l.53 …box(0,0)[lb]{\smash{$\mathbb{N_\alpha}$}}}

    Was mache ich hier falsch?

    Danke und Gruß, Benjamin

  12. Jan says:

    Hi, die Einbindung funktioniert gut in einem sauberen neuen Layout.
    Ich hab aber leider zur Zeit ein vorgegebenes Layout und da stoße ich auf:
    ! Undefined control sequence
    \filename@parse #1->\let \filename@area usw.
    Die pdf und pdf_tex Dateien werden korrekt erstellt aber können dann irgendwie nicht eingebunden werden. Hast du ein grobe Ahnung woran das liegen könnte? Oder einen Tipp wo ich anfangen könnte zu suchen, weil das sind etliche includes.

    Danke und Grüße,
    Jan

    • laclaro says:

      \filename@parse{PATH} scannt einen Pfad und teilt den in \filename@area, \filename@base und \filename@ext auf. Das ist, soweit ich weiß, eine der grundlegensten LaTeX2e Funktionen. durchsuche doch mal deine Dateien nach dem parse. Vielleicht wird das irgendwo umdefiniert? Würde mich aber ehrlich gesagt wundern.

  13. Jan says:

    Ok, Fehler liegt daran, dass man in dem Layout keine Unterstriche in Dateinamen verwenden kann… “.pdf_tex” muss ich irgendwie abändern.

    • laclaro says:

      Du kannst dem inkscape-Befehl noch ein
      & move “#1.pdf_tex” “#1.tex”
      hinterherschicken, um die pdf_tex-Datei umzubenennen und dementsprechend diese von input einbinden lassen. Oder du findest heraus warum dein Layout nicht mit Unterstrichen klarkommt.

      • laclaro says:

        Du könntest auch schauen wo die Dateien der inkscape-plugins liegen, die entsprechende Datei finden, öffnen und den Unterstrich durch etwas anderes ersetzen. Das müsste eine .py Datei sein.

  14. Philipp says:

    Hallo laclaro,
    danke für die Anleitung! Zunächst wollte mein Mac nicht aber nachdem ich den vollen Pfad für Inkscape angegeben habe (/Applications/Inkscape.app/Contents/Resources/bin/inkscape) ging es dann doch. Dabei muss aber die .svg Datei die ich einbinden möchte im gleichen Verzeichnis liegen wie meine .tex Datei. Weder mit dem graphicspath Befehl noch wenn ich den Pfad direkt zum Namen schreibe z.B. \includesvg[1]{fig/file-without-extension} wird überhaupt die .pdf bzw. das .pdf_tex Datei generiert. Von der Commandline funktioniert es mit einem fig/ davor direkt im Unterordner “fig” die Dateien zu generieren. Selbst wenn die Dateien schon drin liegen, findet er sie leider nicht. Irgendeine Idee woran da liegen könnte?
    Gruß
    Philipp

    • laclaro says:

      Der graphicspath-Befehl hilft LaTeX pdf/jpeg/png-Grafiken zu finden. Die SVG wandeln wir ja nur um. Außerdem ist sie kein LaTeX-gültiges Format. Den Graphicspath-Befehl brauchst du, weil in der erzeugten pdf_tex-Datei nicht der vollst. Pfad steht (schau einfach mal rein).
      Wenn das Umwandeln selbst nicht klappt (svg nicht gefunden), dann kommt mir spontan nur ein “Leerzeichen im Pfadnamen”-Problem in den Sinn.
      Wenn der compiler sich über nicht verfügbare pdf_tex-Dateien beschwert, ist es ein graphicspath-Problem: Der Compiler schaut immer von deinem Arbeitsverzeichnis aus. Wenn also in der pdf_tex-Datei in einem Unterverzeichnis “Grafiken” nur der Dateiname der einzubindenden Datei als “Grafik.pdf” steht, wir aber mit dem input-Befehl diese pdf_tex Datei einfach nur in unser Hauptdokument “kopieren”, fehlt die Information, dass die “Grafik.pdf” eben im Unterverzeichnis “Grafiken” ist.
      Also sagen wir LaTeX einfach mit dem graphicspath-Befehl, dass er das Unterverzeichnis “Grafiken” auch immer nach Grafiken durchsuchen soll. Fertig.

      • Philipp says:

        Es ist mir zwar nicht ganz klar warum, aber jetzt scheint es zu funktionieren, solange ich den Pfad mit dem Dateinamen verwende (also \includesvg[1]{fig/file-without-extension}). Die entsprechenden Dateien werden im Unterordner fig abgelegt und von dort aus eingebunden. Mit dem graphicspath Befehl läuft es nicht, obwohl ich eps Dateien ohne Probleme aus dem Unterordner einbinden konnte. Darauf kann ich aber sehr leicht verzichten und wenn ich die Unterordnernamen kurz halte ist der zusätzliche (Schreib-) Aufwand vernachlässigbar.

        Vielen Dank nochmals für die Anleitung und die Hilfe!
        Gruß
        Philipp

  15. Sebastian Maile says:

    Hallo laclaro,
    danke für die super Anleitung.
    Ich versuche das ganze in einer Linux-Crossover umgebung mit dem Texniccenter zu verwenden bekomme aber immer einen Fehler.
    Wie kann ich überprüfen das der pdflatex das Inkscape korrekt aufruft. Gibt es eine Alternative zum Inkscape?

    Viele Grüße
    Sebastian

  16. laclaro says:

    Welchen Fehler bekommst du denn?🙂 Wenn es in der Konsole funktioniert und seinem Compiler erlaubt ist externe Befehle auszuführen (Stichwort -shell-escape), dann sollte auch der Inkscape-Befehl kein Problem darstellen.
    Alternativen zu Inkscape sind mir nicht bekannt. Wenn du ein Tool findest, welches aus der SVG-Datei den Text rausholt, in einem LaTeX-Dokument abspeichert und den textlosen Rest als pdf abspeichert, dann wäre das deine Alternative. Das ist es nämlich was inkscape tut. Prinzipiell baut das plugin auf einem python-script auf, welches schon lange davor existierte. Siehe dazu meinen Originalpost https://laclaro.wordpress.com/2011/07/30/svg-vektorgrafiken-in-latex-dokumente-einbinden/

  17. laclaro says:

    Hallo Phillip,

    Wenn du meinen Post oben nochmal liest wirst du feststellen, dass graphicspath NICHT für die in includesvg angegebenen Dateinamen gilt. In diesem Fall ist er tatsächlich nciht von Nöten, dazu aber erst gleich.
    Wir wandeln die mit vollem relativem Pfad angegebene svg-Datei nur um. Eingebunden werden dann (aus dem Unterverzeichnis) die pdf-Dateien (das steht in den pdf_tex-Dateien, die wir mit “input” einbinden lassen). Da wir inkscape von unserem Arbeitsverzeichnis aus mit dem vollen relativen Pfad laufen lassen ist der graphicspath Befehl hier wirklich nicht nötig. Ein Blick in die pdf_tex-Datei zeigt auch warum: Dort steht im includegraphics-Befehl ebenfalls der volle relative Pfad der pdf-Datei.
    Wenn du dich überzeugen willst, dass es in dieser Weise funktioniert: Ersetze den relativen Pfad in der pdf_tex durch einen einfachen Dateinamen. Dann lasse den Compiler ohne und mit graphicspath-Befehl laufen.

    Viele Grüße,
    Henning

  18. Dom says:

    Was ich noch vermisste, war eine Möglichkeit, die eingebundenen Bilder drehen zu können. Deshalb habe ich es folgenderweise erweitert:

    \newcommand{\includesvg}[3][0]{%
    \executeiffilenewer{#3.svg}{#3.pdf}{%
    \Inkscape -z -D –file=”#3.svg” –export-pdf=”#3.pdf” –export-latex}%
    \rotatebox{#1}{\scalebox{#2}{\input{#3.pdf_tex}}}%
    }

    Der Aufruf erfolgt über

    \includesvg[]{}{}

    Leider ist damit nur der Winkel optional, eine Parameterliste im Sinne von [winkel, skalierungsfaktor] wäre schön, vielleicht hat ja jemand Lust, es weiter anzupassen.

  19. Anonymous says:

    Hallo Laclaro,

    ich habe ganz vergessen, dass ich hiermit rumgespielt habe. Nach deiner Änderung im Code am 10.Januar funktioniert es jetzt aber!

    Bei meiner Studienarbeit waren es nur 10 Grafiken oder so, bei meiner Diplomarbeit bald wirds mir sicher helfen!

    Vielen vielen Dank🙂

    Grüße
    Nikolai

  20. Anonymous says:

    Ich hoffe mir kann jemand von euch weiterhelfen……
    Ich habe mich durch eure Kommentare gewühlt und alle Einstellungen beachtet usw. ABER
    LateX führt ordentlich aus aber es kommt im PDF kein Bild vor…..die Bildunterschrift ist da aber es wird im Ordner auch kein pdf_tex generiert……und im Editor ist alles eingestellt und auch in den Systemvariablen…..also ich hab keine Idee mehr was ich machen kann!

    Viell ja jemand vo euch…..

  21. […] Now it contains everything what was described here. Both the old way and the new way, including the operating system test and my version of the svg-package by Philip Ilten featuring the angle-option to rotate you svg […]

  22. Mehmet says:

    Hi laclaro,

    danke für dein Workaround für die Einbindung von SVG-Grafiken in Latex. Eine feine Sache. Jedoch gab dein Code oben immer einer Fehlermeldung. Das liegt an einem Tippfehler von dir. Du hast bei dem Befehl

    “Wir bekommen damit ein Kommando

    \incudesvg[scale]{file-without-extension}”

    das “l” bei \incLudesvg… vergessen.

    Vielen Dank nochmal! Jetzt hats funktioniert.

  23. Anonymous says:

    Hallo laclaro,

    vielen Dank fuer dieses Tutorial – ich habe das package svg nicht zum Laufen bekommen und diese Anleitung hat mich gerettet🙂

    Eine Frage: hat jemand einen Tipp, wie ich das umwandeln von Texten zu Pfaden vor dem Export auch noch automatisieren kann? Meine Grafiken enthalten einige spezielle Schriftzuege (z.B. gebogene Texte), die durch den Export kaputt gehen. Gleichzeitig moechte sie gern noch editieren koennen, darum ist das Umwandeln von Text zu Pfad in der GUI eine unangenehme Notloesung. Weder das einfuegen von -T noch –export-text-to-path in der Zeile
    “{%
    \Inkscape -z -D –file=”#2.svg” –export-pdf=”#2.pdf” –export-latex}%
    \scalebox{#1}{\input{#2.pdf_tex}}%”
    haben mir weitergeholfen.

    Viele Gruesse und Danke!

  24. laclaro says:

    Puh, dazu fällt mir nichts ein. Bekommst du denn Fehlermeldungen, wenn du versuchst die Texte in Pfade umzuwandeln? Zum debuggen kannst du auch den Umwandlungsbefehl von Inkscape manuell in der Konsole aufrufen.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Posts by topic…
…by month
Have a look at…


%d bloggers like this: