强制 latex 以智能方式处理自制的 .ps 文件

强制 latex 以智能方式处理自制的 .ps 文件

我使用 latex 写论文,使用 PostScript 程序绘制图表。(后者听起来并不疯狂,但那是其他地方的话题了。)

我的问题是关于如何让 LaTeX 整合我自制的.ps图片。有几种不太理想的选择:

  1. latex然后使用dvipsps2pdf包含图形

    \documentclass{amsart}
    \usepackage{graphicx}
    \begin{document}
    \includegraphics{my_ps_file.ps}
    \end{document}  
    

    这种方法可行,但ps2pdf处理包含大量图形的文件非常耗时。(对于某些论文,在快速计算机上处​​理大约需要一分钟。小.ps文件可以包含大量图形,因为 PostScript 是一种完整的编程语言。)

  2. 手动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

  3. 使用 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.pdfmy_ps_file.psmy_ps_file.pdf

现在的问题是:我想要的选项,但不知道如何实现,其工作方式与 (3) 一样,不同之处在于,如果my_ps_file.pdf存在并且比my_ps_file.psLaTeX 更新,则使用它,否则继续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可能需要运行多次。

相关内容