如何在 cref 中显示参考名称来代替其编号

如何在 cref 中显示参考名称来代替其编号

是否可以使用 来替换多重引用中的交叉引用名称以代替其编号\cref?我想定义一个\fullref用于引用章节名称的命令:

代码:

\section{First Section}
label{sec:first}
\section{Second Section}
\label{sec:second}
\section{fullref command}
As discussed in \fullref{sec:first,sec:second} ...

文本:如“第一节和第二节”中所述......

代码\nameref不会在参考名称前输入单词“Sections”,也不能用于多个参考。

此外,对于仅引用一个标签及其名称而不是编号(包括其类型),这里有一个很好的答案: 如何在 autoref 中显示标签名称来代替其编号

答案1

一个hackish版本,结合了列表和计数器。最复杂的东西是获取and中间值以及扩展。

简短解释:

标签的逗号分隔值列表存储到etoolbox列表中,然后使用包装器命令将其拆分为单个引用\nameref(由于扩展问题)。外部计数器labelcount用于计算引用的数量,以跟踪一个或多个引用(单数/复数)和连词的问题and。所有内容都在一个组内,因此这不应该有任何副作用。

带星号的版本依次\fullref使用。(这是我对这个问题的回答的基本想法:\nameref*如何在 autoref 中显示标签名称来代替其编号

\documentclass{book}

\usepackage{blindtext}
\usepackage{etoolbox}
\usepackage{xparse}
\usepackage{hyperref}

\usepackage{cleveref}



\newcommand{\andconjunctionname}{%
  and
}

\newcommand{\checkforlastitem}[2]{%
  \ifnumequal{#1}{#2}{%
    \ignorespaces
  }{%
  }%    
}

\NewDocumentCommand{\namerefwrap}{sm}{%
  \stepcounter{myrefscounter}%
  \IfBooleanTF{#1}{%
    \nameref*{#2}\checkforlastitem{\value{myrefscounter}}{\value{labelcount}}
  }{%
    \typeout{Link reference #2}%
    \nameref{#2}\checkforlastitem{\value{myrefscounter}}{\value{labelcount}}
  }%
  \ifnumgreater{\value{labelcount}}{1}{% Only add an `and` if there is more than one label
    \ifnumequal{\value{myrefscounter}}{\value{labelcount}}{%
    }{% Only add an `add`, if it's not the last label
      \andconjunctionname%
    }%
  }{%
  }%
}



\newcounter{labelcount}%

\newcommand{\addlabelstolist}[2]{%
  \stepcounter{labelcount}% Count the labels
  \listadd{#1}{#2}%
}

\newcounter{myrefscounter}%

\newcommand{\getrefelement}[2]{%
  \setcounter{myrefscounter}{0}%
  \renewcommand*{\do}[1]{%
    \ifnumequal{\value{myrefscounter}}{#1}{%
      \gdef\firstref{##1}\listbreak% Brute force  ;-)
    }{%
      \stepcounter{myrefscounter}%
    }%
  }%
  \dolistloop{#2}%
}


\NewDocumentCommand{\fullref}{s+m}{%
  \begingroup
  \setcounter{labelcount}{0}%
  \listadd{\myrefs}{}%
  \forcsvlist{\addlabelstolist{\myrefs}}{#2}%
  % Get the first element for the \namecref command
  \getrefelement{0}{\myrefs}%
  \ifnumgreater{\value{labelcount}}{1}{%
    \namecrefs{\firstref}
  }{%   
    \namecref{\firstref}
  }%
  % Expand the label list
  \setcounter{myrefscounter}{0}%
  \IfBooleanTF{#1}{%
    \forlistloop{\namerefwrap*}{\myrefs}%
  }{%
    \forlistloop{\namerefwrap}{\myrefs}%
  }%
  \endgroup
}

\begin{document}
\chapter{First} \label{firstchapter}
\section{First section} \label{firstsection}
\section{Second section} \label{secondsection}


\chapter{Second}
In \fullref*{firstchapter,thirdchapter} we saw ... whereas in \fullref{firstsection,secondsection} there was some 

 \blindtext

\chapter{Third} \label{thirdchapter}


\end{document}

在此处输入图片描述

相关内容