我想让我的 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
示例。
复制
plain.bst
到某个位置LaTeX 可以在哪里找到它(您当前文档的目录就可以)并将其重命名为plain-hrefcite.bst
。在开头的评论中添加有关文件性质的简短说明。
将新字段(比如说
href
,)(如果需要的话)添加到文件开头的url
第一个列表中,以使 BibTeX 知道它。ENTRY
.bst
添加代码以
href
将信息写入.bbl
文件。可以通过添加类似以下内容来完成href empty$ { url } { href } if$ duplicate$ empty$ 'pop$ { "\bbldefcitehref{" cite$ * "}{" * swap$ * "}" * write$ newline$ } if$
到打印的函数
\bibitem
(在示例中FUNCTION {output.bibitem}
)。只是为了确保
\bbldefcitehref
在写入的函数中给出后备定义\begin{thebibliography}
(在我们的示例中FUNCTION {begin.bib}
)"\providecommand*{\bbldefcitehref}[2]{}" write$ newline$
修改的具体细节会因风格而异,但总体思路应该适用于广泛的风格。
您可以从以下位置plain.bst
获取修改后的版本plain-hrefcite.bst
https://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
(如果您不加载任何引文或参考书目相关包,则相关宏将来自\@citex
LaTeX 内核)。
\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}