emp 包的正确使用

emp 包的正确使用

我已经使用 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;

这是由\empaddtoTeXtest.tex 序言中的宏添加的。

我有两个相关的问题:

  1. 我怎样才能\empaddtoTeX将传递给它的参数中的所有“#”字符加倍。
  2. 我真的想将一个%&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}

相关内容