我需要使用 xparse,因为我要通过自定义环境传递多个可选参数(为简洁起见,此处未显示)。当我尝试传递以下内容时:
\documentclass{article}
\usepackage{tasks}
\usepackage{xparse}
\newlength{\longlabel}
\settowidth{\longlabel}{(m)}
\NewTasks[label-format=\color{blue}, counter-format={(tsk[a])}, label-width=\longlabel,
item-indent=0pt, label-offset=2pt, column-sep={10pt}, before-skip=-8pt, after-item-skip=2pt, after-skip=-4pt]{newTask}[\item]
\NewDocumentEnvironment{dummyEnvironment}{}
{\begin{newTask}(2)}
{\end{newTask}}
\begin{document}
\begin{newTask}(2)
\item Item 1
\item Item 2
\item Item 3
\item Item 4
\end{newTask}
\begin{dummyEnvironment}
\item Item 1
\item Item 2
\item Item 3
\item Item 4
\end{dummyEnvironment}
\end{document}
返回错误,指出\begin{newTasks}
已结束\end{dummyEnvironment}
错误:
C:\Users... LaTeX Error: \begin{newTask} on input line 22 ended by \end{dummyEnvironment}. [^^I\end{dummyEnvironment}]
C:\Users... LaTeX Error: \begin{dummyEnvironment} on input line 22 ended by \end{document}. [\end{document}]
现在,这个问题已经在“environ”包中得到解答了这里,但是如何使用 xparse 环境解决这个问题?
答案1
你可以(事实上,正如下面 egreg 评论的那样,你应该)\newtask...\endnewtask
直接使用:
\documentclass{article}
\usepackage{tasks}
\usepackage{xparse}
\newlength{\longlabel}
\settowidth{\longlabel}{(m)}
\NewTasks[label-format=\color{blue}, counter-format={(tsk[a])}, label-width=\longlabel,
item-indent=0pt, label-offset=2pt, column-sep={10pt}, before-skip=-8pt, after-item-skip=2pt, after-skip=-4pt]{newTask}[\item]
\NewDocumentEnvironment{dummyEnvironment}{}
{\newTask(2)}
{\endnewTask}
\begin{document}
\begin{newTask}(2)
\item Item 1
\item Item 2
\item Item 3
\item Item 4
\end{newTask}
\begin{dummyEnvironment}
\item Item 1
\item Item 2
\item Item 3
\item Item 4
\end{dummyEnvironment}
\end{document}
当您使用 打开环境时,会发生的情况是使用或(我不记得是哪个了)\begin{newtask}...\end{newtask}
打开一个新的 tex 组,并调用 。然后 Latex 向前查找匹配项,然后插入并关闭该组。使用OP 中的 ,latex 看到,因此向前查找匹配项。不幸的是,它找不到它,因为隐藏在 中,它首先看到的 中。这就是 OP 中的代码给出错误的原因。通过使用,您可以避免此问题。\bgroup
\begingroup
\newtask
\end{newtask}
\endnewtask
dummyEnvironment
\begin{newtask}
\end{newtask}
\end{newtask}
\end{dummyEnvironment}
\newtask....\endnewtask
为了完整性,下面是输出: