I am writing a LaTeX package to pretty-print amino acid residues and numbers with optional symbols. I have created a lua programme that outputs according to a customisable format, \StyleOption{}, using a lua table (the 'sl', 'as' meaning short lower, abbreviation sentence-case etc.) that works as intended (there are many more residues like ala_abbrev, tyr_abbrev etc but they were pruned for this question):
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
his_abbrev = {['sl'] = "h", ['su'] = "H", ['al'] = "his", ['as'] = "His", ['au'] = "HIS"}
ile_abbrev = {['sl'] = "i", ['su'] = "I", ['al'] = "ile", ['as'] = "Ile", ['au'] = "ILE"}
lys_abbrev = {['sl'] = "k", ['su'] = "K", ['al'] = "lys", ['as'] = "Lys", ['au'] = "LYS"}
amino_acid_names = {
his_abbrev, ile_abbrev, lys_abbrev,
}
function amino_acid_name(residue, style)
for _, table in ipairs (amino_acid_names) do
for key, val in pairs (table) do
if tostring (val) == residue then
tex.print (table[style])
end
end
end
end
\end{luacode*}
\newcommand\StyleOption{as}
\newcommand\residueString[2]{\directlua{
amino_acid_name ("\luaescapestring{#1}", "\luaescapestring{#2}")}}
\NewDocumentCommand{\aail}{o m m}{%
\IfValueTF{#1}{%
\residueString{#2}{\StyleOption}%
\textsuperscript{$\scriptstyle\mkern-1mu#1\mkern-1.5mu$} $\mkern-2mu#3$%
}{%
\residueString{#2}{\StyleOption} $\mkern1.5mu#3$%
}%
}
\begin{document}
\aail{i}{434}
\aail[*]{lys}{112}
\aail{HIS}{88}
\end{document}
My issue arises from trying to convert the above into LaTeX3 format. I use LuaLaTeX extensively so I am happy for the package to need lua but others might not. I have went through How to define/iterate over nested property lists in LaTeX3 but I am not sure how to iterate over a prop containing props (\l_abbrev_all_prop) and whilst the LaTeX3 Interfaces documentation probably provides the solution, it is intimidating especially when you don't know what to search for.
Question: How can I get the following LaTeX3 code to print \ResidueString according to the key defined in \StyleOption similar to the lua code please?
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\StyleOption}{}{as} % for the key to \l_abbrev_his_prop etc
\prop_new:N \l_abbrev_his_prop
\prop_new:N \l_abbrev_ile_prop
\prop_new:N \l_abbrev_lys_prop
\prop_new:N \l_abbrev_all_prop
% to save space in Q, just putting them all on one line
\prop_set_from_keyval:Nn \l_abbrev_his_prop {sl = h, su = H, al = his, as = His, au = HIS}
\prop_set_from_keyval:Nn \l_abbrev_ile_prop {sl = i, su = I, al = ile, as = Ile, au = ILE}
\prop_set_from_keyval:Nn \l_abbrev_lys_prop {sl = k, su = K, al = lys, as = Lys, au = LYS}
\prop_set_from_keyval:Nn \l_abbrev_all_prop
{
his = \l_abbrev_his_prop,
ile = \l_abbrev_ile_prop,
lys = \l_abbrev_lys_prop
}
% \cs_new:Npn \residueString:nn #1#2
% {
% \prop_map_function:NN \l_abbrev_all_prop #1#2 % What goes here?
% }
\NewDocumentCommand { \aail } { o m m }
{
\IfValueTF{#1}{%
\residueString{ #2 }{ \StyleOption }%
\textsuperscript{$\scriptstyle\mkern-1mu#1\mkern-1.5mu$} $\mkern-2mu#3$%
}{%
\residueString{ #2 }{ \StyleOption } $\mkern1.5mu#3$%
}%
}
\ExplSyntaxOff
\begin{document}
\aail{i}{434}
\aail[*]{lys}{112}
\aail{HIS}{88}
\end{document}
Note: this will all be customisable including adding custom residues, kern distances, sub/super-script, float caption options set in package options/\SetResidueOptions{key=val} etc but this is just a minimal example.

