我有一份文件
\documentclass[12pt]{article}
\usepackage{natbib}
\bibpunct{(}{)}{,}{a}{}{;}
\makeatletter
\renewcommand*{\NAT@nmfmt}[1]{\textsc{#1}}
\makeatother
\begin{document}
According to \citeauthor{test01} space is important.
According to \citeauthor{test01}\ space is important.
\bibliographystyle{plainnat}
\bibliography{literature}
\end{document}
以及如下的bib文件:
@misc{test01,
author = "Jim Jones and Arthur Miller and Jenny Carter",
title = "My title",
year = "1988"
}
在生成的 PDF 中,et al. 后面的空格很大,就像一个新句子的开始一样:
我怎样才能告诉 Latex 自动在那里使用正常空间?
答案1
以下是一个似乎有效的方法
\usepackage{xpatch}
\xpatchcmd\citeauthor{\begingroup}{\begingroup\aftergroup\@}{}{}
\makeatletter
\renewcommand*{\NAT@nmfmt}[1]{\textsc{#1\@}}
\makeatother
这不应该产生不利影响,因为只有当引用以标点符号结束时,空间因素才会产生影响。
如果该包xpatch
不可用,可以通过以下方式获得相同的效果
\usepackage{etoolbox}
\expandafter\patchcmd\csname citeauthor \endcsname
{\begingroup}{\begingroup\aftergroup\@}{}{}
如果没有重新定义\NAT@nmfmt
,则应该执行以下操作:
\let\patched@NAT@nmfmt\NAT@nmfmt
\xpatchcmd{\patchedNAT@nmfmt}{#1}{#1\@}{}{}
\AtBeginDocument{\let\NAT@nmfmt\patchedNAT@nmfmt}
(请注意,如果愿意的话,\xpatchcmd
可以将其改为。)\patchcmd
免责声明:我是xpatch
答案2
在merlin.mbs
“et al.”中,是由以下函数生成的:
FUNCTION {bbl.etal}
{ "et~al." }
在生成的 bst 文件中将其替换为
FUNCTION {bbl.etal}
{ "et~al.\@" }
这应该可以解决问题。也许值得向作者报告错误。
这可能是过度的,真正需要的是两个这样的函数:一个将设置\spacefactor
为 1000(通过\@
),另一个在点“et al.”既是缩写又是句子结尾句号的地方不这样做。
如果plainnat.bst
上述方法不太适用,因为此 bibtex 样式不会将字符串封装在函数中,而是直接使用它。因此,在这种情况下,需要在文本编辑器中打开 bst 文件,将所有出现的“et~al.”更改为“et~al.\@”,然后将结果保存为新名称,例如,myplain.bst
并改用此样式。
另一种方法是按照@egreg 的建议更新 natbib 宏。无论哪种情况,这都是 natbib 系统的一个错误,我认为应该引起 Patrick 的注意。
答案3
我似乎找到了一种简单但有效的方法来减少“et al.”后面过宽的空格,如下所示:
对于 的第 5 个参数\bibpunct
,它指定作者姓名和年份之间的标点符号,我放置了一个负数细空格:\!
它起作用了!
当然,出于简单的考虑,这并不是一个没有问题的解决方案:当没有“et al.”时,它还会缩短作者姓名和年份之间的间距。