
In einem Dokument muss ich viele Links über einen Biblatex-Eintrag hinzufügen, etwa wie:
\NewDocumentCommand{\addLink}{O{}mm}{\href{#2}{#3}}
\addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}
wobei die Startnummer enthält:
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
Die manuelle Pflege dieser beiden Listen ist jedoch recht aufwändig und das Hinzufügen eines Bib-Eintrags für einen einfachen Link ist recht nervig und schwierig zu pflegen. Wäre es irgendwie möglich, dies zu vermeiden, indem der Eintrag in automatisch erstellt wird \NewDocumentCommand
? Das Jahr kann festgelegt werden 2024
und der author
könnte dem Titel entsprechen, sofern im optionalen Argument nichts anderes angegeben ist.
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}
BEARBEITEN Ich denke, ich kann mir eine Lösung vorstellen, die alle Einträge in eine temporäre Datei schreibt und diese (vielleicht umbenennt?) beim Start lädt … aber das scheint eine ziemlich schmutzige Lösung zu sein. Gibt es eine bessere?
Antwort1
Ich glaube nicht, dass es eine faire Chance gibt, den Eintrag biblatex
rein auf der LaTeX-Seite in die internen Vorgänge von „einzufügen“, nicht zuletzt, weil die Sortierung von Biber durchgeführt werden muss.
Ich denke also, dass Ihre beste Chance darin besteht, in eine temporäre Datei zu schreiben .bib
und \addbibresource
diese Datei. Dies alles kann vor dem Benutzer in Hilfsmakros verborgen werden, wie in gezeigtmeine AntwortZuBestimmten Autor mit Biblatex fett markieren.
Sie könnten zum Beispiel versuchen
\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}
Dadurch wird eine Hilfsdatei generiert <jobname>-tblx.bib
, in die wir alle .bib
Einträge im laufenden Betrieb (über \tbblx@citeandwritetobib
) schreiben. In diesem Beispiel erhalten alle Einträge den Eintragsschlüssel tbblx@name@<counter>
, aber Sie könnten den Code natürlich so ändern, dass Sie einen nützlichen Eintragsschlüssel für die spätere Wiederverwendung bereitstellen können. (Derzeit können Sie den Eintragsschlüssel für einen bestimmten Eintrag nicht einfach abrufen, da in der Spezifikation nichts über den zu verwendenden Eintragsschlüssel steht und beliebiger Text wie author
, title
oder unsicher sind und nicht als Eintragsschlüssel verwendet werden sollten. Aus diesem Grund gibt url
derzeit auch eine an den Eintrag aus. Wenn Sie den Eintragsschlüssel vorhersehbar machen, können Sie das trennen.) Abgesehen davon benötigen wir nur die übliche Buchhaltung für das Öffnen und Schließen der Ausgabedatei. (Wir müssen schließen, um sicherzustellen, dass wir jederzeit in das Dokument schreiben können.)\tbblx@citeandwritetobib
\autocite
\AtEndDocument
Antwort2
Als Ergänzung zu Moewes Antwort habe ich festgestellt, dass die bloße Verwendung des Zählers recht fehleranfällig ist (wenn ich beispielsweise nur ein Element entferne, werden alle Einträge ohne Fehler verschoben, wenn ich vergesse, Biblatex erneut auszuführen).
Deshalb verwende ich stattdessen:
\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
Und ich verwende es so:\mylinkCite[author, default to text]{link}[title, default to text]{text to write in pdf}[year (default 2024)]
Beachten Sie auch, dass Biblatex nicht plant, diese Funktion sofort zu unterstützen, da die interne Implementierung zu kompliziert ist.Biblatex: automatisch einen Bib-Eintrag erstellen aus \addCitation{http://myurl}