如何自动更改一堆 EPS 图像中的标签并将其转换为 PDF

如何自动更改一堆 EPS 图像中的标签并将其转换为 PDF

这篇文章是我之前文章的延续:

创建独立的 eps 文件并使用批处理文件来自动化该过程

Xport给出了有效的好答案!

整个自动化过程的一个目标也是在使用pdfLaTeX而不是传统tex > dvi > ps > pdf方式时有所帮助。使用TeXLive 2010,只需发出命令pdfLaTeX,所有eps文件就会即时转换为pdf并插入到文档中。

我不喜欢这个pdfLaTeX工作流程,但它比传统方式编译速度快得多tex > dvi > ps > pdf。所以我决定pdfLaTeX在文档仍在进行中时使用它,然后我可以使用工作流程tex > dvi > ps > pdf来获得插入所有正确文件的最终编译eps

现在有了pdfLaTeXeps文件将转换为pdf如下形式:

例如jeffcott.eps转换为jeffcott-eps-converted-to.pdf并且model.eps转换为model-eps-converted-to.pdf

利用Xport批处理文件,我尝试自动执行上述操作:

automate.bat首先我们有如下文件:

for %%x in (*.tex) do dobatch.bat %%~nx

其中dobatch.bat

 rem echo off
 latex -interaction=nonstopmode %1
 dvips -R -t unknown %1
 ps2pdf -dAutoRotatePages#/None -dCompatibilityLevel#1.5 -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true -dEPSCrop %1.ps %1-temp.pdf
 pdfcrop --restricted --hires %1-temp %1.pdf
 rename %1.pdf %1-eps-converted-to.pdf
 pdftops -level3 -eps %1-eps-converted-to.pdf
 del %1.log
 del %1.aux
 del %1.dvi
 del %1.ps
 del %1-temp.pdf
 ps2eps -f --fixps %1-eps-converted-to.eps
 del %1.eps

让我们举一个例子来看看发生了什么:

假设我有该文件jeffcott.eps并且model.eps其标签未替换psfrag

这些文件在这里:

http://petitlien.fr/epspicture

jeffcott.tex我创建了如下文件jeffcott.eps

 \documentclass[12pt]{standalone}
 \usepackage[hiresbb,dvips]{graphicx}
 \usepackage[dvips]{color}
 \usepackage{psfrag}
 \usepackage{fourier}
 \newcommand{\figtext}{\small}
 \begin{document}
 {\figtext
 \psfrag{A}{$m$}
 \psfrag{B}{$k,c$}
 \psfrag{Y}{inner stator bore}
 \includegraphics{jeffcott.eps}}
 \end{document}

以及一个类似的model.tex工作方式,model.eps如下所示:

 \documentclass[12pt]{standalone}
 \usepackage[hiresbb,dvips]{graphicx}
 \usepackage[dvips]{color}
 \usepackage{psfrag}
 \usepackage{fourier}
 \newcommand{\figtext}{\small}
 \begin{document}
 {\figtext
 \psfrag{D}{$x$}
 \psfrag{E}{$y$}
 \psfrag{F}{$\omega_\mathrm{ro}$}
 \psfrag{G}{$\omega_\mathit{fo} \thinspace t$}
 \psfrag{H}{$\beta$}
 \psfrag{I}{$a$}
 \psfrag{J}{$r$}
 \psfrag{K}{$\theta$}
 \psfrag{L}{$r$}
 \psfrag{M}{$\mathrm{C}_\mathrm{st}$}
 \psfrag{N}{$\mathrm{C}_\mathrm{ro}$}
 \includegraphics{model.eps}}
 \end{document}

我将jeffcott.texmodel.texautomate.bat放在与和dobatch.bat相同的文件夹中,然后运行​​。该文件夹中现在有以下文件:jeffcott.epsmodel.epsautomate.bat

A. 原始文件

jeffcott.tex
model.tex
jeffcott.eps
model.eps
automate.bat
dobatch.bat

B. 运行automate.bat

jeffcott-eps-converted-to.eps
jeffcott-eps-converted-to.eps.eps
jeffcott-eps-converted-to.pdf

model-eps-converted-to.eps
model-eps-converted-to.eps.eps
model-eps-converted-to.pdf

我已接近我需要的jeffcott-eps-converted-to.pdfmodel-eps-converted-to.pdf已创建。这些pdf文件的所有标签均已psfrag插入,不同于pdf运行生成的文件pdflatexTeXLive 2010后者不包含替换的标签。我在文件中所做的dobatch.bat是确保我获得与创建的文件名相同的文件名pdfLaTeX。现在我可以用批处理文件创建的这些文件替换pdfLaTeX pdf原始文件的版本。epspdf

我有四个问题:

I. 在文件中dobatch.bat,有这一行:ps2eps -f --fixps %1-eps-converted-to.eps

批处理文件中此行之后的任何代码都将被忽略。为什么会这样?如何解决?

