我使用 latex 写论文,使用 PostScript 程序绘制图表。(后者听起来并不疯狂,但那是其他地方的话题了。)
我的问题是关于如何让 LaTeX 整合我自制的.ps
图片。有几种不太理想的选择:
latex
然后使用dvips
并ps2pdf
包含图形\documentclass{amsart} \usepackage{graphicx} \begin{document} \includegraphics{my_ps_file.ps} \end{document}
这种方法可行,但
ps2pdf
处理包含大量图形的文件非常耗时。(对于某些论文,在快速计算机上处理大约需要一分钟。小.ps
文件可以包含大量图形,因为 PostScript 是一种完整的编程语言。)手动
ps2pdf
对每个.ps
文件执行ps2pdf -dEPSCrop -dNOSAFER my_ps_file.ps
然后使用
pdflatex
\documentclass{amsart} \usepackage{graphicx} \begin{document} \includegraphics{my_ps_file.pdf} \end{document}
.ps
这也有效,但是对于自上次运行以来修改过的每个文件,都有额外的命令行步骤pdflatex
。使用 pdflatex 和图形规则
\documentclass{amsart} \usepackage{graphicx,epstopdf} \epstopdfsetup{suffix=} \DeclareGraphicsExtensions{.ps} \DeclareGraphicsRule{.ps}{pdf}{.pdf}{`ps2pdf -dEPSCrop -dNOSAFER #1 \noexpand\OutputFile} \begin{document} \includegraphics{my_ps_file} \end{document}
第五行告诉 LaTeX,当它看到时
\includegraphics{my_ps_file}
,它应该查找一个文件my_ps_file.ps
。第 6 行告诉 LaTeX 如何处理
my_ps_file.ps
:按照参数的顺序,当 (1) 它看到一个.ps
文件时,它最终应该期望有一个.pdf
文件可以插入,(3) 它应该从该文件中读取边界框信息.pdf
,(4) 它应该在该文件上运行某个命令.ps
来获取该.pdf
文件。这里只使用该包
epstopdf
,以便我可以使用第 4 行\epstopdfsetup{suffix=}
,它告诉 LaTeX 调用.pdf
文件my_ps_file.pdf
而不是my_ps_file-ps-converted-to.pdf
。它能工作,并且会自动
ps2pdf
在 上运行my_ps_file.ps file
,但前提是它需要:如果它发现my_ps_file.pdf
已经存在,它就会使用my_ps_file.pdf
。(为了获得此功能,我们使用\includegraphics{my_ps_file}
而不是\includegraphics{my_ps_file.ps}
)。这种可能性消除了可能性 (1) 的缓慢性,也消除了可能性 (2) 的额外命令行步骤。但不幸的是,它会为每个修改的文件添加一个新的命令行步骤:每次更改时都
.ps
必须手动删除,否则 LaTeX 将继续使用旧的而不是创建新的。my_ps_file.pdf
my_ps_file.ps
my_ps_file.pdf
现在的问题是:我想要的选项,但不知道如何实现,其工作方式与 (3) 一样,不同之处在于,如果my_ps_file.pdf
存在并且比my_ps_file.ps
LaTeX 更新,则使用它,否则继续ps2pdf
运行my_ps_file.ps
。
有任何想法吗?
答案1
我将充分利用以下功能epstopdf
:
\documentclass{amsart}
\usepackage{graphicx,epstopdf}
\epstopdfsetup{update}
\DeclareGraphicsExtensions{.ps}
\epstopdfDeclareGraphicsRule{.ps}{pdf}{.pdf}{ps2pdf -dEPSCrop -dNOSAFER #1 \OutputFile}
\begin{document}
\includegraphics{my_ps_file}
\end{document}
仅当目标文件(.pdf
)比源文件旧时,才会运行转换程序。请记住pdflatex
使用--shell-escape
命令行选项调用。
答案2
TeXlive 的当前版本对.eps
文件执行此操作:
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{tmp1}
\end{document}
我有一个文件tmp1.eps
,但没有tmp1.pdf
,所以第一次运行pdflatex
说
Package epstopdf Info: Source file: <tmp1.eps>
(epstopdf) date: 2012-04-25 19:09:03
(epstopdf) size: 204851 bytes
(epstopdf) Output file: <tmp1-eps-converted-to.pdf>
(epstopdf) Command: <repstopdf --outfile=tmp1-eps-converted-to.pdf
tmp1.eps>
(epstopdf) \includegraphics on input line 4.
runsystem(repstopdf --outfile=tmp1-eps-converted-to.pdf tmp1.eps)...executed sa
fely (allowed).
Package epstopdf Info: Result file: <tmp1-eps-converted-to.pdf>
(epstopdf) date: 2012-05-11 13:09:38
(epstopdf) size: 64649 bytes.
<tmp1-eps-converted-to.pdf, id=1, 614.295pt x 794.97pt>
File: tmp1-eps-converted-to.pdf Graphic file (type pdf)
<use tmp1-eps-converted-to.pdf>
第二次运行仅使用此文件:
[2 <./tmp1-eps-converted-to.pdf>] (./tmp.aux) )
现在我更改了postscript文件:touch tmp1.eps
,并pdf
重新生成:
Package epstopdf Info: Source file: <tmp1.eps>
(epstopdf) date: 2012-05-11 13:17:04
(epstopdf) size: 204852 bytes
(epstopdf) Output file: <tmp1-eps-converted-to.pdf>
(epstopdf) date: 2012-05-11 13:16:39
(epstopdf) size: 64651 bytes
(epstopdf) Command: <repstopdf --outfile=tmp1-eps-converted-to.pdf
tmp1.eps>
(epstopdf) \includegraphics on input line 4.
runsystem(repstopdf --outfile=tmp1-eps-converted-to.pdf tmp1.eps)...executed sa
fely (allowed).
Package epstopdf Info: Result file: <tmp1-eps-converted-to.pdf>
(epstopdf) date: 2012-05-11 13:17:08
(epstopdf) size: 64651 bytes.
<tmp1-eps-converted-to.pdf, id=1, 614.295pt x 794.97pt>
File: tmp1-eps-converted-to.pdf Graphic file (type pdf)
<use tmp1-eps-converted-to.pdf>
因此,请将您的 PostScript 文件保存为.eps
并检查系统是否足够智能以理解您的需求。
当然,作为最后的手段,您可以使用make
:它知道如何检查是否重新生成依赖项。
答案3
我觉得回答经过埃格尔是最务实的。为了完整起见,我想指出,对于这种问题制作工具被发明了。Makefile 包含一些规则,当源文件比工具从源文件派生的文件更新时,这些规则会调用该工具。
doc.pdf: psfile1.pdf psfile2.pdf psfile3.pdf
pdflatex doc.tex
%.pdf: %.ps
ps2pdf -dEPSCrop -dNOSAFER $<
上述代码只是一个草图。它从一个 ps 文件派生出一个 pdf 文件,并声明您的主 pdf 文件依赖于从 ps 文件派生的多个文件(根据第二条规则)。
使用 Makefile 编译 LaTeX 文档有点棘手,因为可能存在其他依赖项,有时很难用 Make 捕获。另一个问题是pdflatex
可能需要运行多次。