关于python:使用natbib在\citet中不间断空格?

关于python:使用natbib在\citet中不间断空格?

当我在文档正文中添加引文时,我习惯这样写

... in some interesting paper~\cite{interesting}.

这样(如果我使用编号参考文献)“论文”一词和引用编号就会粘在一起,不会意外地出现在两条不同的行中。

然而,似乎\citetfrom 命令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}

相关内容