
Estou tentando usar expl3
sequências para armazenar 0, 1 ou mais afiliações a 1 ou mais autores armazenados em um datatool
banco de dados. O seguinte MWE funciona bem:
\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}
Mas, assim que comento \author{Foo, Bar 0}
, o autor com afiliação 0, estou enfrentando o seguinte erro que não entendo:
! Missing = inserted for \ifnum.
<to be read again>
{
Responder1
Uma sequência não pode ser usada como argumento para um V
especificador, porque não possui um único valor único.
Então, em vez de armazenar uma sequência no banco de dados, você pode armazenar umponteiropara uma sequência. Como ponteiro, utilizo a versão “stringificada” do nome do 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}