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..