如何在通过“\cref”交叉引用枚举项时显示章节编号

如何在通过“\cref”交叉引用枚举项时显示章节编号

在我的书中,该exercise部分的定义如下:

\newlist{exercise}{enumerate}{5}
\setlist[exercise]{
    label*=\thechapter.\arabic*.,
    ref=\thechapter.\arabic*, 
    before={%
        \section*{\hfil{Exercises -- \thechapter}}%
        \markright{\S Exercises -- \thechapter}%
        \addcontentsline{toc}{section}{Exercises -- \thechapter}%
        \setlist*[enumerate,1]{ref=\theexercisei.~\arabic*}%
        \setlist*[enumerate,2]{ref=\theenumi.(\alph*)}%
    },
}
\setlist*[enumerate,2]{ref=\theenumi.(\alph*)}

当使用 交叉引用练习中的项目时\cref,从我之前问过这个问题,我在代码中添加了以下代码片段:

\crefname{exercisei}{exercise}{exercises}
\crefname{exerciseii}{exercise}{exercises}
\crefname{exerciseiii}{exercise}{exercises}

输出不完整。它正确地生成了“第 # 页中的练习 1.1”,但对于较低级别的项目却失败了。在那里,它显示了子项目和子子项目的前缀字符串“item”。如何修复后面的部分?请帮忙。

以下是 MWE:

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

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

\newlist{exercise}{enumerate}{5}
\setlist[exercise]{
    label*=\thechapter.\arabic*.,
    ref=\thechapter.\arabic*, 
    before={%
        \section*{\hfil{Exercises -- \thechapter}}%
        \markright{\S Exercises -- \thechapter}%
        \addcontentsline{toc}{section}{Exercises -- \thechapter}%
        \setlist*[enumerate,1]{ref=\theexercisei.~\arabic*}%
        \setlist*[enumerate,2]{ref=\theenumi.(\alph*)}%
    },
}
\setlist*[enumerate,2]{ref=\theenumi.(\alph*)}

\crefname{exercisei}{exercise}{exercises}
\crefname{exerciseii}{exercise}{exercises}
\crefname{exerciseiii}{exercise}{exercises}

\begin{document}
    \chapter{One}
    \begin{exercise}
        \item \label{1}
                First exercise.
        \item 
                \begin{enumerate}[label=(\alph*)]
                    \item \label{1a}
                            Question
                            \begin{enumerate}[label=(\roman*), font=\itshape, noitemsep, topsep=0pt]
                                \item \label{1ai}
                                        Qn
                            \end{enumerate}
                \end{enumerate}
    \end{exercise}
    \newpage
    \vref{1}, \vref{1a}, \vref{1ai}
\end{document}

答案1

正如之前的评论中所提到的,我认为覆盖基本enumerate列表环境的默认属性是一个糟糕的想法——除非你绝对确定你永远不会enumerate在文档的其他地方使用环境。

我强烈建议您使用包的机制enumitem(特别是它的\newlist\setlist宏)来定义 3 个级别(或更多,如果您愿意的话)的自定义枚举类列表环境。在下面的代码中,我exlist为这个新的列表环境选择了名称;当然,您可以自由地想出一个不同的名称——只要它不是enumerate……与 1 级、2 级和 3 级列表相关的计数器exlist称为exlistiexlistiiexlistiii。为了告知cleveref(并间接地告知varioref)应如何交叉引用此类对象,请发出适当的\crefname指令;见下文。

在此处输入图片描述

在此处输入图片描述

\documentclass{book}
\usepackage{enumitem}
\newlist{exlist}{enumerate}{3}
\setlist[exlist,1]{left=0pt,
         label=\thechapter.\arabic*.,
         ref=  \thechapter.\arabic*, 
         before={%
             \section*{\centering Exercises -- \chaptername\ \thechapter}
             \markright{\S\  Exercises -- \chaptername\ \thechapter}
             \addcontentsline{toc}{section}{Exercises -- \thechapter}}
        }
\setlist[exlist,2]{left=0pt,
         label=(\alph*),
         ref=  \theexlisti.(\alph*)
        }
\setlist[exlist,3]{left=0pt,nosep,
         label=(\textit{\roman*}),
         ref=  \theexlistii(\textit{\roman*})
        }

% Load 'varioref' first, 'hyperref' second, 'cleveref' third:
\usepackage{varioref}
\usepackage[colorlinks=true]{hyperref}
\usepackage{cleveref}
\crefname{exlisti}{exercise}{exercises}
\crefname{exlistii}{exercise}{exercises}
\crefname{exlistiii}{exercise}{exercises}

\begin{document}
\setcounter{chapter}{1}

\begin{exlist} % start a level-1 list
\item \label{1} First exercise.
\item \begin{exlist} % start a level-2 list
      \item \label{12a} First part of the second exercise.
            \begin{exlist} % start a level-3 list
            \item \label{12ai}  Qn 1
            \item \label{12aii} Qn 2
            \end{exlist}
      \item \label{12b} Second part of the second exercise.
      \end{exlist}
\end{exlist}


\newpage
\vref{1}

\Vref{12a,12b}

\vref{12ai,12aii}
\end{document}

相关内容