当我尝试lstlistings
在mdframed
框内包含一些内容时,出现了奇怪的行为。大多数情况下,它按预期工作,但在某些情况下,我会得到不正确的输出,甚至出现 latex 错误(missing \item
在本例中为 )
我在下面附加了一个 MWE,其中的一些内容已被注释掉,供您使用。
观察/问题:
- 如果我完全删除 ,编译会顺利进行。但是我的“第 1 段”标题消失了。我可以通过添加例如 后面的额外内容
mdframed
来恢复它。有什么线索吗?~
\paragraph{}
- 包含
mdframed
后,编译会顺利进行,如果我删除第一个命令,输出看起来也会正确\paragraph{}
。但是如果同时删除两个命令,我就会不知道Something's wrong--perhaps a missing \item.
为什么? - 对我来说似乎有效的一种解决方法是将其包含
lstlisting
在一个小页面中。但这种方法有多强大?
我的主要问题是:我该如何解决此类问题,以及/或者我该向谁报告?它是mdframed
、listings
还是 中的错误article
?
梅威瑟:
\documentclass{article}
\usepackage{mdframed}
\usepackage{listings}
\begin{document}
\begin{mdframed}
\paragraph{Paragraph 1}
% \begin{minipage}{1.0\linewidth}
\begin{lstlisting}
dummy verbatim text
\end{lstlisting}
% \end{minipage}
\paragraph{Paragraph 2}
\begin{itemize}
\item first item
\item second item
\end{itemize}
\end{mdframed}
\end{document}
答案1
尝试在章节标题之后立即开始列表始终是一个问题。特别是,如果你尝试
\paragraph{Paragraph A}
\begin{lstlisting}
dummy verbatim text
\end{lstlisting}
在顶层(而不是内部mdframed
),您会注意到标题消失了。
我认为你不希望列表位于标题旁边:例如,
\paragraph{Paragraph 1}
\begin{minipage}{1.0\linewidth}
\begin{lstlisting}
dummy verbatim text
dummy verbatim text
dummy verbatim text
dummy verbatim text
\end{lstlisting}
会产生
这很可能不是您想要的。
解决方案:不要mdframed
使用tcolorbox
(我将留给您如何自定义封闭框),如果列表紧随其后,这也可以解决部分标题中的其他几个故障mdframed
并在其后使用。\mbox{}
\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\lstset{
basicstyle=\ttfamily,
columns=fullflexible,
}
\begin{document}
\paragraph{Paragraph A}\mbox{}
\begin{lstlisting}
dummy verbatim text
dummy verbatim text
dummy verbatim text
dummy verbatim text
\end{lstlisting}
\paragraph{Paragraph B}
\begin{itemize}
\item first item
\item second item
\end{itemize}
\begin{tcolorbox}
\paragraph{Paragraph 1}\mbox{}
\begin{lstlisting}
dummy verbatim text
dummy verbatim text
dummy verbatim text
dummy verbatim text
\end{lstlisting}
\paragraph{Paragraph 2}
\begin{itemize}
\item first item
\item second item
\end{itemize}
\end{tcolorbox}
\end{document}
答案2
我会使用 tcolorbox 而不是 mdframed——更加强大。并且您必须添加 \leavevmode 以避免 \paragraph 消失:
\documentclass{article}
\usepackage[many]{tcolorbox}
\usepackage{listings}
\begin{document}
\begin{tcolorbox}
\paragraph{Paragraph 1}\leavevmode
\begin{lstlisting}
dummy verbatim text
\end{lstlisting}
\paragraph{Paragraph 2}
\begin{itemize}
\item first item
\item second item
\end{itemize}
\end{tcolorbox}
\end{document}
答案3
类似这样verbatim
的环境因会引起很多麻烦而臭名昭著,而且绕过它们可能相当困难。幸运的是,fancyvrb
verbatin
提供了一种可以在更多地方工作的默认环境的替代方案。
在您的特定情况下,您可以设置listings
要使用的包fancyvrb
以收集代码:
\documentclass{article}
\usepackage{mdframed}
\usepackage{fancyvrb}
\usepackage{listings}
\lstset{fancyvrb}
\begin{document}
\begin{mdframed}
\paragraph{Listings} \leavevmode
\begin{lstlisting}
#include <iostream>
int main()
{
std::cout << "Hello World!";
}
\end{lstlisting}
\end{mdframed}
\end{document}
另一个生成列表的包是minted
它也用于fancyvrb
收集代码:
\documentclass{article}
\usepackage{mdframed}
\usepackage{minted}
\begin{document}
\begin{mdframed}
\paragraph{Minted}
\begin{minted}[autogobble]{c++}
#include <iostream>
int main()
{
std::cout << "Hello World!";
}
\end{minted}
\end{mdframed}
\end{document}