
Em um documento, preciso adicionar muitos links através de uma entrada do biblatex com algo como:
\NewDocumentCommand{\addLink}{O{}mm}{\href{#2}{#3}}
\addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}
onde o babador contém:
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
Mas manter manualmente essas duas listas é muito caro, e adicionar uma entrada para um link simples é muito chato e difícil de manter. Seria possível, de alguma forma, evitar isso criando automaticamente a entrada no \NewDocumentCommand
? O ano pode ser fixado 2024
e author
pode ser igual ao título, a menos que especificado de outra forma no 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 Acho que consigo pensar em uma solução que grave todas as entradas em um arquivo temporário e que (talvez renomeie?) E carregue esse arquivo na inicialização… mas parece uma solução bastante suja. Existe um melhor?
Responder1
Não acho que haja uma chance justa de "injetar" a entrada no biblatex
interior do ' puramente no lado do LaTeX, até porque a classificação deve ser feita pelo Biber.
Então acho que sua melhor chance é gravar em um .bib
arquivo temporário e \addbibresource
nesse arquivo. Tudo isso pode ser ocultado do usuário em macros auxiliares, conforme mostrado emminha respostaparaColoque um autor específico em negrito usando biblatex.
Por exemplo, você poderia tentar
\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}
Isso gera um arquivo auxiliar <jobname>-tblx.bib
no qual escrevemos todas .bib
as entradas instantaneamente (via \tbblx@citeandwritetobib
). Neste exemplo, todas as entradas recebem a chave de entrada tbblx@name@<counter>
, mas é claro que você pode alterar o código para fornecer uma chave de entrada útil para reutilização posterior. (No momento você não pode recuperar facilmente a chave de entrada para uma entrada específica, porque a especificação não diz nada sobre a chave de entrada que você deseja usar e texto arbitrário como author
, title
ou url
não é seguro e não deve ser usado para a chave de entrada . É também por isso que no momento \tbblx@citeandwritetobib
emite um \autocite
para a entrada. Se você tornar a chave de entrada previsível, poderá separá-la.) Além disso, precisamos apenas da contabilidade usual de abertura e fechamento do arquivo de saída. (Precisamos fechar \AtEndDocument
para garantir que podemos escrever a qualquer momento no documento.)
Responder2
Apenas para complementar a resposta de moewe, percebi que apenas usar o contador era bastante propenso a erros (por exemplo, se eu apenas remover um elemento, todas as entradas serão deslocadas sem nenhum erro se eu esquecer de executar novamente o biblatex).
Então, estou usando:
\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
E eu uso assim:\mylinkCite[author, default to text]{link}[title, default to text]{text to write in pdf}[year (default 2024)]
Observe também que o biblatex não planeja oferecer suporte a esse recurso imediatamente, pois é muito complicado de implementar internamente.Biblatex: crie uma entrada de peito automaticamente a partir de \addCitation{http://myurl}