扩展 \cite 以包含外部链接

扩展 \cite 以包含外部链接

我想让我的 PDF 更适合网络访问。

目前,\cite链接到参考书目部分的条目。这很好。但我想通过一个小的超链接符号来扩展它,这样它就[Author 2000]可能出现[Author 2000 <link-symbol>]在文本中。

<link-symbol>使用一些符号字体真棒比如\faChain\faExternalLink。并且它应该链接到某个 URL(我可以在 bibtex 文件中定义它,也许是一个单独的新条目,例如external_href-- 这应该独立于参考书目部分中显示的任何 URL)。

我该如何做这样的事?


有关我的环境的一些详细信息,尽管我希望答案可以是通用的,这并不重要。(我真的不知道这些是否重要......)

我用\documentclass{scrbook}

据我所知,我实际上并没有导入任何 cite/bibtex 相关的包,除非可能\usepackage{breakcites}(但没有natbib也没有biblatex)。

在我的 tex 文件的末尾,我有以下内容:

\bibliographystyle{i6bibliostyle}
\bibliography{thesis}

所以这是一些自定义书目样式。但我认为这只是关于参考书目部分的样式(不确定)。

答案1

这样的方案需要两方面的支持:你需要从.bib文件中提取相关数据,并且需要在引用中使用该数据。

使用常规 BibTeX 方法时,生成引文时无法获取条目数据,因此使某些内容可用于引文的标准方法是将其写入文件.aux。(理论上还有其他方法,例如直接在 LaTeX 中usebib解析.bib文件,但这有其局限性。)

因此首先,您需要告诉您的 BibTeX 样式您打算使用哪个新字段将 URL 传递给 LaTeX。

