我有以下文件:
\documentclass{article}
\usepackage{enumerate}
\usepackage{xparse}
\newcounter{probctr}
\NewDocumentEnvironment{prob}{o}
{%
\par
\addvspace{.15in}%
\addtocounter{probctr}{1}%
\noindent\textbf{Problem \theprobctr}%
\IfNoValueF{#1}{ (#1 points)}%
\par\nopagebreak\smallskip\noindent\ignorespaces%
}
{\addvspace{.15in}}
\begin{document}
\begin{prob}[15]
\begin{enumerate}[(a)]
\item Item 1
\item Item 2
\end{enumerate}
Consider this ...
\end{prob}
\end{document}
如果我注释掉“考虑一下...”这一行,文档就可以正常编译。但是我得到这一行,LaTeX Error: Something's wrong--perhaps a missing \item.
有人能告诉我这里出了什么问题吗?
答案1
正如 egreg 在评论中指出的那样:
宏\addvspace
必须以垂直模式发出!
\NewDocumentCommand
和enumerate
等 或之间没有冲突enumitem
。错误的解决方法是\addvspace
必须跟在显式 之后。对于too\par
也会发生错误(请参阅环境)。\newenvironment
probtrad
我建议使用\refstepcounter{probctr}
而不是\addtocounter
。前者允许使用\label
和引用它。
请注意,我最初的版本是有效的(使用\vskip 0.15in
而不是\par\addvspace{0.15in}
)只是因为\vskip
暗示\par
)。当时它并不是真正正确的。Joe Cocker 唱道:With a little help from my friends
我采用了 的评论(经 许可egreg
)来在此处应用它。
\documentclass{article}
\usepackage{enumerate}
\usepackage{etoolbox}
%\usepackage[shortlabels]{enumitem} % as an alternative to enumerate
\usepackage{xparse}
\newcounter{probctr}
\NewDocumentEnvironment{prob}{o}
{%
\par
\addvspace{.15in}%
\refstepcounter{probctr}%
\noindent\textbf{Problem \theprobctr}%
\IfNoValueF{#1}{ (#1 points)}%
\par\nopagebreak\smallskip\noindent\ignorespaces%
}{%
\par\addvspace{.15in}% egreg's suggestion
}
\newenvironment{probtrad}[1][]{%
\par
\addvspace{.15in}%
\refstepcounter{probctr}%
\noindent\textbf{Problem \theprobctr}%
\ifblank{#1}{}{ (#1 points)}%
\par\nopagebreak\smallskip\noindent\ignorespaces%
}{%
\par\addvspace{.15in}% egreg's suggestion
}
\begin{document}
\begin{prob}[15]
\begin{enumerate}[(a)]
\item Item 1
\item Item 2
\end{enumerate}
Consider this ...
\end{prob}
\begin{probtrad}[20]
\begin{enumerate}[(a)]
\item Item 3
\item Item 4
\end{enumerate}
Now consider this ...
\end{probtrad}
\end{document}