babel-french 与 crossreftools 的另一个不兼容问题

babel-french 与 crossreftools 的另一个不兼容问题

注释掉所示行后,以下同时使用babel-french和的操作将给出其末尾crossreftools两个命令的预期输出:crossreftools

\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}

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

\makeatletter
\declaretheoremstyle[
  headformat=\NAME\NUMBER\let\thmt@space\@empty\NOTE,
]{thmstyle}
\makeatother
\theoremstyle{thmstyle}
\declaretheorem[name=Theorem]{theorem}

\usepackage[pdftex,colorlinks]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}

\usepackage{crossreftools}

\begin{document}

\begin{theorem}[theorem of Pythagoras]
  \label{thm:prelim}

  The square of the hypotenuse of a right triangle equals the sum of the squares of the other two sides.

\end{theorem}

\crtrefanchor{thm:prelim} --- \verb!\crtrefanchor{thm:prelim}!

\crtrefname{thm:prelim} --- \verb!\crtrefanchor{thm:prelim}!

\end{document}

new-babel-法语-crossreftools-clash

但是,当取消注释该行时,就会出现以下错误:

./clash.tex:23: Missing \endcsname inserted.
<to be read again> 
               :
l.23       \label{thm:prelim}

毫无疑问,错误的原因与https://tex.stackexchange.com/a/510593/13492:使之活跃的french选项,会干扰冒号在标签中的使用。babel:

babel-french在和crossreftools之间给出了另一个此类的修复https://tex.stackexchange.com/a/510641/13492

问题:如何修复这两个crossreftools命令的不兼容性?

注意:标签中为什么有冒号?

在前面的 MWE 所出的书本长度的文档中,我一直在标签中使用冒号,因为它们几乎都在冒号后面的短语中嵌入了连字符,例如。\label{thm:law-large-numbers}这样的标签使定理的类型(或定义等)在视觉上与该特定定理的简洁描述(等)区分开来。

我尝试用分号来代替,但发现也不好,因为babel-french它也会使它变得活跃。

字符|可能有用(希望它不会导致其他问题),但与:标签相比,它相当突兀。(尽管如此,在不无意中替换正文所需的冒号标点符号的情况下,替换 1500-1600 个标签中的冒号仍需要一些工作。)

答案1

这可能会有所帮助。我不知道它是否足够强大,但在简单的情况下它应该可以工作:

\edef\myoldcatcode{\the\catcode`\:}
\let\myoriglabel\label
\def\label{\catcode`\:=11 \mynewlabel}
\def\mynewlabel#1{\myoriglabel{#1}\catcode`\:=\myoldcatcode}

答案2

你只需要在构造 csnames 时确保 : 安全,例如

\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}

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

\makeatletter
\declaretheoremstyle[
  headformat=\NAME\NUMBER\let\thmt@space\@empty\NOTE,
]{thmstyle}

\let\zzz\active@prefix
\def\active@prefix{\ifincsname\expandafter\string\else\expandafter\zzz\fi}
\makeatother
\theoremstyle{thmstyle}
\declaretheorem[name=Theorem]{theorem}

\usepackage[pdftex,colorlinks]{hyperref}
\usepackage[nameinlink,noabbrev,capitalize]{cleveref}

\usepackage{crossreftools}

\begin{document}

\begin{theorem}[theorem of Pythagoras]
  \label{thm:prelim}

  The square of the hypotenuse of a right triangle equals the sum of the squares of the other two sides.

\end{theorem}

\crtrefanchor{thm:prelim} --- \verb!\crtrefanchor{thm:prelim}!

\crtrefname{thm:prelim} --- \verb!\crtrefanchor{thm:prelim}!

\end{document}

相关内容