难道它不需要知道当前的字体吗?
编辑:看来我的表述非常不清楚。让我们再试一次。假设我正在写一篇论文,并且使用 BibTeX。因此,我有一个名为 bib.bib 的文件,其中包含大量有用的参考书目条目。进一步假设我的论文只引用了另外两篇论文,一篇是我、我自己和我写的,另一篇是我们和他们写的。进一步假设我使用的是 alpha 样式,因此这两篇论文的引用方式是[MMI98]
和[UT15]
,或其他任何形式。当我运行 BibTeX 时,它将生成一个.bbl
文件,其中包含类似 的内容\begin{thebibliography}{MMI98}
。它怎么知道“MMI98”比“UT15”长?
答案1
回答这个特定问题需要一个假设:
- 类是
article.cls
——类(通常)定义thebibliography
环境
问题指出alpha
正在使用样式,这是默认样式之一。在下面的示例中,我已加载natbib
,它“保留”了该基本样式。但是,加载natbib
有助于显示 (1) BibTeX 实际上并不关心在将参考书目添加到输出时您在文档中使用的字体,以及 (2) 一些与参考书目相关的软件包(例如或natbib
)biblatex
允许您独立控制与字体相关的内容。
然后想象一下这个文档:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@article{aa,
author = {Me and Myself and I},
title = {My Article},
journal = {My Journal},
year = {2016},
number = 1,
volume = 1,
pages = {1-20},
}
@article{bb,
author = {Us and Them},
title = {Our Article},
journal = {Our Journal},
year = {1996},
number = 2,
volume = 2,
pages = {1-20},
}
\end{filecontents*}
\usepackage[T1]{fontenc}
\usepackage{natbib}
%\renewcommand{\bibfont}{\sffamily\itshape}
\begin{document}
\nocite{*}
%\ttfamily
\bibliographystyle{alpha}
\bibliography{\jobname}
\end{document}
如果我们运行,latex
则会产生bibtex
以下内容:.bbl
\begin{thebibliography}{MMI16}
\bibitem[MMI16]{aa}
Me, Myself, and I.
\newblock My article.
\newblock {\em My Journal}, 1(1):1--20, 2016.
\bibitem[UT96]{bb}
Us and Them.
\newblock Our article.
\newblock {\em Our Journal}, 2(2):1--20, 1996.
\end{thebibliography}
问题是(我相信):BibTeX 如何确定最宽的标签是MMI16
而不是UT96
?
BibTeX 的一个古老但仍然有价值的资源是驯服 BeaST:BibTeX 的 B 到 X第四章介绍了逆波兰表示法的乐趣,以便您理解和破解.bst
文件。在第 35 页,我们阅读了函数width$
,解释了这个函数,
返回使用 1987 年 6 月的字体书写时字符串的长度
S
(以百分之一点为单位)。cmr10
您可能不介意细节......此函数用于比较标签的宽度,最长的标签作为环境参数传递thebibliography
;
因此,如果您的文档使用了一种特别奇怪的字体,其字符宽度不寻常(例如, 占用i
的空间比 大m
),那么 BibTeX 可能会选择错误的标签作为最长的标签,因为它对文档实际使用的字体一无所知,也不关心。然而,由于大多数适合学术或专业用途的字体在字符宽度方面具有相似的特征(例如,i
是总是小于m
),这可能并不危险。
最后,关于在你的参考书目之前添加\ttfamily
(你可以取消注释上面文件中的行),这会改变主字体文件的设置为任何\ttfamily
设置。这当然可以改变你的参考书目所用的字体(但不会改变其标题)。但这与 BibTeX 无关,而是与你的 documentclass 和你加载的任何包有关。例如,使用 ,natbib
你可以根据需要重新定义\bibfont
,这样会使 的使用变得\ttfamily
无关紧要(尝试取消注释上述文件中的该行)。