如何使用 \lstinputlisting 包含列表

如何使用 \lstinputlisting 包含列表

在嵌入 Java 代码(实际处理)的文档中,我可以使用以下命令成功嵌入列表:

\begin[language=java]{lstlisting}
...
\end{lstlisting}

为了增加便利性,我编写了一个新命令,将其缩写为:

\java

\end{lstlisting}

这很好。然而,在许多情况下,最好将列表保留在外部。这应该是:

lstinputlisting[language=java]{code/openglprocessing/s00trianglegouraud.pde}

我将其缩写为:

\newcommand{\incjava}{\lstinputlisting[language=Java]}

\incjava{code/openglprocessing/s00trianglegouraud.pde}

这两种公式都会导致以下错误:

! Undefined control sequence.
l.160 \incjava
              {code/openglprocessing/s00trianglegouraud.pde}

谈到这个主题,有没有办法定义一个标准目录,以避免必须重复引用 code/openglprocessing,类似于 \includegraphics 的图形路径?

\graphicspath{ {img/} }

答案1

\java我会定义一个环境,而不是java。然后\begin\end宏在源代码中正确匹配,这也让一些 TeX 编辑器感到满意。这样的环境由\lstnewenvironment包定义listings。还添加了一个可选参数。然后用户可以为特定列表设置一些选项\begin{java}[...]

\incjava命令应按以下示例所示工作。此外,该宏还为特定列表的选项提供了一个可选参数。

\documentclass{article}
\usepackage{listings}

\lstnewenvironment{java}[1][]{%
  \lstset{language=Java,#1}%
}{}

\newcommand*{\incjava}[1][]{%
  \lstinputlisting[{language=Java,#1}]%
}

\begin{document}
\begin{java}
public class Example implements StringHandler {

    /**
     * Prints the given string.
     *
     * @param s  the given string
     */
    @Override
    public void handle(String s) {
        System.out.println(s);
    }

}
\end{java}

\incjava{Example.java}
\end{document}

Result

没有\listingspath列出文件,但\input@path可以定义 TeX 文件,例如:

\makeatletter
\providecommand*{\input@path}{}
\g@addto@macro\input@path{{code/openglprocessing/}}
\makeatother

每个条目都应被花括号括起来并以目录分隔符结尾。

另一种方法是设置环境变量TEXINPUTS以包含目录,例如 TeX Live/Linux:

TEXINPUTS=:code/openglprocessing

开头的冒号(Unix)或分号(Windows)很重要,因为先前的搜索路径(来自texmf.cnf)会添加到此处。

相关内容