lstinputlisting 不包含 lstnewenvironment 内的文件?

lstinputlisting 不包含 lstnewenvironment 内的文件?

我想使用lstinputlisting将文件包含在lstlisting块内的代码中,该块是通过新环境定义的。但是,命令lstinputlisting本身(而不是代码)在代码块中逐字复制。MWE:

\documentclass{minimal}
\usepackage{color}
\usepackage{listings}
\usepackage{verbatim}

\definecolor{customblue}{RGB}{235,241,245}

\lstnewenvironment{terminalblock}{%
  \lstset{backgroundcolor=\color{customblue},
  frame=single,
  framerule=0pt,
  basicstyle=\ttfamily,
  breaklines=true,
  columns=fullflexible}}{}

\begin{document}
 \begin{terminalblock}
  \lstinputlisting{code.cpp}
 \end{terminalblock}

\begin{verbatim}
 \verbatiminput{code.cpp}
\end{verbatim}

\begin{lstlisting}
 \lstinputlisting{code.cpp}
\end{lstlisting}

\end{document}

同样的问题在标准lstlistingverbatim环境下也会出现,PDF文档只包含\lstinputlisting{code.cpp}三次,如图所示。

韋斯特

由于自定义环境生成的块的背景是正确的颜色,所以我认为配置设置在自定义环境中起作用,但不起作用lstinputlistings。我不知道这是否相关,但这些是的内容code.cpp

#include <iostream>
#define abusing using

abusing namespace std;

int main()
{
   cout<<"Hello, world!"<<endl;
   return 0;
}

答案1

terminalblock环境用于直接输入代码;在此环境中使用没有多大意义,\lstinputlistings因为它将被逐字采用(尽管可以通过例如转为 LaTeX 来完成)。更好的方法是定义一种样式,并将此样式用于您的环境(用于输入直接代码)和\lstinputlistings(用于包含来自外部文件的代码);还请注意,您正在使用frame=single,但将规则宽度设置为,0pt因此不会绘制任何线条。

这是具有定义样式和的代码\lstinputlisting

\documentclass{article}
\usepackage{color}
\usepackage{listings}

\definecolor{customblue}{RGB}{235,241,245}

\lstdefinestyle{mystyle}{%
  backgroundcolor=\color{customblue},
  frame=single,
  framerule=0pt,
  basicstyle=\ttfamily,
  breaklines=true,
  columns=fullflexible
}

\lstnewenvironment{terminalblock}{%
  \lstset{style=mystyle}}{}

\begin{document}
\lstinputlisting[style=mystyle]{code.cpp}
\end{document}

以及terminalblock环境:

\documentclass{minimal}
\usepackage{color}
\usepackage{listings}

\definecolor{customblue}{RGB}{235,241,245}

\lstdefinestyle{mystyle}{%
  backgroundcolor=\color{customblue},
  frame=single,
  framerule=0pt,
  basicstyle=\ttfamily,
  breaklines=true,
  columns=fullflexible
}

\lstnewenvironment{terminalblock}{%
  \lstset{style=mystyle}}{}

\begin{document}

\begin{terminalblock}
#include <iostream>
#define abusing using

abusing namespace std;

int main()
{
   cout<<"Hello, world!"<<endl;
   return 0;
}
\end{terminalblock}

\end{document}

在此处输入图片描述

相关内容