A MetaPost version. Most of the drawing is done by two macros, pythagorean_square
which draws a square based on a vertex, and pythagorean_config
which draws the triange and calls pythagorean_square
for each vertex.
These macros can be used for any kind of triangle. To ensure that it is a rectangle triangle is left to the user. The apices can be given as arguments of pythagorean_config
in any order, clockwise or counterclockwise: by making use of the turningnumber
function of MetaPost, it is ensured that the squares are always exterior to the triangle.
I give a LuaLaTeX version of my MetaPost code, which makes use of the luamplib
package, but needs of course to be typeset by LuaLaTeX, and a second version which can be used with all LaTeX dialects, using the gmp
package and thus requiring to be typeset with the shell-escape
option activated if the user doesn't want to be bothered with more than one compilation.
% Luamplib version
\documentclass[12pt]{article}
\usepackage{unicode-math}
\usepackage{luamplib}
\mplibsetformat{metafun}
\mplibtextextlabel{enable}
\everymplib{verbatimtex \leavevmode etex;
% Right angle mark
% From "Tutorial in MetaPost" by André Heck
mark_size := 2mm;
vardef mark_right_angle(expr endofa, common, endofb) =
save tn; tn := turningnumber(common--endofa--endofb--cycle);
draw ((1, 0)--(1,1)--(0,1))
zscaled (mark_size * unitvector((1+tn)*endofa+(1-tn)*endofb-2*common))
shifted (common*u) ;
enddef;
% Drawing of a Pythagorean square based on vertex [AB]
vardef pythagorean_square(expr A, B, legend)(text drawing_options) =
save D, E, v, my_square, my_center;
pair D, E, v, c, my_center; path my_square; clearxy;
z = B - A;
v = (-y, x);
if t = 1:
E = A - v;
D = B - v;
else:
D = B + v;
E = A + v;
fi;
my_square = B--D--E--A--cycle;
my_center = center my_square;
draw (B--D--E--A) scaled u drawing_options;
freelabel(legend, u*0.5[A, E], u*(my_center reflectedabout (A, E)));
freelabel(legend, u*0.5[E, D], u*(my_center reflectedabout (D, E)));
freelabel(legend, u*0.5[D, B], u*(my_center reflectedabout (D, B)));
freelabel(legend, u*0.5[A, B], u*(my_center reflectedabout (A, B)));
enddef;
% Drawing of the triangle and all its Pythagorean squares
vardef pythagorean_config(expr A, B, C, c, a, b)(text drawing_options) =
if angle(B-A) - angle(C-A) <> 0:
t = turningnumber(A--B--C--cycle);
pythagorean_square(A, B, c)(drawing_options);
pythagorean_square(B, C, a)(drawing_options);
pythagorean_square(C, A, b)(drawing_options);
draw (A--B--C--cycle) scaled u;
fi;
enddef;
beginfig(0);}
\everyendmplib{endfig;}
\begin{document}
\begin{center}
\begin{mplibcode}
u = 2.5cm;
pair A, B, C; A = origin; B = (1, 0); C = (1, 1);
label.llft("$A$", A*u); label.lrt("$B$", B*u); label.urt("$C$", C*u);
pythagorean_config(A, B, C, "$c$", "$a$", "$b$")(dashed evenly);
mark_right_angle(A, B, C);
\end{mplibcode}
\end{center}
\bigskip
\begin{center}
\begin{mplibcode}
u := 1.75cm;
pair A, B, C; A = origin; B = (0.5, 1.5); C = A + 1.5*(B-A) rotated -90;
freelabel("$A$", A*u, u*0.5[B,C]); label.top("$B$", B*u); label.lrt("$C$", C*u);
pythagorean_config(A, B, C, "$c$", "$a$", "$b$")(withcolor red);
mark_right_angle(B, A, C);
\end{mplibcode}
\end{center}
\end{document}

% GMP version
\documentclass[12pt]{article}
\usepackage[latex, shellescape]{gmp}
\gmpoptions{everymp={%
input latexmp; setupLaTeXMP(options="12pt", mode=rerun, textextlabel=enable);
% Right angle mark
% From "Tutorial in MetaPost" by André Heck
mark_size := 2mm;
vardef mark_right_angle(expr endofa, common, endofb) =
save tn; tn := turningnumber(common--endofa--endofb--cycle);
draw ((1, 0)--(1,1)--(0,1))
zscaled (mark_size * unitvector((1+tn)*endofa+(1-tn)*endofb-2*common))
shifted (common*u) ;
enddef;
% Drawing of a Pythagorean square based on vertex [AB]
vardef pythagorean_square(expr A, B, legend)(text drawing_options) =
save D, E, v, my_square, my_center; pair D, E, v, c, my_center; path my_square; clearxy;
z = B - A;
v = (-y, x);
if t = 1:
E = A - v;
D = B - v;
else:
D = B + v;
E = A + v;
fi;
my_square = B--D--E--A--cycle;
my_center = center my_square;
draw (B--D--E--A) scaled u drawing_options;
freelabel(legend, u*0.5[A, E], u*(my_center reflectedabout (A, E)));
freelabel(legend, u*0.5[E, D], u*(my_center reflectedabout (D, E)));
freelabel(legend, u*0.5[D, B], u*(my_center reflectedabout (D, B)));
freelabel(legend, u*0.5[A, B], u*(my_center reflectedabout (A, B)));
enddef;
% Drawing of the triangle and all its Pythagorean squares
vardef pythagorean_config(expr A, B, C, c, a, b)(text drawing_options) =
if angle(B-A) - angle(C-A) <> 0:
t := turningnumber(A--B--C--cycle);
pythagorean_square(A, B, c)(drawing_options);
pythagorean_square(B, C, a)(drawing_options);
pythagorean_square(C, A, b)(drawing_options);
draw (A--B--C--cycle) scaled u;
fi;
enddef;}}
\begin{document}
\begin{center}
\begin{mpost*}[mpmem = metafun]
u := 2.5cm;
pair A, B, C; A = origin; B = (1, 0); C = (1, 1);
label.llft("$A$", A*u); label.lrt("$B$", B*u); label.urt("$C$", C*u);
pythagorean_config(A, B, C, "$c$", "$a$", "$b$")(dashed evenly);
mark_right_angle(A, B, C);
\end{mpost*}
\end{center}
\bigskip
\begin{center}
\begin{mpost*}[mpmem = metafun]
u := 1.75cm;
pair A, B, C; A = origin; B = (0.5, 1.5); C = A + 1.5*(B-A) rotated -90;
freelabel("$A$", A*u, u*0.5[B,C]); label.top("$B$", B*u); label.lrt("$C$", C*u);
pythagorean_config(A, B, C, "$c$", "$a$", "$b$")(withcolor red);
mark_right_angle(B, A, C);
\end{mpost*}
\end{center}
\end{document}