注释掉所示行后,以下同时使用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}
但是,当取消注释该行时,就会出现以下错误:
./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}