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