我想增强 pdflatexmk 引擎,以便事后删除文件。我来自TeXShop 排版成功后自动“丢弃辅助文件”,其中的指令是编写一个执行“pdftex”的 Python 文件,然后删除所有其它文件。
然而,我不知道如何调用不同的 texshop “引擎”。也就是说,不是这样做
command = '/usr/texbin/pdflatex ' + '--output-driver=/usr/texbin/xdvipdfmx ' + OUTPUT_ARGUMENT + '"' + output_dir + '"' + ' ' + '"' + pdf_path + os.path.sep + tex_file + '"'
由于我将文件保存在/Engine
文件夹中,因此我认为我可以简单地
execfile("pdflatexmk.engine")
相反 - 但这给了
Traceback (most recent call last):
File "/Volumes/Stuff/user/Library/TeXShop/Engines/pdflatexmk_del.py", line 43, in <module>
execfile("pdflatexmk.engine")
IOError: [Errno 2] No such file or directory: 'pdflatexmk.engine'
答案1
每个引擎都是一个自己的 shell 脚本,因此增强现有引擎的最简洁方法可能是添加脚本。
pdflatexmk -c
您想要的是在每次成功运行后有效地调用pdflatexmk
。
如果你看一下,pdflatexmk.engine
你会发现最后一行是:
"${LTMKBIN}"/latexmk -pdf -r "${LTMKEDIT}/latexmkrcedit" -r "${TSBIN}/pdflatexmkrc" ${localrc} "$1"
这就是整个脚本的核心:调用latexmk
。要添加仅在此行成功完成后执行的命令,请添加&& <cmds>
。因此将最后一行更改为:
"${LTMKBIN}"/latexmk -pdf -r "${LTMKEDIT}/latexmkrcedit" -r "${TSBIN}/pdflatexmkrc" ${localrc} "$1" && "${LTMKBIN}"/latexmk -c
将新引擎另存为pdflatexmk-c.engine
或您喜欢的其他名称,然后重新启动 TeXShop。
然后您可以在文件中的第一行调用该引擎.tex
,如下所示:
% !TEX TS-program = pdflatexmk-c
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\tableofcontents
\section{Foo}
\lipsum
\section{Bar}
\lipsum[1-12]
\end{document}
您会看到它pdflatexmk
正在运行,运行pdflatex
几次以获得正确的生成的引用,然后pdflatexmk -c
运行并删除辅助文件。
答案2
我不得不说,在我使用不同 stackexchange 网站的整个过程中,我从来没有遇到过如此负面的提问体验;即一种居高临下的“我知道的比你应该知道的要多”的态度。
以下是调用texshop的pdflatexmk引擎的最简单方法(如果__file__
它放在Engine文件夹中):
import os, subprocess
# run pdflatexmk
engine = os.path.dirname(__file__)+'/pdflatexmk.engine'
file = pdf_path + os.path.sep + tex_file
command = '{0} "{1}"'.format(engine, file)
subprocess.call(command, shell=True)
然后,更安全的删除方法是使用黑名单,而不是白名单。稍等片刻,以防我们想重新运行编译器:
# wait a bit before delete
import time
time.sleep(360) # in seconds
# delete
file_plain = tex_file.split('.')[:-1][0]
print file_plain
del_list = ['log', 'aux', 'bbl', 'blg', 'fdb_latexmk', 'fls', 'synctex.gz', 'toc']
files = [pdf_path + os.path.sep + file_plain+'.'+l for l in del_list]
for file in files: os.remove(file)