我需要在外部文件上编写一些内联代码,然后用 加载它listings
。我想定义一个新环境,但如果我这样做,filecontents
则不会保存第一行代码(参见 MWE):
\documentclass[]{article}
\usepackage{listings}
\usepackage{filecontents}
\newenvironment{MyNewEnvironment}[2]{%
\def\temp{#1}%
\csname filecontents*\endcsname{\temp}%
#2%
}%
{\csname endfilecontents*\endcsname%
\lstinputlisting{\temp}%
}%
\begin{document}
\begin{MyNewEnvironment}{foo.txt}%
one
two
three
four
five
\end{MyNewEnvironment}
\end{document}
生成的 foo.txt 包含:
two
three
four
five
答案1
我建议使用fancyvrb
和xparse
,这样也可以将选项传递给\lstinputlisting
:
\documentclass{article}
\usepackage{fancyvrb,xparse,listings}
\NewDocumentEnvironment{MyNewEnvironment}{O{}m}
{\VerbatimOut{#2}}
{\endVerbatimOut\lstinputlisting[#1]{#2}}
\begin{document}
\begin{MyNewEnvironment}[columns=fullflexible]{foo.txt}
one
two
three
four
five
\end{MyNewEnvironment}
\end{document}
答案2
正如 egreg 在其评论中所说,这可能不是正确的使用方法filecontents*
。
无论如何,将你的 MWE 更改为
\documentclass[]{article}
\usepackage{listings}
\usepackage{filecontents}
\newenvironment{MyNewEnvironment}[1]{%
\def\temp{#1}%
\csname filecontents*\endcsname{\temp}%
}%
{\csname endfilecontents*\endcsname%
\lstinputlisting{\temp}%
}%
\begin{document}
\begin{MyNewEnvironment}{foo.txt}
one
two
three
four
five
\end{MyNewEnvironment}
\end{document}
对我来说很好用。