自定义环境中的任务

自定义环境中的任务

我需要将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就好像它是显式内容一样。基本上,它执行与以前相同的技巧,但以更抽象的方式,而不进行临时定义。

相关内容