我该如何修补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
您必须使用\LetLtxMacro
:letltxmacro
会告诉您原因。另请参阅何时使用 \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}