Lstinputlisting 和 listings 样式

Lstinputlisting 和 listings 样式

为了进一步扩展我最近关于新列表环境的问题,请参见此处:多种列表样式

如何lstlistings通过命令定义一个新环境,\lstnewenvironment并能够使用该命令\lstinputlisting从文件中提取所需的内容?

lstlistingenvironments我指的是通过命令新建的\lstnewenvironment{MYENV}。然后可以通过

\begin{MYENV} 
BODY 
\end{MYENV} 

任何地方BODY都会被格式化,包括命令 \input{mycode.whatever},而不是提取文件内容mycode.whatever并格式化内容。

答案1

如果文件包含适当的列表环境(如cplusplusrcode),那么您只需使用 即可\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>}

相关内容