jeffcott-eps-converted-to.epsII. Ghostscript 无法读取和的 bbox model-eps-converted-to.eps。这就是我使用ps2eps来修复 bbox 并且它工作的原因。我得到了文件:jeffcott-eps-converted-to.eps.epsmodel-eps-converted-to.eps.eps。由于我在同一个目录中有原始eps文件:jeffott.epsmodel.eps(没有psfrag标签),我希望拥有新的正确eps文件,其中包含所有标签,并命名为和jefcottalone.epsmodelalone.eps以强调它们是独立的。如何在批处理文件中实现这一点dobatch.bat

III. 在我的文件中jeffcott.tex,我使用了以下行:

 \documentclass[12pt]{standalone}

软件包是否standalone接受该选项12pt?我在手册中没有看到这一点。

IV. 在我的文件中jeffcott.tex,我使用以下命令:

\newcommand{\figtext}{\small}

指定图中文本的大小\figtext。这似乎有效。这是正确的做法吗?

答案1

设想:

请确认您的情况是否如下。

  1. 您有一堆 EPS 文件。
  2. 您想要替换每个 EPS 上的某些特定标签。为此,您已file01.teximage01.epsfile01.tex等准备了文件image02.eps。例如,您已准备file01.tex和 ,file02.tex如下所示:

    % file01.tex for image01.eps
    \documentclass[dvips]{article}
    \pagestyle{empty}
    \parindent=0pt
    \usepackage{graphicx}
    \usepackage{psfrag}
    
    \begin{document} 
    \small
    \psfrag{a}{$A$}
    \psfrag{b}{$B$}
    \psfrag{c}{I am C!}
    \includegraphics{image01}
    \end{document}
    
    % file02.tex for image02.eps
    \documentclass[dvips]{article}
    \pagestyle{empty}
    \parindent=0pt
    \usepackage{graphicx}
    \usepackage{psfrag}
    
    \begin{document} 
    \small
    \psfrag{G}{\color{red}$m$}
    \psfrag{H}{\color{red}$k,c$}
    \psfrag{I}{\color{red}inner stator bore}
    \includegraphics{image02}
    \end{document}
    
  3. 您希望自动化该过程以为每个 EPS 生成一个 PDF 版本。

  4. EPS 中有价值对象周围的所有空白都必须在 PDF 中修剪。

  5. 您想要将生成的 PDF 文件导入到您的主文档中,例如论文、文章等。

如果这是你的真实情况,那么我会给你正确的方向。我对你的长篇大论感到困惑。

解决方案:

以下是您必须执行的工作流程。

  1. 创建一个批处理文件,用于编译单个文件file**.tex以生成。按以下方式file**.pdf命名批处理文件。EpsToPdf.bat

    rem EpsToPdf.bat
    rem It takes a file name without extension.
    rem For example: EpsToPdf file01
    rem Another example: EpsToPdf file02
    
    latex "%1"
    dvips -t unknown "%1"
    ps2pdf "%1.ps" "%1-temp.pdf"
    pdfcrop --hires "%1-temp" "%1.pdf"
    rem acrord32 "%1.pdf"
    del "%1.log"
    del "%1.aux"
    del "%1.dvi"
    del "%1.ps"
    del "%1-temp.pdf"
    
  2. 创建另一个批处理文件以自动执行编译所有的过程。按以下方式file**.tex命名此批处理。automate.bat

    rem automatic.bat
    rem just execute without any switch.
    for %%x in (*.tex) do EpsToPdf.bat "%%~nx"
    
  3. 确保所有image**.epsfile**.tex、 批处理文件都位于同一目录中。除非您已将PATH环境变量设置为指向批处理文件的路径,否则这是必需的。

  4. automatic.bat双击执行,等待所有PDF生成,若有缺失PDF则检查对应的file**.tex

  5. 要将生成的 PDF 导入到您的主要文档(如论文、文章、期刊等),请按如下方式创建另一个 TeX 文档。这只是一个简单的例子。

    % main.tex
    \documentclass{article}
    \usepackage{graphicx,lipsum}
    \begin{document}
    \lipsum[1]
    \includegraphics{file01}
    
    \lipsum[2]
    \includegraphics{file02}
    \end{document}
    

    并使用以下批处理文件对其进行编译,只需TexToPdf main在 DOS 提示符下键入并按回车键即可。

    rem TexToPdf.bat
    rem It takes a file name without extension.
    rem For example: TexToPdf main
    
    pdflatex "%1"
    pdflatex "%1"
    rem acrord32 "%1.pdf"
    del "%1.log"
    del "%1.aux"
    rem del "%1.***" <=== change *** to something meaningful
    

    pdflatex.exe故意执行两次以获得正确的交叉引用。

  6. 完毕!

额外的:

如果您还需要 EPS 输出,那么您必须在上面pdftops -eps "%1.pdf"之后立即插入。pdfcrop --hires "%1-temp" "%1.pdf"EpsToPdf.bat

但要小心!!!!请仔细阅读以下内容!!!

如果您的 TeX 输入文件与导入的 EPS 文件同名,则原始 EPS 文件将被覆盖。您将丢失原始 EPS!为避免这种情况,您不能给 TeX 输入文件指定与原始 EPS 名称相同的名称。

相关内容