Biblatex: crie uma entrada de peito automaticamente a partir de \addCitation{http://myurl}

Biblatex: crie uma entrada de peito automaticamente a partir de \addCitation{http://myurl}

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 2024e authorpode 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 biblatexinterior 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 .bibarquivo temporário e \addbibresourcenesse 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.bibno qual escrevemos todas .bibas 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, titleou urlnão é seguro e não deve ser usado para a chave de entrada . É também por isso que no momento \tbblx@citeandwritetobibemite um \autocitepara 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 \AtEndDocumentpara 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}

informação relacionada