下面的命令\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}