我使用 ntheorem 包定义了一个新定理。如果我想为某个定理添加标签,我会收到 caption 包的错误。并且引用不起作用。
Package caption Warning: \label without proper \caption on input line 170.
See the caption package documentation for explanation.
LaTeX Warning: Reference `def:edge-factor' on page 11 undefined on input line 310.
这个定理如下:
\begin{mydef}[Edge-Weight]
\label{def:edge-weight}
[...]
\end{mydef}
标题设置为环境变量。如何在不添加额外标题的情况下获得正确的标签?最小示例
\documentclass[pdftex,a4paper, twoside]{scrreprt}
\usepackage{caption}
\usepackage{newfloat}
\usepackage[standard, hyperref]{ntheorem}
\DeclareFloatingEnvironment[fileext=frm,placement={H},name=Definition, listname={List of Definitions}]{deffloat}
\theoremstyle{break}
\theoremsymbol{\ensuremath{\clubsuit}}
\theoremseparator{:}
\theoremprework{\begin{deffloat}[H]}
\theorempostwork{\end{deffloat}}
\newtheorem{mydef}{Definition}[chapter]
\begin{document}
\begin{mydef}[Edge-Factor] \label{def:edge-factor}
Definition
\end{mydef}
Text \ref{def:edge-factor}
\end{document}
检查示例时,我发现这是因为新的浮动环境。
答案1
由于您已经加载了标题包,因此您可以使用它\phantomcaption
来生成所需的锚点,而无需使用\caption
:
\documentclass[pdftex,a4paper, twoside]{scrreprt}
\usepackage{caption}
\usepackage{newfloat}
\usepackage[standard, hyperref]{ntheorem}
\DeclareFloatingEnvironment[fileext=frm,placement={H},name=Definition, listname={List of Definitions}]{deffloat}
\theoremstyle{break}
\theoremsymbol{\ensuremath{\clubsuit}}
\theoremseparator{:}
\theoremprework{\begin{deffloat}[H]}
\theorempostwork{\end{deffloat}}
\newtheorem{mydef}{Definition}[chapter]
\begin{document}
\begin{mydef}[Edge-Factor]
\phantomcaption
\label{def:edge-factor}
Definition
\end{mydef}
Text~\ref{def:edge-factor}
\end{document}
但是请注意,现在您遇到了另一个问题:计数器不同步,因为现在对定义的交叉引用会拾取浮点计数器形成的字符串,而该字符串不符合定义的编号方案;在上面的示例代码中,定义的编号为“0.1”(计数器值为 0 chapter
),而交叉引用仅为“1”。您需要采取措施保持计数器同步。
但是,我不明白为什么你要用浮点数包围你的定义环境;这样定义可能会飘走,并可能在需要它们的位置之后出现,更不用说已经讨论过的其他问题了。如果你需要的只是列表的可能性,那么这个ntheorem
包已经提供了这个功能。
现在,在评论中提到浮动的原因只是为了防止定义允许分页,更好的选择是将定义括在minipage
; 内。这样,一切都会按预期工作,而无需额外的工作:
\documentclass[a4paper, twoside]{scrreprt}
\usepackage{caption}
\usepackage[standard, hyperref]{ntheorem}
\theoremstyle{break}
\theoremsymbol{\ensuremath{\clubsuit}}
\theoremseparator{:}
\theoremprework{\vskip\topsep\par\noindent\begin{minipage}{\linewidth}}
\theorempostwork{\end{minipage}\par\vskip\topsep}
\newtheorem{mydef}{Definition}[chapter]
\begin{document}
\begin{mydef}[Edge-Factor]
\label{def:edge-factor}
Definition
\end{mydef}
Text~\ref{def:edge-factor}
\end{document}