如果您已经掌握了 BibTeX 编程语言,那么这相当简单。具体步骤因风格而异。对于这个答案,我将其用作plain.bst示例。

  1. 复制plain.bst到某个位置LaTeX 可以在哪里找到它(您当前文档的目录就可以)并将其重命名为plain-hrefcite.bst

  2. 在开头的评论中添加有关文件性质的简短说明。

  3. 将新字段(比如说href,)(如果需要的话)添加到文件开头的url第一个列表中,以使 BibTeX 知道它。ENTRY.bst

  4. 添加代码以href将信息写入.bbl文件。可以通过添加类似以下内容来完成

    href empty$
      { url }
      { href }
    if$
    duplicate$ empty$
      'pop$
      {
        "\bbldefcitehref{" cite$ * "}{" * swap$ * "}" * write$
        newline$
      }
    if$
    

    到打印的函数\bibitem(在示例中FUNCTION {output.bibitem})。

  5. 只是为了确保\bbldefcitehref在写入的函数中给出后备定义\begin{thebibliography}(在我们的示例中FUNCTION {begin.bib}

    "\providecommand*{\bbldefcitehref}[2]{}" write$ newline$
    

修改的具体细节会因风格而异,但总体思路应该适用于广泛的风格。

您可以从以下位置plain.bst获取修改后的版本plain-hrefcite.bsthttps://gist.github.com/moewew/783770c4abbb3ce7cbfb84069c3c5a32。对原始文件的更改在修订选项卡中很好地突出显示,并归结为

--- plain.bst   2010-12-09 04:18:56.000000000 +0100
+++ plain-hrefcite.bst  2021-01-21 08:04:09.349426800 +0100
@@ -1,3 +1,13 @@
+%%%% plain-hrefcite.bst
+%%%% 2021-01-21 MW
+%%%%
+%%%% add a linked item to citation label
+%%%%
+%%%% https://tex.stackexchange.com/q/579660/35864
+%%%%
+%%%% added a href field and write its contents to the bbl in \bbldefcitehref
+%%%%
+%%%%
 % BibTeX standard bibliography style `plain'
    % Version 0.99b (8-Dec-10 release) for BibTeX versions 0.99a or later.
    % Copyright (C) 1984, 1985, 1988, 2010 Howard Trickey and Oren Patashnik.
@@ -31,6 +41,8 @@
     type
     volume
     year
+    url
+    href
   }
   {}
   { label }
@@ -88,6 +100,17 @@
   cite$ write$
   "}" write$
   newline$
+  href empty$
+    { url }
+    { href }
+  if$
+  duplicate$ empty$
+    'pop$
+    {
+      "\bbldefcitehref{" cite$ * "}{" * swap$ * "}" * write$
+      newline$
+    }
+  if$
   ""
   before.all 'output.state :=
 }
@@ -1080,6 +1103,7 @@
     'skip$
     { preamble$ write$ newline$ }
   if$
+  "\providecommand*{\bbldefcitehref}[2]{}" write$ newline$
   "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
 }
 
 
 

然后只需将信息从文件传输.bbl.aux文件,以便从一开始就可以在引文中使用。完成上述操作后,我们可以通过修改实现的宏来打印引文中的信息\cite(如果您不加载任何引文或参考书目相关包,则相关宏将来自\@citexLaTeX 内核)。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{fontawesome}
\usepackage[colorlinks]{hyperref}

\makeatletter
\newcommand*{\bbldefcitehref}[2]{%
  \immediate\write\@mainaux{\noexpand\auxdefcitehref{\unexpanded{#1}}{\unexpanded{#2}}}}

\newcommand*{\auxdefcitehref}[2]{%
  \expandafter\global\expandafter\def\csname citehref@#1\endcsname{#2}}

\newcommand*{\mkcitehref}[1]{%#
  \ifx#1\empty
    \ \href{https://example.edu}{\faExternalLink}%
  \fi
  \ifcsname citehref@#1\endcsname
    \ \href{\csname citehref@#1\endcsname}{\faExternalLink}%
  \fi}

\def\@citex[#1]#2{\leavevmode
  \let\@citea\@empty
  \@cite{\@for\@citeb:=#2\do
    {\@citea\def\@citea{,\penalty\@m\ }%
     \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
     \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
     \@ifundefined{b@\@citeb}{\hbox{\reset@font\bfseries ?}%
       \G@refundefinedtrue
       \@latex@warning
         {Citation `\@citeb' on page \thepage \space undefined}}%
       {\@cite@ofmt{\csname b@\@citeb\endcsname
          \mkcitehref{\@citeb}}}}}{#1}}

\def\@lbibitem[#1]#2{\def\hrefcite@currentkey{#2}\item[\@biblabel{#1}\hfill]\if@filesw
      {\let\protect\noexpand
       \immediate
       \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
\def\@bibitem#1{\def\hrefcite@currentkey{#1}\item\if@filesw \immediate\write\@auxout
       {\string\bibcite{#1}{\the\value{\@listctr}}}\fi\ignorespaces}

\newcommand*{\hrefcite@currentkey}{}

\def\@biblabel#1{[#1\mkcitehref{\hrefcite@currentkey}]}
\makeatother


\begin{filecontents}{\jobname.bib}
@book{elk,
  author    = {Anne Elk},
  title     = {A Theory on Brontosauruses},
  year      = {1972},
  publisher = {Monthy \& Co.},
  location  = {London},
  href      = {https://example.edu/~elk/bronto.pdf},
}
@book{belk,
  author    = {Anne Belk},
  title     = {A Theory on Brontosauruses},
  year      = {1972},
  publisher = {Monthy \& Co.},
  location  = {London},
  url       = {https://example.edu/~elk/bronto.pdf},
}
@article{sigfridsson,
  author  = {Sigfridsson, Emma and Ryde, Ulf},
  title   = {Comparison of methods for deriving atomic charges from the
             electrostatic potential and moments},
  journal = {Journal of Computational Chemistry},
  year    = 1998,
  volume  = 19,
  number  = 4,
  pages   = {377-395},
  doi     = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P},
}
\end{filecontents}


\begin{document}
Lorem \cite{sigfridsson,elk,belk}

\bibliographystyle{plain-hrefcite}
\bibliography{\jobname}
\end{document}

引用和参考书目标签是相互关联的。

相关内容