Contar autores de una entrada de bibliografía

Contar autores de una entrada de bibliografía

Me gustaría tener un comando que me diera el número de autores de una determinada entrada bibliográfica. Lo que he intentado sin éxito hasta ahora fue crear un almacenamiento clave-valor (prop), conectar el mecanismo de importación bbl y almacenar la cantidad de autores que se supone que están presentes en el contador de autores.

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @book{key,
        author = {John Doe and Mike Smith},
        year = {2001},
        title = {Title},
        publisher = {Publisher},
    }
    @book{key2,
        author = {John Doe},
        year = {2002},
        title = {Title2},
        publisher = {Publisher2},
    }
\end{filecontents}

\usepackage{biblatex}
\addbibresource{\jobname.bib}

\usepackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_my_author_count
\cs_new_protected:Npn \storecount#1#2{%
    \prop_gput:Nnn \g_my_author_count{#1}{#2}%
}
\cs_new:Npn \getcount#1{%
    \prop_item:Nn \g_my_author_count{#1}%
}
\ExplSyntaxOff

\newcounter{authorcount}
\setcounter{authorcount}{0}

\AtDataInput{%
    \storecount{\strfield{entrykey}}{\value{author}}%
    % debug stuff begin
        \storecount{fakekey}{123}%
        \addtocounter{authorcount}{\value{author}}%
        \global\edef\entrykey{\strfield{entrykey}}%
    % debug stuff end
}

% make sure it's defined
\makeatletter
\@ifundefined{entrykey}{\edef\entrykey{\empty}}{}
\makeatother

\begin{document}
    % debug stuff begin
        % expect 3
        \arabic{authorcount} % got 3 => hook & counter work

        % expect key or key2
        \entrykey % got key => \strfield{entrykey} works

        % expect [?] - 123
        [?] - \getcount{fakekey}    % got [?] - 123
                                    % => storage works
    % debug stuff end

    % expect [2] - 2
    \cite{key} - \getcount{key} % got [2] - 

    % expect [1] - 1
    \cite{key2} - \getcount{key2} % got [1] -   

    \printbibliography

\end{document}

ingrese la descripción de la imagen aquí

¿Qué me estoy perdiendo?

Respuesta1

Dado que la información está presente en el authorcontador cuando se procesa una entrada, el número se puede recuperar directamente con un \cite...comando similar. No es necesario ningún desvío \AtDataInput.

Dado que los comandos biblatexde \citeson sólidos, esto no le devuelve el número de autores de forma ampliable. Si fuera necesario, podría ser más fácil ejecutarlo \AtDataInputo dejar que un \citecomando similar guarde el contador relevante en una macro auxiliar. Lo que tenga más sentido dependerá del caso de uso.

\documentclass{article}

\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareCiteCommand{\citeauthorcount}
  {\boolfalse{citetracker}%
   \boolfalse{pagetracker}%
   \usebibmacro{prenote}}
  {\printtext{The entry}%
   \setunit{\addspace}%
   \printfield{entrykey}%
   \setunit{\addspace}%
   \printtext{has \arabic{author} author(s)}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\begin{document}
\citeauthorcount{sigfridsson,worman}
\printbibliography
\end{document}

La entrada sigfridsson tiene 2 autor(es), La entrada worman tiene 1 autor(es)


Si entendí correctamente, el problema principal con su expl3solución fue la expansión y la falta de un archivo \the. El MWE usó nargumentos de tipo y, por lo tanto, no almacenaría los valores del contador, sino su representación interna y de manera similar para \strfield{entrykey}: La nversión simplemente se guardaría \strfield{entrykey}, pero la xversión expande esto y, por lo tanto, escribe sigfridssony worman. La siguiente implementación debería funcionar.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{biblatex}

\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\prop_new:N \g_vh_author_count

\cs_new_protected:Npn \vh_store_author_count:nn #1#2
{
  \prop_gput:Nnn \g_vh_author_count {#1} {#2}
}
\cs_generate_variant:Nn \vh_store_author_count:nn {xx}

\cs_new:Npn \vh_get_author_count:n #1
{
  \prop_item:Nn \g_vh_author_count {#1}
}

\NewExpandableDocumentCommand \getauthorcount {m} {
  \vh_get_author_count:n { #1 }
}

\AtDataInput{%
  \vh_store_author_count:xx {\strfield{entrykey}}{\the\value{author}}%
}
\ExplSyntaxOff

\addbibresource{biblatex-examples.bib}

\begin{document}
  \cite{sigfridsson} - \getauthorcount{sigfridsson}

  \cite{worman} - \getauthorcount{worman}

  \edef\foo{\getauthorcount{worman}} \meaning\foo

  \edef\foo{\getauthorcount{sigfridsson}} \meaning\foo

  \printbibliography
\end{document}

[1] - 2

[2] - 1

macro:->1

macro:->2

información relacionada