如何将环境主体逐字写入外部文件。我尝试了以下方法,但如果主体包含未定义的宏(错误)或例如%
(在输出中消失),则会出现问题。
尝试 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.tex
,ext-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 命令?