This is an extension of a previous question (link). I would like to include the following xparse key-value store holding a name value into the document below:
% Key-value store
\ExplSyntaxOn
\prop_new:N \list_prop
\keys_define:nn {bio} {%
name .code:n={ \prop_put:Nnn \list_prop {name} {#1} },
}
\NewDocumentCommand{\update}{+m}{%
\keys_set:nn {bio} {#1}%
}
\cs_new:Npn \getvalue#1{%
\prop_item:Nn \list_prop {#1}
}
\ExplSyntaxOff
% Default variable values
\update{%
name={John Doe}
}
I would like to use the stored name to automatically update l_adam_name_full_tl defined in \adam_name_define:n below. In other words, l_adam_name_full_tl would be defined automatically based on values in the above key-value store. It would be ideal to retain the \definename function for flexibility, but to make its default value \getvalue{name} when an argument is not passed.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definename}{m}
{
\adam_name_define:n { #1 }
}
\NewDocumentCommand{\makebold}{m}
{
\adam_name_makebold:n { #1 }
}
\tl_new:N \l_adam_name_full_tl
\tl_new:N \l_adam_name_first_tl
\tl_new:N \l_adam_name_last_tl
\tl_new:N \l_adam_name_initials_tl
\tl_new:N \l__adam_name_input_tl
\cs_new_protected:Nn \adam_name_define:n
{
\tl_set:Nn \l_adam_name_full_tl { #1 }
\tl_set_eq:NN \l_adam_name_first_tl \l_adam_name_full_tl
\tl_set_eq:NN \l_adam_name_last_tl \l_adam_name_full_tl
\regex_replace_once:nnN { (.*)\s[^\s]*\Z } { \1 } \l_adam_name_first_tl
\regex_replace_once:nnN { .*\s([^\s]*)\Z } { \1 } \l_adam_name_last_tl
\tl_set_eq:NN \l_adam_name_initials_tl \l_adam_name_first_tl
\regex_replace_all:nnN { ([[:alpha:]])[[:alpha:]]+ } { \1. } \l_adam_name_initials_tl
}
\cs_new_protected:Nn \adam_name_makebold:n
{
\tl_set:Nn \l__adam_name_input_tl { #1 }
% full name
\regex_replace_once:nnN
{
(
\u{l_adam_name_full_tl} % name surname
|
\u{l_adam_name_initials_tl} \s \u{l_adam_name_last_tl} % initials surname
|
\u{l_adam_name_last_tl} , \s \u{l_adam_name_first_tl} % surname, name
|
\u{l_adam_name_last_tl} , \s \u{l_adam_name_initials_tl} % surname, initials
)
}
{ \c{textbf} \cB\{ \1 \cE\} }
\l__adam_name_input_tl
% print
\tl_use:N \l__adam_name_input_tl
}
\ExplSyntaxOff
\begin{document}
\definename{John Doe}
\makebold{His name was John Doe.}
\makebold{His name was J. Doe.}
\makebold{His name was Doe, J..}
\definename{John T. Doe}
\makebold{His name was John T. Doe.}
\makebold{His name was J. T. Doe.}
\makebold{His name was Doe, J. T..}
\end{document}
Expected output:
His name was John Doe.
His name was Doe, John.
His name was J. Doe.
His name was Doe, J..
His name was John T. Doe.
His name was J. T. Doe.
His name was Doe, J. T..

\updateneeds to be called behind the scenes within a class file. In other words, before\begin{document}. Also, the current version doesn't work to boldface the author name when overridingbibitemand parsing the second argument as an input to\makebold. – Adam Erickson Jan 19 '19 at 01:10expl3is quickly growing on me now that I'm starting to understand it. – Adam Erickson Jan 19 '19 at 01:47