我需要将tasks
环境包装在自定义的 中\NewEnviron
。显然,tasks
除了它之外的代码也会阻塞,\task
或者\item
由于它处理自身环境的方式,大概是导致它在 上出现\BODY
这种情况。有什么办法可以解决这个问题吗?给出的确切错误是“有些错误 - 可能缺少\item
”,如下所示:
\documentclass[a4paper]{book}
\usepackage{environ}
\usepackage[more]{tasks}
\NewTasks[style=enumerate,counter-format=tsk[1]),label-width=2ex]{mytaskenum}[\item](3)
\NewEnviron{mytaskenv}[1][Exercises]{
% Misc. stuff to precede the tasks env here
\begin{mytaskenum}
\BODY
\end{mytaskenum}
% Misc. stuff to follow
}{}
\begin{document}
\begin{mytaskenv}
\item item 1
\item item 2
\item item 3
\end{mytaskenv}
\end{document}
答案1
您必须在开始工作\BODY
之前进行扩展:\begin{mytaskenum}
\documentclass[a4paper]{book}
\usepackage{environ}
\usepackage[more]{tasks}
\NewTasks[style=enumerate,counter-format=tsk[1]),label-width=2ex]{mytaskenum}[\item](3)
\NewEnviron{mytaskenv}[1][Exercises]{%
% Misc. stuff to preceed the tasks env here
\def\tempbegin{\begin{mytaskenum}}%
\expandafter\tempbegin\BODY
\end{mytaskenum}
% Misc. stuff to follow
}
\begin{document}
\begin{mytaskenv}
\item item 1
\item item 2
\item item 3
\end{mytaskenv}
Check:
\begin{mytaskenum}
\item item 1
\item item 2
\item item 3
\end{mytaskenum}
\end{document}
更清洁的替代方案xparse
:
\documentclass[a4paper]{book}
\usepackage{environ}
\usepackage[more]{tasks}
\usepackage{xparse}
\NewTasks[style=enumerate,counter-format=tsk[1]),label-width=2ex]{mytaskenum}[\item](3)
\ExplSyntaxOn
\NewDocumentCommand{\domytaskenum}{}
{
\texman_mytaskenum:V \BODY
}
\cs_new_protected:Npn \texman_mytaskenum:n #1
{
\begin{mytaskenum}
#1
\end{mytaskenum}
}
\cs_generate_variant:Nn \texman_mytaskenum:n { V }
\ExplSyntaxOff
\NewEnviron{mytaskenv}[1][Exercises]{%
% Misc. stuff to preceed the tasks env here
\domytaskenum
% Misc. stuff to follow
}
\begin{document}
\begin{mytaskenv}
\item item 1
\item item 2
\item item 3
\end{mytaskenv}
Check:
\begin{mytaskenum}
\item item 1
\item item 2
\item item 3
\end{mytaskenum}
\end{document}
该\domytaskenum
命令只是调用\texman_domytaskenum:V \BODY
;反过来\texman_domytaskenum:V
是的变体\texman_domytaskenum:n
,它负责处理mytaskenum
环境中的参数。V
变体使用存储在中的标记列表的值,\BODY
就好像它是显式内容一样。基本上,它执行与以前相同的技巧,但以更抽象的方式,而不进行临时定义。