如何将数学方程式融入乳胶中的图像?

如何将数学方程式融入乳胶中的图像?

如何在 latex 中将数学方程式转换为图像?我想要在编译 tex 文件后将所有方程式转换为 pdf 文件中的图像的代码。

答案1

我想你可以编写一个包来编译子作业中的方程式,就像这样(称之为这个包imageeqn.sty):

\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{imageeqn}[2014/11/30 v0.1 Image equations]

\RequirePackage{graphicx}

\newwrite\@out
\newcounter{imageeqn}

\begingroup \catcode `|=0 \catcode `[=1
\catcode`]=2 \catcode `\{=12 \catcode `\}=12
\catcode`\\=12 |gdef|@ximageeqn#1\end{imageeqn}[|immediate|write|@out[#1]|end[imageeqn]]
|endgroup

\def\imageeqn{\kernel@ifnextchar [{\@imageeqn}{\@imageeqn[]}}

\def\@imageeqn[#1]{%
\stepcounter{imageeqn}
\immediate\openout\@out=\jobname-eqn-\arabic{imageeqn}.tex
\immediate\write\@out{\noexpand\documentclass[convert={density=288,outext=.png}]{standalone}}
\immediate\write\@out{\noexpand\usepackage{amsmath}}
\immediate\write\@out{\noexpand\begin{document}}
\immediate\write\@out{\noexpand$}
\newlinechar='15
\begingroup \catcode`\^^M=12 %
\let\do\@makeother\dospecials\obeyspaces%
\@ximageeqn}

\def\endimageeqn{%
\endgroup%
\immediate\write\@out{\noexpand$}
\immediate\write\@out{\noexpand\end{document}}
\immediate\closeout\@out
\immediate\write18{pdflatex --enable-write18 -interaction=nonstopmode \jobname-eqn-\arabic{imageeqn}.tex}
\begin{center}
\includegraphics[scale=0.25]{\jobname-eqn-\arabic{imageeqn}.png}
\end{center}}

这个包(我通过修改 编写的python.sty)定义了一个环境imageeqn,它接受其中的方程式,生成一个 tex 文件,将其编译为 png,然后使用 包含生成的 png \includegraphics。它可以按如下方式使用(我们将此文件称为image.tex):

\documentclass{article}

\usepackage{imageeqn}

\begin{document}
Pythagorean theorem:
\begin{imageeqn}x^2 + y^2 = z^2.\end{imageeqn}
Some integral:
\begin{imageeqn}\Gamma(t) = \int_0^\infty x^{t-1} e^{-x} \, dx.\end{imageeqn}
\end{document}

使用命令行编译它:

pdflatex --enable-write18 image.tex

结果是一个 pdf 文件,其中嵌入了两个方程式作为光栅图像。我不确定你为什么要这样做,但无论如何,我很享受尝试弄清楚如何做到这一点的过程 :)

顺便说一下,此实现非常有限:首先,如果您添加\end{imageeqn}新行,它将无法编译。其次,它将方程式转换为文本样式的数学运算(以美元符号表示),因此不支持方程式编号、对齐等。

解决换行问题

第一个问题至少在 Linux 上可以通过使用 预处理子作业来解决sed。这可以通过替换以下内容来实现:

\immediate\write18{pdflatex --enable-write18 -interaction=nonstopmode \jobname-eqn-\arabic{imageeqn}.tex}

在上面的代码中:

\immediate\write18{sed -i '/^$/d' \jobname-eqn-\arabic{imageeqn}.tex; pdflatex --enable-write18 -interaction=nonstopmode \jobname-eqn-\arabic{imageeqn}.tex}

使用预处理来\[使\begin{equation}工作

可以通过对输入进行预处理来使\[\]、工作:\begin{equation}\end{equation}sed

cat input.tex | sed 's|\\\[|\begin{imageeqn}|g' \
              | sed 's|\\\]|\end{imageeqn}|g' \
              | sed 's|\\begin{equation}|\begin{imageeqn}|g' \
              | sed 's|\\end{equation}|\end{imageeqn}|g' \
              > input2.tex
pdflatex --enable-write18 input2.tex

也许lualatex在这里可能会有帮助,但我对此一无所知。

答案2

好吧,我又想出了另一个答案。以下第二个版本的软件包imageeqn.sty重新实现了equation环境、、、、\[环境以及美元符号之间的内联数学\]\(\)

\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{imageeqn}[2014/11/30 v0.2 Image equations]

\RequirePackage{graphicx}
\RequirePackage{environ}
\RequirePackage{pgf}

\newcommand\ie@resolution{288}
\pgfmathsetmacro\ie@scale{72/\ie@resolution}

\newwrite\@out
\newcounter{ie@subjob}

% -- open subjob and write preamble
\def\ie@open{%
  \stepcounter{ie@subjob}%
  \immediate\openout\@out=\jobname-eqn-\arabic{ie@subjob}.tex%
  \immediate\write\@out{\noexpand\documentclass[convert={density=\ie@resolution,outext=.png}]{standalone}}%
  \immediate\write\@out{\noexpand\usepackage{amsmath}}%
  \immediate\write\@out{\noexpand\begin{document}}%
  \immediate\write\@out{\noexpand$}%
}

% -- close current subjob
\def\ie@close{%
  \immediate\write\@out{\noexpand$}%
  \immediate\write\@out{\noexpand\end{document}}%
  \immediate\closeout\@out%
} 

% -- compile and insert current subjob
\def\ie@emit{%
  \immediate\write18{pdflatex --enable-write18 -interaction=nonstopmode \jobname-eqn-\arabic{ie@subjob}.tex}%
  \includegraphics[scale=\ie@scale]{\jobname-eqn-\arabic{ie@subjob}.png}%
} 

% -- define \inlineimageeqn command
\newcommand\inlineimageeqn[1]{%
  \ie@open%
  \immediate\write\@out{\unexpanded{#1}}%
  \ie@close%
  \ie@emit%  
}

% -- redefine 'equation' environment
\RenewEnviron{equation}{%
  \begin{center}
    \ie@open%
    \immediate\write\@out{\BODY}%
    \ie@close%
    \ie@emit%
  \end{center}}

% -- redefine '\[ \]' environment
\def\[#1\]{\begin{center}\inlineimageeqn{#1}\end{center}}

% -- redefine '\( \)' environment
\def\(#1\){\begin{center}\inlineimageeqn{#1}\end{center}}

% -- refine inline math
\catcode`\$=13
\def$#1${\inlineimageeqn{#1}}

下面的简单示例说明了它的用法:

\documentclass{article}
\usepackage{imageeqn}

\begin{document}
Pythagorean theorem for $x$, $y$, and $z$:
\[
x^2 + y^2 = z^2.
\]
Some integral:
\begin{equation}
\Gamma(t) = \int_0^\infty x^{t-1} e^{-x} \, dx.
\end{equation}
\end{document}

感谢barbara beeton谁的回答删除拼写和语法检查中的所有数学运算启发了这种方法。

相关内容