crossreftools + docliccense 重述可重述定理时出现错误

crossreftools + docliccense 重述可重述定理时出现错误

如下图所示,加载和后crossreftoolsdoclicense我在第二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未加载(但crossreftoolsdoclicense已加载)。

restatable如果我使用未加星号的而不是加星号的,也会出现同样的情况restatable*

什么可能导致这种奇怪的相互作用?

我注意到这只是今天才发生的。几天前,在 TeXLive 2020 进行一些更新之前,这种情况并没有发生!我注意到它已于thmtools2020/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

更新:

crossreftoolsv1.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
  • 在 的当前实现中\crtaddlabeltotoc,提取\ref{<label>}标签的参考值( 的纯输出),
    • 首先,\expandafterin\expandafter\crtrefnumber{#1}不起作用,因为后面的标记\crtrefnumber{不可扩展的。
    • 其次,这会将完全展开的结果写\crtrefnumber{#1}.aux\crtrefnumber 可扩展,但其扩展的结果不一定可扩展。
  • thmtoolsrestatable环境将不可扩展的谱表存储在标签的参考值中,只要与 一起使用,就会导致问题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}导致的问题严重到足以引发错误。

关于当前的修复,由于标签已在文档开头定义,因此使用\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

相关内容