包装 natbib 宏 \citep 和 \citet

包装 natbib 宏 \citep 和 \citet

我该如何修补natbib命令\citep\citet类似命令?我尝试过xparse(下面的 MWE)、etoolbox\pretocmd\apptocmd命令)以及xpatch\xpretocmd\xapptocmd命令),但都没有任何明显的效果。

这是尝试找到一个自动解决错误的办法\pdfendlink 最终与 \pdfstartlink 处于不同的嵌套级别当链接跨越两页时就会发生这种情况。(即使使用最新的hyperref,我也会在双列格式中看到错误。)目的是将所有出现的\citep...{...}和类似内容包装到 中\mbox{}笔记:这不是为了发布,只是为了确保我开发的 LaTeX 文档的中间状态能够顺利编译。我不想修复文档发布时可能消失的东西。

编辑:最初,我以为这是一件非常简单的事情,显而易见。是什么让 LaTeX 在这种特殊情况下表现得如此奇怪?

解决这一实际问题的另一种方法是使用关于python:使用natbib在\citet中不间断空格? 但是,由于某种原因,这在我的例子中不起作用(natbib++ ;抱歉,这里没有 MWE...)另一种方法是将链接限制为参考中的单个单词(例如,年份),或者添加维基百科hyperref样式babel的链接图标,而不是将整个参考标记为可点击。

MWE(也在 GitHub 上

以下代码给出了如下所示的错误:

\documentclass{scrartcl}
\pagestyle{empty}
\usepackage{xparse}
\usepackage[authoryear,round]{natbib}

\let\oldcitep=\citep
\RenewDocumentCommand{\citep}{O{} O{} m}{\oldcitep{#3}}

\NewDocumentCommand{\citex}{O{} O{} m}{\oldcitep{#3}}

\begin{document}
  \citep{SomeRef}
\end{document}

错误信息

Runaway text?
\citep code {}{}{SomeRef}{SomeRef}{SomeRef}{SomeRef}{SomeRef}{SomeRef\ETC.
! TeX capacity exceeded, sorry [main memory size=5000000].
\l__xparse_args_tl ...omeRef}{SomeRef}{SomeRef}{So
                                                  meRef}{SomeRef}{SomeRef}{S...
l.12   \citep{SomeRef}

最让我困惑的是:当我在文档正文中用 替换 时\citep\citex文档就可以编译了。

答案1

您必须使用\LetLtxMacroletltxmacro会告诉您原因。另请参阅何时使用 \LetLtxMacro?

\documentclass{scrartcl}
\pagestyle{empty}
\usepackage{xparse}
\usepackage[authoryear,round]{natbib}
\usepackage{letltxmacro}

\LetLtxMacro\oldcitep\citep
\RenewDocumentCommand{\citep}{O{} O{} m}{\oldcitep{#3}}

\NewDocumentCommand{\citex}{O{} O{} m}{\oldcitep{#3}}

\begin{document}
  \citep{SomeRef}
\end{document}

相关内容