关于使用 etoolbox 将 lstlisting 环境包装到另一个环境中的问题

关于使用 etoolbox 将 lstlisting 环境包装到另一个环境中的问题

在下面的平均能量损失,我尝试通过来自包的宏对和将一个lstlisting环境(testlst)包装到另一个环境( ) 。test\BeforeBeginEnvironment\AfterEndEnvironmentetoolbox

虽然运行时没有错误,但\vrule代码中的两个都不起作用(画垂直线)。为什么?

梅威瑟:

\documentclass{article}
\usepackage{geometry}
\geometry{showframe}
\usepackage{listings,xparse,etoolbox}

\parindent0pt
\begin{document}
% -------------------------
\newenvironment{test}[1]
{\begin{minipage}{#1}}
{\end{minipage}}
% -------------------------
\lstnewenvironment{testlst}[2][]
{
  \BeforeBeginEnvironment{testlst}{\vrule\begin{test}{#2}}
  \lstset{#1}  
}
{
  \AfterEndEnvironment{test}{\end{minipage}\vrule}
}
% -------------------------
% Test:
\begin{testlst}[numbers=left]{5in}
  \rule{2in}{10pt}
\end{testlst}
% -------------------------
\end{document} 

答案1

这行不通。您首先要定义一个环境,然后可能还要声明\BeforeBeginEnvironment\AfterEndEnvironment

但没有必要,因为正在定义环境。

\documentclass{article}
\usepackage{geometry}
%\geometry{showframe}
\usepackage{listings}

\usepackage{lipsum}

\lstnewenvironment{testlst}[2][]
 {
  \trivlist\item\relax\vrule\minipage{#2}
  \lstset{#1}
 }
 {
  \endminipage\vrule\endtrivlist
 }

\begin{document}

\lipsum[1][1-5]
\begin{testlst}[numbers=left]{5in}
  \rule{2in}{10pt}
  \rule{2in}{10pt}
  \rule{2in}{10pt}
\end{testlst}
\lipsum[2][1-5]

\end{document} 

请注意,您需要使用环境的“裸”形式,因为lstnewenvironment它是一种逐字记录。

在此处输入图片描述

相关内容