三思而后行

三思而后行

我正在尝试编写一个将文件名设置为第 0 行的 lstlisting 环境。我试过

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{listings}

\lstset{numbers=left}

% @param 1 : filename
\lstnewenvironment{code}[1]{\setcounter{lstlisting}{0}, #1}{}


\begin{document}

\begin{code}[main.cpp]
#include <iostream>
using namespace std::cout

int main(void){
    cout << "Hello World";
}
\end{code}

\end{document}

但它不起作用。有什么想法吗?

答案1

三思而后行

您是否建议将文件名插入到列表顶部编号为 0 的行中,就像一行代码一样?我认为这是个坏主意:您可能会让读者感到困惑。

将文件名排版为列表的标题

在我看来,更好的选择是通过将参数传递给键,将文件名排版为列表的标题title;见下文。

在此处输入图片描述

此外,在您的示例中,您定义了code环境,使其接受强制参数,但您使用它时却好像它接受了可选参数;这是不对的。无论如何,更好的方法是允许除了强制参数之外还有一个可选参数,这样您仍然可以将选项传递给底层listings环境:

\lstnewenvironment{code}[2][]{%
  \lstset{%
    numbers = left,
    title   = #2,
    #1,
  }%
}{}

代码

\documentclass{article}

\usepackage{listings}

\lstnewenvironment{code}[2][]{%
  \lstset{%
    numbers = left,
    title   = #2,
    #1,
  }%
}{}

\begin{document}

\begin{code}{main.cpp}
#include <iostream>
using namespace std::cout

int main(void){
    cout << "Hello World";
}
\end{code}

\end{document}

外部列表:如何以编程方式使用文件名作为标题

(看daleif 的评论

如果您正在插入外部文件\lstinputlisting并想要以编程方式排版该文件的相对路径或仅排版其文件名作为该列表的标题,则可以按照以下示例进行操作。

在此处输入图片描述

代码

\documentclass{article}

\usepackage[T1]{fontenc} % <-- to correctly print underscores
\usepackage{listings}
\usepackage{filecontents}

% assuming folder "./foo" exists...
\begin{filecontents*}{foo/my_main_program.cpp}
#include <iostream>
using namespace std::cout

int main(void){
    cout << "Hello World";
}
\end{filecontents*}

\makeatletter
\newcommand\inputcode[2][]{%
  \filename@parse{\detokenize{#2}}
  \lstinputlisting[%
    numbers = left,
    % title   = \lstname,                    % <-- relative path
    title   = \filename@base.\filename@ext,  % <-- only the filename
    #1,
  ]{#2}%
}
\makeatother

\begin{document}

\inputcode{foo/my_main_program.cpp}

\end{document}

相关内容