如何将环境内容输出到文件,同时用盒子包裹内容?

如何将环境内容输出到文件,同时用盒子包裹内容?

这是来源:

\documentclass{article}
\begin{document}
\begin{obj}{name-of-obj}
This is a test code.
\begin{equation}
a < b
\end{equation}
\end{obj}
\end{document}

我想用一个盒子把 obj 的内容包起来。使用framed包,可以通过定义:

\newenvironment{obj}[1]{%
\begin{framed}
}{%
\end{framed}
}

但是,同时我想生成如下的 xml 文件:

<?xml version="1.0"?>
<root>
<obj name="name-of-obj">
<content mime="application/x-latex"><![CDATA[
This is a test code.
\begin{equation}
a < b
\end{equation}
]]></content>
</obj>
</root>

(看来 VerbatimOutfancyvrb实现了 xml 输出,但是它破坏了通常的 dvi 输出。)

我该如何实现这个功能?

答案1

\documentclass{article}
\newwrite\objout
\usepackage{environ}

\NewEnviron{obj}[1]
{%
\fbox{\parbox{.5\textwidth}{\BODY}}%
\immediate\openout\objout=#1.xml
\immediate\write\objout{%
<?xml version="1.0"?>
<root>^^J%
<obj name="name-of-obj">%^^J
<content mime="application/x-latex"><![CDATA[^^J%
\expandafter\unexpanded\expandafter{\BODY}^^J%
]]></content>^^J%
</obj>^^J%
</root>^^J%
}%
\immediate\closeout\objout
}
{}

\begin{document}
\begin{obj}{name-of-obj}
This is a test code.
\begin{equation}
a < b
\end{equation}
\end{obj}
\end{document}

将内容排版在框中并name-of-obj.xml写出

<?xml version="1.0"?> <root>
<obj name="name-of-obj"><content mime="application/x-latex"><![CDATA[
This is a test code. \begin {equation} a < b \end {equation}
]]></content>
</obj>
</root>

注意,保存的文件中行尾已丢失。通常这无所谓,但如果有,则需要更复杂、更脆弱的版本,涉及 catcode 更改。

它也不会检查是否]]>出现在内容中。

相关内容