
Estoy intentando utilizar expl3
secuencias para almacenar 0, 1 o más afiliaciones a 1 o más autores almacenados en una datatool
base de datos. El siguiente MWE funciona bien:
\documentclass{article}
\usepackage{xparse}
\usepackage{datatool}
\ExplSyntaxOn
\DTLnewdb{_mymodule_authors}
\seq_new:N \g_mymodule_author_affiliations_seq
\keys_define:nn { mymodule/authors }
{
affiliation .code:n = \seq_gput_right:Nn \g_mymodule_author_affiliations_seq {#1}
}
\cs_new_protected:Nn \_mymodule_authors:nn
{
\DTLnewrow{_mymodule_authors}
\DTLnewdbentry{_mymodule_authors}{name}{#1}
\DTLnewdbentry{_mymodule_authors}{affiliations}{#2}
}
\cs_generate_variant:Nn \_mymodule_authors:nn { nV }
\RenewDocumentCommand \author { o m } {
\IfValueTF {#1}
{
\keys_set:nn { mymodule/authors } { #1 }
\_mymodule_authors:nV {#2}{\g_mymodule_author_affiliations_seq}
}
{
\_mymodule_authors:nV {#2}{\c_empty_tl}
}
\seq_gclear:N \g_mymodule_author_affiliations_seq
}
\NewDocumentCommand \showauthors { } {
\DTLforeach*{_mymodule_authors}{
\l_tmpa_tl=name,
\l_tmpa_seq=affiliations
}{
\mymodule_display_author:nn {\l_tmpa_tl}{\l_tmpa_seq}
\DTLiflastrow{
}{
\DTLpar
}
}
}
\cs_new_protected:Nn \mymodule_display_author:nn
{
#1
\seq_if_empty:NF {\l_tmpa_seq}
{
\space(\seq_use:Nn \l_tmpa_seq { ,~ })
}
}
\ExplSyntaxOff
\begin{document}
%\author{Foo, Bar 0}
\author[affiliation=Blah]{Foo, Bar 1}
\author[affiliation=Bleh,affiliation=Blih]{Foo, Bar 2}
\author[affiliation=Bloh,affiliation=Bluh,affiliation=Blyh]{Foo, Bar 3}
%
\showauthors
\end{document}
Pero, tan pronto como comento \author{Foo, Bar 0}
, el autor con 0 afiliación, me enfrento al siguiente error que no entiendo:
! Missing = inserted for \ifnum.
<to be read again>
{
Respuesta1
Una secuencia no se puede utilizar como argumento para un V
especificador porque no tiene un valor único.
Entonces, en lugar de almacenar una secuencia en la base de datos, puede almacenar unapunteroa una secuencia. Como indicador, utilizo la versión "encadenada" del nombre del autor.
\documentclass{article}
\usepackage{xparse}
\usepackage{datatool}
\ExplSyntaxOn
\DTLnewdb{_mymodule_authors}
\seq_new:N \l_mymodule_author_affiliations_seq
\keys_define:nn { mymodule/authors }
{
affiliation .code:n = \seq_put_right:Nn \l_mymodule_author_affiliations_seq {#1}
}
\cs_new_protected:Nn \_mymodule_authors:n
{
\DTLnewrow{_mymodule_authors}
\DTLnewdbentry{_mymodule_authors}{name}{#1}
\DTLnewdbentry{_mymodule_authors}{affiliations}{\tl_to_str:n{#1}}
}
\RenewDocumentCommand \author { O{} m }
{
\seq_clear:N \l_mymodule_author_affiliations_seq
\keys_set:nn { mymodule/authors } { #1 }
\_mymodule_authors:n {#2}
\seq_new:c { g_mymodule_affiliation_ \tl_to_str:n{#2} _seq }
\seq_gset_eq:cN { g_mymodule_affiliation_ \tl_to_str:n{#2} _seq } \l_mymodule_author_affiliations_seq
}
\NewDocumentCommand \showauthors { }
{
\DTLforeach*{_mymodule_authors}
{
\l_tmpa_tl=name,
\l_tmpb_tl=affiliations
}
{
\mymodule_display_author:VV \l_tmpa_tl \l_tmpb_tl
\DTLiflastrow { }{ \DTLpar }
}
}
\cs_new_protected:Nn \mymodule_display_author:nn
{
#1
\seq_if_empty:cF { g_mymodule_affiliation_#2_seq }
{
\c_space_tl(\seq_use:cn { g_mymodule_affiliation_#2_seq } { ,~ })
}
}
\cs_generate_variant:Nn \mymodule_display_author:nn { VV }
\ExplSyntaxOff
\begin{document}
\author{Foo, Bar 0}
\author[affiliation=Blah]{Foo, Bar 1}
\author[affiliation=Bleh,affiliation=Blih]{Foo, Bar 2}
\author[affiliation=Bloh,affiliation=Bluh,affiliation=Blyh]{Foo, Bar 3}
\showauthors
\end{document}