0

I want the output from the command

\cref{prob:third-problem,prob:fourth-problem}

on the first line of the content of the first chapter — the one whose output (with two ??s) is marked in the displayed page below — will become "Exercises 2.3 and 2.4" (without any quotes), just like any other command of the form \cref{first,second}.

(And similarly for something like \cref{first,fourth,fifth} with a list of more than two problem references.)

How can this be done with cleveref?

\documentclass{memoir}

% theorems    
\usepackage{amsthm}
\usepackage{thmtools}

\declaretheoremstyle[
  headformat=\NAME\NOTE,
  headfont= \sffamily\bfseries,
  headpunct={\vspace{\topsep}\newline},
  numbered=no,
  spaceabove=3\topsep,
  postheadspace=0pt    
]{probs}
\declaretheorem[
  name=EXERCISES,
  style=probs,
]{problemscontent}

\newenvironment{problems}
{\problemscontent}
{\endproblemscontent}

% lists
\usepackage{enumitem}

% For exercises
\newcounter{problemnumber} % number exercises within each chapter

\newlist{problemsenum}{enumerate}{3}
\setlist[problemsenum,1]{%...
    label=\bfseries\sffamily\arabic*.,
    ref={\arabic*}, % strips formatting!
    before=\leavevmode \vspace{-\dimexpr\baselineskip+\topsep\relax},
    after=\stepcounter{problemsenumi}\setcounter{problemnumber}{\value{problemsenumi}},
    start=\value{problemnumber}
}
\makeatletter
\renewcommand{\p@problemsenumi}{\maybe@thechapter{\thechapter}}
\protected\def\maybe@thechapter#1{%
  \ifnum#1=\value{chapter}%
  \else
    #1.%
  \fi
}
\makeatother

\newlist{problempartsenum}{enumerate}{2}
\setlist[problempartsenum,1]{%
    label=\bfseries\sffamily(\alph*),
    ref={(\alph*)},%, % strips formatting!
    before=\vspace{\dimexpr+6pt-\medskipamount\relax},
}

% links
\usepackage[pdftex]{hyperref} 
\hypersetup{%
  breaklinks=true,%
  colorlinks, citecolor=red,%
}

%% Allow ref to section n, not section m.n
%% From 'third installment' of  answer by Christian Hupfer 
%% https://tex.stackexchange.com/a/383608
\usepackage{xparse,xassoccnt}
\usepackage[user,hyperref]{zref}
\RegisterPostLabelHook{\zlabel}
% Replace \arabic{section} with \Roman{section} etc. as needed:
\makeatletter
\zref@newprop{section}{\arabic{section}} 
\zref@addprop{main}{section}
\newcommand{\secref}[1]{%
  \zref@ifrefundefined{#1}{%
    \ref{#1}}{%
    \hyperlink{\zref@extract{#1}{anchor}}%
       {\zref@extract{#1}{section}}}}
 \makeatother
%% End of code from Christian Hupfer's answer

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

\crefformat{problemsenumi}{#2Exercise~#1#3}
\Crefformat{problemsenumi}{#2Exercise~#1#3}
\crefformat{problemscontent}{#2\textnormal{#3}}
\Crefformat{problemscontent}{#2\textnormal{#3}}

\newcommand\crefprob[2]{\cref{#1}~\ref{#2}}
\newcommand\crefrangeprob[2]{Exercises~\textup{\ref{#1}}--\textup{\ref{#2}}}
\newcommand\crefrangeprobpart[2]{\textup{\ref{#1}}--\textup{\ref{#2}}}
\newcommand\crefprobandrangeprobpart[3]{\cref{#1}~\textup{\ref{#2}}--\textup{\ref{#3}}}

\begin{document}

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

See \cref{prob:first-problem} in a different chapter. And \cref{prob:third-problem,prob:fourth-problem}.

See also \cref{prob:chap1-number2}~\ref{prob-part:one-part-b}, that is, 
\crefprob{prob:chap1-number2}{prob-part:one-part-b}.

And consider \crefrangeprob{prob:chap1-number1}{prob:chap1-number2} in this chapter.

What about parts \crefrangeprobpart{prob-part:one-part-a}{prob-part:one-part-b} 
of \cref{prob:chap1-number2} in this chapter?
That is, \crefprobandrangeprobpart{prob:chap1-number2}{prob-part:one-part-a}{prob-part:one-part-b}.

Or \crefprobandrangeprobpart{prob:first-problem}{prob-part:first-problem-part-a}{prob-part:first-problem-part-b} 
in another chapter.

\begin{problems}
\begin{problemsenum}

\item\label{prob:chap1-number1}
A question.

\item\label{prob:chap1-number2}

\begin{problempartsenum}

\item\label{prob-part:one-part-a}
Why is $a = b$?

\item\label{prob-part:one-part-b}
Why is $d = c$?

\item\label{prob-part:one-part-c}
Is $x=y$?

\end{problempartsenum}

\end{problemsenum}

\end{problems}

%%%
\chapter{Second}\label{chap:2}
\setcounter{problemnumber}{1}

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


And see \crefrangeprob{prob:third-problem}{prob:fifth-problem}.

\section{First section}

\begin{problems}\label{probs:seconeprobs}
\begin{problemsenum}

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

\begin{problempartsenum}

\item\label{prob-part:first-problem-part-a}
Why is $a = b$?

\item\label{prob-part:first-problem-part-b}
Why is $d = c$?

\item\label{prob-part:first-problem-part-c}
Is $x=y$?

\end{problempartsenum}

\item 
Second problem.

\end{problemsenum}
\end{problems}

\section{Second section}

\begin{problems}\label{probs:sectwoprobs}
\begin{problemsenum}

\item \label{prob:third-problem}
First problem.

\item \label{prob:fourth-problem}
Second problem.

\begin{problempartsenum}

\item\label{prob-part-fourth-problem-part-a}
Is it?

\item\label{prob-part-fourth-problem-part-b}
Why not?

\end{problempartsenum}

\item \label{prob:fifth-problem}
Fifth problem.

\end{problemsenum}
\end{problems}

\end{document}

Missing cleveref plural and "and".

Notes:

  1. The problems environment has been defined in a special way so as to allow cleveref references to items enumerated there, without that environment itself being a numbered theorem-like environment. That and associated command and cleveref constructions are gleaned from various answers in other posts. Those posts include Reference with just part of section number after decimal point and How use cleveref to get theorem-like name and list item number?.
  2. My actual, much more complex document, does use the memoir document class. However, for this MWE, the book class likely could be used as well, possibly if additional packages were explicitly loaded.
  • This can be fixed by including \crefname{problemsenumi}{Exercise}{Exercises} in the preamble. Unfortunately, if the \cref argument consists of more than two items for the problemsenumi type, such as \cref{prob:third-problem,,prob:chap1-number2,,prob:fourth-problem}, then the output "Exercises 2, 2.3 and 2.4" is missing the desired Oxford comma (the comma preceding the "and". – murray Aug 3 at 20:43
  • The Oxford comma issue is addressed in a new post: tex.stackexchange.com/questions/502718/…. – murray Aug 3 at 21:09
  • Sorry, I should have searched first: the Oxford comma issue was solved in tex.stackexchange.com/a/161340/13492. – murray Aug 3 at 21:16
0

This can be fixed by including

\crefname{problemsenumi}{Exercise}{Exercises}

in the preamble.

(The missing Oxford (serial) comma that I prefer can be inserted as answered in Can cleveref be made to use the Oxford comma for multiple citations?, namely, by including \newcommand{\creflastconjunction}{, and\nobreakspace}.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.