获取 \cref 的扩展

获取 \cref 的扩展

是否可以将的扩展保存\cref在宏中?我的尝试

\documentclass{article}
\usepackage{cleveref}

\begin{document}
\section{This is a section}
\label{sec}

\edef\temp{\expandafter\empty\cref{sec}}
\show\temp

\end{document}

由于一些不明显的错误而失败。

答案1

为了使第一个答案以一种更简短的方式不混淆,我使用我的包中的\crtcref\crtCref宏提供了第二个解决方案crossreftools

\documentclass{article}
\usepackage{cleveref}
\usepackage{crossreftools}

\begin{document}

\section{This is a section}
\label{sec}

\edef\temp{\crtcref{sec}}

\edef\Temp{\crtCref{sec}}


Content of reference: \temp\ or \Temp
\end{document}

请注意,\cref\Cref不可扩展,而\crtcref\crtCref可扩展,但超链接版本不可扩展。

在此处输入图片描述

的当前版本为crossreftools0.9(今天(2019/01/03)上传至 CTAN),\crtcref等宏来自 v0.1,但是,v.0.9 包含\crtcref和的一个小错误修复\crtCref,报告错误的参考编号,v.0.8。一个额外的宏'crtcrefcountervalue

答案2

\cref和它们的大写变体都不可\cref*扩展,因此将它们存储在宏中将\edef不起作用。

这是一个旁路解决方案。

  1. cleveref存储带有后缀的标签@cref,因此\label{sec}生成标签名称secsec@cref
  2. othersec(见下面的代码)的标签是

    \newlabel{othersec@cref}{{[section][2][]2}{1}}
    

    {[section][2][]2}计数器类型的相关信息在哪里(section这里,[2]代表部分编号2,但是我还没能弄清楚它的含义[]2

  3. \getrefnumber通过refcount包提取标签名称下存储的内容,这在的情况下更为复杂cleveref,但使用名为的“拆分器”宏,\split@@internal该宏仅将第一个内的内容留[]在输入流中,可以提取计数器类型,即section这里。

  4. cleveref\cref@section@name和定义为保存和的\Cref@section@name单数名称的宏,其他计数器也类似,取决于和的参数。sectionSection\crefname\Crefname

{}请注意标签周围的包装对cleveref- 可以将其与\split@internal和一起使用\split@@internal

\xcref\Xcref不是或的包装器,\cref而是\Cref一个旁路。

我已经在输出中重复了部分值,\xcref\Xcref\getrefnumber{#1}其中评估了通常的标签。

代码还会\xcref检查\Xcref标签名称是否存在,如果标签尚未定义则提供“无”内容——这对于文档的第一次编译运行或文件删除后非常重要.aux

\label请注意:当与引入的可选参数一起使用时,此处的方法可能会失败cleveref——我尚未对此进行测试。


\documentclass{article}
\usepackage{hyperref}
\usepackage{cleveref}


\makeatletter
\def\split@@internal[#1][#2][#3]#4{#1}%

\def\split@internal#1{%
  \expandafter\split@@internal#1%
}




\newcommand{\Xcref}[1]{%
  \IfRefUndefinedExpandable{#1@cref}{%
  }{%
    \csname Cref@\expandafter\split@internal\getrefnumber{#1@cref}@name\endcsname\ \getrefnumber{#1}%
  }%
}

\newcommand{\xcref}[1]{%
  \IfRefUndefinedExpandable{#1@cref}{%
  }{%
    \csname cref@\expandafter\split@internal\getrefnumber{#1@cref}@name\endcsname\ \getrefnumber{#1}%
  }%
}

\makeatother


\begin{document}

\edef\tmp{\Xcref{othersec}}

\section{This is a section and is followed by \Xcref{othersec}}
\label{sec}

\section{Other section}\label{othersec}

or use \tmp




\end{document}

在此处输入图片描述

相关内容