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.