Um zu demonstrieren wie man ein Unix Shell-Skript aus einem AppleScript aufruft werden wir das AppleScript „pdflatexc“ von Claus Gerhardt analysieren. Dieses Skript erfüllt lediglich die Aufgabe den Ort der teTeX-Binaries an die $PATH-Variable zu übergeben und dann pdflatex zum Setzen aufzurufen.

Das Shell-Skript selbst ist von TeXShop unabhängig und kann im Terminal mit dem Befehl „pdflatexc myfile.tex“ aufgerufen werden, wenn sich pdflatexc sich in einem Ordner befindet, der sich im Durchsuchungspfad für auführbare Dateien befindet.

#!/bin/tcsh
# pdflatexc
# Claus Gerhardt
#
# Usage
# pdflatexc filename.tex

set path= ($path /usr/local/teTeX/bin/powerpc-apple-darwin-current /usr/local/bin)

pdflatex --shell-escape "$1"

Natürlich können Sie auch kompliziertere Skripte erstellen, die verschiedene Operationen in Folge ausführen können. Erst dann werden die hier dargestellten Techniken wirklich nützlich.

Das AppleScript, durch das dieses Shell-Skript aufgerufen wird ist wesentlich interessanter:

--Applescript
-- Apply only to an already saved file.
-- Claus Gerhardt, Nov. 2003

set scriptPath to (do shell script "dirname " & "~/Library/TeXShop/Scripts/ex")
set scriptPath to scriptPath & "/setname.scpt"
set scriptName to POSIX file scriptPath as alias
set scriptLiB to (load script scriptName)
tell scriptLib
set frontName to setname(#NAMEPATH#,#TEXPATH#)
end tell

set fileName to #TEXPATH#
set n to (number of characters of contents of fileName)
set fileNamequoted to quoted form of fileName
set baseName to do shell script "basename " & fileNamequoted
set m to (number of characters of contents of baseName)
set dirName to quoted form of (characters 1 thru (n - m - 1) of fileName as string)

set shellScript to "cd " & dirName & ";"
set shellScript to shellScript & "~/Library/TeXShop/bin/pdflatexc " & baseName
do shell script shellScript

tell document frontName
refreshpdf
end tell

Wenn man die einführenden Kommentare außer Acht lässt, bilden die ersten sieben Zeilen einen zauberhaften Weg die Quelldatei zu sichern, den Namen des Dokumentes heraus zu bekommen und ihn in die Variable „frontName“ zu sichern. Es wird ein kompiliertes Skript mit dem Namen „setpath.scpt“ in ~/Library/TeXShop/Scripts für den schwierigen Teil benutzt. Wenn man genau hin sieht, kann man erkennen, dass der Code den Pfad „~/Library/TeXShop/Scripts/setname.scpt“ findet und dieses Skript mit den Parametern #NAMEPATH# und #TEXPATH# aufruft.

In vielen AppleScripts könnte dies einfacher auch mit Hilfe der folgenden Befehle erreicht werden:

set frontName to #DOCUMENTNAME#
tell document frontName of application "TeXShop"
save
end tell

Gerhardts Skript hat jedoch zwei Vorteile. Als erstes kann sein Skript auch dann aufgerufen werden, wenn das vorderste Dokument eine log-Datei ist (z.B. /Users/koch/Examples/myfile.log), das später nicht die Befehle aufnehmen soll. Zum Zweiten gibt Gerhardts Skript beim Sichern eine Fehlermeldung aus. Der Befehl „Sichern“ würde im Gegensatz dazu TeXShop in Sichern-Dialog aufhängen. (Lesen Sie das Hilfe-Dokument „Skripte mit TeXShop-Satzkommandos erstellen“ für weitere Hinweise.)

Die nächsten sechs Zeilen des Skripts definieren die Variablen „dirName“ und „baseName“. Ist die Quelldatei „/Users/koch/This directory/Stuff/myfile.tex“, so wird „dirName“ " '/Users/koch/This directory/Stuff' “ inklusive der einfachen und doppelten Anführungszeichen. „baseName“ wird zu "myfile.tex.". Diese Schritte sind notwendig, damit Leerzeichen in den Pfaden enthalten sein können. Wie immer erlaubt TeX keine Leerzeichen im letztendlichen Dateinamen.

Die nächsten drei Zeilen rufen das Shell-Skipt auf. Das Ergebnis kommt das dem Auführen von "cd dirName; ~/Library/TeXShop/bin/pdflatexc baseName" in einem Terminal gleich.

Shell-Befehle in AppleScript werden in folgender Form aufgerufen:

do shell script "cmd input"
Will man mehrere Shell-Skripte kombinieren, sollte man besser folgende Form verwenden:
do shell script "cmd " & "input"
Beachten Sie das Leerzeichen hinter „cmd“ sowie die Anführungszeichen. Das kaufmännische „und“ ist ein binärer Operator. Das heißt:
"cmd " & "input" = "cmd input"
Wird die Shell mit Hilfe eines AppleScripts aufgerufen, so ist das Standard-Arbeitsverzeichnis das root-Verzeichnis. Das Kommando
do shell script "cd " dirName

ändert das Verzeichnis zu dem in dirName spezifizierten. dirName ist schon in Anführungszeichen, so dass diese hier entbehrlich sind.

Will man das Arbeitsverzeichnis behalten und wetiere Befehle ausführen, so können diese nicht mehr durch "do shell script" auferufen werden, da hierdurch eine neue Shell aufgerufen würde. Im Terminal würden aufeinander folgende Befehle mit einem Semikolon getrennt. Im AppleScript muss das Semikolon deshalb mit dem kaufmännischen „und“ eingebettet werden:

do shell script "cmd(1) " & "input(1)" & ";" & "cmd(2) " & "input(2)"
Dies wird im obigen Beispiel ausgeführt: cmd(1) = cd, "input(1)" = dirName, cmd(2) = ~/Library/TeX/bin/pdflatexc - ruft das Shell-Skript auf - und "input(2)" = baseName.

Die Zeilen

set shellScript to "cd " & dirName & ";"
set shellScript to shellScript & "~/Library/TeX/bin/pdflatexc " & baseName
sind einfach ein Weg Befehlsketten in einer Variable zusammenzufügen.

Die letzten drei Zeilen aktualisieren das Vorschau-Fenster.

Sicherlich sind einige Zeilen schwer verständlich. Sie können sie aber ohne Probleme in eiigene Skripte kopieren.

Hilfe zu Makros
Skripte mit Shell-Befehlen erstellen