我想使用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}
同样的问题在标准lstlisting
和verbatim
环境下也会出现,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}