![在 Mac 中创建使用 Automator 编译 .tex 文件的服务](https://linux22.com/image/291209/%E5%9C%A8%20Mac%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E4%BD%BF%E7%94%A8%20Automator%20%E7%BC%96%E8%AF%91%20.tex%20%E6%96%87%E4%BB%B6%E7%9A%84%E6%9C%8D%E5%8A%A1.png)
我在用着Mac OS 10.9.3,TeXLive-2013和斯克里文纳写论文。我想使用 Apple 的 Automator 创建一个名为“编译 TeX 文件”的服务(可从 Finder 的文件右键菜单中获取),该服务使用所选文件作为输入。
例如:
- 在文件夹 (/Volumes/Data/TeX_docs/) 中我有一个示例Scrivener 创建的文件,可以用 LaTeX 进行编译。
- 我想右键单击此文件并从 Finder 的服务菜单中选择选项“编译 TeX 文件”
- 一旦选择,该服务将执行命令
latexmk -pdf -bibtex exemple.tex
并编译同一文件夹内的.tex 文件,创建一个.pdf 文件(此终端命令现在运行正常,因此需要自动执行此操作!) - 编译 .tex 文件后,会出现一个对话框,询问我是否要使用
Yes
或No
选项删除所有临时文件。如果Yes
选择 ,它会删除所有 TeX 临时文件(.aux、.bbl、.bcf、.fdb_latexmk、.fls、.log、.out、.run.xml)并仅保留原始 exemple.tex 和新的 exemple.pdf 文件。否则,它不会执行任何其他操作,最终我会得到所有文件!
答案1
这不是最佳解决方案,但目前有效。这是 Automator 窗口:
第一个 shell 脚本.tex
使用序列编译文件pdflatex - biber - pdflatex
,并包含以下代码:
for f in "$@"
do
file_ext=${f##*.}
if [ "$file_ext" = "tex" ]
then
foldername=$(dirname "$f")
export foldername
filename=$(basename "$f")
filesimple=${filename%.tex*}
cd $foldername
/usr/local/texlive/2013/bin/x86_64-darwin/pdflatex "$filename"
/usr/local/texlive/2013/bin/x86_64-darwin/biber "$filesimple"
/usr/local/texlive/2013/bin/x86_64-darwin/pdflatex "$filename"
else
echo $f n\'est pas un fichier TeX
fi
done
第二个 shell 脚本删除所有温度文件并打开该.pdf
文件。它包含以下代码:
for f in "$@"
do
file_ext=${f##*.}
if [ "$file_ext" = "tex" ]
then
foldername=$(dirname "$f")
filename=$(basename "$f")
filesimple=${filename%.tex*}
cd $foldername
rm $filesimple.aux
rm $filesimple.bbl
rm $filesimple.bcf
rm $filesimple.blg
rm $filesimple.log
rm $filesimple.run.xml
open $filesimple.pdf
else
echo $f n\'est pas un fichier TeX
fi
done
我仍在等待使用latexmk
命令的更好的解决方案!
答案2
这不是最漂亮的解决方案,但它可以达到您想要的目的(即使用latexmk
和确认对话框):
首先,您的第一个脚本可以替换为以下内容:
for f in "$@"
do
file_ext=${f##*.}
if [ "$file_ext" = "tex" ]
then
foldername=$(dirname "$f")
filename=$(basename "$f" .tex)
cd "$foldername"
/usr/texbin/latexmk -pdf -bibtex "$filename"
open "${filename}.pdf"
else
echo $f n\'est pas un fichier TeX
fi
done
请注意,我在第一个脚本中添加了 open 命令,因此第二个脚本仅有的负责清理临时文件。此外,如果您想进一步简化操作,您可以.latexmkrc
在生成的 TeX 文件所在的目录中创建一个,如下所示:
$pdf_mode = 1; # equivalent to -pdf
$bibtex_use = 2; # equivalent to -bibtex
然后将latexmk
命令简化为/usr/texbin/latexmk "$filename"
。然后,在第二步之前Get Finder Items
,添加一个Ask for Confirmation
步骤。您可以在其中输入消息文本并将按钮更改为“是”或“否”。注意,“确定”按钮应该更改为“是”,假设您希望“是”作为默认选项。
最后,您可以将第二个脚本更改为如下内容:
for f in "$@"
do
file_ext=${f##*.}
if [ "$file_ext" = "tex" ]
then
foldername=$(dirname "$f")
filename=$(basename "$f" .tex)
cd "$foldername"
/usr/texbin/latexmk -c "$filename"
rm -f "$filename".bbl
rm -f "$filename".run.xml
else
echo $f n\'est pas un fichier TeX
fi
done
-c
latexmk
是在清理模式下运行的选项,但它不会删除您的 pdf。请注意,我仍然需要手动删除.run.xml
和.bbl
文件。我不太明白为什么latexmk
不清理.bbl
文件。
更接近可靠解决方案的方案可能需要更多脚本,并将其分解为多个工作流,例如,优雅地处理编译失败的情况并为用户显示日志文件。此外,拥有一个可以清理 TeX 辅助文件的独立服务可能不错。但就简单性而言,这是我能想到的最好的方案。