我正在尝试定义一个环境,用于将代码列表包裹在阴影框中并居中显示。使用此代码,我可以生成我想要的输出类型:
\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}
这会产生如下输出:
当我尝试将其抽象到环境中时,我的问题出现了。我已经看到了一些相关的问题:
- 如何使列表居中?这个问题的答案建议使用
tabular
环境来使列表居中,这是可行的,但在目前的情况下,它的shadowbox
作用是一样的(刚好足够容纳列表)。 - 如何将列表居中在这个问题中,该
tabular
技术不起作用,但答案显示了如何将列表的内容保存在Sbox
(来自fancybox
)中并将其设置在parbox
中centerline
。 - adjustbox 和 lstnewenvironment这个问题实际上涉及围绕列表创建框架,似乎与我的问题最相关。答案取决于
adjustbox
,它支持简单框架,但不支持 fancybox 的 shadowbox。 - 为什么当我尝试在用户定义的环境中使用“begin{lstlisting}”时 pdfLaTeX 会失败?这里的答案指出,很难定义在哪些
verbatim
类似环境中会出现,因此最好使用lstnewenvironment
。
基于这些方法,我尝试使用 ,但都失败了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.41
:2013/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
,它支持简单框架,但不支持\shadowbox
fromfancybox
。
嗯,它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
而不是{
.. }
。使用环境形式可能会导致此嵌套定义中出现问题。