[NTG-context] Metapost label alignment etc.
Aditya Mahajan
adityam at umich.edu
Thu Jul 6 00:27:04 CEST 2006
On Fri, 30 Jun 2006, Idris Samawi Hamid wrote:
> Hi, Mojca, Aditya, Hans, and all the MP gurus,
>
> Thank you for all the help and advice.
>
> On Fri, 30 Jun 2006 18:17:23 -0600, Mojca Miklavec
> <mojca.miklavec.lists at gmail.com> wrote:
>
> Wow... Ok, following is my present, still naive code. What I would like to
> be able to do is
>
> 1) In the first figure [square], control the relation of the front and
> back face of the cube by a single parameter. So if I use z for the front
> face coordinates, I can use z' for the rear face and define z' as a
> function of z. Then the angle of the z111--z'111 diagonal wrt the x-axis
> will change, and the label for that axis will have to change as well. I've
> been manually calculating inverse tangents to do this but can it be done
> automatically?
angle(...).
> 2. In the second figure, to in addition control the distance between the 2
> cubes by a single parameter without recalculating the dashed lines mapping
> the two.
See code below.
> I only started yesterday but i can see that MetaPost is going to turn me
> into a junkie if I'm not careful :-)
>
> Any other suggestions for improving/streamlining this is greatly
> appreciated: I think it will make a nice example case for beginners/on the
> wiki when done!
I do not have an ingeneous solution like Mojca. I will do this in a
brute force way like you, but using loops for repetitive tasks and
allowing metapost to do all the calculations for me.
\setuppapersize[letter][letter]
\setupcolors[state=start]
\setuppagenumbering[state=stop]
\def\AXIS#1#2#3{(#1) Axis #2: {\bf #3}}
\forceMPTEXcheck{LABELL}
\forceMPTEXcheck{LABELR}
\forceMPTEXcheck{LABELM}
\startMPenvironment
\ssxx\setupinterlinespace
\stopMPenvironment
\startMPinclusions
vardef LABELL@\#(expr s, p)= label@\#(textext("%
\framed[width=1.5cm,align=left,frame=off,autowidth=force,strut=on]{"
& s &
"}"),p)
enddef ;
vardef LABELR@\#(expr s, p)= label@\#(textext("%
\framed[width=1.5cm,align=right,frame=off,autowidth=force,strut=on]{"
& s
& "}"),p)
enddef ;
vardef LABELM@\#(expr s, p)= label@\#(textext("%
\framed[align=middle,frame=off,autowidth=force,strut=on]{" & s &
"}"),p)
enddef ;
picture my_dash ; my_dash := dashpattern(on 1mm off 1mm) ;
% my_dash is more verbose than p.
\stopMPinclusions
\startstaticMPfigure{square}
numeric u ; u := 1.4cm;
% Always declare the type of a variable. Helps in debugging.
path p; p := unitsquare scaled 5u ;
% Identify the corners
z[1] = llcorner p ;
z[2] = ulcorner p ;
z[3] = urcorner p ;
z[4] = lrcorner p ;
% Identify the corners of the shifted rectangle
for i = 5 upto 8:
z[i] = z[i-4] shifted (2u, 1.25u) ;
endfor ;
% Find the intersection points
z[9] = whatever[z[5],z[6]] = whatever[z[2],z[3]] ;
z[10] = whatever[z[5],z[8]] = whatever[z[3],z[4]] ;
% Axis location
% No need to calculate these explicitly, you can as well use
% label(p, 0.5[...]) ;
z[11] = 0.5[z[1],z[4]] ;
z[12] = 0.5[z[1],z[2]] ;
z[13] = 0.5[z[1],z[5]] ;
% z[13] = (1u,0.15u) ; Not sure which point you had calculated.
drawoptions(withcolor .625red withpen pencircle scaled 0.4pt) ;
draw p ;
draw (z[6] -- z[7]) ;
draw (z[7] -- z[8]) ;
draw (z[6] -- z[9]) ;
draw (z[10] -- z[8]) ;
% draw (z[2] -- z[6]) ;
% draw (z[3] -- z[7]) ;
% draw (z[4] -- z[8]) ;
for i = 2 upto 4 :
draw(z[i] -- z[i+4]) ;
endfor ;
drawoptions(withcolor .625red dashed my_dash withpen pencircle scaled
0.4pt) ;
% draw (z[1] -- z[5]) ;
% draw (z[9] -- z[5]) ;
% draw (z[5] -- z[10]) ;
for i = 1,9,10 :
draw(z[5] -- z[i] ) ;
endfor ;
drawoptions(withcolor black) ;
LABELL.llft("(0,0,0,0) Light Condensed Small Sans~Serif", z[1]) ;
LABELL.llft("(0,1,0,0) Light Extended Small Sans~Serif", z[2]) ;
LABELR.lrt ("(1,1,0,0) Bold Extended Small Sans~Serif", z[3]) ;
LABELR.lrt ("(1,0,0,0) Bold Condensed Small Sans~Serif", z[4]) ;
LABELR.urt("(0,0,1,0) Light Condensed Large Sans~Serif", z[5]) ;
LABELR.urt("(0,1,1,0) Light Extended Large Sans~Serif", z[6]) ;
LABELR.urt("(1,1,1,0) Bold Extended Large Sans~Serif", z[7]) ;
LABELR.urt("(1,0,1,0) Bold Condensed Large Sans~Serif", z[8]) ;
LABELM.bot ("\AXIS{x}{1}{Weight}", z[11]);
picture p; p :=
textext("\framed[align=middle,frame=off,autowidth=force,strut=on]%
{\AXIS{y}{2}{Width}}");
p := p rotatedaround (z[12], 90) ;
label.lft(p,z[12]);
p := textext("\AXIS{z}{3}{Optical Size}");
p := p rotatedaround (z[13], angle(z[5]-z[1])) ;
% inv tan(1.5/2)
% Let metapost calculate it for you
% Ugly kludge
label(p,z[13]+(0,2labeloffset));
% currentpicture := currentpicture scaled 0.9 ;
% Why? Either change u, or use scaled= option in \usestaticMPfigure
\stopstaticMPfigure
\startstaticMPfigure{2squares}
numeric u ; u := 0.7cm;
path p; p := unitsquare scaled 5u ;
% Identify the corners
z[1] = llcorner p ;
z[2] = ulcorner p ;
z[3] = urcorner p ;
z[4] = lrcorner p ;
% Identify the corners of the shifted rectangle
for i = 5 upto 8:
z[i] = z[i-4] shifted (2u, 1.25u) ;
endfor ;
for i = 11 upto 18:
z[i] = z[i-10] shifted (10u,-2.5u) ;
endfor ;
z[19] = (3.125u,3.125u) ;
z[20] = (13.125u,0.625u) ;
z[21] = (5u,-1.25u) ;
drawoptions(withcolor .625red withpen pencircle scaled 0.4pt) ;
for i = 0,10:
draw (z[i+1] -- z[i+2] -- z[i+3] -- z[i+4] -- cycle) ;
draw (z[i+5] -- z[i+6] -- z[i+7] -- z[i+8] -- cycle) ;
draw (z[i+1] -- z[i+5]) ;
draw (z[i+2] -- z[i+6]) ;
draw (z[i+3] -- z[i+7]) ;
draw (z[i+4] -- z[i+8]) ;
endfor ;
% Remove repetitions
% draw (z[11] -- z[12] -- z[13] -- z[14] -- cycle) ;
% draw (z[15] -- z[16] -- z[17] -- z[18] -- cycle) ;
% draw (z[11] -- z[15]) ;
% draw (z[12] -- z[16]) ;
% draw (z[13] -- z[17]) ;
% draw (z[14] -- z[18]) ;
% map square to square
drawoptions(withcolor .625red dashed my_dash withpen pencircle scaled
0.4pt) ;
for i = 1 upto 8 :
draw z[i] -- z[i+10] ;
endfor ;
% draw (z[1] -- z[11]) ;
% draw (z[2] -- z[12]) ;
% draw (z[3] -- z[13]) ;
% draw (z[4] -- z[14]) ;
% draw (z[5] -- z[15]) ;
% draw (z[6] -- z[16]) ;
% draw (z[7] -- z[17]) ;
% draw (z[8] -- z[18]) ;
% labels
drawoptions(withcolor black) ;
label (textext("Sans Serif"),z[19]) ;
label (textext("Serif"),z[20]) ;
picture p; p := textext("\AXIS{a}{4}{Serif}");
% p := p rotatedaround (z[21], -14.036) ;
p := p rotatedaround (z[21], angle(z[11]-z[1])) ;
label.bot(p,z[21]);
% currentpicture := currentpicture scaled 0.9 ;
\stopstaticMPfigure
\starttext
\midaligned{\usestaticMPfigure[square]}
\blank[2*big]
\midaligned{\usestaticMPfigure[2squares]}
\stoptext
Aditya
More information about the ntg-context
mailing list