考虑以下 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
在命令行提示符下。
也许我可以在接下来的几天里审查这个答案并添加进一步的解释。