在自定义计数器部分中有参考

在自定义计数器部分中有参考

我有一些“项目”,我想在整个文档中计数和引用它们。这些项目通常是方程式。我还有一些不同类型的“项目”,我想通过标签上的前缀来区分它们。

例如,对于“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添加了一个附加项。因此您需要将其删除。FFenumerateref

编辑:此外,如果您想要超链接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}

截屏

相关内容