
En un documento, necesito agregar muchos enlaces a través de una entrada biblatex con algo como:
\NewDocumentCommand{\addLink}{O{}mm}{\href{#2}{#3}}
\addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}
donde el dorsal contiene:
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
Pero mantener manualmente estas dos listas es bastante costoso y agregar una entrada dorsal para un enlace simple es bastante molesto y difícil de mantener. ¿Sería posible, de alguna manera, evitar esto creando automáticamente la entrada en el archivo \NewDocumentCommand
? El año se puede fijar 2024
y author
podría ser igual al título a menos que se especifique lo contrario en el argumento opcional.
MWE:
\documentclass[]{article}
\begin{filecontents}[noheader,overwrite]{main.bib}
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
\end{filecontents}
\usepackage[
style=alphabetic,% also
minalphanames=3,maxalphanames=4, % [Foo+99] -> [FBB+99].
maxnames=99, % Do not put "et al". Sets maxbibnames, maxcitenames and maxsortnames.
sortcites=true,
%sorting=none,
doi=false,
url=false,
giveninits=true, % Bob Foo --> B. Foo
isbn=false,
url=false,
eprint=false,
sortcites=false, % \cite{B,A,C}: [A,B,C] --> [B,A,C]
%backref=true, % [1] Title, blabla --> [1] Title, blabla (pages 1, 45, 56)
%% TODO: customize using https://tex.stackexchange.com/questions/36307/formatting-back-references-in-bibliography
]{biblatex}
\addbibresource{main.bib}%
\NewDocumentCommand{\addLink}{O{}mm}{
\href{#2}{#3}
}
\usepackage{hyperref}
\begin{document}
You can go to \addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}.
\printbibliography
\end{document}
EDITAR Supongo que puedo pensar en una solución que escriba en un archivo temporal todas las entradas, y eso (¿tal vez cambiar el nombre?) y cargue este archivo al inicio... pero parece una solución bastante sucia. Hay alguno mejor?
Respuesta1
No creo que haya una buena posibilidad de "inyectar" la entrada en biblatex
el interior de 's puramente en el lado de LaTeX, sobre todo porque Biber debe realizar la clasificación.
Entonces creo que tu mejor oportunidad es escribir en un .bib
archivo temporal y \addbibresource
ese archivo. Todo esto se puede ocultar al usuario en macros auxiliares como se muestra enmi respuestaaPoner en negrita un autor específico usando biblatex.
Por ejemplo, podrías intentar
\documentclass[]{article}
\usepackage[
style=alphabetic,% also
minalphanames=3,maxalphanames=4, % [Foo+99] -> [FBB+99].
maxnames=99, % Do not put "et al". Sets maxbibnames, maxcitenames and maxsortnames.
sortcites=true,
%sorting=none,
doi=false,
url=false,
giveninits=true, % Bob Foo --> B. Foo
isbn=false,
url=false,
eprint=false,
sortcites=false, % \cite{B,A,C}: [A,B,C] --> [B,A,C]
]{biblatex}
\usepackage{hyperref}
\makeatletter
\def\tbblx@bibfile@name{\jobname -tblx.bib}
\newwrite\tbblx@bibfile
\immediate\openout\tbblx@bibfile=\tbblx@bibfile@name
\immediate\write\tbblx@bibfile{%
@comment{Auto-generated file}\blx@nl}
\newcounter{tbblx@name}
\setcounter{tbblx@name}{0}
\newcommand*{\tbblx@citeandwritetobib}[3]{%
\stepcounter{tbblx@name}%
\edef\tbblx@tmp@cite{%
\noexpand\autocite{tbblx@name@\the\value{tbblx@name}}}%
\tbblx@tmp@cite
\immediate\write\tbblx@bibfile{%
@online{tbblx@name@\the\value{tbblx@name},
author = {\unexpanded{#1}}, %
title = {\unexpanded{#2}},
year = {2024},
url = {\unexpanded{#3}},}%
}%
}
\AtEndDocument{%
\closeout\tbblx@bibfile}
\addbibresource{\tbblx@bibfile@name}
\NewDocumentCommand{\addLink}{O{#3}mm}{%
\href{#2}{#3}
\tbblx@citeandwritetobib{#1}{#3}{#2}%
}
\makeatother
\addbibresource{biblatex-examples.bib}
\begin{document}
You can go to \addLink{https://en.wikipedia.org/}{Wikipedia}.
\cite{sigfridsson}
\printbibliography
\end{document}
Esto genera un archivo auxiliar <jobname>-tblx.bib
en el que escribimos todas .bib
las entradas sobre la marcha (a través de \tbblx@citeandwritetobib
). En este ejemplo, todas las entradas reciben una clave de entrada tbblx@name@<counter>
, pero, por supuesto, puede cambiar el código para poder proporcionar una clave de entrada útil para su reutilización posterior. (Por el momento no puede recuperar fácilmente la clave de entrada para una entrada específica, porque la especificación no dice nada sobre la clave de entrada que desea usar y texto arbitrario como author
, title
o url
no es seguro y no debe usarse para la clave de entrada Es también por eso que en este momento \tbblx@citeandwritetobib
emite un \autocite
a la entrada. Si hace que la clave de entrada sea predecible, puede separarla). Aparte de eso, solo necesitamos la contabilidad habitual para abrir y cerrar el archivo de salida. (Necesitamos cerrar \AtEndDocument
para asegurarnos de que podamos escribir en cualquier momento en el documento).
Respuesta2
Solo para agregar a la respuesta de moewe, me di cuenta de que solo usar el contador era bastante propenso a errores (por ejemplo, si solo elimino un elemento, todas las entradas se cambiarán sin ningún error si olvido volver a ejecutar biblatex).
Entonces estoy usando en su lugar:
\usepackage{pdftexcmds}
\makeatletter
\def\tbblx@bibfile@name{\jobname -tblx.bib}
\newwrite\tbblx@bibfile
\immediate\openout\tbblx@bibfile=\tbblx@bibfile@name
\immediate\write\tbblx@bibfile{%
@comment{Auto-generated file}\blx@nl}
\usepackage{pdftexcmds}
\newcommand*{\tbblx@citeandwritetobib}[5]{%
\edef\tbblx@name@entry{\pdf@mdfivesum{\detokenize{#1#2#3#4#5}}}%just the counter is not enough, as we might forget to run latexmk to regenerate the entries if one changes. Also, not adding the counter is better as it allows exactly identical entries to share the same line in the bibliography.
\edef\tbblx@tmp@cite{%
\noexpand\cite{tbblx@name@\tbblx@name@entry}}%
\tbblx@tmp@cite
\immediate\write\tbblx@bibfile{%
@online{tbblx@name@\tbblx@name@entry,
author = {\unexpanded{#1}}, %
title = {\unexpanded{#2}},
year = {#4},
url = {\unexpanded{#3}}
}%
}%
}
\AtEndDocument{%
\closeout\tbblx@bibfile}
\addbibresource{\tbblx@bibfile@name}
\NewDocumentCommand{\mylinkCite}{O{{#3}}mO{#4}mO{2024}}{%
\href{#2}{#4}
\tbblx@citeandwritetobib{#1}{#3}{#2}{#5}{}%
}
\makeatother
Y lo uso como:\mylinkCite[author, default to text]{link}[title, default to text]{text to write in pdf}[year (default 2024)]
Tenga en cuenta también que biblatex no planea admitir esta característica de fábrica ya que es demasiado complicada de implementar internamente.Biblatex: crea una entrada de dorsal automáticamente desde \addCitation{http://myurl}