使用 pdflatex 时使用 psfrag 替代

使用 pdflatex 时使用 psfrag 替代

到目前为止,我将数学纳入图表的标准方法是使用 psfrag 和 latex+dvips+ps2pdf。

我现在正在转向 pdflatex,并倾向于以 pdf 格式准备我的图形。我想知道是否存在一种类似于 psfrag 的方法可以将数学包含在 pdf 图形中。我知道 auto-pst-pdf 包,但不想使用它,因为在大型项目中,它的运行速度比 pdflatex 慢得多,而且我不确定它是否可以像 pdflatex 一样处理 microtype。

答案1

目标和制约因素

  • 提取主输入文件中导入的所有 EPS 图像,而无需对主输入文件进行大量修改。
  • 将每个导入的 EPS 图像转换为 PDF 并以其原始文件名保存。

假设

  • 为了最佳实践,我假设您将所有 EPS 图像放在名为 的子目录中Images。这意味着目录结构定义如下。

    other parents/project/Images/
    other parents/project/main.tex
    other parents/project/myextractor.sty
    

    您必须遵循此约定,因为其余代码使用此结构。当然,您可以更改此目录结构,但您还需要修改一些代码(不多)。稍后main.texmyextractor.sty进行讨论。

  • 您正在使用 Windows。如果您不是 Windows 用户,请禁用 中提到的清理代码myextractor.sty

  • 你知道你必须main.tex

    latex -shell-escape main
    dvips main
    
    ps2pdf -dAutoRotatePages#/None main.ps
    

注意:对于非 Windows 用户,请替换#=

步骤1

创建一个名为的包,myextractor.sty如下所示。按照上面的目录结构保存它。

% myextractor.sty

\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{myextractor}[2013/10/09 v0.01 LaTeX package for my own purpose]

\RequirePackage{filecontents}
\begin{filecontents*}{template.tex}
\documentclass[preview,border=0pt,graphics]{standalone}
\usepackage{graphicx}
\graphicspath{{Images/}}
% Active the following code (between \makeatletter and \makeatother) 
% if you want to cancel the effect of 
% width, height and/or scale defined in \includegraphics
%\makeatletter
%\define@key{Gin}{width}{}
%\define@key{Gin}{scale}{}
%\define@key{Gin}{height}{}
%\makeatother
\let\ea\expandafter
\begin{document}
%\edef\z{\noexpand\includegraphics[\varone]{\vartwo}}\z
\ea\includegraphics\ea[\varone]{\vartwo}
\end{document}
\end{filecontents*}

\RequirePackage{graphicx}
\RequirePackage{pgffor}

\let\temp\includegraphics

\renewcommand\includegraphics[2][]{%
    \temp[#1]{#2}%
    \immediate\write18{latex -jobname=#2 -output-directory=Images \unexpanded{"\def\varone{#1} \def\vartwo{#2} \input{template}"} && cd Images && dvips #2 && ps2pdf -dAutoRotatePages=/None #2.ps}%
    % disable the following if you are not Windows users.
    \foreach \ext in {dvi, ps, log, aux}{\immediate\write18{cd Images && cmd /c del #2.\ext}}%
}

\endinput

仔细阅读代码中的注释。它们如下。

% Active the following code (between \makeatletter and \makeatother) 
% if you want to cancel the effect of 
% width, height and/or scale defined in \includegraphics
%\makeatletter
%\define@key{Gin}{width}{}
%\define@key{Gin}{scale}{}
%\define@key{Gin}{height}{}
%\makeatother

% disable the following if you are not Windows users.
\foreach \ext in {dvi, ps, log, aux}{\immediate\write18{cd Images && cmd /c del #2.\ext}}%

第2步

修改main.tex如下

% main.tex
\documentclass{book}
%\usepackage{graphicx}
\usepackage{myextractor}% automatically load graphicx
\graphicspath{{Images/}}


\begin{document}
\chapter{A}
\begin{figure}[hbtp]
\centering
\includegraphics[scale=.5]{A}
\caption{A}
\label{fig:A}
\end{figure}
A \ldots

\chapter{B}
\begin{figure}[hbtp]
\centering
\includegraphics[scale=.75]{B}
\caption{B}
\label{fig:B}
\end{figure}
B \ldots

\chapter{B}
\begin{figure}[hbtp]
\centering
\includegraphics[scale=1]{C}
\caption{C}
\label{fig:C}
\end{figure}
C \ldots

\end{document}

重要说明如下

%\usepackage{graphicx}
\usepackage{myextractor}% automatically load graphicx
\graphicspath{{Images/}}
  • 先加载myextractorgraphicx以防止graphicx覆盖myextractor定义。由于内部myextractor加载,您实际上可以在中graphicx禁用。graphicxmain.tex
  • \graphicspath必须按照上面给出的方式指定。

步骤3

main.tex按照上面的说明进行编译latex-dvips-ps2pdf。之后,检查Images文件夹,您将找到每个 EPS 图像的 PDF 版本。完成!

答案2

我不知道您是否打算在大量图片上写 LaTex,但我使用 Inkscape 来做到这一点。基本上,在将图像保存为 .pdf 格式时,有一个复选框可以勾选,该复选框允许提取所有文本并创建一个辅助 tex 文件,该文件会自动将其放置在正确的位置。在您的 .tex 文件中,您可以\includegraphics{mypix.pdf}\input{mypix.pdf_tex}(由 Inkscape 创建的文件)替换。

由于这只是一个打开并保存的操作,我想可以编写一些脚本来自动对给定文件夹的所有文件执行此操作

相关内容