如何为动态定义标签前缀的环境创建上下文相关的参考名称?

如何为动态定义标签前缀的环境创建上下文相关的参考名称?

背景:我问了一个比较混乱的问题,但相关问题早些时候。我收到了曼努埃尔(Manuel)的出色回答但我对这个问题的困惑意味着我不幸问错了问题。所以这是一个不同的问题,尽管内容相似,但我希望这可能是A正确的问题,即使不是正确的问题。


我正在尝试创建一个新环境来排版枚举列表。该环境设计为采用一个强制参数,通常是一个字母。这用作列表中项目的前缀。因此,如果字母是a,则项目将被标记为a1a2依此类推。标签的排版方式是字母采用小写字母。对项目的引用也应使用小写字母,但有时我希望将字母设置为大写字母,例如在句子开头。

我一直在尝试组合cleverefenumitem实现此结果。列表中的标签没有问题,因为label=\textsc{<letter>}\arabic*它可以很好地完成工作。

但是,为了便于在句子开头使用不同的格式,我将 选项与 一起使用enumitemref然后label,我希望正确\Cref设置\cref标签的格式。但是,我不知道该怎么做。

如果我在项目的参考资料中包含字母,例如ref=<letter>\arabic*,那么我可以使用\creflabelformat{<type>}{<format>}将标签排版为小写字母。但这对上下文不敏感。\Cref\cref假设任何大小写差异都会影响姓名与引用类型相关,而不是特定项目引用本身的内容。

因此,我使用并尝试使用和ref=\arabic*设置字母前缀。但是,这意味着我需要在自定义环境中使用和创建自定义格式。问题是这些定义不是全局的,因此当我在文档的其他地方使用或时,它们没有被定义。\crefname\Crefname\crefname\Crefname\cref\Cref

如何在没有预先定义的情况下获得所需的结果\crefname以及\Crefname我需要的字母?

\documentclass{article}
\usepackage{xparse,enumitem,cleveref,ebgaramond}
\NewDocumentEnvironment{lettered}{ O {} m }{%
  \let\labelorig\label
  \def\label##1{\labelorig[lettered#2]{##1}}%
  \crefname{lettered#2}{\textsc{#2}}{\textsc{#2}}%
  \Crefname{lettered#2}{\MakeUppercase{#2}}{\MakeUppercase{#2}}%
  \begin{enumerate}[label=\textsc{#2}\arabic*., ref=\arabic*, #1]
}{%
  \end{enumerate}%
}
\begin{document}
Some examples:
\begin{lettered}{t}
  \item\label{t:thing} A thing.
  \item\label{t:another} Another thing.
\end{lettered}
\begin{lettered}{c}
  \item\label{c:claim} A claim.
  \item\label{c:different} A different claim.
\end{lettered}
The actual output is the next sentence.
\Cref{t:thing} and \cref{t:another} are the subject of claims \cref{c:claim} and \cref{c:different}.
The desired output is the next sentence.
T1 and \textsc{t}2 are the subject of claims \textsc{c}1 and \textsc{c}2.
\end{document}

prefixed referencing

答案1

好吧。我是个白痴。我可以盯着某个东西看一下午,但只能花 30 秒找到答案我发帖问一个问题。

事实证明,cleveref文档对于“单一”引用的构成有一个奇怪的想法。我天真地以为这Single Cross-References意味着交叉引用代币然后

交叉引用格式单身的\crefformat使用和命令来定义或重新定义交叉引用\Crefformat...

引入了关于排版交叉引用的讨论代币

但事实证明,文档指的是单个类型交叉引用,而不是单一代币交叉引用,正如我所料。这意味着我只需使用和\crefformat,就可以\Crefformat类型在我的自定义环境中创建的所有标签的交叉引用:

\documentclass{article}
\usepackage{xparse,enumitem,cleveref,ebgaramond}
\NewDocumentEnvironment{lettered}{ O {} m }{%
  \let\labelorig\label
  \def\label##1{\labelorig[lettered]{##1}}%
  \begin{enumerate}[label=\textsc{#2}\arabic*., ref=#2\arabic*, #1]
}{%
  \end{enumerate}%
}
\crefformat{lettered}{#2\textsc{#1}#3}
\Crefformat{lettered}{#2\MakeUppercase{#1}#3}
\begin{document}
Some examples:
\begin{lettered}{t}
  \item\label{t:thing} A thing.
  \item\label{t:another} Another thing.
\end{lettered}
\begin{lettered}{c}
  \item\label{c:claim} A claim.
  \item\label{c:different} A different claim.
\end{lettered}
The actual output is the next sentence.
\Cref{t:thing} and \cref{t:another} are the subject of claims \cref{c:claim} and \cref{c:different}.
The desired output is the next sentence.
T1 and \textsc{t}2 are the subject of claims \textsc{c}1 and \textsc{c}2.
\end{document}

以下是排版单个交叉引用的结果类型涉及四个交叉引用代币

a single cross-reference

相关内容