Difference between revisions of "MetaFun - MetaPost in ConTeXt"

From Wiki
Jump to navigation Jump to search
(Add section about \defineMPinstance and \setupMPinstance)
(Less <cmd>, more {{cmd|...}})
Line 1: Line 1:
 
< [[Graphics]]|[[Metafun]]|[[Metapost]]>
 
< [[Graphics]]|[[Metafun]]|[[Metapost]]>
  
ConTeXT provides a tight integration of TeX and [[Metapost]]. Metapost can used behind the scenes for some graphic trickery. This integration is also helpful for drawing figures in metapost and use them in the document. Some of the commonly used commands for this are
+
ConTeXT provides a tight integration of TeX and [[MetaPost]]. MetaPost can used behind the scenes for some graphic trickery. This integration is also helpful for drawing figures in MetaPost and use them in the document. Some of the commonly used commands for this are
  
==<cmd>defineMPinstance</cmd> and <cmd>setupMPinstance</cmd>==
+
== \defineMPinstance and \setupMPinstance ==
  
These commands can be used to set up MetaPost invocations with particular
+
{{cmd|defineMPinstance}} and {{cmd|setupMPinstance}} can be used to set up MetaPost invocations with particular features. One use case could be to select a sans serif font for all MetaPost
features. One use case could be to select a sans serif font for all MetaPost
 
 
labels. Example:
 
labels. Example:
  
Line 55: Line 54:
  
  
==<cmd>startMPenvironment</cmd>==
+
=== \startMPenvironment ===
<em>Deprecated,</em> use <cmd>defineMPinstance</cmd> and <cmd>setupMPinstance</cmd> instead.
 
  
This is used to change the body font for metapost graphics. For example, to get the text in metapost graphics in times, use
+
{{cmd|startMPenvironment}} is a '''deprecated''' evironment in which one could place settings that one only wanted to apply in the MetaPost environment, but not in the document itself. One should use {{cmd|defineMPinstance}} and {{cmd|setupMPinstance}}, instead.
 +
 
 +
An example of its usage:
  
 
<texcode>
 
<texcode>
Line 112: Line 112:
 
Warning: <b>\sometxt</b> cannot be used in loops.  Instead use <b>\textext</b>.  [Someone who understands why should expand this statement!]
 
Warning: <b>\sometxt</b> cannot be used in loops.  Instead use <b>\textext</b>.  [Someone who understands why should expand this statement!]
  
==<cmd>startMPinclusions</cmd>==
+
== \startMPinclusions ==
This can be used for specifying metapost files to ''input'' and also to define metapost functions.
+
 
 +
Inside {{cmd|startMPinclusions}} one can specify MetaPost files to ''input'', and also define MetaPost functions.
 
For example
 
For example
 
<texcode>
 
<texcode>
Line 126: Line 127:
  
  
==<cmd>startMPpage</cmd>==
+
== \startMPpage ==
This produces a page containing metapost graphic. The resulting pdf is self contained (it has all the fonts embedded) This is useful if you want to send the figure to a coauthor or a journal. For example, one can have
+
 
 +
{{cmd|startMPpage}} produces a page a containing MetaPost graphic. The
 +
page is just large enough to contain the graphic. The resulting pdf is
 +
self-contained (it has all the fonts embedded) This is useful if you want to send the figure to a coauthor or a journal. For example, one can have
  
 
<texcode>
 
<texcode>
Line 151: Line 155:
 
gives a pdf with two pages of graphics.
 
gives a pdf with two pages of graphics.
  
==<cmd>startstaticMPfigure</cmd>==
+
== \startstaticMPfigure ==
<cmd>startuseMPgraphic</cmd> series of commands were designed for using metapost for drawing fancy frames and backgrounds and not for using <i>stand-alone</i> graphics for a document. <cmd>startstaticMPfigure</cmd> creates a separate pdf file containing the graphic. This pdf can be included in the document using <cmd>usestaticMPfigure</cmd>. Context is clever enough to recompile the resulting metapost file, only if something inside the start stop staticMPgraphic has changed.
+
 
 +
The {{cmd|startuseMPgraphic}} series of commands were designed for using MetaPost for drawing fancy frames and backgrounds and not for using <i>stand-alone</i> graphics for a document. {{cmd|startstaticMPfigure}} creates a separate pdf file containing the graphic. This pdf can be included in the document using {{cmd|usestaticMPfigure}}. ConTeXt is clever enough to recompile the resulting MetaPost file, only if something inside the start stop staticMPgraphic has changed.
  
 
For example,
 
