为什么 enumitem 不在标记项目后的新行上开始?

为什么 enumitem 不在标记项目后的新行上开始?

考虑以下 MWE

\documentclass[preview,border=10pt]{standalone}
\usepackage{enumitem}
\begin{document}
\thispagestyle{empty}

\trivlist\item[Boring dummy text]
\begin{enumerate}
 \item Foo
 \item Bar
 \item Quux
\end{enumerate}
\endtrivlist

\end{document}

结果图

对我来说,这种行为是一种功能!我正在定义自己的命令\paragraph{#1},如果段落以列表开头,我希望列表的第一项与段落标题在同一行开始。

简单的选择:不使用命令,而是定义一个paragraph接受[#1]段落标题选项的环境。现在使用 排版段落标题\trivlist\item[#1],然后使用 关闭环境\endtrivlist

但是,我不喜欢这个选项。它破坏了默认标记,其中\paragraph是命令。当然,我不希望用户手动键入\endtrivlist以关闭段落。这让我想到了我的问题:

问:如何\trivlist\item[Dummy text]在不实际打开和关闭列表的情况下重现行为?

因此,我正在寻找一个命令\paragraph{#1},使得以下 MNWE 将产生与上述相同的输出。

\documentclass[preview,border=10pt]{standalone}
\usepackage{enumitem}
\begin{document}
\thispagestyle{empty}

\paragraph{Boring dummy text}
\begin{enumerate}
 \item Foo
 \item Bar
 \item Quux
\end{enumerate}

\end{document}

答案1

您可以在您的命令中模拟\item内部执行的操作。

编辑:此代码的先前版本写得仓促,包含一些不一致之处。现在,我已使命令\myparagraph在行为上更类似,\paragraph同时,我还简化了代码。

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
\usepackage[utf8]{inputenc}      % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\usepackage{lipsum} % just for dummy "Lorem ipsum..." text

\makeatletter

\newcommand*\myparagraph[1]{%
    \par
    \addpenalty\@secpenalty
    \addvspace\bigskipamount
    \global\setbox\@labels\hbox{%
        \color@begingroup
        \textbf{#1}%
        \color@endgroup
    }%
    \global\@inlabeltrue
    \everypar{%
        \if@inlabel
            \global\@inlabelfalse
            {\setbox\z@ \lastbox}% remove indentation (OK?)
            \unhbox\@labels
            \quad
        \fi
        \everypar{}%
    }%
    \ignorespaces
}

\makeatother



\begin{document}

Some text.

\myparagraph{With a list following immediately.}
\begin{enumerate}
    \item  First item.
    \item  Second item.
    \item  Third item.
\end{enumerate}

\myparagraph{With a list \emph{not} following immediately.}
Some text
% \showthe\everypar
in between.
\begin{enumerate}
    \item  First item of second list.
    \item  Second item of second list.
    \item  Third item of second list.
\end{enumerate}

\myparagraph{With longer text.}
\lipsum*[1]
\begin{enumerate}
    \item  First item of third list.
    \item  Second item of third list.
    \item  Third item of third list.
\end{enumerate}
\lipsum*[2]

\end{document}

输出:

代码输出

一条评论,@jmc 要求解释此代码的工作原理。好吧,正如我所说,它模拟了命令\item内部执行的操作,以确保紧随其后的列表环境不会开始新行。为了提供更多细节,我必须详细解释一下 LaTeX 中如何处理列表,我担心这可以说是“超出了这个答案的范围”。(:-) LaTeX 对列表环境的管理最初由 Leslie Lamport 在 35/40 年前设计,尽管非常简而言之,在 LaTeX 内核源代码的注释中,更具体地说是在文件中找到的注释ltlists.dtx。回想一下,安装 TeXLive 后,您可以通过键入以下内容查看 LaTeX 内核完整源代码的排版版本

texdoc source2e

在命令行提示符下。

也许我可以在接下来的几天里审查这个答案并添加进一步的解释。

相关内容