这篇文章是我之前文章的延续:
Xport
给出了有效的好答案!
整个自动化过程的一个目标也是在使用pdfLaTeX
而不是传统tex > dvi > ps > pdf
方式时有所帮助。使用TeXLive 2010
,只需发出命令pdfLaTeX
,所有eps
文件就会即时转换为pdf
并插入到文档中。
我不喜欢这个pdfLaTeX
工作流程,但它比传统方式编译速度快得多tex > dvi > ps > pdf
。所以我决定pdfLaTeX
在文档仍在进行中时使用它,然后我可以使用工作流程tex > dvi > ps > pdf
来获得插入所有正确文件的最终编译eps
。
现在有了pdfLaTeX
,eps
文件将转换为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.tex
、model.tex
和automate.bat
放在与和dobatch.bat
相同的文件夹中,然后运行。该文件夹中现在有以下文件:jeffcott.eps
model.eps
automate.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.pdf
并model-eps-converted-to.pdf
已创建。这些pdf
文件的所有标签均已psfrag
插入,不同于pdf
运行生成的文件pdflatex
,TeXLive 2010
后者不包含替换的标签。我在文件中所做的dobatch.bat
是确保我获得与创建的文件名相同的文件名pdfLaTeX
。现在我可以用批处理文件创建的这些文件替换pdfLaTeX
pdf
原始文件的版本。eps
pdf
我有四个问题:
I. 在文件中dobatch.bat
,有这一行:ps2eps -f --fixps %1-eps-converted-to.eps
批处理文件中此行之后的任何代码都将被忽略。为什么会这样?如何解决?
jeffcott-eps-converted-to.eps
II. Ghostscript 无法读取和的 bbox model-eps-converted-to.eps
。这就是我使用ps2eps
来修复 bbox 并且它工作的原因。我得到了文件:jeffcott-eps-converted-to.eps.eps
和model-eps-converted-to.eps.eps
。由于我在同一个目录中有原始eps
文件:jeffott.eps
和model.eps
(没有psfrag
标签),我希望拥有新的正确eps
文件,其中包含所有标签,并命名为和jefcottalone.eps
,modelalone.eps
以强调它们是独立的。如何在批处理文件中实现这一点dobatch.bat
?
III. 在我的文件中jeffcott.tex
,我使用了以下行:
\documentclass[12pt]{standalone}
软件包是否standalone
接受该选项12pt
?我在手册中没有看到这一点。
IV. 在我的文件中jeffcott.tex
,我使用以下命令:
\newcommand{\figtext}{\small}
指定图中文本的大小\figtext
。这似乎有效。这是正确的做法吗?
答案1
设想:
请确认您的情况是否如下。
- 您有一堆 EPS 文件。
您想要替换每个 EPS 上的某些特定标签。为此,您已
file01.tex
为image01.eps
、file01.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}
您希望自动化该过程以为每个 EPS 生成一个 PDF 版本。
EPS 中有价值对象周围的所有空白都必须在 PDF 中修剪。
您想要将生成的 PDF 文件导入到您的主文档中,例如论文、文章等。
如果这是你的真实情况,那么我会给你正确的方向。我对你的长篇大论感到困惑。
解决方案:
以下是您必须执行的工作流程。
创建一个批处理文件,用于编译单个文件
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"
创建另一个批处理文件以自动执行编译所有的过程。按以下方式
file**.tex
命名此批处理。automate.bat
rem automatic.bat rem just execute without any switch. for %%x in (*.tex) do EpsToPdf.bat "%%~nx"
确保所有
image**.eps
、file**.tex
、 批处理文件都位于同一目录中。除非您已将PATH
环境变量设置为指向批处理文件的路径,否则这是必需的。automatic.bat
双击执行,等待所有PDF生成,若有缺失PDF则检查对应的file**.tex
。要将生成的 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
故意执行两次以获得正确的交叉引用。完毕!
额外的:
如果您还需要 EPS 输出,那么您必须在上面pdftops -eps "%1.pdf"
之后立即插入。pdfcrop --hires "%1-temp" "%1.pdf"
EpsToPdf.bat
但要小心!!!!请仔细阅读以下内容!!!
如果您的 TeX 输入文件与导入的 EPS 文件同名,则原始 EPS 文件将被覆盖。您将丢失原始 EPS!为避免这种情况,您不能给 TeX 输入文件指定与原始 EPS 名称相同的名称。