在 ntheorem 环境中添加标签,无需附加标题

在 ntheorem 环境中添加标签,无需附加标题

我使用 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}

相关内容