我已经使用 metapost 为我的 latex 文档生成图形一段时间了,但我总是将它们作为单独的文档进行管理,并使用 将生成的图形包含到 latex 文档中\includgraphics{figure.mps}
。然而,我决定尝试使用该emp
包将 metapost 定义直接合并到我的主文档中。
下面是我尝试生成的 metapost 代码的一个工作示例 (working.mp):
verbatimtex
\documentclass [12pt]{article}
\newcommand \stack [1]{\vbox {\halign {\hfil ##\hfil \cr #1\crcr }}}
\begin {document}
etex;
input expressg;
beginfig(1);
LaTeX_unitlength := 1.0pt;
w := 40*LaTeX_unitlength;
h := 40*LaTeX_unitlength;
z0 = origin;
drawroundedbox(0, 2.5cm, 3cm, 5mm)(btex \stack{Domain\cr Name\cr Service} etex);
endfig;
verbatimtex
\end{document}
etex;
end.
endinput;
我可以调用TEX=latex mpost working.mp
并且它成功处理该文件。
这是我尝试使用来生成相同 metapost 图的 latex 文件 (test.tex) 的 MWE:
\documentclass[letterpaper,12pt, openbib]{article}
\usepackage[utf8]{inputenc}
\usepackage{emp}
\empaddtoTeX{\newcommand\stack[1]{\vbox{\halign{\hfil##\hfil\cr#1\crcr}}}}
\empprelude{input expressg}
\DeclareGraphicsRule{*}{mps}{*}{}
\title{Emp Package Test}
\author{Author}
\begin{document}
\maketitle
\begin{empfile}[\jobname-figs]
\section{Emp Package Test}
This is a test trying to get a macro properly added to the verbatimtex section
of the generated metapost file.
\verb+\newcommand\stack[1]{\vbox{\halign{\hfil##\hfil\cr#1\crcr}}}+
The macro above is what we are trying to add. However, things aren't working
out the way I want them to. Instead, what's showing up in the MetaPost file is:
\begin{verbatim}
verbatimtex
\documentclass [12pt]{article}
\newcommand \stack [1]{\vbox {\halign {\hfil ####\hfil \cr ##1\crcr }}}
\begin {document}
etex;
\end{verbatim}
\begin{figure}
\begin{center}
\begin{emp}(40,40)
z0 = origin;
drawroundedbox(0, 2.5cm, 3cm, 5mm)(btex \stack{Domain\cr Name\cr Service} etex);
\end{emp}
\end{center}
\caption{\label{fig:emp}Example using embeded MetaPost}
\end{figure}
\end{empfile}
\end{document}
在 example.tex 上运行 pdflatex 会生成 example-figs.mp。在 example-figs.mp 上运行相同的 mpost 命令会失败,并显示以下输出:
--(0)> TEX=latex mpost test-figs.mp
This is MetaPost, version 1.803 (kpathsea version 6.2.0dev)
(mpost.mp (/usr/share/texlive/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.004) ) (./test-figs.mp
(/usr/share/texlive/texmf-dist/metapost/expressg/expressg.mp
>> "expressg.mp version 1.61, 2004/03/17")fatal: Command failed: latex --parse-first-line --interaction=nonstopmode mpm0nOLA.tex; see mpxerr.log
>> test-figs.mp
>> test-figs.mpx
! ! Unable to make mpx file.
l.13 drawroundedbox(0, 2.5cm, 3cm, 5mm)(btex
\stack{Domain\cr Name\cr
Transcript written on test-figs.log.
检查 emp 包创建的 metapost 文件 (test-figs.mp) 发现它与我在开头展示的 working.mp 文件完全相同除了对于在开始处的 verbatimtex ... etex 块中添加的 \stack 宏的定义:
verbatimtex
\documentclass [12pt]{article}
\newcommand \stack [1]{\vbox {\halign {\hfil ####\hfil \cr ##1\crcr }}}
\begin {document}
etex;
这是由\empaddtoTeX
test.tex 序言中的宏添加的。
我有两个相关的问题:
- 我怎样才能
\empaddtoTeX
将传递给它的参数中的所有“#”字符加倍。 - 我真的想将一个
%&latex
添加到verbatimtex
块中,这样我就可以调用 metapost,而不是像mpost test-figs.mp
我描述的那样,但\empaddtoTex{%&latex}
不起作用,因为“%”后面的所有内容都被视为一个 somment,而 pdflatex 会抱怨缺少“}”。可以这样做吗?
答案1
同样的技巧可能也适用于emp
,但是,出于显而易见的原因,我更喜欢gmp
。;-)
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[shellescape,latex]{gmp}
\gmpoptions{everymp={input expressg;}}
\catcode`#=12
\mpxcommands{\newcommand\stack [1]{\vbox {\halign {\hfil ##\hfil \cr #1\crcr }}}}
\catcode`#=6
\begin{document}
\title{Gmp Package Test}
\author{Author}
\maketitle
\section{Emp Package Test}
This is a test trying to get a macro properly added to the verbatimtex section
of the generated metapost file.
\begin{figure}[htp]
\centering
\begin{mpost}
z0 = origin;
drawroundedbox(0, 2.5cm, 3cm, 5mm)(\btex \stack{Domain\cr Name\cr Service} etex);
\end{mpost}
\caption{Example using embeded MetaPost}\label{fig:emp}
\end{figure}
\end{document}
它需要运行该文件-shell-escape
(新版本可能会避免使用它,因为现在它mpost
位于受限 shell 转义的“安全”程序列表中)。
但是,最简单的解决方法是创建一个小.tex
文件,mpmacros.tex
例如
\newcommand\stack[1]{\vbox{\halign{\hfil##\hfil\cr#1\crcr}}}
在其中并简单地做
\mpxcommands{\input{mpmacros}}
另一方面,你可以简单地避免这种情况
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[shellescape,latex]{gmp}
\gmpoptions{everymp={input expressg;}}
\begin{document}
\title{Gmp Package Test}
\author{Author}
\maketitle
\section{Emp Package Test}
This is a test trying to get a macro properly added to the verbatimtex section
of the generated metapost file.
\begin{figure}[htp]
\centering
\begin{mpost}
z0 = origin;
drawroundedbox(0, 2.5cm, 3cm, 5mm)(
\btex {\begin{tabular}{@{}c@{}}Domain\\ Name\\ Service\end{tabular}} etex
);
\end{mpost}
\caption{Example using embeded MetaPost}\label{fig:emp}
\end{figure}
\end{document}