在我的书中,该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
称为exlisti
、exlistii
和exlistiii
。为了告知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}