如何通过“\cref”交叉引用项目来生成列表环境标题

如何通过“\cref”交叉引用项目来生成列表环境标题

正如接受的答案所建议的那样这个问题我问的是,我在我的Examples环境中使用相同的代码片段。

最近我了解了variorefcleveref包并开始使用它们。在这方面,以下是 MWE

\documentclass{article}
\usepackage{amsthm}
\usepackage{enumitem}
\usepackage{etoolbox}
\newtheoremstyle{myexcstyle}{3ex}{3ex}{}{}{\scshape}{:}{.5em}{}
\theoremstyle{myexcstyle}
\newtheorem*{exmps}{Examples}
\makeatletter
\newcommand*{\my@start@example}[2]{%
    \begin{exmps}#1
        \mbox{}\par\nobreak\vskip -0.5ex\@nobreaktrue
        \begin{enumerate}[label=\arabic*., font=\bfseries, ref=\arabic*, itemsep=1.5ex, #2]%
        }
        
        \newenvironment{Exmps}[1][]
        {%
            \ifstrequal{#1}{start}
            {\my@start@example{}{series=resumable-series}}%
            {%
                \ifstrequal{#1}{continued}
                {\my@start@example{[continued]}{resume=resumable-series}}
                {\my@start@example{}{}}%
            }%
        }
        {\end{enumerate}%
    \end{exmps}%
}
\makeatother

\usepackage{varioref}
\usepackage[colorlinks=true]{hyperref}
\usepackage{cleveref}
\crefname{Exmps}{Example}{Examples}

\begin{document}
    \begin{Exmps}
        \item \label{1}
                First example
        \item \label{2}
                Second example
    \end{Exmps}
    \vref{1}
\end{document}

产生以下输出:

在此处输入图片描述

如何将生成的前缀字符串“item”更改\vref为“example”?

答案1

Exmps代码中的环境调用了 1 级环境enumerate。与此环境关联的计数器称为enumi。指令

\crefname{Exmps}{Example}{Examples}

不会产生您想要的效果,因为 的第一个参数中需要的相关计数器变量\crefname不是Exmps而是enumi。该cleveref包包含将计数器enumi(以及它的兄弟enumiienumiii等)与标签字符串“item”关联的代码。这就是为什么\vref在您的示例中生成“item”作为前缀字符串的原因。

现在,我认为运行是一个非常糟糕的主意\crefname{enumi}{Example}{Examples},因为 1 级枚举环境也可能出现在文档的其他地方,对吗?

解决方案是使用包的机制enumitem(具体来说,包的\newlist\setlist命令)来创建一个定制的枚举类环境,该环境可获得您想要的所有格式化功能。在下面的解决方案中,此定制环境称为examplenum,相关计数器称为examplenumi。现在,\crefname{examplenumi}{Example}{Examples}对的输出产生了预期的效果\vref

在此处输入图片描述

\documentclass{article}
\usepackage{amsthm}
\usepackage{enumitem}
\usepackage{etoolbox}

\usepackage{varioref}
\usepackage[colorlinks=true]{hyperref}
\usepackage{cleveref}

\newlist{examplenum}{enumerate}{1}
\setlist[examplenum]{label=\arabic*., font=\bfseries, 
                    ref=\arabic*, itemsep=1.5ex, left=0pt}
\crefname{examplenumi}{Example}{Examples}

\newtheoremstyle{myexcstyle}{3ex}{3ex}{}{}{\scshape}{:}{.5em}{}
\theoremstyle{myexcstyle}
\newtheorem*{exmps}{Examples}

\makeatletter
\newcommand*{\my@start@example}[2]{%
   \begin{exmps}#1
   \mbox{}\par\nobreak\vskip -0.5ex\@nobreaktrue
   \begin{examplenum}[#2]}
\newenvironment{Exmps}[1][]{%
   \ifstrequal{#1}{start}
   {\my@start@example{}{series=resumable-series}}%
   {\ifstrequal{#1}{continued}
     {\my@start@example{[continued]}{resume=resumable-series}}
     {\my@start@example{}{}}}}
   {\end{examplenum}%
    \end{exmps}}
\makeatother

\begin{document}
\begin{Exmps}
   \item \label{ex:1} First example
   \item \label{ex:2} Second example
\end{Exmps}
\clearpage % force a page break
\vref{ex:1} \dots
\end{document}

相关内容