有没有办法检测代码当前是否在列表中,无论是itemize
,enumerate
还是description
?
注意:我用它enumitem
来配置列表。
动机:我之所以问这个问题是因为我的文档中的环境需要列表外部或内部不同的垂直间距。
\documentclass{article}
\usepackage{enumitem}
\newcommand{\IfInList}[2]{...} % How to define this?
\begin{document}
\begin{itemize}
\item \IfInList{code if in list}{code if not in list}
\end{itemize}
\IfInList{code if in list}{code if not in list}
\end{document}
答案1
我们可以通过在进入指定环境之一时增加计数器并在最后减少计数器来模拟堆栈。
该\IfInList
命令可以测试计数器是否为正。
该\listenvironments
命令可以多次发出,最好不要使用相同的环境名称(如果需要,我相信您可以自己解决问题)。
\ExplSyntaxOn
\NewDocumentCommand{\listenvironments}{m}
{
\clist_map_inline:nn { #1 }
{
\AddToHook{env/##1/begin}{\int_gincr:N \g_jinwen_list_int}
\AddToHook{env/##1/end}{\int_gdecr:N \g_jinwen_list_int}
}
}
\NewExpandableDocumentCommand{\IfInList}{mm}
{
\int_compare:nTF { \g_jinwen_list_int > 0 } { #1 } { #2 }
}
\int_new:N \g_jinwen_list_int
\ExplSyntaxOff
完整示例:
\documentclass{article}
\usepackage{enumitem}
\ExplSyntaxOn
\NewDocumentCommand{\listenvironments}{m}
{
\clist_map_inline:nn { #1 }
{
\AddToHook{env/##1/begin}{\int_gincr:N \g_jinwen_list_int}
\AddToHook{env/##1/end}{\int_gdecr:N \g_jinwen_list_int}
}
}
\NewExpandableDocumentCommand{\IfInList}{mm}
{
\int_compare:nTF { \g_jinwen_list_int > 0 } { #1 } { #2 }
}
\int_new:N \g_jinwen_list_int
\ExplSyntaxOff
\listenvironments{itemize,enumerate,description}
\begin{document}
\begin{itemize}
\item \IfInList{code if in list}{code if not in list}
\end{itemize}
\IfInList{code if in list}{code if not in list}
\end{document}