如何使用 cleveref 获取类似定理的名称和列表项编号?

如何使用 cleveref 获取类似定理的名称和列表项编号?

我需要如何修改此源以便:

  1. 第 1 章的第一行输出目前为“参见下面的 ?? 1”,现在改为“参见下面的问题 2.1”
  2. 第 2 章的第一个输出行,当前为“请参阅这些中的??。”,将改为“请参阅这些中的第 1 个问题。”?

注意:

  • 类似定理的环境problems本身没有编号,但在不同的章节中引用时,应该使用“问题”一词,后跟该章节的编号,然后是项目编号作为参考;并且
  • 当在出现该环境的同一章节中引用该环境中的某个项目时problemsenum,引用应该包含“问题”一词。

我不明白如何在这里使用适当的别名或计数器。

\documentclass[oneside]{book}

\usepackage{amsthm}
\usepackage{thmtools}

\usepackage{aliascnt}
\usepackage[nameinlink]{cleveref}
\crefname{enumi}{}{} 

\declaretheoremstyle[numbered=no]{probs}
\declaretheorem[name=PROBLEMS,style=probs]{problems} 

\newenvironment{problemsenum}
{\begin{enumerate}%
Solve these problems.}%
{\end{enumerate}}

\crefname{problems}{Problem}{Problem}
\Crefname{problems}{Problem}{Problem}


\begin{document}

\chapter{}\label{chap:1}

See \cref{prob:my-problems} \cref{prob-part:first-problem}, below.

\chapter{}\label{chap:2}

Refer to \cref{prob-first-problem} in these.

\begin{problems}
\label{prob:my-problems}

\begin{problemsenum}

\item \label{prob-part:first-problem}
First problem.

\item 
Second problem.

\end{problemsenum}

\end{problems}

\end{document}

部分解决方法

使用上面编辑版本中添加的章节标签,在序言中做出定义:

\newcommand{\probref}[1]{Problem~\cref{#1}}
\newcommand{\otherprobref}[1]{Problem~\thechapter.\cref{#1}}

然后分别在第1章和第2章中创建交叉引用,如下所示:

See \otherprobref{prob-part:first-problem}

Refer to \probref{prob-part:first-problem} in these.

为什么部分解决方法不能令人满意。不幸的是,如果我现在也将其包括在序言中......

\usepackage[colorlinks=true]{hyperref} 

...那么第 1 章和第 2 章中的链接分别为仅有的针对实际问题编号(此处为 1),而不是整个短语“问题 1.1”和“问题 1”。对于这种类型的交叉引用,这否定了nameinlink我使用的选项cleveref

更好的部分解决方法

在他的回答中如何抑制编号定理的数量?Christian Hupfer 提供了一个巧妙的新部分解决方案:

  • 确实创建了带有数字的交叉引用,以便在无编号的定理类环境中枚举项目(这是我的目标之一);但是
  • 不是满足我的一个要求,即当引用在相同的该环境发生的章节,则章节号将在参考文献中被抑制。

是否有某种方法可以修改 Hupfer 的答案以满足我当前帖子顶部的要求 #2?

这实质上是 Hupfer 的巧妙回答,稍作修改以适合我的情况,单位划分为章节而不是节(并添加了彩色链接、额外文本以便于显示链接指向的位置等):

\documentclass[oneside]{book}

\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{enumitem}
\usepackage[colorlinks, linkcolor=blue]{hyperref}

\declaretheoremstyle[numbered=yes,headpunct={}]{probs}
\declaretheorem[name=PROBLEMS,style=probs,numberwithin=chapter,preheadhook={\let\theproblems\relax},postheadhook={\newcommand{\theproblems}{\thechapter.\arabic{problems}}\leavevmode}]{problems} 

\newlist{probenum}{enumerate}{1}

\setlist[probenum,1]{label=({\arabic*)},ref={Problem~\thechapter\,(\arabic*)}}

\usepackage{lipsum}

\begin{document}

\chapter{First chapter}

In \ref{fooother} you will prove that \dots .

\begin{problems}
\begin{probenum}
  \item foo \label{foo} \lipsum[1]
  \item bar \label{bar} \lipsum[2]
\end{probenum}
\end{problems}

In \ref{bar} and \ref{foo}, you already proved that \dots .
In \ref{fooother} you will prove that \dots .


\chapter{Second chapter}

\begin{problems}
\begin{probenum}
  \item foo \label{fooother} \lipsum[3]
  \item bar \label{barother} \lipsum[4]
\end{probenum}
\end{problems}

Earlier in \ref{bar}, you had already showed that \dots ; now in \ref{fooother} you just showed that \dots .

\end{document}

答案1

对您的环境进行编号problems,但隐藏号码。

\documentclass[oneside]{book}

\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{enumitem}

\usepackage{aliascnt}
\usepackage[nameinlink]{cleveref}

\declaretheoremstyle[
  headformat=\NAME\NOTE,
]{probs}
\declaretheorem[
  name=PROBLEMS,
  style=probs,
]{problemsinner}
\newenvironment{problems}
  {\problemsinner Solve these problems.}
  {\endproblemsinner}

\newlist{problemsenum}{enumerate}{1}
\setlist[problemsenum,1]{label=\arabic*}
\makeatletter
\renewcommand{\p@problemsenumi}{\maybe@thechapter{\thechapter}}
\protected\def\maybe@thechapter#1{%
  \ifnum#1=\value{chapter}%
  \else
    #1.%
  \fi
}
\makeatother

\crefformat{problemsenumi}{#2Problem~#1#3}
\Crefformat{problemsenumi}{#2Problem~#1#3}
\crefformat{problemsinner}{#2#3}
\Crefformat{problemsinner}{#2#3}

\begin{document}

\chapter{First}\label{chap:1}

See \cref{prob-part:first-problem} in a different chapter.

\chapter{Second}\label{chap:2}

Refer to \cref{prob-part:first-problem} in this chapter.

\begin{problems}
\label{prob:my-problems}

\begin{problemsenum}

\item \label{prob-part:first-problem}
First problem.

\item 
Second problem.

\end{problemsenum}

\end{problems}

\end{document}

在此处输入图片描述

技术说明:我使用 A6 纸张格式来制作图像。

相关内容