在文档中,我需要通过 biblatex 条目添加许多链接,如下所示:
\NewDocumentCommand{\addLink}{O{}mm}{\href{#2}{#3}}
\addLink{https://en.wikipedia.org/}{Wikipedia}\cite{Wiki}
围兜里有:
@online{Wiki,
title = {Wikipedia},
author = {Wikipedia},
year = 2024,
url = {https://en.wikipedia.org/},
}
但手动维护这两个列表的成本相当高,而为简单链接添加 bib 条目则相当烦人且难以维护。能否通过自动在 中创建条目来避免这种情况\NewDocumentCommand
?除非在可选参数中另有规定,否则年份可以固定为2024
并且author
可以等于标题。
平均能量损失:
\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}
编辑 我想我可以想到一个解决方案,将所有条目写入临时文件,然后(也许重命名?)在启动时加载此文件……但这似乎是一个相当肮脏的解决方案。有更好的解决方案吗?
答案1
我认为,仅从 LaTeX 的角度来说,将条目“注入”到 的内部是不太可能的biblatex
,尤其是因为排序必须由 Biber 完成。
因此,我认为最好的办法是写入临时.bib
文件和\addbibresource
该文件。这些都可以在辅助宏中隐藏起来,如我的答案到使用 biblatex 将特定作者设为粗体。
例如你可以尝试
\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}
这将生成一个辅助文件,我们可以将所有条目动态地<jobname>-tblx.bib
写入其中(通过)。在此示例中,所有条目都给出了条目键,但是您当然可以更改代码,以便提供有用的条目键以供以后重复使用。(目前,您无法轻松检索特定条目的条目键,因为规范没有提到您要使用的条目键,并且任意文本(如、或)是不安全的,不应用作条目键。这也是为什么目前向条目发出。如果您使条目键可预测,则可以将其分离出来。)除此之外,我们只需要通常打开和关闭输出文件的簿记。(我们需要关闭以确保我们可以随时在文档中写入。).bib
\tbblx@citeandwritetobib
tbblx@name@<counter>
author
title
url
\tbblx@citeandwritetobib
\autocite
\AtEndDocument
答案2
只是为了补充 moewe 的答案,我意识到仅使用计数器很容易出错(例如,如果我只删除一个元素,如果我忘记重新运行 biblatex,所有条目都会被移动而不会出现任何错误)。
因此我改用:
\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
我使用它如下:\mylinkCite[author, default to text]{link}[title, default to text]{text to write in pdf}[year (default 2024)]
另请注意,biblatex 不打算开箱即用地支持此功能,因为内部实现起来太复杂Biblatex:从 \addCitation{http://myurl} 自动创建 bib 条目