Biblatex:从 \addCitation{http://myurl} 自动创建 bib 条目

Biblatex:从 \addCitation{http://myurl} 自动创建 bib 条目

在文档中,我需要通过 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@citeandwritetobibtbblx@name@<counter>authortitleurl\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 条目

相关内容