framebox 不适用于 lstlisting 环境

framebox 不适用于 lstlisting 环境

我正在寻找一种用框架包裹某些东西的方法。我尝试了不同的方法,但最终选择使用fancybox包装和minipage(因为我需要控制框架的宽度)。它对于纯文本内容非常有效

\usepackage{fancybox}

\begin{document}
  \fbox{%
    \begin{minipage}{\textwidth}
      \textbf{Why we use negative angle in above calculate?}\newline
       Since .... we have to ....
    \end{minipage}
  }
\end{document}

但是,如果我们添加任何环境,如lstlistingverbatim,它就不起作用

  \fbox{%
    \begin{minipage}{\textwidth}
      \textbf{Why we use negative angle in above calculate?}\newline
       Since .... we have to ....
       \begin{lstlisting}
          A = x+y;
          B = x^2-2y;
       \end{lstlisting}
    \end{minipage}
  }

有没有什么方法可以让它发挥作用?

ps 我创建了一个网页,供用户在其中输入乳胶内容,无论他们输入什么,我都会用框架框将其包裹起来,并用 pdflatex 生成一个 pdf。我无法控制他们输入的内容,他们可能会输入文本、数学、环境和/或混合所有这些。那么有没有更好的方法来框住里面的乳胶内容?

答案1

这是因为listings(包括verbatim内容)不能作为参数传递给其他函数/宏(无需担心)。不过先将内容装箱是可以的:

在此处输入图片描述

\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\newsavebox{\codebox}% For saving code
\begin{document}
\begin{lrbox}{\codebox}
\begin{lstlisting}
A = x+y;
B = x^2-2y;
\end{lstlisting}
\end{lrbox}

\noindent
\fbox{%
  \begin{minipage}{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
    \textbf{Why we use negative angle in above calculate?}\newline
      Since .... we have to .... \par
    \usebox{\codebox}
  \end{minipage}%
}
\end{document}

lrbox是一个采用一个强制(box)参数的环境,它将使用该参数来存储内容。我已将其称为\codebox。请执行以下操作外部然后\fbox使用\usebox{\codebox} 里面 \fbox的論點。

\noindent注意偶尔使用%(见%行末百分号 ( ) 有什么用?) 和 a\dimexpr作为minipage尺寸,以避免出现过满\hbox警告。


如果你无法控制用户插入的内容,并且他们可以混合/匹配内容,那么你最好使用装箱一切并只对\fbox输出进行 -ing:

在此处输入图片描述

\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\newsavebox{\userinput}% For saving user input
\begin{document}
\begin{lrbox}{\userinput}
\begin{minipage}{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
  \textbf{Why we use negative angle in above calculate?}\newline
   Since .... we have to ....

\begin{lstlisting}
A = x+y;
B = x^2-2y;
\end{lstlisting}
\end{minipage}
\end{lrbox}

\noindent
\fbox{\usebox{\userinput}}%
\end{document}

当然,mdframed对这种事情没有任何问题,并且可能是一个更好的选择;它还允许跨页面边界进行框架中断:

在此处输入图片描述

\documentclass{article}
\usepackage{listings,mdframed}% http://ctan.org/pkg/{listings,mdframed}
\begin{document}
\begin{mdframed}
  \textbf{Why we use negative angle in above calculate?}\newline
   Since .... we have to ....

\begin{lstlisting}
A = x+y;
B = x^2-2y;
\end{lstlisting}
\end{mdframed}

\end{document}

查看mdframed文档了解有关如何使事物变得奇特的更多细节。

答案2

listings软件包提供了用于框架环境的内置选项listings,例如全局使用

\lstset{frame=single}

或者在本地使用(例如)

\begin{lstlisting}[frame=single]

完整的 MWE 如下

截屏

\documentclass{article}

\usepackage{xcolor}
\usepackage{listings}

\lstset{frame=single}

\begin{document}

\begin{lstlisting}[frame=single]
          A = x+y;
          B = x^2-2y;
       \end{lstlisting}

\begin{lstlisting}[backgroundcolor=\color{yellow!20}]
          A = x+y;
          B = x^2-2y;
\end{lstlisting}

\end{document}

答案3

接受 Verbatim 内容的使用和环境如下调整框

\usepackage{adjustbox}
...

\begin{adjustbox}{minipage=[t][0.5\textheight]{1\textwidth},fbox}
  ...
  \begin{lstlisting}[language=..., ...]
    your code
  \end{lstlisting}
  ...
\end{adjustbox}

或者你可以留下空文字高度自动高度

\begin{adjustbox}{minipage=[t][]{1\textwidth},fbox}

相关内容