+
+HtmlStream & operator<<(HtmlStream & ms, char c)
+{
+ ms.os() << c;
+ return ms;
+}
+
+
+HtmlStream & operator<<(HtmlStream & ms, char_type c)
+{
+ ms.os().put(c);
+ return ms;
+}
+
+
+HtmlStream & operator<<(HtmlStream & ms, MTag const & t)
+{
+ ms.os() << '<' << from_ascii(t.tag_);
+ if (!t.attr_.empty())
+ ms.os() << " " << from_ascii(t.attr_);
+ ms << '>';
+ return ms;
+}
+
+
+HtmlStream & operator<<(HtmlStream & ms, ETag const & t)
+{
+ ms.os() << "</" << from_ascii(t.tag_) << '>';
+ return ms;
+}
+
+
+HtmlStream & operator<<(HtmlStream & ms, docstring const & s)
+{
+ ms.os() << s;
+ return ms;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+SetMode::SetMode(MathStream & os, bool text)
+ : os_(os)
+{
+ was_text_ = os_.inText();
+ os_.setTextMode(text);
+}
+
+
+SetMode::~SetMode()
+{
+ os_.setTextMode(was_text_);
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+
+SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
+ : os_(os)
+{
+ was_text_ = os_.inText();
+ os_.setTextMode(text);
+}
+
+
+SetHTMLMode::~SetHTMLMode()
+{
+ os_.setTextMode(was_text_);
+}
+
+