在定理注释中使用带有可选参数的引用命令时出现“参数有额外的 }”错误

在定理注释中使用带有可选参数的引用命令时出现“参数有额外的 }”错误

我正在尝试在定理注释中添加一个引用(带有可选参数)。下面是 MWE。

\documentclass{article}

\usepackage[french]{babel}
\usepackage{amsthm,create-theorem}

\CreateTheorem{theorem,corollary}{}

\begin{document}

\begin{theorem}\label{thm}
\end{theorem}

\begin{corollary}[{\crefthe[de]{thm}}]
\end{corollary}

\end{document}

但是,我收到了以下错误:

Argument of \crefthe  has an extra }.
<inserted text> 
\par 
Paragraph ended before \crefthe  was complete.
<to be read again> 
\par 

由于\crefthe[de]{thm}已经被放入一个额外的组中,我希望可选参数在这里正常工作,但它却不工作......我怀疑问题出在包中create-theorem,当我误用某些ex类型扩展时,但是在定义环境时我使用了n类型(版本中2022-08-08的第 982 行create-theorem):

\NewDocumentEnvironment { #1 } { O{} }
  {
    \tl_if_blank:nTF { ##1 }
    ...

由于错误消息很少提到实际问题可能出在哪里,所以我不知道下一步该做什么才能找到导致这些错误的确切行。

请问这里错误的原因是什么,我应该如何解决?


添加:正如@daleif在评论中指出的那样,这里可以使用双括号。但是,如果直接通过 定义定理amsthm,则单括号就足够了:

\documentclass{article}

\usepackage[french]{babel}

% \usepackage{amsthm,create-theorem}
% \CreateTheorem{theorem,corollary}{}

\usepackage{amsthm}
\newtheorem{theorem}{Théorème}
\newtheorem{corollary}{Corollaire}
\usepackage{crefthe}
\crefthename{theorem}[le]{théorème}[les]{théorèmes}

\begin{document}

\begin{theorem}\label{thm}
\end{theorem}

\begin{corollary}[{\crefthe[de]{thm}}]
\end{corollary}

\end{document}

因此一定有什么地方出了问题create-theorem,但不幸的是我不知道如何找到它……

答案1

好的,所以我调试了你的包代码......

对于一些调试技巧,请使用 errorcontextlines (\errorcontextlines 有什么作用?)虽然效果非常有限,但我们还是得到了我们想要的东西。

这有点复杂,但是...

<argument> ...er \@iden }\@ifempty {\crefthe [de}{\let \thmnote \@gobble }{\let \thmnote \@iden }\thm@swap \swappedhead \thmhead {\tl_use:c {g_crthm_name_heading_corollary_\languagename _tl}}{\csname thecorollary\endcsname }{\crefthe [de}
                                                                                                                                                                                                                                              \the \thm@hea...
\sbox  #1#2->\setbox #1\hbox {\color@setgroup #2
                                                \color@endgroup }
\deferred@thm@head ...el \indent \par \fi \if@nobreak \adjust@parskip@nobreak \else \addpenalty \@beginparpenalty \addvspace \@topsep \addvspace {-\parskip }\fi \global \@inlabeltrue \everypar \dth@everypar \sbox \@labels {\normalfont #1}
                                                                                                                                                                                                                                              \ignorespaces 
\@begintheorem ...empty {#2}{\let \thmnumber \@gobble }{\let \thmnumber \@iden }\@ifempty {#3}{\let \thmnote \@gobble }{\let \thmnote \@iden }\thm@swap \swappedhead \thmhead {#1}{#2}{#3}\the \thm@headpunct \thmheadnl \hskip \thm@headsep }
                                                                                                                                                                                                                                              \ignorespaces 
<argument> \begin {corollary_crthm_regional}[\crefthe [de]
                                                          {thm}]
\use_ii:nn #1#2->#2
      
\use_ii:nn #1#2->#2
                   
\environment corollary code #1->\tl_if_blank:eTF {#1}{\begin {corollary_crthm_regional}}{\begin {corollary_crthm_regional}[#1]}
             

正如您所见,LaTeX 错误地考虑了\crefthe [de可选参数,并且它以 开头\begin {corollary_crthm_regional},或者看起来如此。

所以我改变了路线...

                        \begin{ #1 _crthm_regional }[##1]

                        \begin{ #1 _crthm_regional }[{##1}]

至少对于这个案例来说似乎有效。

(我正在使用旧版本的软件包,因为我的 TeX live 版本还没有\ProcessKeyOptions,所以行号可能已经改变)

我也提前知道(通过偶然发现] 位于可选参数内“偶然”)问题是大概在将“不安全”参数传递给之前,您忘记用大括号括起来[...],所以它比看起来更容易。

环顾四周,似乎还有一些更危险的路线,例如

                    \crthm_newtheorem:w { #1 _crthm_regional } [#1] { \tl_use:c { g_crthm_name_heading_ #1 _ \languagename _tl } }

但这似乎对这个特定案例没有影响。不过最好还是把它们全部修复。

相关内容