Changes

Jump to navigation Jump to search
3,667 bytes added ,  20:06, 15 October 2014
m
Added Hans, the provider of the solution to the problem with textext...
< [[Math]], [[MetaFun]], [[Graphics]]
MetaPost is a graphical programming language, based on Donald Knuth's MetaFont. Normally MP graphics are converted to PostScript and used with dvips, but ConTeXt can use it directly with PDF (see the[http://www.pragma-ade.com/general/sources/mptopdf.pdf MPtoPDFMP to PDF]manual). MetaPost is ConTeXt's "native" graphics mode, see [[MetaFun]].
MetaPost is ConTeXt's native graphics language. [[MetaFun]] is a MetaPost module by Hans Hagen that adds a lot of extra features; it is enabled by default, so one could say that MetaFun is ConTeXt's default dialect of MetaPost.
== Documentation & Tutorials ==
* [[manual:metafun-s.pdf|MetaFun]]
* [http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html Lots of examples]
* [[Color in MetaPost]] describes how to get color mixtures, TeX colors, and transparent effects in MetaPost graphics.
* [http://wiki.contextgarden.net/MetaPost_in_ConTeXt MetaPost in ConTeXt]
== Using MetaPost in ConTeXt ==
== Troubleshooting plain MetaPost ==* Test if MetaPost With {{cmd|startuseMPgraphic}}, you define a piece of graphics code that is processed anew every time the graphic is installed on your systemplaced with {{cmd|useMPgraphic}}. * create testFurther commands are described at [[MetaPost in ConTeXt]].mp containing this:
beginfig(1) <context source=yes> draw fullcircle scaled 3cm ; endfig ; end ; \def\mycolor{.625red}
* apply MetaPost on the testfile\startuseMPgraphic{name} fill fullcircle scaled 20pt withcolor \mycolor;\stopuseMPgraphic
mp test.mp or mpost test.mpred: \useMPgraphic{name}
* that should create a postscript file test.1* open test.1 with a postscript viewer like ghostview, okular ... You should see a circle\def\mycolor{.625blue} == Troubleshooting MetaPost embedded in ConTeXt == * create test.tex containing thisblue \starttext useMPgraphic{name} \startMPcode draw fullcircle scaled 3cm ; \stopMPcode \stoptext  * for mkii you need to have write18 support enabled and run texexec --pdf test.tex  * for mkiv run </context test.tex  * that should create a pdf file test.pdf* open test.pdf with a pdf viewer like acroread, okular... You should see a circle.>
== Different Packages, Extensions & Applications of Metapost ==
* [http://www.ctan.org/tex-archive/graphics/metaplot/ MetaPlot] - graph drawing
* [http://www.ctan.org/tex-archive/graphics/metapost/contrib/macros/metaobj/ MetaObj] - object-oriented drawing, see also the page about [[MetaObj and Labels]]
* [http://stud4.tuwien.ac.at/~e0225855/finomaton/finomaton.html finomaton] - drawing finite state automata
* [http://www-math.univ-poitiers.fr/~phan/statsmac.html statsmac] - metapost macros for statistics graphs
* [http://metauml.sourceforge.net/ MetaUML] - MetaPost library for typesetting UML diagrams
* [http://vigna.dsi.unimi.it/metagraph/ METAGRAPH] - drawing (un)directed graphs
=== 3D support ===
* [http://asymptote.sourceforge.net/ Asymptote] - inspired by MetaPost & fully generalizes MetaPost path construction algorithms to three-dimensions
== Using MP Testing plain MetaPost ==To test whether MetaPost is installed on your system, create a file called {{code|test.mp}}:  beginfig(1) draw fullcircle scaled 3cm ; endfig ; end ; * apply MetaPost on the testfile  mp test.mp or mpost test.mp * that should create a postscript file test.1* open test.1 with a postscript viewer like Ghostview, Okular, … You should see a circle. == Testing MetaPost embedded in ConTeXt == If MetaPost is installed on your system and working correctly, you can   \starttext \startMPcode draw fullcircle scaled 3cm; \stopMPcode \stoptext * for mkii you need to have write18 support enabled and run texexec --pdf test.tex * for mkiv run context test.tex * that should create a pdf file test.pdf* open test.pdf with a pdf viewer like Adobe Acrobat, Okular... You should see a circle. == Text in MetaPost == Text that is typeset using `textext` or `btex … etex` adapts to the body font. However, when `label("Foo", pair)` or `"Foo" infont defaultfont` is used, which is not the recommended way, the text is typeset using the font `MetafunDefault`, which can be changed if desired. Example: <context mode="mkiv" source="yes" text="Gives:">\starttext \startMPcode label("Foo", origin); draw textext("Bar") yshifted -LineHeight; \stopMPcode  \definefontsynonym [MetafunDefault] [Bold*default]  \switchtobodyfont [pagella, 18pt]  \startMPcode label("Foo", origin); draw textext("Foo") yshifted -LineHeight; \stopMPcode\stoptext</context> The first recommended way to typeset text is to use the `textext` macro and change the font using {{cmd |setupMPinstance}}. == Repetition of a Text Element to Fill a Bar Using textext == Imagine you want to create a frame which consists out of one glyph or a combination of different glyphs in order to make a decorative border. For this purpose a usable graphicseries of such elements should be placed on the bar as pictures, evenly spaced. Such Probably you want to have at the end of the bar a graphic different glyph inserted as a picture too. The following code is calculated anew each time it working but the last picture is usednot the expected glyph. An exampleOne would expect 14 times the "?" and at the end of the bar a "*": <context mode="mkiv" source="yes" text="Gives:">\starttext \startMPpage picture PicA ; PicA := textext("*"); picture PicB ; PicB := textext("?");  numeric Step ; Step := 2cm div bbwidth(PicB) ;  for i = 1 upto Step : draw PicB shifted (i*5mm,0) ; endfor ; draw PicA ; \stopMPpage\stoptext</context> What you get is 15 "?" but no "*"!
In order to get this corrected one needs to calculate the boundingbox of the "?" on beforehand. Hans Hagen provided this solution on 14-10-2014. <texcodecontext mode="mkiv" source="yes" text="Gives:">\startuseMPgraphicstarttext \startMPcalculation path PicX ; PicX := boundingbox textext("?") ; \stopMPcalculation  \startMPpage picture PicA ; PicA := textext("*"); picture PicB ; PicB := textext("?");  numeric Step ; Step := 2cm div bbwidth(PicX) ; % numeric Step ; Step := 2cm div bbwidth(PicB) ;  for i = 1 upto Step : draw PicB shifted (i*5mm,0) ; endfor ; draw PicA ; \stopMPpage\stoptext </context> Now you get 14 "?" and the "*". === A Full Example === <context mode="mkiv" source="yes" text="Gives:">\setupbodyfont[8pt] \defineoverlay[Myframe][\reuseMPgraphic{nameFrame}] \setuppapersize[A8][A8] fill fullcircle scaled 5cm withcolor red;\stopuseMPgraphicsetuplayout [topspace=5mm, backspace=5mm, height=middle, width=middle, header=0pt, footer=0pt]
\useMPgraphic{name}</texcode>starttext
As said% ======== Definition of the frame in Metafun ==========\startMPcalculation path PicX ; PicX := boundingbox textext("= : =") ;\stopMPcalculation \startreusableMPgraphic{Frame} numeric u, this graphic is calculated each time it is placedv, which can be time consuming. Apart from the time aspectxshift,yshift, this also means that the graphic itself is incorporated many times. Thereforepicwidth, for graphics that don’t changeremnant, CONTEXT provides reusable graphics:nelements;
<texcode> u := OverlayWidth; v := OverlayHeight; path p,w;\startreusableMPgraphic{name} p := unitsquare xscaled u yscaled v; fill w := fullcircle scaled 200pt withcolor .625yellow8pt; picture Edgepic,Linepic[]; color edgedotcolor,linelementcolorA;\stopreusableMPgraphic edgedotcolor := blue; linelementcolorA := red;
Linepic[1] := textext("\reuseMPgraphicrotate[rotation=90]{name= : =}");< Linepic[2] := textext("= : ="); Edgepic := textext("o"); %Calculations for the horizontal frame-element placement: % In order to make this work, the width of the line element needs to be calculated on beforehand. % path PicX; PicX := textext(")("); picwidth := bbwidth(PicX); nelements := u div picwidth; remnant := u mod picwidth; xshift := picwidth + remnant/texcode>nelements;
When reusing a graphic is not so important and you just want to include something inline Linepic[3] := Linepic[2] shifted (0.5*picwidth, you can also use the following:0);
<texcode> for a = llcorner p, ulcorner p :\startMPcode for i = 1 upto nelements : draw Linepic[3] shifted ((xpart a + (i-1)*xshift),ypart a) withcolor linelementcolorA; endfor; endfor; %Calculations for the vertical frame-element placement: picheight fill fullcircle scaled 200pt := bbwidth(PicX); nelements := v div picheight; remnant := v mod picheight; yshift := picheight + remnant/nelements; Linepic[4]:= Linepic[1] shifted (0,0.5*picheight); for a = llcorner p, lrcorner p : for i = 1 upto nelements: draw Linepic[4] shifted (xpart a,ypart a + (i-1)*yshift) withcolor .625yellowlinelementcolorA;\stopMPcode endfor;</texcode> endfor;
See also section 3.3 of [[manual for i = llcorner p, lrcorner p,ulcorner p,urcorner p :metafun-s.pdf|MetaFun manual]]. fill w shifted (xpart i,ypart i) withcolor white; draw Edgepic shifted (xpart i,ypart i) withcolor edgedotcolor; endfor;
=== Examples ===% For frame-element positioning checking:% draw p;%\stopreusableMPgraphic
{{todo|Enable support for Metapost code when running ConTeXt online. This will allow easy creation of Metapost examples, including both source code and resulted figure.}}% ==========
Currently\startframedtext [width=0.8\textwidth, running online Metapost code like thisheight=0.8\textheight,frame=off,background=Myframe, align={middle,lohi}] The butterfly counts not months but moments, and has time enough. \blank {\tfx Rabindranath Tagore}\stopframedtext\stoptext
<context source="yes">
\startMPcode
fill fullcircle scaled 200pt withcolor .625yellow;
\stopMPcode
</context>
does not return anythingThere is some strange cropping going on on the Wiki-implementation. Of course the left frame is in reality equal to the right frame...
There is one important remark: The MPcalculation and the drawing itself must be inside \starttext ... \stoptext.
== Other Links ==
48

edits

Navigation menu