是否可以将的扩展保存\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
可扩展,但超链接版本不可扩展。
的当前版本为crossreftools
0.9(今天(2019/01/03)上传至 CTAN),\crtcref
等宏来自 v0.1,但是,v.0.9 包含\crtcref
和的一个小错误修复\crtCref
,报告错误的参考编号,v.0.8。一个额外的宏'crtcrefcountervalue
。
答案2
\cref
和它们的大写变体都不可\cref*
扩展,因此将它们存储在宏中将\edef
不起作用。
这是一个旁路解决方案。
cleveref
存储带有后缀的标签@cref
,因此\label{sec}
生成标签名称sec
和sec@cref
。othersec
(见下面的代码)的标签是\newlabel{othersec@cref}{{[section][2][]2}{1}}
{[section][2][]2}
计数器类型的相关信息在哪里(section
这里,[2]
代表部分编号2
,但是我还没能弄清楚它的含义[]2
。\getrefnumber
通过refcount
包提取标签名称下存储的内容,这在的情况下更为复杂cleveref
,但使用名为的“拆分器”宏,\split@@internal
该宏仅将第一个内的内容留[]
在输入流中,可以提取计数器类型,即section
这里。cleveref
将\cref@section@name
和定义为保存和的\Cref@section@name
单数名称的宏,其他计数器也类似,取决于和的参数。section
Section
\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}