在我的枚举环境中,我希望有类似的东西\myitem
,它会自动打印3(a).
,3(b).
等等。(当然,常规的\item
s 仍然会打印常规的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
。 - 我用包裹
enumitem
这enumitem
用于列表处理,但如果需要的话,这个解决方案应该能够适应而不需要这样做。 - 我用过
newtoggle
过这etoolbox
因为我更喜欢那个语法而不是\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}