我想将程序代码写入文件,以便稍后执行。该语言要求保留换行符。
\begin{myCode}
one
two
three
\end{myCode}
在我的宏中我有以下内容
\obeylines
输出结果如下:
one^^Mtwo^^Mthree
有没有一种简单的方法可以^^M
用 Unix 系统识别的行结束符来替换?我理解verbatim
环境逐行处理文本,但在这种情况下可能没有必要。
更新:
这是最小的工作代码:
\documentclass{minimal}
\usepackage{environ}
\newwrite\myOutput
\makeatletter
\def\my@writeToFile#1{
\immediate\openout\myOutput=output.txt%
\immediate\write\myOutput{#1}
\immediate\closeout\myOutput
}
\newenvironment{myCode} {
\obeylines
\Collect@Body\my@writeToFile %macro from the environ package
}{%
}
\makeatother
\begin{document}
\begin{myCode}
one
two
three
\end{myCode}
\end{document}
答案1
\newlinechar`\^^J
将使它把 unix 行结束控制 J 放在行尾,而不是控制 M,
答案2
您应该意识到一个重要的事实:\write
在写入操作期间会扩展其参数。因此(暂时不考虑行终止问题)如果您的环境是
\begin{myCode}
\emph{x}
\end{myCode}
结果output.txt
将不会很有趣
^^M\protect \unhbox \voidb@x \bgroup \def myCode{x}\let \futurelet \@let@token \let \protect \relax \protect \relax \protect \edef n{it}\protect \xdef \OT1/cmr/m/n/10 {\OT1/cmr/m/n/10 }\OT1/cmr/m/n/10 \size@update \enc@update x\egroup ^^M
可以逐字写入文件,例如,使用以下包fancyvrb
:
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{output.txt}
one
two
three
\emph{x}
\end{VerbatimOut}
\end{document}
答案3
灵感来自大卫的回答,在新的环境中使用\newlinechar
让它^^M
被解释为换行符似乎有效。
\documentclass{minimal}
\usepackage{environ}
\newwrite\myOutput
\makeatletter
\def\my@writeToFile#1{
\immediate\openout\myOutput=output.txt%
\immediate\write\myOutput{#1}%
\immediate\closeout\myOutput%
}
\newenvironment{myCode} {
\newlinechar`\^^M%
\obeylines%
\Collect@Body\my@writeToFile% %macro from the environ package
}{%
}
\makeatother
\begin{document}
\begin{myCode}
one
two
three
\end{myCode}
\end{document}
答案4
基于彼得·格里尔的建议我已经尝试过filecontents
包。我想出了以下解决方案:
\documentclass{minimal}
\usepackage{filecontents}
\makeatletter
\newenvironment{myCode}[1] {
\filec@ntents{#1}
}{%
}
\makeatother
\begin{document}
\begin{myCode}{myFile.txt}
one
two
\emph{txt}
\\ dangerous $ code %@#
\end{myCode}
\end{document}
输出如下所示:
%% LaTeX2e file `myFile.txt'
%% generated by the `myCode' environment
%% from source `test' on 2012/02/28.
%%
one
two
\emph{txt}
\\ dangerous $ code %@#
它很简约,但基本上满足了我的要求(只要删除那些评论就完美了)。