我一直没能找到这个问题的答案。我想将 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
没有像\ref
has 那样的保护机制。
快速补丁如下:
\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
命令),这似乎不是一个很大的限制。