![babel 和 crossreftools 不兼容?](https://linux22.com/image/402564/babel%20%E5%92%8C%20crossreftools%20%E4%B8%8D%E5%85%BC%E5%AE%B9%EF%BC%9F.png)
以下 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; 或- 替换
french
为german
或russian
。
文档的不兼容性部分说“...通过重新定义等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
。