I want to use lstinputlisting
to include a file with code within an lstlisting
block, which is defined through a new environment. However, the lstinputlisting
command itself, not the code, is reproduced verbatim in the code block. 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}
The same problem occurs in the standard lstlisting
and verbatim
environments as well. The PDF document just contains \lstinputlisting{code.cpp}
three times, as shown.
Since the background of the block generated by the custom environment is the correct colour, so I think the configuration settings are working in the custom environment, but not lstinputlistings
. I don't know if it's relevant, but these are the contents of code.cpp
:
#include <iostream>
#define abusing using
abusing namespace std;
int main()
{
cout<<"Hello, world!"<<endl;
return 0;
}
Best Answer
The
terminalblock
environmnet is for code directly input; it doesn't make much sense to use\lstinputlistings
inside this environment since it will be taken verbatim (although it could be done, for example, by escaping to LaTeX). A better approach is to define a style and use this style both for your environment (to be used to input direct code) and for\lstinputlistings
(to be used to include code from external files); also notice that you are usingframe=single
, but setting the rule width to0pt
so no lines will be drawn.Here's your code with the defined style and
\lstinputlisting
:and with the
terminalblock
environment: