![在自定义计数器部分中有参考](https://linux22.com/image/401474/%E5%9C%A8%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AE%A1%E6%95%B0%E5%99%A8%E9%83%A8%E5%88%86%E4%B8%AD%E6%9C%89%E5%8F%82%E8%80%83.png)
我有一些“项目”,我想在整个文档中计数和引用它们。这些项目通常是方程式。我还有一些不同类型的“项目”,我想通过标签上的前缀来区分它们。
例如,对于“foo”项目,我可以在相应的标签上选择“F”前缀。
我想用两种方式来计算:
在自定义枚举环境中,计数器会通过命令自动增加
\item
。在章节或其他类似的地方,我在章节的文本旁边添加了对该项目的引用
在这两种用例中,我都希望定义一个用于交叉引用的标签。此外,标签应该有一个前缀,以帮助了解引用了哪些类型的项目。
这是一个 MVE
\documentclass[en,12pt]{article}
\usepackage{ifthen}
\usepackage{enumitem}
\usepackage{hyperref}
\usepackage{prettyref}
% Define a new set of "things" to be counted
\newcommand{\DefEnumStuff}[3]{%
\newcounter{count#2}%
\setcounter{count#2}{0}%
% add a new enumerate command
\newenvironment{#1}%
{\let\olditem\item%
\begin{enumerate}[label={#3\arabic*}., ref={#3\arabic*}]%
\setcounter{enumi}{\value{count#2}}%
\renewcommand{\item}[1][]{%
\refstepcounter{count#2} \olditem%
\ifthenelse{ \equal{####1}{} }{}{\label{####1}}%
}%
}%
{\end{enumerate}}%
% add command to increase the counter outside the enumerate environment and define a label
\expandafter\newcommand\csname refstep#2\endcsname[1] {{\refstepcounter{count#2}\label{##1}}}%
}%
\newrefformat{foo}{F\ref{#1}}%
% define "foo" items to be counted.
% Have enumerate-like environment named "foo"
% and command "\refstepfoo" for use cases 1 and 2
\DefEnumStuff{foo}{foo}{F}
\begin{document}
\begin{foo}
\item[foo:A] foo A
\item[foo:B] foo B
\end{foo}
\begin{foo}
\item C
\end{foo}
As seen in \ref{foo:A}
\refstepfoo{foo:D}
\section*{Example (\ref{foo:D})} % expected Example F4
\end{document}
在我的系统上我得到以下结果
在我看来它是有效的,只是我想将“示例”部分中的引用读作“示例 (F4)”而不是“示例 (4)”。
你能帮我实现这个吗?欢迎就整体想法提出进一步的建议!
短暂性脑缺血发作
答案1
这里的问题是你没有prettyref
正确使用。当你定义一个时\newrefformat
,你需要使用\prettyref
才能真正使用它。\ref
继续正常工作——它是不是被覆盖。这就是为什么您在您的部分中只能看到4
而不是。F4
但是,当您\ref
在\prettyref
所有地方替换为时,您会注意到引用F1
现在将被打印为,FF1
因为在您已在's字段中设置的前缀前面\prettyref
添加了一个附加项。因此您需要将其删除。F
F
enumerate
ref
编辑:此外,如果您想要超链接F4
而不是仅仅4
超链接,那么您必须手动调用\hyperref
:
\newrefformat{foo}{\hyperref[{#1}]{F\ref*{#1}}}
我使用\ref*
来抑制超4
链接,然后使用\hyperref
超链接F4
。
最后的工作示例是:(
我还简化了必须输入foo:X
项目标签的过程,只需输入即可X
,因为您已经里面 foo
环境。)
\documentclass[en,12pt]{article}
\usepackage{ifthen}
\usepackage{enumitem}
\usepackage{hyperref}
\usepackage{prettyref}
% Define a new set of "things" to be counted
\newcommand{\DefEnumStuff}[3]{%
\newcounter{count#2}%
\setcounter{count#2}{0}%
% add a new enumerate command
\newenvironment{#1}%
{\let\olditem\item%
\begin{enumerate}[label={#3\arabic*}., ref={\arabic*}]%
\setcounter{enumi}{\value{count#2}}%
\renewcommand{\item}[1][]{%
\refstepcounter{count#2}\olditem%
\ifthenelse{ \equal{####1}{} }{}{\label{#2:####1}}%
}%
}%
{\end{enumerate}}%
% add command to increase the counter outside the enumerate environment and define a label
\expandafter\newcommand\csname refstep#2\endcsname[1] {%
{\refstepcounter{count#2}\label{#2:##1}}%
}%
}
\newrefformat{foo}{\hyperref[{#1}]{F\ref*{#1}}}
% define "foo" items to be counted.
% Have enumerate-like environment named "foo"
% and command "\refstepfoo" for use cases 1 and 2
\DefEnumStuff{foo}{foo}{F}
\begin{document}
\begin{foo}
\item[A] foo A
\item[B] foo B
\end{foo}
\begin{foo}
\item C
\end{foo}
As seen in \prettyref{foo:A}
\refstepfoo{D}
\section*{Example (\prettyref{foo:D})} % expected Example F4
\end{document}