为了进一步扩展我最近关于新列表环境的问题,请参见此处:多种列表样式。
如何lstlistings
通过命令定义一个新环境,\lstnewenvironment
并能够使用该命令\lstinputlisting
从文件中提取所需的内容?
lstlistingenvironments
我指的是通过命令新建的\lstnewenvironment{MYENV}
。然后可以通过
\begin{MYENV}
BODY
\end{MYENV}
任何地方BODY
都会被格式化,包括命令 \input{mycode.whatever},而不是提取文件内容mycode.whatever
并格式化内容。
答案1
如果文件包含适当的列表环境(如cplusplus
或rcode
),那么您只需使用 即可\input{<filename>}
。如果没有(或仅包含应格式化的原始代码),您可以创建一个新命令来为您完成所有设置,就像它为您的\lstnewenvironment
创作所做的那样。以下内容可与 中的解决方案结合使用多种列表样式:
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\usepackage{filecontents}% http://ctan.org/pkg/filecontents
\begin{filecontents*}{cplusplus.c}
// 'Hello World!' program
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
\end{filecontents*}
\begin{filecontents*}{rcode.r}
cat('Hello, world!\n')
\end{filecontents*}
\begin{filecontents*}{pseudocode.p}
print "Hello world"
\end{filecontents*}
\makeatletter
% --------------------------------------- C++
\let\oldaddcontentsline\addcontentsline
\newcommand{\lstlistcplusplusname}{List of C++}
\lst@UserCommand\lstlistofcplusplus{\bgroup
\let\contentsname\lstlistcplusplusname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{loc}}%
\tableofcontents \egroup}
\newcommand{\lstinputcplusplus}[2][]{{%
\renewcommand{\lstlistingname}{C++ Code}%
\renewcommand{\addcontentsline}[3]{\oldaddcontentsline{loc}{##2}{##3}}%
\lstinputlisting[language=C++,#1]{#2}%
}}
% --------------------------------------- R
\newcommand{\lstlistrcodename}{List of R}
\lst@UserCommand\lstlistofrcode{\bgroup
\let\contentsname\lstlistrcodename
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lor}}%
\tableofcontents \egroup}
\newcommand{\lstinputrcode}[2][]{{%
\renewcommand{\lstlistingname}{R Code}%
\renewcommand{\addcontentsline}[3]{\oldaddcontentsline{lor}{##2}{##3}}%
\lstinputlisting[language=R,#1]{#2}%
}}
% --------------------------------------- Pseudocode
\newcommand{\lstlistpseudocodename}{List of Pseudocode}
\lst@UserCommand\lstlistofpseudocode{\bgroup
\let\contentsname\lstlistpseudocodename
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lop}}%
\tableofcontents \egroup}
\newcommand{\lstinputpseudocode}[2][]{{%
\renewcommand{\lstlistingname}{Pseudocode}%
\renewcommand{\addcontentsline}[3]{\oldaddcontentsline{lop}{##2}{##3}}%
\lstinputlisting[basicstyle=\ttfamily,#1]{#2}%
}}
\makeatother
\begin{document}
\lstlistofcplusplus
\lstlistofrcode
\lstlistofpseudocode
\lstinputcplusplus[caption={Hello world}]{cplusplus.c}
\lstinputrcode[caption={Hello world}]{rcode.r}
\lstinputpseudocode[caption={Hello world}]{pseudocode.p}
\end{document}
用于输入特定类型列表的宏有\lstinputcplusplus[<options>]{<filename>}
、\lstinputrcode[<options>]{<filename>}
和\lstinputpseudocode[<options>]{<filename>}
。