考虑一下代码
\documentclass{article}
\usepackage{listings}
\usepackage{cleveref}
\crefname{lstnumber}{line}{lines}
\Crefname{lstnumber}{Line}{Lines}
\begin{document}
\begin{lstlisting}[escapechar=@,numbers=left]
{A}@\label{lineref1}@
x:=1@\label{lineref2}@
{B}@\label{lineref3}@
y:=2@\label{lineref4}@
{C}@\label{lineref5}@
\end{lstlisting}
See the Hoare-triples at \namecrefs{lineref1} \ref{lineref1}--\ref{lineref3}, \ref{lineref3}--\ref{lineref5}.
%\labelcrefrange{lineref1}{lineref3}, \labelcrefrange{lineref3}{lineref5}
\end{document}
使用 (non-existing) 时\labelcrefrange
,输入可能会更抽象一些:每个文档只需提供一次范围的格式(而不是每次使用时都拼写出双连字符而不带空格)。 cleveref (或其他一些标准包)中是否存在这样的命令?
答案1
\labelcrefrange
当你想要的东西只需使用 就能产生时, 就不需要 (存在) \cref
。这是因为可以通过额外的逗号提供合适的“空标签”来防止交叉引用的压缩(参见cleveref
手动的)。
\documentclass{article}
\usepackage{listings}
\usepackage{cleveref}
\crefname{lstnumber}{line}{lines}
\Crefname{lstnumber}{Line}{Lines}
\newcommand{\crefrangeconjunction}{--}
%\newcommand{\creflastconjunction}{, }
\begin{document}
\begin{lstlisting}[escapechar=@,numbers=left]
{A}@\label{lineref1}@
x:=1@\label{lineref2}@
{B}@\label{lineref3}@
y:=2@\label{lineref4}@
{C}@\label{lineref5}@
z:=3@\label{lineref6}@
{D}@\label{lineref7}@
\end{lstlisting}
See the Hoare-triples at \namecrefs{lineref1} \ref{lineref1}--\ref{lineref3}, \ref{lineref3}--\ref{lineref5}.
%\labelcrefrange{lineref1}{lineref3}, \labelcrefrange{lineref3}{lineref5}
\noindent
See the Hoare-triples at
\cref{lineref1,lineref2,lineref3,,lineref3,lineref4,lineref5,,lineref5,lineref6,lineref7}.
\end{document}
要去掉“and”,请取消注释该行\newcommand{\creflastconjunction}{, }
。
答案2
您可以使用以下内部宏来定义它cleveref
\makeatletter
\DeclareRobustCommand{\labelcrefrange}[2]{\@crefrangenostar{labelcref}{#1}{#2}}
\makeatother