![crossreftools + docliccense 重述可重述定理时出现错误](https://linux22.com/image/417822/crossreftools%20%2B%20docliccense%20%E9%87%8D%E8%BF%B0%E5%8F%AF%E9%87%8D%E8%BF%B0%E5%AE%9A%E7%90%86%E6%97%B6%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF.png)
如下图所示,加载和后crossreftools
,doclicense
我在第二restatable
当重新表述定理时,pdflatex 通过。
./restate-thm.tex:43: Undefined control sequence.
\@calc@post@scan ...st@scan \else \def \calc@next
{\calc@error #1}\fi \fi \f...
我明白了不错误时...
crossreftools
已加载但doclicense
实际上未加载;或doclicense
已加载但crossreftools
实际上未加载;或hyperref
未加载(但crossreftools
和doclicense
已加载)。
restatable
如果我使用未加星号的而不是加星号的,也会出现同样的情况restatable*
。
什么可能导致这种奇怪的相互作用?
我注意到这只是今天才发生的。几天前,在 TeXLive 2020 进行一些更新之前,这种情况并没有发生!我注意到它已于thmtools
2020/07/16(版本 69)更新;而doclicense
它使用的其他文件自 2020-06-28 以来没有更新,crossreftools
最后更新于 2019/01/03。
% file restate-thm.tex
\documentclass{book}
% Theorems...
\usepackage{amsmath,amsthm}
\usepackage{thmtools} % loads thm-restate
%
\swapnumbers
%
\declaretheorem[name=Theorem,numberwithin=chapter,style=plain]{theorem}
%
\makeatletter
\declaretheoremstyle[
notefont=\bfseries,notebraces={}{},
headformat=\NUMBER\let\thmt@space\@empty\NOTE,
]{namedthmstyle}
%
\declaretheorem[style=namedthmstyle,name=Theorem,title = {},numberlike=theorem
]{namedtheorem}
\makeatother
% Links...
%\usepackage{hyperxmp} % to add metadata info into pdf
\usepackage[colorlinks]{hyperref}
% the problems??
\usepackage[type={CC},modifier={by-nc-nd},version={4.0},lang={english}]{doclicense}%
\usepackage{crossreftools}
\begin{document}
\chapter{Statement}
\begin{restatable*}[Theorem of Pythagoras]{namedtheorem}{PythagorasTheorem}
%\label{thm:Pythagoras}
The square on the hypotenuse of a right triangle equals the sum of the squares on the other two sides.
\end{restatable*}
\chapter{Proof}
Recall the theorem.
\PythagorasTheorem
\end{document}
当包含thmtools
选项时,则在degug
第一的pdflatex pass 我在日志中看到以下内容:
Chapter 2.
Key `Theorem of Pythagoras' with value `' ignored by label.
Key `Theorem of Pythagoras' with value `' ignored by name.
Key `Theorem of Pythagoras' with value `' ignored by continues.
Key `Theorem of Pythagoras' with value `' ignored by restate phase 1.
Package atveryend Info: Empty hook `BeforeClearDocument' on input line 44.
[3]
Package atveryend Info: Empty hook `AfterLastShipout' on input line 44.
(./restate-thm.aux)
Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 44.
Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 44.
Package rerunfilecheck Warning: File `restate-thm.out' has changed.
(rerunfilecheck) Rerun to get outlines right
(rerunfilecheck) or use package `bookmark'.
...
LaTeX Warning: There were undefined references.
答案1
更新:
crossreftools
v1.0(2020-07-19)已修复此问题,因此无需后续补丁。
原始答案:
尝试这个:
\makeatletter
\renewcommand{\crtaddlabeltotoc}[1]{%
\ifcrtfinal
\else
% replace "\expandafter\crtrefnumber{#1}" with "\string\crtrefnumber{#1}"
\addcontentsline{\crt@listoflabelsfileextension}{\crt@listoflabelsstructurelevel}{\protect\numberline{\string\crtrefnumber{#1}}#1}%
\fi
}
\makeatother
这似乎是一个错误crossreftools
,这里有一个重现该问题的最小示例。
\documentclass{article}
\usepackage{crossreftools}
\begin{document}
\makeatletter
\def\@currentlabel{\protect\def\protect\x{x}}
\makeatother
text \label{key}
\end{document}
一些解释:
corssreftools
有一个\crtlistoflabels
输出存储在辅助文件中的标签列表.lla
。对于第 5 页第 3 节的标签sec:xxx
,其在标签列表中的对应条目将类似于“3 sec:xxx ... ... 5”。这里3
相当于的输出\ref{sec:xxx}
。- 第一次运行 latex 时,
\crtaddlabeltotoc
会调用 来将必要信息写入.aux
。当.aux
在文档开头输入 时,.lla
会创建 。当\crtlistoflabels
使用 时,.lla
会输入 。 - 可以通过包选项“final”
\crtlistoflabels
关闭整个实用程序。crossreftools
- 第一次运行 latex 时,
- 在 的当前实现中
\crtaddlabeltotoc
,提取\ref{<label>}
标签的参考值( 的纯输出),- 首先,
\expandafter
in\expandafter\crtrefnumber{#1}
不起作用,因为后面的标记\crtrefnumber
是{
不可扩展的。 - 其次,这会将完全展开的结果写
\crtrefnumber{#1}
为.aux
。\crtrefnumber
是可扩展,但其扩展的结果不一定可扩展。
- 首先,
thmtools
的restatable
环境做将不可扩展的谱表存储在标签的参考值中,只要与 一起使用,就会导致问题crossreftools
。- 在 OP 的例子中,当
doclicense
被注释时,文件中仍然有错误的内容.aux
,例如(注意\def \@arabic {\c@equation }
片段)
\@writefile{lla}{\contentsline {section}{\numberline {\def \@arabic {\c@equation }{\@arabic {\c@equation }}\global \c@equation 0\relax }thmt@@PythagorasTheorem@data}{1}\protected@file@percent }
- 但是,如果用户不使用
\crtlistoflabels
,则文件.lla
永远不会被加载。因此,内容中的问题.lla
永远不会被发现。 - 在 OP 的例子中,当
doclicense
取消注释时,包calc
会被加载。这使得完全扩展的过程\crtrefnumber{#1}
导致的问题严重到足以引发错误。
- 在 OP 的例子中,当
关于当前的修复,由于标签已在文档开头定义,因此使用\crtrefnumber{<label name>}
而不是其扩展\crtlistoflabels
是安全的。因此,\string
将 替换为\expandafter
写入。\crtrefnumber{#1}
.aux
修复后,
\@writefile{lla}{\contentsline {section}{\numberline {\crtrefnumber{thmt@@PythagorasTheorem@data}}thmt@@PythagorasTheorem@data}{1}\protected@file@percent }
写给.aux
。