For example,
Line 176: Line 181:
  
 
* '''center''' and '''radius''' above are ''labels'' that are used to access the figure.
 
* '''center''' and '''radius''' above are ''labels'' that are used to access the figure.
* <cmd>usestaticMPfigure</cmd> takes the first argument as the ''label'' of the figure to be inserted. The second argument has the same options as the second argument of <cmd>externalfigure</cmd>
+
* {{cmd|usestaticMPfigure}} takes the first argument as the ''label'' of the figure to be inserted. The second argument has the same options as the second argument of {{cmd|externalfigure}}
 
* To force the figure files to be regenerated, remove all the <code>*.mp.md5</code> files from the current directory.
 
* To force the figure files to be regenerated, remove all the <code>*.mp.md5</code> files from the current directory.
 
==Transparent colors in figures==
 
==Transparent colors in figures==
Line 201: Line 206:
 
This all sounds like the 'missing specials' problem that is caused
 
This all sounds like the 'missing specials' problem that is caused
 
by conflicting -progname= arguments when using the web2c version
 
by conflicting -progname= arguments when using the web2c version
of metapost.
+
of MetaPost.
  
 
Make sure you do not have conflicting memory settings for both
 
Make sure you do not have conflicting memory settings for both

Revision as of 18:42, 25 November 2012

< Graphics|Metafun|Metapost>

ConTeXT provides a tight integration of TeX and MetaPost. MetaPost can used behind the scenes for some graphic trickery. This integration is also helpful for drawing figures in MetaPost and use them in the document. Some of the commonly used commands for this are

\defineMPinstance and \setupMPinstance

\defineMPinstance and \setupMPinstance can be used to set up MetaPost invocations with particular features. One use case could be to select a sans serif font for all MetaPost labels. Example:

\setupMPinstance [metafun] [textstyle=sans]
\starttext

\startMPcode
  draw textext("some text") ;
\stopMPcode

\stoptext

Another use case could be to create a custom setup with important text in bold and red for selected MetaPost graphics. Example:

\defineMPinstance
  [important]
  [metafun] % needs to be inherited from the global metafun instance
  [textcolor=red]

\defineMPinstance
  [veryimportant]
  [important]
  [textstyle=bold]

\starttext

% normal black text
\startMPcode
  draw textext("some text") ;
\stopMPcode

% red text
\startMPcode{important}
  draw textext("some text") ;
\stopMPcode

% red bold text
\startMPcode{veryimportant}
  draw textext("some text") ;
\stopMPcode

\stoptext


\startMPenvironment

\startMPenvironment is a deprecated evironment in which one could place settings that one only wanted to apply in the MetaPost environment, but not in the document itself. One should use \defineMPinstance and \setupMPinstance, instead.

An example of its usage:

\startMPenvironment
\usetypescript[times][texnansi]
\switchtobodyfont[times,10pt]
\stopMPenvironment

An MPenvironment is sort of like verbatimtex..etex in regular (standalone) MetaPost figures. Here is an example of using verbatimtex in a regular MetaPost figure:

verbatimtex
% center-align and stack the two arguments
\def\2#1#2{\vbox{\halign{\hfil##\hfil\cr #1\cr #2\cr}}}
etex

beginfig(1)
  z0 = (2in,0);
  draw fullcircle scaled 3cm;
  label(btex \2{sun}{mass $M$} etex, origin);
  draw fullcircle scaled 1.5cm shifted z0;
  label(btex \2{earth}{mass $m$} etex, z0);
endfig;
end

To integrate such a graphic into a ConTeXt source file, there are several choices.

