Um notwendige Pakete in der jeweils aktuellen Fassung in ein Dokument einzubinden, muß man nicht unbedingt auf die Installation von TeX auf dem eigenen Rechner, CTAN oder TeX-Live zurückgreifen, man kann die notwendigen Pakete auch per wget von einer Autorenhomepage (oder CTAN) in sein Dokumentverzeichnis herunterladen und dann einbinden. Dies ist leicht machbar, wenn man sich ein Script schreibt, welches die benötigten Dateien aus den Netzquellen herunterlädt (Bsp: wget http://biocoen.org/mbenotes.sty).

Die Frage ist, wie man diesen Vorgang aus einer LaTeX-Quelldatei heraus auslösen kann, ohne ein Shellscript zu benutzen.

gefragt 06 Mai '14, 20:43

ctansearch's gravatar image

ctansearch
(inaktiv)
Akzeptiert: 84%

bearbeitet 15 Mai '14, 02:05

Bes's gravatar image

Bes
1411516


Wenn man die Option shell-escape bzw. enable-write18 für seine TeX-Installation aktiviert hat, könnte man vor \usepackage aufrufen:

Open in writeLaTeX
\immediate\write18{wget http://biocoen.org/mbenotes.sty}

Dann wird das Paket durch den Aufruf des externen Programms wget heruntergeladen. Mann kann auch Optionen übergeben, beispielsweise für Überschreiben einer bereits vorhandenen Datei.

Ausserdem: Wie man write18 aktiviert

Nachtrag @ctansearch: Man kann die Dateien auch bedingt herunterladen

Open in writeLaTeX
\IfFileExists{path/datei.ext}{}%Wenn Datei vorhanden, tu nix
  {\immediate\write18{wget http://path/datei.ext}}%sonst lade herunter
Permanenter link

beantwortet 07 Mai '14, 15:48

stefan's gravatar image

stefan ♦♦
5.8k12134

bearbeitet 15 Mai '14, 01:46

Bes's gravatar image

Bes
1411516

Es sei darauf hingewiesen, dass man seit LuaTeX 0.85 \immediate\write18 besser nicht mehr direkt verwenden sollte, sondern stattdessen das Paket shellesc und dann \ShellEscape{wget http://biocoen.org/mbenotes.sty}.

(07 Jun, 09:30) saputello

In Ergänzung zur Antwort von Stefan bzw. deren Ergänzung durch @ctansearch sei erwähnt:

Man kann bei wget übrigens auch per Option steuern, was geschehen soll, wenn die Datei bereits existiert, etwa per

Open in writeLaTeX
\immediate\write18{wget -nc http://biocoen.org/mbenotes.sty}

die Datei nur herunterladen, wenn sie noch nicht existiert. Im Unterschied zur vorherigen Lösung wird hier im Fall, dass die Datei nicht existiert, nur einmal getestet wird, ob sie existiert. Dafür werden Dateien nur im aktuellen Verzeichnis, nicht jedoch in TDS gesucht und gefunden. Weitere optionale Alternativen wären dafür beispielsweise, die lokale Datei durch die entfernte überschreiben zu lassen oder dies nur zu tun, wenn die entfernte Datei neuer ist oder eine andere Größe aufweist. Näheres erklärt die Anleitung zu wget. Die Optionen können allerdings je nach Versions des Programs bzw. je nach verwendetem OS abweichen. Man sollte sich daher zumindest auf die POSIX-Optionen beschränken, die jede Fassung von wget bereitstellen sollte.

Problematisch bei diesem einfachen Aufruf von wget per \write18 aus TeX heraus ist, dass keine echte Fehlerbehandlung für Fehler beim Download per wget stattfindet. Hier muss man sich stattdessen darauf verlassen, dass die spätere Verwendung der heruntergeladenen Datei zu einem entsprechenden Fehler führt. Wollte man dies ergänzen, müsste man innerhalb des \write18-Codes den Fehlerstatus prüfen und beispielsweise eine Markerdatei erzeugen, die man dann testen kann. Dies wiederum ist nur mit großem Aufwand OS-unabhängig lösbar.

Eine generelle Alternative wäre, den Aufruf von wget via Lua zu realisieren. luaTeX bietet über os.execute ebenfalls die Möglichkeit, externe Programme auszuführen, wobei auch eine komplette Fehlerbehandlung möglich ist. Hier wäre auch die Implementierung weiterer Tests etwa bezüglich der Version der heruntergeladenen Datei möglich.

Eine weitere, empfehlenswerte Möglichkeit, ist die Verwendung eines Dokumenterzeugungs-Werkzeugs, das auch die Ausführung weiterer Programme am Anfang des Kompiliervorgangs ermöglicht. Neben dem aus der Unix-Welt bekannten make wäre hier beispielsweise das weitreichend konfigurierbare arara zu nennen, das speziell für die Erzeugung von LaTeX-Dokumenten entwickelt wurde. Auch diese Werkzeuge melden Fehler bei Programmausführungen in der Regel unmittelbar, was einer zufälligen Fehlermeldung bei Verwendung einer nicht korrekt heruntergeladenen Datei vorzuziehen ist.

Permanenter link

beantwortet 15 Mai '14, 02:03

Bes's gravatar image

Bes
1411516

Es sei darauf hingewiesen, dass man seit LuaTeX 0.85 \immediate\write18 besser nicht mehr direkt verwenden sollte, sondern stattdessen das Paket shellesc und dann \ShellEscape{wget -nc http://biocoen.org/mbenotes.sty}.

(07 Jun, 09:31) saputello
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×108
×40
×32

Frage gestellt: 06 Mai '14, 20:43

Frage wurde angeschaut: 3,158 Mal

Zuletzt aktualisiert: 07 Jun, 09:31