定义居中的阴影盒列表环境

定义居中的阴影盒列表环境

我正在尝试定义一个环境,用于将代码列表包裹在阴影框中并居中显示。使用此代码,我可以生成我想要的输出类型:

\documentclass[twocolumn]{article}
\usepackage{listings}
\usepackage{fancybox}
\usepackage{lipsum}
\begin{document}
\lipsum[4]
\begin{center}
  \shadowbox{%
    \begin{lstlisting}[gobble=6]
      line of code
      line of code
    \end{lstlisting}%
  }
\end{center}
\lipsum[4]
\end{document}

这会产生如下输出:

中心环境中的 shadowbox 中的代码列表

当我尝试将其抽象到环境中时,我的问题出现了。我已经看到了一些相关的问题:

基于这些方法,我尝试使用 ,但都失败了lstnewenvironment。尝试获取居中列表(如下所示)失败(出现错误消息):

\documentclass[twocolumn]{article}

\usepackage{listings}
\usepackage{fancybox}
\usepackage{lipsum}
\usepackage{adjustbox}

\lstnewenvironment{CenteredShadowboxListing}[1][]{%
  \begin{center}%
    \lstset{#1}%
  }{%
  \end{center}%
}

\begin{document}
\lipsum[4]
\begin{CenteredShadowboxListing}[gobble=2]
  line of code
  line of code
\end{CenteredShadowboxListing}
\lipsum[4]
\end{document}

失败并出现以下错误:

! File ended while scanning use of \lst@BOLGobble@.
<inserted text> 
                \par 
<*> mwe.tex

我如何定义一个包含代码列表、在其周围放置阴影框并将该框置于中心的环境?

答案1

这是使用 的建议tcolorbox。颜色、阴影等可以根据您的喜好进行调整。您可以将其替换style=tcblatex为您希望作为环境默认设置的任何列表设置。

\documentclass[twocolumn]{article}

\usepackage{lipsum}
\usepackage[most]{tcolorbox}    

\newenvironment{CenteredShadowboxListing}[1][]{%
  \tcbset{listing options={style=tcblatex,#1}}\tcbwritetemp}%
  {\endtcbwritetemp%
  \tcbox[enhanced,arc=0pt,outer arc=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
  boxrule=0.6pt,drop fuzzy shadow,before=\begin{center},after=\end{center}]%
  {\tcbusetemplisting}}

\begin{document}
\lipsum[4]
\begin{CenteredShadowboxListing}
line of code
line of code
\end{CenteredShadowboxListing}
\lipsum[4]
\end{document}

在此处输入图片描述

更新:使用tcolorbox版本,排版上述示例的代码可以写得更紧凑,但结果相同2.412013/07/23

\documentclass[twocolumn]{article}

\usepackage{lipsum}
\usepackage[most]{tcolorbox}% version 2.41 or newer

\newtcblisting{CenteredShadowboxListing}[1][]{%
  listing options={style=tcblatex,#1},hbox,listing only,
  enhanced,arc=0pt,outer arc=0pt,top=1mm,bottom=1mm,left=1mm,right=1mm,
  boxrule=0.6pt,drop fuzzy shadow,before=\begin{center},after=\end{center}}

\begin{document}
\lipsum[4]
\begin{CenteredShadowboxListing}
line of code
line of code
\end{CenteredShadowboxListing}
\lipsum[4]
\end{document}

答案2

adjustbox 和 lstnewenvironment这个问题实际上涉及围绕列表创建框架,似乎与我的问题最相关。答案取决于adjustbox,它支持简单框架,但不支持\shadowboxfrom fancybox

嗯,它adjustbox本身不提供阴影框,但允许使用以下命令使用其他框命令precode

\documentclass[twocolumn]{article}

\usepackage{listings}
\usepackage{fancybox}
\usepackage{lipsum}
\usepackage{adjustbox}

\lstnewenvironment{CenteredShadowboxListing}[1][]{%
  \noindent\adjustbox{precode=\shadowbox,center,vspace=\bigskipamount}\bgroup
    \lstset{#1}%
  }{%
  \egroup%
}

\begin{document}
\lipsum[4]

\begin{CenteredShadowboxListing}[gobble=2]
  line of code
  line of code
\end{CenteredShadowboxListing}

\lipsum[4]

\end{document}

这里使用了命令形式\adjustbox而不是环境形式,这很好,因为\adjustbox特殊命令接受\bgroup..\egroup而不是{.. }。使用环境形式可能会导致此嵌套定义中出现问题。

相关内容