First, let's look at viewing the compilation product. Previously, I'd just used the LaTeX file name to define the PDF file name, and sent it to PDFView using AppleScript. With the new approach, I need a shell script defining the default behavior, and an AppleScript invoking the shell script from SEE. The shell script is:
PATH="$PATH:/usr/texbin:/usr/local/bin"
export PATH
VIEWER=${SEE_LATEX_VIEWER:-'open "$PRODUCT"'}
PRODUCT_TYPE="${SEE_LATEX_PRODUCT_TYPE:-pdf}"
FILE="$(basename "$1")"
DIRNAME="$(dirname "$1")"
LINE="$2"
PRODUCT="$(basename "$1" .tex).$PRODUCT_TYPE"
cd "$DIRNAME"
if [ -s "$PRODUCT" ]
then
eval $VIEWER
fi
Note that the new definition nowhere assumes that we will produce a PDF file as output; it could be used with export PATH
VIEWER=${SEE_LATEX_VIEWER:-'open "$PRODUCT"'}
PRODUCT_TYPE="${SEE_LATEX_PRODUCT_TYPE:-pdf}"
FILE="$(basename "$1")"
DIRNAME="$(dirname "$1")"
LINE="$2"
PRODUCT="$(basename "$1" .tex).$PRODUCT_TYPE"
cd "$DIRNAME"
if [ -s "$PRODUCT" ]
then
eval $VIEWER
fi
latex
to produce a DVI, for instance.The AppleScript is:
tell application "SubEthaEdit"
if exists path of front document then
set filePath to path of front document
set lineNumber to startLineNumber of selection of front document
set activeMode to mode of front document
set modeResources to resource path of activeMode
else
error "You have to save the document first"
end if
end tell
set viewScript to prependEnvironment for activeMode onto (join of {quotedForm for (modeResources & "/bin/viewproduct.sh"), quotedForm for filePath, lineNumber} by space)
do shell script viewScript
-- SubEthaEdit settings
on seescriptsettings()
{displayName:"View", shortDisplayName:"View", keyboardShortcut:"^~@o", toolbarIcon:"ToolbarIconRun", inDefaultToolbar:"yes", toolbarTooltip:"View current document in external viewer", inContextMenu:"no"}
end seescriptsettings
on join of tokenList by delimiter
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to delimiter
set joinedString to tokenList as string
set text item delimiters of AppleScript to oldTIDs
return joinedString
end join
on quotedForm for baseString
quote & baseString & quote
end quotedForm
to prependEnvironment for seeMode onto scriptString
set envFilePath to (path to preferences from user domain as string) & "de.codingmonkeys.SubEthaEdit." & (name of seeMode) & "_environment.plist"
(readEnvironment out of envFilePath) & scriptString
end prependEnvironment
to readEnvironment out of plist
readListPair out of plist
environmentString from result
end readEnvironment
to readListPair out of plist
tell application "System Events"
if exists file plist then
tell property list file plist
get {name, value} of every property list item
end tell
else
{{}, {}}
end if
end tell
end readPlist
on environmentString from keyValueListPair
set {plistKeys, plistValues} to keyValueListPair
set accumulator to {}
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to ""
repeat with i from 1 to number of items in plistKeys
set tokens to {"export ", item i of plistKeys, "=", item i of plistValues, ";"}
copy (tokens as string) to the end of the accumulator
end repeat
set AppleScript's text item delimiters to space
set envString to accumulator as string
set AppleScript's text item delimiters to oldTIDs
envString
end environmentString
if exists path of front document then
set filePath to path of front document
set lineNumber to startLineNumber of selection of front document
set activeMode to mode of front document
set modeResources to resource path of activeMode
else
error "You have to save the document first"
end if
end tell
set viewScript to prependEnvironment for activeMode onto (join of {quotedForm for (modeResources & "/bin/viewproduct.sh"), quotedForm for filePath, lineNumber} by space)
do shell script viewScript
-- SubEthaEdit settings
on seescriptsettings()
{displayName:"View", shortDisplayName:"View", keyboardShortcut:"^~@o", toolbarIcon:"ToolbarIconRun", inDefaultToolbar:"yes", toolbarTooltip:"View current document in external viewer", inContextMenu:"no"}
end seescriptsettings
on join of tokenList by delimiter
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to delimiter
set joinedString to tokenList as string
set text item delimiters of AppleScript to oldTIDs
return joinedString
end join
on quotedForm for baseString
quote & baseString & quote
end quotedForm
to prependEnvironment for seeMode onto scriptString
set envFilePath to (path to preferences from user domain as string) & "de.codingmonkeys.SubEthaEdit." & (name of seeMode) & "_environment.plist"
(readEnvironment out of envFilePath) & scriptString
end prependEnvironment
to readEnvironment out of plist
readListPair out of plist
environmentString from result
end readEnvironment
to readListPair out of plist
tell application "System Events"
if exists file plist then
tell property list file plist
get {name, value} of every property list item
end tell
else
{{}, {}}
end if
end tell
end readPlist
on environmentString from keyValueListPair
set {plistKeys, plistValues} to keyValueListPair
set accumulator to {}
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to ""
repeat with i from 1 to number of items in plistKeys
set tokens to {"export ", item i of plistKeys, "=", item i of plistValues, ";"}
copy (tokens as string) to the end of the accumulator
end repeat
set AppleScript's text item delimiters to space
set envString to accumulator as string
set AppleScript's text item delimiters to oldTIDs
envString
end environmentString
The shell script uses the same
SEE_LATEX_VIEWER
environment variable used for compiling; I'll adapt the compilation script a little to allow separate viewing behavior for the two cases, defaulting to both using the SEE_LATEX_VIEWER
contents. Essentially, this consists of changing just one line, replacing VIEWER=${SEE_LATEX_VIEWER:-'open "$PRODUCT"'}
with VIEWER=${SEE_LATEX_COMPILEVIEWER:-${SEE_LATEX_VIEWER:-'open "$PRODUCT"'}}
Note that the AppleScript uses the same code to read from the same plist of environment settings as the compilation script--no changes were needed to accommodate the new settings.Second, let's examine cleaning up the auxiliary files. The shell script is:
PATH="$PATH:/usr/texbin:/usr/local/bin"
export PATH
CLEANUP=${SEE_LATEX_CLEANUP:-'rm -f $(basename "$FILE" .tex).{aux,bbl,blg,dvi,log,out,ps,pdf,pdfsync,toc}'}
FILE="$(basename "$1")"
DIRNAME="$(dirname "$1")"
PRODUCT="$(basename "$1" .tex).$PRODUCT_TYPE"
cd "$DIRNAME"
eval $CLEANUP
The cleanup behavior can be defined in a export PATH
CLEANUP=${SEE_LATEX_CLEANUP:-'rm -f $(basename "$FILE" .tex).{aux,bbl,blg,dvi,log,out,ps,pdf,pdfsync,toc}'}
FILE="$(basename "$1")"
DIRNAME="$(dirname "$1")"
PRODUCT="$(basename "$1" .tex).$PRODUCT_TYPE"
cd "$DIRNAME"
eval $CLEANUP
SEE_LATEX_CLEANUP
variable, used to set the CLEANUP
variable. The default value for CLEANUP
is to remove files with the same name as the LaTeX file but with different filename extensions. The list of extensions (aux, bbl, blg, dvi, log, out, ps, pdf, pdfsync, toc) is pretty arbitrary, being essentially what were created for my own writings.The associated AppleScript is:
tell application "SubEthaEdit"
if exists path of front document then
set filePath to path of front document
set activeMode to mode of front document
set modeResources to resource path of activeMode
else
--Unsaved document, so LaTeX not run on it and can just return
return
end if
end tell
set cleanupScript to prependEnvironment for activeMode onto (join of {quotedForm for (modeResources & "/bin/cleanupaux.sh"), quotedForm for filePath} by space)
do shell script cleanupScript
on seescriptsettings()
return {displayName:"Clean Up Auxiliary Files"}
end seescriptsettings
on join of tokenList by delimiter
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to delimiter
set joinedString to tokenList as string
set text item delimiters of AppleScript to oldTIDs
return joinedString
end join
on quotedForm for baseString
quote & baseString & quote
end quotedForm
to prependEnvironment for seeMode onto scriptString
set envFilePath to (path to preferences from user domain as string) & "de.codingmonkeys.SubEthaEdit." & (name of seeMode) & "_environment.plist"
(readEnvironment out of envFilePath) & scriptString
end prependEnvironment
to readEnvironment out of plist
readListPair out of plist
environmentString from result
end readEnvironment
to readListPair out of plist
tell application "System Events"
if exists file plist then
tell property list file plist
get {name, value} of every property list item
end tell
else
{{}, {}}
end if
end tell
end readPlist
on environmentString from keyValueListPair
set {plistKeys, plistValues} to keyValueListPair
set accumulator to {}
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to ""
repeat with i from 1 to number of items in plistKeys
set tokens to {"export ", item i of plistKeys, "=", item i of plistValues, ";"}
copy (tokens as string) to the end of the accumulator
end repeat
set AppleScript's text item delimiters to space
set envString to accumulator as string
set AppleScript's text item delimiters to oldTIDs
envString
end environmentString
Again, the bulk of the script is unchanged, with no changes at all to the portions handling the environment settings.
if exists path of front document then
set filePath to path of front document
set activeMode to mode of front document
set modeResources to resource path of activeMode
else
--Unsaved document, so LaTeX not run on it and can just return
return
end if
end tell
set cleanupScript to prependEnvironment for activeMode onto (join of {quotedForm for (modeResources & "/bin/cleanupaux.sh"), quotedForm for filePath} by space)
do shell script cleanupScript
on seescriptsettings()
return {displayName:"Clean Up Auxiliary Files"}
end seescriptsettings
on join of tokenList by delimiter
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to delimiter
set joinedString to tokenList as string
set text item delimiters of AppleScript to oldTIDs
return joinedString
end join
on quotedForm for baseString
quote & baseString & quote
end quotedForm
to prependEnvironment for seeMode onto scriptString
set envFilePath to (path to preferences from user domain as string) & "de.codingmonkeys.SubEthaEdit." & (name of seeMode) & "_environment.plist"
(readEnvironment out of envFilePath) & scriptString
end prependEnvironment
to readEnvironment out of plist
readListPair out of plist
environmentString from result
end readEnvironment
to readListPair out of plist
tell application "System Events"
if exists file plist then
tell property list file plist
get {name, value} of every property list item
end tell
else
{{}, {}}
end if
end tell
end readPlist
on environmentString from keyValueListPair
set {plistKeys, plistValues} to keyValueListPair
set accumulator to {}
set oldTIDs to text item delimiters of AppleScript
set text item delimiters of AppleScript to ""
repeat with i from 1 to number of items in plistKeys
set tokens to {"export ", item i of plistKeys, "=", item i of plistValues, ";"}
copy (tokens as string) to the end of the accumulator
end repeat
set AppleScript's text item delimiters to space
set envString to accumulator as string
set AppleScript's text item delimiters to oldTIDs
envString
end environmentString
2 comments:
Wowie...it looks like you may have already done a lot of the hard work for using LaTeX with SubEthaEdit that I was thinking about. Any thoughts on adding it all into a downloadable mode file for the rest of us?
That's definitely my intention. I've been a bit busy of late, so haven't done much with it. However, all that really remains to do is add in comments and maybe to see if I can't do something more with completing citations from BibDesk.
I guess I might as well come clean here. The larger goal is not just to get a LaTeX environment, but also to produce a collection of patterns that can be readily customized for other environments. So far, I've got examples that integrate SEE with external applications and that call out to the shell to do some work, with the environment usable to customize the behavior.
What remains is to develop some useful examples that serve as patterns for transforming text within a SEE document. It should be clear that comments will serve for that purpose. Citation completion with BibDesk would also nicely serve that purpose.
I expect to have the comments done this week, and to see what else can be done relatively promptly. There should be a usable mode made available by the end of the month.
If you don't want to wait, send me an email and I'll pass along the current version.
Post a Comment