到目前为止,我猜这\lstinputlisting{file.ext}
只是读取文件的内容并在lstlisting
环境中使用它。下面的示例文件编译得很好,但如果我用(我的想法是:等效的)其他形式替换宏的内容,编译就会失败,
\documentclass{memoir}
\usepackage{listings}
\newcommand\MESFN[4][]{
\lstinputlisting{a.c}
% \begin{lstlisting} int i, sum = 0; \end{lstlisting}
}
\begin{document}
\MESFN[]{}{}{}
\end{document}
我找到了问题(和答复)
为什么 lstlisting 不能保存在命令中?,我明白为什么它会失败。但是,为什么另一种形式会成功?为 提供文件或直接内容之间还有其他区别吗listings
?(也许 \lstinline 也一样)
答案1
原因很简单,LaTeX 只读取文件名而不读取文件内容。在您的示例中,文件名是无害的。但有一些合法的文件名,LaTeX 无法处理(例如下面的示例\TEST
)。
如果您想在.tex
文件中包含源代码,您可以使用包filecontents
,它将生成您想在宏中使用的文件。
\documentclass{memoir}
\usepackage{listings}
\usepackage{filecontents}
\begin{filecontents*}{b.c}
int i, sum = 0;
// crasy stuff, that LaTeX wouldn't like
c_r = a % b;
\end{filecontents*}
\newcommand\MESFN[4][]{
\lstinputlisting{b.c}
}
\newcommand\TEST{
% \lstinputlisting{b%29.c}
}
\begin{document}
\MESFN[]{}{}{}
\end{document}