将环境主体逐字写入文件

将环境主体逐字写入文件

如何将环境主体逐字写入外部文件。我尝试了以下方法,但如果主体包含未定义的宏(错误)或例如%(在输出中消失),则会出现问题。

尝试 1
用于environ获取环境内容。

\ProvidesPackage{tofile1}

\RequirePackage{environ}

% counter for external files
\newcounter{TF@File}

\newwrite\TF@out

\NewEnviron{tofile}{%
    \stepcounter{TF@File}
    \edef\TF@outFile{ext-\jobname-\[email protected]}
    \typeout{Name: \TF@outFile}
    \immediate\openout\TF@out=\TF@outFile
    \typeout{\TF@outFile\space opened}
    \immediate\write\TF@out{\BODY}
    \typeout{\TF@outFile\space written}
    \immediate\closeout\TF@out
    \typeout{\TF@outFile\space closed}
}

% test.tex
\documentclass{article}

\usepackage{tofile1}

\begin{document}
Test

\begin{tofile}
That's {a short Test}
which works
but ignores line breaks
\end{tofile}

Text

\begin{tofile}
\xx That's {another Test}%
This one doesn't work ...
it gives an error because \xx is undefined
\end{tofile}
\end{document}

这个命令创建了两个所需的文件ext-test-1.texext-test-1.tex但换行符被忽略,并且未定义的控制序列 ( \xx) 会导致错误。此外,百分号字符被解释为注释,而不是简单字符。我想 catcode magic 可能会有所帮助。

尝试 2
使用该filecontents包。

\ProvidesPackage{tofile2}

\RequirePackage{environ}
\RequirePackage{filecontents}

% counter for external files
\newcounter{TF@File}

\newwrite\TF@out

\newenvironment{tofile}{%
    \stepcounter{TF@File}
    \edef\TF@outFile{ext-\jobname-\[email protected]}
    \begin{filecontents}{\TF@outFile}
}{
    \end{filecontents}
}

Same test file as above ...

这个只创建了第一个文件,并且由于无法正确确定ext-test-1.tex的结尾而发生错误。filecontens

还有其他方法可以做到这一点吗,也许是一个包裹?

答案1

您可以查看verbatimwrite中的verbatim.sty定义,或者使用幻想VRB包裹:

\documentclass{article}

\usepackage{fancyvrb}
\newenvironment{tobiwrite}[1]
  {\typeout{Writing file #1}\VerbatimOut{#1}}
  {\endVerbatimOut}

\begin{document}
\begin{tobiwrite}{tobi.txt}
a

b
c
\end{tobiwrite}
\end{document}

相反,\typeout您可以做任何您想做的事情(例如,使用 检查文件是否已存在\IfFileExists)。

答案2

可以使用listings包中的内部宏来执行此操作。

\documentclass{article}

\makeatletter
\RequirePackage{listings}
\lst@RequireAspects{writefile}

\lstnewenvironment{yourenv}{%
  % some code before
  % including \lstset{..}
  % Write file to given filename
  \lst@BeginWriteFile{\jobname.txt}%
}
{%
  \lst@EndWriteFile% closes output file
}
\makeatother

\begin{document}
% ...    
\end{document}

与我在以下问题的答案中提供的类似代码进行比较:
具有逐字环境的 LaTeX 文档
如何在 \newenvironment 中使用 \write 命令?

相关内容