\newrefformat 在 \newenvironment 定义中不起作用

\newrefformat 在 \newenvironment 定义中不起作用

受到启发在自定义计数器部分中有参考,我开发了以下新环境。一切都很好,除了我调用\prettyref{dog:1}输出时只显示1代替狗1经过一些调试后,看起来\newrefformat环境内部的定义没有被执行。

\newenvironment{animals}[1][dog]%
{
    \newrefformat{#1}{\hyperref[{##1}]{\uppercase{#1} \ref*{##1}}}
    
    \newcount\IndexNum
    \IndexNum = 1
    \newcounter{count#1}%
    \setcounter{count#1}{0}%
    
    \let\olditem\item%
    \begin{enumerate}[label={\texttt{\uppercase{#1}\arabic*}}, ref={\arabic*}]%
    
        \setcounter{enumi}{\value{count#1}}%
        \renewcommand{\item}[1][]{%
            \refstepcounter{count#1}\olditem%
            \label{#1:\the\IndexNum} \global\advance\IndexNum by 1
        }%

}%
{\end{enumerate}}

我还附加了 MWE 供您参考。

\documentclass{article}

\usepackage{prettyref}
\usepackage{hyperref}
\usepackage{enumitem}

\newenvironment{animals}[1][dog]%
{
    \newrefformat{#1}{\hyperref[{##1}]{\uppercase{#1} \ref*{##1}}}
    
    \newcount\IndexNum
    \IndexNum = 1
    \newcounter{count#1}%
    \setcounter{count#1}{0}%
    
    \let\olditem\item%
    \begin{enumerate}[label={\texttt{\uppercase{#1}\arabic*}}, ref={\arabic*}]%
        
        \setcounter{enumi}{\value{count#1}}%
        \renewcommand{\item}[1][]{%
            \refstepcounter{count#1}\olditem%
            \label{#1:\the\IndexNum} \global\advance\IndexNum by 1
        }%
        
    }%
    {\end{enumerate}}

\begin{document}
    \begin{animals}
        \item Pitbull
        \item Boxer
    \end{animals}

\prettyref{dog:1} is Pitbull. 
\end{document}

当前输出为

电流输出

而预期的输出是

预期输出

答案1

命令\newrefformat的效果范围受到环境的限制。

查看prettyref包中的源代码,发现可以通过在其前面加上前缀来\global克服范围限制。

此外,尽管它有这个名字,但如果使用相同的参数重复使用,它不会\newcommand引发错误。因此,可以使用相同的可选参数拥有多个这样的环境。

\documentclass{article}

\usepackage{prettyref}
\usepackage{hyperref}
\usepackage{enumitem}

\newenvironment{animals}[1][dog]{%
    \global\newrefformat{#1}{\hyperref[{##1}]{\uppercase{#1}\ref*{##1}}}%
%    
    \newcount\IndexNum
    \IndexNum = 1
    \newcounter{count#1}%
    \setcounter{count#1}{0}%
%    
    \let\olditem\item
    \begin{enumerate}[label={\texttt{\uppercase{#1}\arabic*}}, ref={\arabic*}]
        
        \setcounter{enumi}{\value{count#1}}%
        \renewcommand{\item}[1][]{%
            \refstepcounter{count#1}\olditem%
            \label{#1:\the\IndexNum} \global\advance\IndexNum by 1
        }%
        
    }%
    {\end{enumerate}}

\begin{document}
    \begin{animals}
        \item Pitbull
        \item Boxer
    \end{animals}

\prettyref{dog:1} is Pitbull. 
\end{document}

在此处输入图片描述

相关内容