如何在 enumerate-with-description 中抑制项目描述后的新段落?

如何在 enumerate-with-description 中抑制项目描述后的新段落?

下面的命令\descitem允许列表中的项目enumerate包含描述。(抱歉,我现在无法在 tex.stackexchange 上找到该定义的来源。)这个想法是允许列表中的项目使用可选参数,enumerate类似于使用theorem或类定理环境使用可选参数的方式amsthm

普通\item不是立即开始新的段落。好!

\descitem不幸的是,之后有一个空白行导致开始一个新段落。糟糕!如何修复此问题?

\documentclass{memoir}
\usepackage{enumitem}

\newlist{penum}{enumerate}{2}
\setlist[penum,1]{%
  label= \sffamily\upshape(\arabic*),
  ref={\arabic*}, 
  widest=99,
}
\newcommand\descitem[1][]{\item{\sffamily\MakeUppercase#1. }}

\begin{document}
\begin{penum}

\item

An ordinary item: no new paragraph printed, despite preceding blank line.

\descitem[number two]

An item with a description: blank line causes new paragraph.

\descitem[three]
\label{it:three}

A labeled item with a description: ditto.
 
\end{penum}
\end{document}

列举并描述

因此,我试图使行为与此方面\descitem相同\item:命令行后有一个空白行,而不是创建新段落。所以我想问如何修改 \descitem 以便不进入垂直模式。

这种情况类似于对theorem环境使用可选参数的情况:在\begin{theorem}[something-about-it]紧接着的空白行之后不是开始一个新段落。

为什么我不干脆避免使用空行呢?因为在 后面有一个空行\descitem[...],就像在普通的 后面有一个空行一样\item,这样在重写或编辑源代码时可以更容易地找到项目。

答案1

我建议一个模糊的解决方案。我们测量参数的宽度\descitem,然后离开水平模式并返回垂直模式。下一个文本的第一个字母再次打开水平模式。将\everypar文本移动到适当的水平位置,负数\vskip将其移动到适当的垂直位置。

\def\descitem[#1]{\par
   \setbox0=\hbox{\sffamily\MakeUppercase#1. }
   \item{\sffamily\MakeUppercase#1. }\par
   \everypar={\hskip\wd0 \everypar={}}
   \nobreak\vskip-\parskip \vskip-\baselineskip
}

答案2

我仍然不建议这样做,但以下内容实现了\gobblepar我之前评论中的宏。

\documentclass{memoir}
\usepackage{enumitem}

\makeatletter
\newcommand\gobblepar
  {\@ifnextchar\label{\gobblepar@label}{\@ifnextchar\par{\@gobble}{}}}
\newcommand\gobblepar@label[2]{\label{#2}\gobblepar}
\makeatother

\newlist{penum}{enumerate}{2}
\setlist[penum,1]{%
  label= \sffamily\upshape(\arabic*),
  ref={\arabic*}, 
  widest=99,
}
\newcommand\descitem[1][]{\item{\sffamily\MakeUppercase#1. }\gobblepar}

\begin{document}
\begin{penum}

\item

An ordinary item: no new paragraph printed, despite preceding blank line.

\descitem[number two]

An item with a description: blank line causes new paragraph.

\descitem[three]
\label{it:three}

A labeled item with a description: ditto.
 
\end{penum}
\end{document}

在此处输入图片描述

相关内容