Usaremos el applescript «pdflatexc», realizado por Claus Gerhardt, para ilustar el proceso involucrado al llamar a un script del Shell de Unix desde un applescript. El script de shell particular que explicamos no es muy interesante; lo único que hace es añadir la localización de los archivos binarios teTeX a la variable $PATH, y llama a pdflatex para componer.

El script de shell en sí mismo es independiente de TeXShop, y se puede ejecutar en el Terminar tecleando «pdflatexc miarchivo.tex», supuesto que el directorio en el que esté pdflatexc se encuentre en la ruta de búsqueda de archivos ejecutables. Éste es el script del shell:

#!/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"
Por supuesto, se pueden escribir scripts más complicados que realicen varias operaciones una tras otra. Aquí es donde estas técnicas resultan útiles.

El applescript usado para llamar a este script del shell es más interesante. Es éste:

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

Ignorando los comentarios introductorios, las primeras siete líneas de este script son una receta mágica de Claus Gerhardt para guardar el archivo de código y encontrar el nombre documento en cuestión, poniendo este nombre en la variable «frontName». Esta receta usa un script compilado llamado «setpath.scpt», que se encuentra en ~/Library/TeXShop/Scripts; él es quien realiza todo el trabajo duro. Una lectura cuidadosa muestra que estas líneas encuentran la ruta ~/Library/TeXShop/Scripts/setname.scpt y llaman a este script con parámetros #NAMEPATH# y #TEXPATH#.

En muchos applescripts, todo esto se puede hacer también mediante estos comandos:

set frontName to #DOCUMENTNAME#
tell document frontName of application "TeXShop"
save
end tell
Sin embargo, el script de Gerhardt tiene dos ventajas. Primera, se puede llamar al script cuando el documento que está al frente es un archivo log, digamos /Users/koch/Examples/myfile.log, esto es, en el caso de que el documento que está al frente no es el documento que debe recibir los siguientes comandos. Segundo, si no hemos guardado nunca el documento, el script de Gerhardt devuelve un error cuando intenta guardar, mientras que el comando «save» puede hacer que TeXShop se cuelgue después de sacar el diálogo de guardar (mira el documento de ayuda «Scripts con comandos de composición de TeXShop» para conocer más detalles.)

Las siguientes seis líneas del script definen las variables dirName y baseName. Si el código fuente es «/Users/koch/This directory/Stuff/myfile.tex», dirName es " '/Users/koch/This directory/Stuff' ", incluyendo las comillas simples y dobles, y basename es «myfile.tex». Gran parte de este trabajo es necesario porque los nombres de las carpetas pueden contener espacios. Como siempre, TeX no permite espacios en el nombre del archivo.

Las siguientes tres líneas llaman al script de shell. El resultado es el mismo que si tecleaáramos «cd dirName; ~/Library/TeXShop/bin/pdflatexc baseName» en el Terminal, aunque, para ser absolutamente precisos, dirName podría haberse tenido que reemplazar por su forma sin comillas, es decir, siguiendo con el ejemplo anterior, por '/Users/koch/This directory/Stuff', incluyendo las comillas simples debido al espacio en el nombre del directorio.

En AppleScript, los comandos de shell se usan con la sintaxis

do shell script "cmd input"
Si queremos combinar varios scripts de shell, es mejor escribir el comando de una manera equivalente, mediante
do shell script "cmd " & "input"
Fíjate en el espacio entre cmd y la comilla. El signo & es el operador de concatenacón binario, es decir,
"cmd " & "input" = "cmd input"
Cuando llamamos al shell vía un applescript, el directorio de trabajo predeterminado es el directorio raíz. El comando
do shell script "cd " dirName
cambia el directorio al directorio especificado en dirName; dirName ya tiene comillas, luego no son necesarias comillas adicionales.

Si uno quiere mantener el directorio de trabajo y ejecutar más comandos, entonces estos comandos no hay que usarlos con la sintaxis «do shell script», porque así se llamaría a un nuevo shell. En el terminal, podemos separar comandos consecutivos con punto y coma; en AppleScript lo logramos concatenando ";", es decir,

do shell script "cmd(1) " & "input(1)" & ";" & "cmd(2) " & "input(2)"
En el ejmplo anterior se hace esto: cmd(1) = cd, "input(1)" = dirName, cmd(2) = ~/Library/TeX/bin/pdflatexc —llamando al script del shell—, y "input(2)" = baseName.

Las líneas

set shellScript to "cd " & dirName & ";"
set shellScript to shellScript & "~/Library/TeX/bin/pdflatexc " & baseName
son simplemente una manera conveniente de concatenar esta secuencia de comandos y meterlo en una variable.

Las últimas tres líneas actualizan la ventana con el pdf previsto.

No desesperes: bastantes de estas líneas son complicadas, pero se pueden copiar sin cambios en nuevos scripts.

Ayuda para macros
Scripts con comandos del Shell