\documentclass[border=5mm]{standalone} \usepackage{luamplib} \usepackage{dwmpcode} \def\t#1{\vbox{\let\\\cr\halign{\texttt{##}\hss\cr#1\cr}}} \def\ts#1{\vbox{\let\\\cr\openup-4pt\halign{\small\hss\mpl{##}\hss\cr#1\cr}}} \begin{document} \mplibtextextlabel{enable} \begin{mplibcode} beginfig(1); numeric u; u = 16; pen P[]; P1 = makepen(for i=1 upto 90: 1/2 dir 4i -- endfor cycle) scaled u; P10 = pencircle scaled u; P100 = pencircle scaled 1/2; P2 = pensquare scaled u; P20 = pensquare scaled u; P200 = pensquare; P3 = pensquare scaled 0.7071 u rotated 45; P30 = pensquare scaled 0.7071 u rotated 45; P300 = pensquare scaled 0.35355 rotated 45; P4 = penrazor scaled u; P40 = penrazor scaled u; P400 = penrazor; path crook; crook = origin -- (5u, 0) -- 7u * dir 30; string cap_name[], join_name[], pen_name[]; cap_name[butt] = "butt"; cap_name[rounded] = "rounded"; cap_name[squared] = "squared"; join_name[beveled] = "beveled"; join_name[rounded] = "rounded"; join_name[mitered] = "mitered"; pen_name1 = "pencircle"; pen_name2 = "pensquare"; pen_name3 = "pensquare\\\quad rotated 45"; pen_name4 = "penrazor"; for i=1, 2: draw (origin -- 360 right) shifted ((0, 2.25-2.8i) scaled 8u); label.rt("\t{" & pen_name[i] & "}", (0, 2.15-2.8i) scaled 8u); for cap = rounded, butt, squared: interim linecap := cap; for join = rounded, beveled, mitered: boolean default; default = (cap=rounded) and (join=rounded); interim linejoin := join; pair s; s = (cap, 0.8 join) shifted (0, -2.8i) scaled 8u; draw crook shifted s withpen P[i] withcolor (15/16 if default: - 1/8 fi) if i=1: [blue, white] fi; draw (2.5u, 3u) shifted s withpen P[10i] withcolor 3/4; draw fullcircle scaled 20 shifted (2.5u, 3u) shifted s withcolor 3/4 red; for k=0, 1, 2: draw makepath(P[i]) shifted point k of crook shifted s withcolor 1/2[blue, white]; endfor draw envelope P[i] of crook shifted s; draw crook shifted s withpen P[100i] withcolor red; if default: label("\ts{linecap\\" & cap_name[cap] & "}", s + (0, 5/4u)); label("\ts{" & join_name[join] & "\\linejoin}", point 1 of crook shifted s shifted (0, -5/4u)); else: label("\ts{" & cap_name[cap] & "}", s + (0, u)); label("\ts{" & join_name[join] & "}", point 1 of crook shifted s shifted (0, -u)); fi endfor endfor endfor endfig; \end{mplibcode} \end{document}