如何强制 TeX 保留换行符?

如何强制 TeX 保留换行符?

我想将程序代码写入文件,以便稍后执行。该语言要求保留换行符。

\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 %@#

它很简约,但基本上满足了我的要求(只要删除那些评论就完美了)。

相关内容