How to use textpath with Metapost

Standard

It took me more than a few hours to get this working and as the manual is not at all fully clear on what you need to do (or rather, it assumes more knowledge of LaTeX than I had), I thought it would be useful to set this out.

Textpath allows one to draw text on a path (i.e., not just on a straight line). Here’s an example I prepared earlier:

Hardware Virtualisation

Decus et tutamen as the coins say.

But using it is not as simple as I hoped it would be and even the very fine The LATEX Graphics Companion does not cover it – this is despite textpath being in the standard free TeX distributions and the alternative they describe – TXP – requiring a manual install.

Here are the key steps you need to get it to work.

Firstly, you have to configure your metapost file as a full LaTeX file and not just a piece of Metapost.

So at the top:

input latexmp;
setupLaTeXMP(preamblefile="mypreamble");
input textpath;
filenametemplate "%j-%c.mps";

And then you need to create your LaTeX preamble – i.e. the file I have called “mypreamble.tex” here but you can call it anything.

Here is mine:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[osf]{mathpazo}
\usepackage{textpathmp}

This is what constrains your file as LaTeX.

This also means you have to end your file with an end after the endfig of the Metapost.

If you get some of this wrong you may find that you get an output but the strings (labels) are messed up – it is quite sensitive.

Here’s the file that generated the above graphic:


input latexmp;
setupLaTeXMP(preamblefile="mypreamble");
input textpath;
filenametemplate "%j-%c.mps";
beginfig(1);
prologues:=3;

%some colours
color lightgrey;
lightgrey:=(4/5, 4/5, 4/5);
color midgrey;
midgrey:=(3/5, 3/5, 3/5);
color darkgrey;
darkgrey=(2/5, 2/5, 2/5);
color gloom;
gloom=(1/5, 1/5, 1/5);

color azure;
azure:=(12/13, 1, 1);
color baby;
baby:=(12/13, 24/25, 1);
color lavender;
lavender=(23/26, 23/26, 49/50);
color ultra;
ultra=(8/13, 23/26, 12/13);
color ukraine;
ukraine=(66/255, 173/255, 222/255);
color turquoise;
turquoise=(0, 191/255, 1);

path hardware, virtlayer, kernel, user;
path hardwareL, virtlayerL, kernelL, userL;

hardware = fullcircle scaled 100;
virtlayer = fullcircle scaled 150;
kernel = fullcircle scaled 250;
user = fullcircle scaled 350;

hardwareL := reverse fullcircle scaled 75 rotated 180;
virtlayerL := reverse fullcircle scaled 125 rotated 180;
kernelL := reverse fullcircle scaled 225 rotated 160;
userL := reverse fullcircle scaled 325 rotated 160;

fill virtlayer withcolor lavender;
draw user;
fill user withcolor midgrey;
draw kernel;
fill kernel withcolor lightgrey;
draw virtlayer;
fill virtlayer withcolor lavender;
draw hardware;
fill hardware withcolor white;
draw textpath("Virtualisation", virtlayerL, 0);
draw textpath("Hardware", hardwareL, 0);
draw textpath("Kernel", kernelL, 0);

label.urt(btex Hardware virtualisation etex, (-200,-200));

endfig;
end;

There are lots of tricks to get the text looking the right way – e.g., inside or outside the path, left to right and so on. But they are described in the manual and I will leave them to readers to work out – getting the output at all is the most fundamental task!