smartref 包与 babel 选项 frenchb 冲突

smartref 包与 babel 选项 frenchb 冲突

我一直没能找到这个问题的答案。我想将 smartref 包与带有选项 frenchb 的 babel 一起使用,但似乎存在冲突:\chapterref以下 MWE 中的命令:

\documentclass{book}[11pt]
\usepackage{smartref}         %Pour \chapterref
\usepackage[frenchb]{babel}
\addtoreflist{chapter}

\begin{document}

\chapter{A chapter}

Here is some text, see \S\ \chapterref{sec:try}.

\section{tata}

\section{toto}
\label{sec:try}

\end{document}

产生以下错误:

! Missing \endcsname inserted.
<to be read again> 
                   \unskip 
l.14 ...is some text, see \S\ \chapterref{sec:try}

如果我用 替换\usepackage[frenchb]{babel}\usepackage[english]{babel}文档将正确编译并产生预期结果。我尝试交换两个 usepackage 的命令,但编译仍然失败。

我正在使用 Babel v3.8d 和 frenchb v2.6e(根据日志),以及刚从 CTAN 下载的 smartref 版本 1.9(根据 CTAN,根据自述文件为 1.82)。

我猜想一个私人破解的 babel frenchb 可以解决这个问题,但我对 TeX(csname 等)了解太少,无法自己深入研究这个问题。有人能给我一些提示吗?

提前致谢。

答案1

问题恰恰就出在标签中的冒号上,因为它smartref没有像\refhas 那样的保护机制。

快速补丁如下:

\documentclass{book}[11pt]
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{smartref}         %Pour \chapterref
\usepackage[frenchb]{babel}

\usepackage{regexpatch}
\makeatletter
\regexpatchcmd*{\addtoreflist}
  {([^1])\cP.\cP.2}%                        replace all ##2 not preceded by 1
  {\1\c{detokenize}\cB\{\cP\#\cP\#2\cE\}}%  with \detokenize{##2}
  {}{}
\makeatother

\addtoreflist{chapter}

\begin{document}

\chapter{A chapter}

Here is some text, see \S~\chapterref{sec:try}.

\section{tata}

\section{toto}
\label{sec:try}

\end{document}

请注意,这不允许在参数中使用宏\label(更准确地说,您打算使用的宏\chapterref或类似smartef命令),这似乎不是一个很大的限制。

在此处输入图片描述

相关内容