我正在尝试在定理注释中添加一个引用(带有可选参数)。下面是 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
,当我误用某些e
或x
类型扩展时,但是在定义环境时我使用了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 } }
但这似乎对这个特定案例没有影响。不过最好还是把它们全部修复。