当我在文档正文中添加引文时,我习惯这样写
... in some interesting paper~\cite{interesting}.
这样(如果我使用编号参考文献)“论文”一词和引用编号就会粘在一起,不会意外地出现在两条不同的行中。
然而,似乎\citet
from 命令natbib
(应该产生类似“作者 [4]”的结果)没有~
在作者姓名和引用编号之间使用,因此,在少数情况下,我最终会得到类似
... Authors
[4].
这很烦人。有没有一种简单的方法可以natbib
利用不间断空格?
答案1
步调一致和史蒂芬·柯特维茨建议重新定义\NAT@spacechar
。这可能曾经有效,但我发现现在七年过去了,使用natbib 2010/09/13 8.31b (PWD, AO)
TeXLive 2016 后,它不再有效。来自@penelope 的评论还提到,自 2014 年中期起,这种方法已不再有效。
以下策略做对我来说现在有效。将以下内容添加到文档序言中的某个位置\usepackage{natbib}
:
\bibpunct{\nolinebreak{}[}{]}{,}{n}{}{,}
其中的关键部分是\nolinebreak{}[
,它阻止 LaTeX 在开始一组带括号的引用编号之前换行[
。其余参数\bibpunct
仅复制带括号的带编号引用的标准标点符号。
请注意,{}
紧随其后的\nolinebreak
并不是一个真正的空参数\nolinebreak
。相反,它只是防止\nolinebreak
将以下内容误[
认为是可选参数的开头。话虽如此,\nolinebreak
确实接受一个可选参数,该参数决定应以何种程度的强度阻止中断。因此,您可以使用类似的东西\bibpunct{\nolinebreak[0][}{]}{,}{n}{}{,}
来使 no-break 指令只是一个温和的要求,一直到\bibpunct{\nolinebreak[4][}{]}{,}{n}{}{,}
严格要求。后者相当于您使用\bibpunct{\nolinebreak{}[}{]}{,}{n}{}{,}
我最初建议的形式时获得的默认处理。
答案2
看起来\NAT@spacechar
需要重新定义:
\documentclass{article}
\usepackage[numbers]{natbib}
\makeatletter
% \def\NAT@spacechar{\ }% OLD
\def\NAT@spacechar{~}% NEW
\makeatother
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{a01,
author = {Author, A.},
year = {2001},
title = {Alpha},
}
\end{filecontents}
\begin{document}
Let's test if author and citation number end up in different lines: \citet{a01}.
\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{document}
答案3
由于\NAT@spacechar
使用了,这种重新定义可以防止此类中断:
\makeatletter
\renewcommand*{\NAT@spacechar}{~}
\makeatother
这也会影响到需要停顿的地方。因此,对于罕见的情况,一个简单的方法是在\mbox
引用周围使用:
... in the paper \mbox{\citet{interesting}}.
答案4
重新定义namelabeldelim
使用不间断空格(\addnbspace
)对我有用:
\DeclareDelimFormat{namelabeldelim}{\addnbspace}