1. Place the definition of \2 in the MPenvironment. However, that fails (as of the 2006.09.28 beta but it's likely to work soon, knowing Hans) because the definition is stored as a macro itself, and then the parameters #1 and #2 become ##1 and ##2, alas. There is a \startbuffer trick that Hans posted on the mailing list. But perhaps the easiest is:

2. Place the definition of \2 in the ConTeXt environment, and change btex..etex to \sometxt. Here's an example:

% in a large document, put this def in an environment
\def\2#1#2{\vbox{\halign{\hfil##\hfil\cr #1\cr #2\cr}}}

\starttext

% earth and sun
\startreusableMPgraphic{fig}
  z0 = (2in,0);
  draw fullcircle scaled 3cm;
  label(\sometxt{\2{sun}{mass $M$}}, origin);
  draw fullcircle scaled 1.5cm shifted z0;
  label(\sometxt{\2{earth}{mass $m$}}, z0);
\stopreusableMPgraphic

\reuseMPgraphic{fig}

\stoptext

Warning: \sometxt cannot be used in loops. Instead use \textext. [Someone who understands why should expand this statement!]

\startMPinclusions

Inside \startMPinclusions one can specify MetaPost files to input, and also define MetaPost functions. For example

\startMPinclusions
 input boxes ;
 
 vardef my_metapost_fun(expr var)=
 ...
 enddef ;
\stopMPinclusions


\startMPpage

\startMPpage produces a page a containing MetaPost graphic. The page is just large enough to contain the graphic. The resulting pdf is self-contained (it has all the fonts embedded) This is useful if you want to send the figure to a coauthor or a journal. For example, one can have

\starttext
\startMPpage
 draw fullcircle scaled 2cm ;
 dotlabel.bot(textext("(0,0)"),origin) ;
\stopMPpage

\startMPpage
 draw fullcircle scaled 2cm ;
 drawarrow (0,0)--(1cm,0) ;
 label.bot(textext("$r$"),(5mm,0)) ;
\stopMPpage

\stoptext

Processing this file using

 texmfstart texexec --pdf filename

gives a pdf with two pages of graphics.

\startstaticMPfigure

The \startuseMPgraphic series of commands were designed for using MetaPost for drawing fancy frames and backgrounds and not for using stand-alone graphics for a document. \startstaticMPfigure creates a separate pdf file containing the graphic. This pdf can be included in the document using \usestaticMPfigure. ConTeXt is clever enough to recompile the resulting MetaPost file, only if something inside the start stop staticMPgraphic has changed.

For example,

\startstaticMPfigure{center}
 draw fullcircle scaled 2cm ;
 dotlabel.bot(textext("(0,0)"),origin) ;
\stopstaticMPfigure

\startstaticMPfigure{radius}
 draw fullcircle scaled 2cm ;
 drawarrow (0,0)--(1cm,0) ;
 label.bot(textext("$r$"),(5mm,0)) ;
\stopstaticMPfigure

\starttext

Circle centered \usestaticMPfigure[center][width=1cm] at origin with radius
\usestaticMPfigure[radius][width=1cm] $r=1\,\text{cm}$.

\stoptext
  • center and radius above are labels that are used to access the figure.
  • \usestaticMPfigure takes the first argument as the label of the figure to be inserted. The second argument has the same options as the second argument of \externalfigure
  • To force the figure files to be regenerated, remove all the *.mp.md5 files from the current directory.

Transparent colors in figures

You can use transparent colors! For example:

\runMPgraphicstrue
\setupcolors[state=start]
\starttext
\startreusableMPgraphic{a}
fill unitsquare scaled 1cm withcolor yellow;
fill unitsquare shifted (0.5,0.5)
  scaled 1cm withcolor transparent(1,0.5,red);
\stopreusableMPgraphic

\placefigure[force,none]{}{\reuseMPgraphic{a}}
\stoptext

If you see black squares rather than a yellow one underneath a partially transparent red one, then you probably hit the 'missing specials' problem diagnosed by Taco (ntg-context list, 23 Sep 2006 22:00:42 +0200):

This all sounds like the 'missing specials' problem that is caused
by conflicting -progname= arguments when using the web2c version
of MetaPost.

Make sure you do not have conflicting memory settings for both
   main_memory.mpost
as well as
   main_memory.metafun

The best is to remove all trace of '.mpost' and '.metafun' memory
settings from your texmf.cnf, but at least make sure all the
'.mpost' and 'metafun' values are the same .

Then regenerate metafun using texexec --make, and all should be
well again.

And indeed it fixed it for me (Sanjoy). These were the memory setting in the /etc/texmf/texmf.d/95NonPath.cnf configlet that is part of Debian and Ubuntu distributions of TeX:

main_memory = 1000000 % words of inimemory available; also applies to inimf&mp
main_memory.context = 1500000
main_memory.mpost = 1500000

I commented out the .mpost line (there was no separate metafun line, which I guess instead used the main_memory value of 1000000), regenerated /etc/texmf/texmf.cnf with update-texmf (as root), then regenerated metafun with texexec --make metafun (as me) and transparency worked.