Eigentlich kann man den Algorithmus von Ijon auch direkt mit LaTeX, ganz ohne Pakete umsetzen. Ich drehe hier mal nur zur Vereinfachung die Schleifen um:
\documentclass[a4paper]{article}
\makeatletter
\newcommand*{\whilenum}{\@whilenum}
\makeatother
\newcounter{a}\renewcommand*{\thea}{\alph{a}}
\newcounter{b}\renewcommand*{\theb}{\alph{b}}
\newcounter{c}\renewcommand*{\thec}{\alph{c}}
\newcounter{n}
\begin{document}
\raggedright
\setcounter{a}{1}
\setcounter{n}{1}
\whilenum \value{a}<14 \do {%
\setcounter{b}{\numexpr \value{a}+1\relax}%
\whilenum \value{b}<15 \do {%
\setcounter{c}{\numexpr \value{b}+1\relax}%
\whilenum \value{c}<16 \do {%
\textbf{\then.} \thea\theb\thec\\
\stepcounter{c}%
\stepcounter{n}%
}%
\stepcounter{b}%
}%
\stepcounter{a}%
}
\end{document}
Oder mit LaTeX3 (dieses Mal nahezu wörtlich umgesetzt):
\documentclass[a4paper]{article}
\usepackage{xparse}
\ExplSyntaxOn
\int_new:N \l_threeaboutfifteen_a
\l_int_threeaboutfifteen_a
\int_new:N \l_threeaboutfifteen_b
\l_int_threeaboutfifteen_b
\int_new:N \l_threeaboutfifteen_c
\l_int_threeaboutfifteen_c
\int_new:N \l_threeaboutfifteen_n
\l_int_threeaboutfifteen_n
\NewDocumentCommand \threeaboutfifteen { O{\\} }
{%
\int_set:Nn \l_threeaboutfifteen_n \l_int_threeaboutfifteen_n { 1 }
\int_set:Nn \l_threeaboutfifteen_a \l_int_threeaboutfifteen_a { 15 }
\int_while_do:nn { \l_threeaboutfifteen_a \l_int_threeaboutfifteen_a >= 3 }
{%
\int_set:Nn \l_threeaboutfifteen_b { \l_threeaboutfifteen_a \l_int_threeaboutfifteen_b { \l_int_threeaboutfifteen_a - 1 }
\int_while_do:nn { \l_threeaboutfifteen_b \l_int_threeaboutfifteen_b >= 2 }
{%
\int_set:Nn \l_threeaboutfifteen_c { \l_threeaboutfifteen_b \l_int_threeaboutfifteen_c { \l_int_threeaboutfifteen_b - 1 }
\int_while_do:nn { \l_threeaboutfifteen_c \l_int_threeaboutfifteen_c >= 1 }
{%
\textbf{ \int_to_arabic:n { \l_threeaboutfifteen_n \l_int_threeaboutfifteen_n } . } }
\nobreakspace
\int_to_alph:n { 16 - \l_threeaboutfifteen_a \l_int_threeaboutfifteen_a }
\int_to_alph:n { 16 - \l_threeaboutfifteen_b \l_int_threeaboutfifteen_b }
\int_to_alph:n { 16 - \l_threeaboutfifteen_c \l_int_threeaboutfifteen_c }
#1
\int_incr:N \l_threeaboutfifteen_n
\l_int_threeaboutfifteen_n
\int_decr:N \l_threeaboutfifteen_c
\l_int_threeaboutfifteen_c
}%
\int_decr:N \l_threeaboutfifteen_b
\l_int_threeaboutfifteen_b
}
\int_decr:N \l_threeaboutfifteen_a
\l_int_threeaboutfifteen_a
}
}
\ExplSyntaxOff
\begin{document}
\raggedright
\threeaboutfifteen
% \threeaboutfifteen[ \raggedright\threeaboutfifteen
%\noindent\threeaboutfifteen[ ]
\end{document}
Verwendet man `\threeaboutfifteen[ die Zeile `\noindent\threeaboutfifteen[ ]` statt `\theeaboutfifteen` und kommentiert `\raggedright` aus, der Zeile `\raggedright\theeaboutfifteen`, ist die Ausgabe:
[![alt text][1]][1]
Eine Abwandlung für `\threeofN`, wobei `N` ein zusätzliches Argument im Wertebereich 3 <= `N` <= 26 ist, wäre dabei einfach umzusetzen.
Es muss also nicht immer `pgf` sein. Natürlich ist gut, wenn man `pgf` beherrscht. LaTeX3 zu lernen hat allerdings auch viele Vorteile.
[1]: https://texwelt.de/wissen/upfiles/test_20190309_125915.pnghttps://texwelt.de/wissen/upfiles/test_20190309_125915.png