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}
¿Qué me estoy perdiendo?
Respuesta1
Dado que la información está presente en el author
contador 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 biblatex
de \cite
son 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 \AtDataInput
o dejar que un \cite
comando 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 expl3
solución fue la expansión y la falta de un archivo \the
. El MWE usó n
argumentos 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 n
versión simplemente se guardaría \strfield{entrykey}
, pero la x
versión expande esto y, por lo tanto, escribe sigfridsson
y 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