这是来源:
\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 更改。
它也不会检查是否]]>
出现在内容中。