如何在枚举环境中获取自定义计数器以及如何标记和引用项目?

如何在枚举环境中获取自定义计数器以及如何标记和引用项目?

在我的枚举环境中,我希望有类似的东西\myitem,它会自动打印3(a).3(b).等等。(当然,常规的\items 仍然会打印常规的1.2.,等等。)
顺便说一句,我还希望能够标记和引用(具有可点击功能)任何一种计数器。简而言之,我想输入

‎\item‎‎ ‎foo‎‎
‎\item\label{itm1}‎‎ ‎bar‎‎
‎\myitem Something
‎\myitem\label{myitm3b} ‎Something‎‎ ‎else‎‎‎
‎\item‎ ‎foobar‎‎  
Let's refer to \ref{itm1} and \ref{myitm3b} to ...

并得到

     1. foo
     2. ‎bar‎‎
  3(a). Something‎‎  
  3(b). Something‎‎ ‎else‎
 ‎    ‎4.‎ foobar‎‎  
     Let's refer to 1. and 3(b). to ...

我在这个网站上找到了类似的问题,但没有一个对我有用。

答案1

您可以定义\myitem使用自定义计数器作为标签的第二部分:

在此处输入图片描述

笔记:

  • 连续使用\myitem将产生后续的字母字符,并且任何使用常规的\item都会将下一次使用重置\myitem为从开始,如下面的测试用例(a)所示。5(a)
  • 按照Heiko Oberdiek 的建议我用\refstepcounter计数器代替\stepcounter以便提供用于hyperref
  • 非常感谢T·弗伦提供链接至公理或假设的自定义枚举\myitem对于我所缺少的缺失部分,即如何在通过 引用时设置自定义标签\ref
  • 我用包裹enumitemenumitem用于列表处理,但如果需要的话,这个解决方案应该能够适应而不需要这样做。
  • 我用过newtoggleetoolbox因为我更喜欢那个语法而不是\newif语法。但如果你不想包含额外的包,那么调整它以使用应该相当简单\newif其他一些条件方法

代码:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{enumitem}
\usepackage{hyperref}% For hyperref testing.

\newcounter{MyCounter}
\newtoggle{AlreadyInMyItem}

\let\OldItem\item
\def\item{%
    \global\togglefalse{AlreadyInMyItem}%
    \setcounter{MyCounter}{0}%
    \OldItem%
}

\makeatletter
\def\myitem{%
    \OldItem[%
        \iftoggle{AlreadyInMyItem}{}{%
            \stepcounter{enumi}%
            \global\toggletrue{AlreadyInMyItem}%
        }%
        \refstepcounter{MyCounter}\theenumi%
        (\alph{MyCounter}).]%
         % Use "\protected@edef" here as per David Carlisle as it is safer
        \protected@edef\@currentlabel{\theenumi(\alph{MyCounter})}%
}%
\makeatother

\begin{document}
\begin{enumerate}[align=right]
    \item‎‎ ‎foo‎‎
    ‎\item\label{itm1}‎‎ ‎bar‎‎
    ‎\myitem Something
    ‎\myitem\label{myitm3b} ‎Something‎‎ ‎else‎‎‎
    ‎\item‎ ‎foobar‎‎  
    ‎\myitem Something
    ‎\myitem\label{myitm5b} ‎Something‎‎ ‎else‎‎‎
\end{enumerate}
%\clearpage% For hyperref testing.
Let's refer to \ref{itm1} and \ref{myitm3b}.
\end{document}

答案2

这是布尔值的解决方案\newif

\documentclass{article}
\usepackage{enumitem}
\usepackage{hyperref}
\makeatletter
\newcounter{vdcount}
\newif\ifvdam
\let\origitem\item
\def\item{%
  \global\vdamfalse
  \setcounter{vdcount}{0}%
  \origitem
}
\def\fancyitem{%
  \origitem[%
    \ifvdam\else
      \stepcounter{enumi}%
      \global\vdamtrue
    \fi
    \refstepcounter{vdcount}%
    \theenumi(\alph{vdcount}).%
  ]%
  \protected@edef\@currentlabel{\theenumi(\alph{vdcount})}%
}
\makeatother

\begin{document}
\begin{enumerate}[align=right]
  \item foo.
  \item\label{itm1} bar.
  \fancyitem Something.
  \fancyitem\label{myitm3b} Something else.
  \item foobar.
  \fancyitem Something.
  \fancyitem\label{myitm5b} Something else.
\end{enumerate}

Referring to items~\ref{itm1} and \ref{myitm3b}.
\end{document} 

相关内容