如何在 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
谁的回答删除拼写和语法检查中的所有数学运算启发了这种方法。