mdframed 和 listings 之间奇怪的交互(错误?)

mdframed 和 listings 之间奇怪的交互(错误?)

当我尝试lstlistingsmdframed框内包含一些内容时,出现了奇怪的行为。大多数情况下,它按预期工作,但在某些情况下,我会得到不正确的输出,甚至出现 latex 错误(missing \item在本例中为 )

我在下面附加了一个 MWE,其中的一些内容已被注释掉,供您使用。

观察/问题:

  • 如果我完全删除 ,编译会顺利进行。但是我的“第 1 段”标题消失了。我可以通过添加例如 后面的额外内容mdframed来恢复它。有什么线索吗?~\paragraph{}
  • 包含mdframed后,编译会顺利进行,如果我删除第一个命令,输出看起来也会正确\paragraph{}。但是如果同时删除两个命令,我就会不知道Something's wrong--perhaps a missing \item.为什么?
  • 对我来说似乎有效的一种解决方法是将其包含lstlisting在一个小页面中。但这种方法有多强大?

我的主要问题是:我该如何解决此类问题,以及/或者我该向谁报告?它是mdframedlistings还是 中的错误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的环境因会引起很多麻烦而臭名昭著,而且绕过它们可能相当困难。幸运的是,fancyvrbverbatin提供了一种可以在更多地方工作的默认环境的替代方案。

在您的特定情况下,您可以设置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}

铸造

相关内容