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/},
}

しかし、これら 2 つのリストを手動で管理するのは非常にコストがかかり、単純なリンクに 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

biblatexソートは Biber によって実行する必要があるため、LaTeX 側だけでエントリを の内部に「挿入」できる可能性は低いと思います。

.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 さんの回答に付け加えると、カウンターを使用するだけではエラーが発生しやすいことに気付きました (たとえば、1 つの要素を削除するだけで、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 エントリを自動的に作成します

関連情報