是否可以使用 来替换多重引用中的交叉引用名称以代替其编号\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}