我正在使用 thmtools 为定理、引理等定义几个环境。
其中之一是推论的环境。(我在这篇文章的末尾给出了这个环境的完整定义)。我将推论的指定限制为我希望能够引用的早期项目的直接结果,但对于这些项目,我将只提供它们直接遵循的任何早期项目的交叉引用,而不是证明。例如,如果推论 III.4.5 是项目 I.2.3 和 II.3.4 的直接结果,我想要类似的东西:
推论III.4.5(I.2.3 和 II.3.4)。 Foo 相当于 bar。⬜
为了以与文档其他地方使用的排版惯例最一致的方式执行此操作(括号中的引用来自前推论头部末尾的句号(如上所示),要做的就是使用通过 thmtools 定义的定理类环境的内置可选参数。\declaretheorem
事实上,如果我指定类似以下内容的内容,我确实得到了推论头部中交叉引用的所需位置
\begin{corollary}[some theorem and some definition]
Foo is equivalent to bar. \qed
\end{corollary}
这确实可以毫无问题地编译,但是,当然,将字符串“(某些定理和某些定义)”放在应该有适当交叉引用的位置(如上所示):
推论III.4.5(一些定理和一些定义)。 Foo 相当于 bar。⬜
但是当我尝试使用以下方法指定适当的交叉引用时:
\begin{corollary}[\ref{some theorem} and \ref{some definition}]
%% ...
...我收到错误
! Missing \endcsname inserted.
<to be read again>
\protect
l.345 ...{some theorem} and \ref{some definition}]
?
有什么方法可以保护交叉引用以避免此错误?(编辑:顺便说一句,即使我\MakeRobustCommand\ref
使用制造商包。FWIW。)
PS:请注意,以下是前面显示的代码的相关定义:
\def\qed{\hfill $\Box$}
\declaretheoremstyle[%
spaceabove=4ex%
]{thmstyle}
\declaretheorem[%
name={Theorem},%
numberwithin=section,%
style=thmstyle,%
]{thm}
\declaretheorem[%
name={Corollary},%
style=thmstyle,%
sharenumber=thm,%
]{corollary}
由 LOCKSTEP 编辑:以下示例对我有用:
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\declaretheoremstyle[%
spaceabove=4ex%
]{thmstyle}
\declaretheorem[%
name={Theorem},%
numberwithin=section,%
style=thmstyle,%
]{thm}
\declaretheorem[%
name={Corollary},%
style=thmstyle,%
sharenumber=thm,%
]{corollary}
\begin{document}
\section{foo}
\begin{thm}\label{a}
Some text.
\end{thm}
\begin{corollary}[\ref{a}]
Some text.
\end{corollary}
\end{document}
KJO 编辑:我复制并粘贴了 lockstep 的示例,然后运行它,但它对我来说不起作用;我得到的错误与我之前得到的错误几乎相同:
! Missing \endcsname inserted.
<to be read again>
\protect
l.28 \begin{corollary}[\ref{a}]
? x
我在命令前面添加了命令后重新运行了相同的代码\listfiles
,并将生成的日志文件这里。请告诉我应该发布哪些其他信息才能查明造成这种差异的原因。
答案1
您的thmtools
(50) 版本已过时。我的版本号是 61,这也是 CTAN 当前列出的版本。更新您的 TeX 发行版应该可以解决此错误。
答案2
尽管这个建议通常是针对的amsthm
,但您并没有使用它,它可能仍然有效。
用于\protect
你的\ref
s,如
\begin{corollary}[\protect\ref{some theorem} and \protect\ref{some definition}]
答案3
我很好奇——当然我不能确定,因为您没有提供如何以及在何处创建标签以及为标签选择什么名称的信息——问题是否在于您创建随后尝试交叉引用的定理标签的方式和/或位置。通常,人们会按如下方式启动类似定理的环境:
\begin{theorem}[Einstein] \label{th:emc2}
\[ E = mc^2\]
\end{theorem}
请注意,标签必须后定理的开始。在其他地方,你可以用\ref{th:emc2}
-- 而不是交叉引用这个结果\ref[Einstein]
,以确保万无一失。
我希望这些评论能有所帮助。