我正在使用 egreg 的回答中描述的技术将反斜杠写入文件的有效方法在外部文件中写入 LaTeX 代码:
\newwrite\mywriter
\NewEnviron{writethis}
{\immediate\write\mywriter{\unexpanded\expandafter{\BODY}}}
\begin{document}
\immediate\openout\mywriter=\jobname-later.tex
\begin{writethis}\textbf{abc}\end{writethis}
\immediate\closeout\mywriter
但是,我不能将它与逐字文本一起使用:
\begin{writethis}
\begin{verbatim}
foo() {
}
\end{verbatim}
\end{writethis}
换行符已被删除。
如何使用 复制逐字代码 \immediate\write
?
答案1
我不会重新发明轮子。;-)
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{\jobname-later.tex}
\begin{verbatim}
foo() {
}
\end{verbatim}
\end{VerbatimOut}
Something
\input{\jobname-later}
\end{document}
我们可以使用基础结构fancyvrb
来定义VerbatimOutAppend
,以便只有当我们想要时才关闭文件。
\documentclass{article}
\usepackage{fancyvrb}
\makeatletter
\newcommand{\OpenVerbatimOutAppend}[2]{%
\expandafter\newwrite\csname martin@write@#1\endcsname
\immediate\openout\csname martin@write@#1\endcsname=#2\relax
}
\newcommand{\CloseVerbatimOutAppend}[1]{%
\immediate\closeout\csname martin@write@#1\endcsname
}
\def\VerbatimOutAppend{\FV@Environment{}{VerbatimOutAppend}}
\def\FVB@VerbatimOutAppend#1{%
\@bsphack
\begingroup
\FV@UseKeyValues
\FV@DefineWhiteSpace
\def\FV@Space{\space}%
\FV@DefineTabOut
\expandafter\let\expandafter\FV@OutFile\csname martin@write@#1\endcsname
\def\FV@ProcessLine{\immediate\write\FV@OutFile}%
\let\FV@FontScanPrep\relax
\let\@noligs\relax
\FV@Scan}
\def\FVE@VerbatimOutAppend{\endgroup\@esphack}
\DefineVerbatimEnvironment{VerbatimOutAppend}{VerbatimOutAppend}{}
\makeatother
\begin{document}
\OpenVerbatimOutAppend{default}{\jobname-later.tex}
\begin{VerbatimOutAppend}{default}
\begin{verbatim}
foo() {
}
\end{verbatim}
\end{VerbatimOutAppend}
Something
\begin{VerbatimOutAppend}{default}
\begin{verbatim}
foo() {
}
\end{verbatim}
\end{VerbatimOutAppend}
\CloseVerbatimOutAppend{default}
\input{\jobname-later}
\end{document}
多个输出文件可以同时处于活动状态;我们为每个文件分配一个符号名称,在本例中为default
。以下是输出文件的内容:
\begin{verbatim}
foo() {
}
\end{verbatim}
\begin{verbatim}
foo() {
}
\end{verbatim}