babel 和 crossreftools 不兼容?

babel 和 crossreftools 不兼容?

以下 MWE 给出错误:

./test.tex:10: Missing \endcsname inserted.
<to be read again> 
               :   
l.10 \section{A section}\label{sec:one`}

来源:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[french,main=english]{babel}

\usepackage{crossreftools}

\begin{document}

\section{A section}\label{sec:one}

Some math $1+1=2$.

\end{document}

错误如果我:

  • 删除\usepackage{crossreftools};或
  • french从选项中省略`babel; 或
  • 替换frenchgermanrussian

文档的不兼容性部分说“...通过重新定义等crossreftools写入辅助文件的任何不可扩展内容都会导致问题。\label@currentlabel

这就是french选项所做的事情吗babel— — 将这些不可扩展的内容写入.aux

如果是这样,有没有什么解决方法?

答案1

crossreftools 创建一个标签列表并尝试将标签键写入其中。这有点脆弱……您可以添加\detokenize

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[french,main=english]{babel}

\usepackage{crossreftools}
\makeatletter
\renewcommand{\crtaddlabeltotoc}[1]{%
  \ifcrtfinal
  \else
  \addcontentsline{\crt@listoflabelsfileextension}{\crt@listoflabelsstructurelevel}{%
   \protect\numberline{\expandafter\crtrefnumber\expandafter{\detokenize{#1}}}#1}%
  \fi
}
\makeatother

\begin{document}
\crtlistoflabels
\tableofcontents
\section{A section:abc }  \label{sec:onea} \label{seconea}
Some math $1+1=2$.

\end{document}

答案2

法语选项已:激活以产生法语标点符号间距,这会干扰其使用,最简单的解决办法就是避免在作品\label中使用标点符号。\label\label{sec-one}

正常情况下babel可确保:仍然有效,\label但显然crossreftools禁用了这一点。

答案3

还有另外一个地方\detokenize需要用到:

\renewcommand{\@@crtextr@ct@ref}[2]{%
  \expandafter\@@@crtextr@ct@ref\expandafter{\detokenize{#2}}{#1}%
}
\newcommand{\@@@crtextr@ct@ref}[2]{%
  \expandafter\ifx\csname r@#1\endcsname\relax
  \crt@refundefined%
  \else
  \expandafter\expandafter\csname crt@ref@splitter@#2\endcsname\csname r@#1\endcsname%
  \fi
}

我倾向于在自己的 副本中进行更改crossreftools.sty。然后用新定义替换原始定义。这意味着在每种情况下\renewcommand都应替换为\newcommand

相关内容