2003-08-19 13:00:56 +00:00
|
|
|
/**
|
2007-04-25 03:01:35 +00:00
|
|
|
* \file MathStream.cpp
|
2003-08-19 13:00:56 +00:00
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
*
|
2008-11-14 15:58:50 +00:00
|
|
|
* \author André Pönitz
|
2003-08-19 13:00:56 +00:00
|
|
|
*
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
*/
|
2002-09-11 09:14:57 +00:00
|
|
|
|
2001-12-03 17:52:48 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
2007-11-05 23:46:17 +00:00
|
|
|
#include "MathStream.h"
|
|
|
|
|
2016-06-30 02:39:42 +00:00
|
|
|
#include "MathFactory.h"
|
2007-04-26 16:05:57 +00:00
|
|
|
#include "MathData.h"
|
2006-10-22 10:15:23 +00:00
|
|
|
#include "MathExtern.h"
|
|
|
|
|
2016-06-19 02:39:38 +00:00
|
|
|
#include "TexRow.h"
|
|
|
|
|
2007-11-27 20:51:20 +00:00
|
|
|
#include "support/docstring.h"
|
2016-06-04 09:49:21 +00:00
|
|
|
#include "support/RefChanger.h"
|
|
|
|
#include "support/textutils.h"
|
2001-12-03 17:52:48 +00:00
|
|
|
|
2007-08-12 08:57:17 +00:00
|
|
|
#include <algorithm>
|
2008-02-07 17:04:06 +00:00
|
|
|
#include <cstring>
|
2008-05-06 10:36:32 +00:00
|
|
|
#include <ostream>
|
2007-11-05 23:46:17 +00:00
|
|
|
|
2007-12-12 10:16:00 +00:00
|
|
|
using namespace std;
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
|
2003-10-06 15:43:21 +00:00
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
NormalStream & operator<<(NormalStream & ns, MathAtom const & at)
|
2001-12-03 17:52:48 +00:00
|
|
|
{
|
2006-10-22 10:15:23 +00:00
|
|
|
at->normalize(ns);
|
|
|
|
return ns;
|
2001-12-03 17:52:48 +00:00
|
|
|
}
|
2001-12-05 08:04:20 +00:00
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
NormalStream & operator<<(NormalStream & ns, MathData const & ar)
|
2006-10-22 10:15:23 +00:00
|
|
|
{
|
|
|
|
normalize(ar, ns);
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NormalStream & operator<<(NormalStream & ns, docstring const & s)
|
|
|
|
{
|
|
|
|
ns.os() << s;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
NormalStream & operator<<(NormalStream & ns, const string & s)
|
2001-12-05 08:04:20 +00:00
|
|
|
{
|
2006-10-21 00:16:43 +00:00
|
|
|
ns.os() << from_utf8(s);
|
2001-12-05 08:04:20 +00:00
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
NormalStream & operator<<(NormalStream & ns, char const * s)
|
|
|
|
{
|
|
|
|
ns.os() << s;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NormalStream & operator<<(NormalStream & ns, char c)
|
|
|
|
{
|
|
|
|
ns.os() << c;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NormalStream & operator<<(NormalStream & ns, int i)
|
|
|
|
{
|
|
|
|
ns.os() << i;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
WriteStream & operator<<(WriteStream & ws, docstring const & s)
|
|
|
|
{
|
2010-11-18 14:05:50 +00:00
|
|
|
// Skip leading '\n' if we had already output a newline char
|
|
|
|
size_t const first =
|
|
|
|
(s.length() > 0 && (s[0] != '\n' || ws.canBreakLine())) ? 0 : 1;
|
|
|
|
|
|
|
|
// Check whether there's something to output
|
|
|
|
if (s.length() <= first)
|
|
|
|
return ws;
|
|
|
|
|
2008-06-16 01:21:17 +00:00
|
|
|
if (ws.pendingBrace()) {
|
|
|
|
ws.os() << '}';
|
|
|
|
ws.pendingBrace(false);
|
|
|
|
ws.pendingSpace(false);
|
|
|
|
ws.textMode(true);
|
2010-11-18 14:05:50 +00:00
|
|
|
} else if (ws.pendingSpace()) {
|
|
|
|
if (isAlphaASCII(s[first]))
|
2006-10-31 20:16:47 +00:00
|
|
|
ws.os() << ' ';
|
2010-11-18 14:05:50 +00:00
|
|
|
else if (s[first] == ' ' && ws.textMode())
|
2009-10-23 15:00:36 +00:00
|
|
|
ws.os() << '\\';
|
2006-10-31 20:16:47 +00:00
|
|
|
ws.pendingSpace(false);
|
|
|
|
}
|
2010-11-18 14:05:50 +00:00
|
|
|
ws.os() << s.substr(first);
|
2006-10-31 20:16:47 +00:00
|
|
|
int lf = 0;
|
2010-11-19 13:27:51 +00:00
|
|
|
char_type lastchar = 0;
|
2010-11-18 14:05:50 +00:00
|
|
|
docstring::const_iterator dit = s.begin() + first;
|
2006-10-31 20:16:47 +00:00
|
|
|
docstring::const_iterator end = s.end();
|
2010-11-18 14:05:50 +00:00
|
|
|
for (; dit != end; ++dit) {
|
|
|
|
lastchar = *dit;
|
|
|
|
if (lastchar == '\n')
|
2006-10-31 20:16:47 +00:00
|
|
|
++lf;
|
2010-11-18 14:05:50 +00:00
|
|
|
}
|
2006-10-31 20:16:47 +00:00
|
|
|
ws.addlines(lf);
|
2010-11-18 14:05:50 +00:00
|
|
|
ws.canBreakLine(lastchar != '\n');
|
2006-10-22 10:15:23 +00:00
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-10-07 03:13:21 +00:00
|
|
|
WriteStream::WriteStream(otexrowstream & os, bool fragile, bool latex,
|
|
|
|
OutputType output, Encoding const * encoding)
|
2016-06-14 18:22:24 +00:00
|
|
|
: os_(os), fragile_(fragile), firstitem_(false), latex_(latex),
|
Fix display and output of math macros with optional arguments
This is a long standing issue, present since the new math macros
inception in version 1.6. It manifests as a display issue when a
macro with optional arguments appears in the optional argument of
another macro. In this case the display is messed up and it is
difficult, if not impossible, changing the arguments as they do not
appear on screen as related to a specific macro instance. It also
manifests as latex errors when compiling, even if the latex output
is formally correct, due to limitations of the xargs package used
to output the macros. Most probably, both aspects have the same
root cause, as simply enclosing in braces the macro and its
parameters solves both issues. However, when reloading a document,
lyx strips the outer braces enclosing a macro argument, thus
frustrating this possible workaround.
This commit solves the display issue by correctly accounting for
macros with optional arguments nested in the argument of another
macro, and circumvents the xargs package limitations causing errors
by enclosing in braces the macros with optional arguments appearing
in the argument of an outer macro when they are output. This means
that when loading an old document with such macros and saving it
again, the macro representation is updated and will have these
additional braces. However, as such braces are stripped by lyx on
loading, there is no risk that they accumulate.
See also this thread:
http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg197828.html
2016-12-01 17:02:47 +00:00
|
|
|
output_(output), insidemacro_(false), pendingspace_(false),
|
|
|
|
pendingbrace_(false), textmode_(false), locked_(0), ascii_(0),
|
|
|
|
canbreakline_(true), mathsout_(false), ulemcmd_(NONE), line_(0),
|
|
|
|
encoding_(encoding), row_entry_(TexRow::row_none)
|
2006-10-22 10:15:23 +00:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
WriteStream::~WriteStream()
|
|
|
|
{
|
2008-06-16 01:21:17 +00:00
|
|
|
if (pendingbrace_)
|
|
|
|
os_ << '}';
|
|
|
|
else if (pendingspace_)
|
2006-10-22 10:15:23 +00:00
|
|
|
os_ << ' ';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void WriteStream::addlines(unsigned int n)
|
|
|
|
{
|
|
|
|
line_ += n;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void WriteStream::pendingSpace(bool how)
|
|
|
|
{
|
|
|
|
pendingspace_ = how;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-06-16 01:21:17 +00:00
|
|
|
void WriteStream::pendingBrace(bool brace)
|
|
|
|
{
|
|
|
|
pendingbrace_ = brace;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-06-04 00:36:04 +00:00
|
|
|
void WriteStream::textMode(bool textmode)
|
|
|
|
{
|
|
|
|
textmode_ = textmode;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-07-03 00:05:58 +00:00
|
|
|
void WriteStream::lockedMode(bool locked)
|
|
|
|
{
|
|
|
|
locked_ = locked;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-04 19:08:17 +00:00
|
|
|
void WriteStream::asciiOnly(bool ascii)
|
|
|
|
{
|
|
|
|
ascii_ = ascii;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-10-11 10:09:38 +00:00
|
|
|
Changer WriteStream::changeRowEntry(TexRow::RowEntry entry)
|
2015-10-07 03:13:21 +00:00
|
|
|
{
|
2016-10-11 10:09:38 +00:00
|
|
|
return make_change(row_entry_, entry);
|
2015-10-07 03:13:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool WriteStream::startOuterRow()
|
|
|
|
{
|
2016-10-11 10:09:38 +00:00
|
|
|
if (TexRow::isNone(row_entry_))
|
2015-10-07 03:13:21 +00:00
|
|
|
return false;
|
2016-10-11 10:09:38 +00:00
|
|
|
return texrow().start(row_entry_);
|
2015-10-07 03:13:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
WriteStream & operator<<(WriteStream & ws, MathAtom const & at)
|
|
|
|
{
|
|
|
|
at->write(ws);
|
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
WriteStream & operator<<(WriteStream & ws, MathData const & ar)
|
2006-10-22 10:15:23 +00:00
|
|
|
{
|
|
|
|
write(ar, ws);
|
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WriteStream & operator<<(WriteStream & ws, char const * s)
|
|
|
|
{
|
2010-11-18 14:05:50 +00:00
|
|
|
ws << from_utf8(s);
|
2006-10-22 10:15:23 +00:00
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WriteStream & operator<<(WriteStream & ws, char c)
|
|
|
|
{
|
2010-11-18 14:05:50 +00:00
|
|
|
if (c == '\n' && !ws.canBreakLine())
|
|
|
|
return ws;
|
|
|
|
|
2008-06-16 01:21:17 +00:00
|
|
|
if (ws.pendingBrace()) {
|
|
|
|
ws.os() << '}';
|
|
|
|
ws.pendingBrace(false);
|
|
|
|
ws.pendingSpace(false);
|
|
|
|
ws.textMode(true);
|
|
|
|
} else if (ws.pendingSpace()) {
|
2007-04-02 15:21:36 +00:00
|
|
|
if (isAlphaASCII(c))
|
2006-10-22 10:15:23 +00:00
|
|
|
ws.os() << ' ';
|
2009-10-23 15:00:36 +00:00
|
|
|
else if (c == ' ' && ws.textMode())
|
|
|
|
ws.os() << '\\';
|
2006-10-22 10:15:23 +00:00
|
|
|
ws.pendingSpace(false);
|
|
|
|
}
|
|
|
|
ws.os() << c;
|
2010-11-18 21:15:59 +00:00
|
|
|
if (c == '\n')
|
2006-10-22 10:15:23 +00:00
|
|
|
ws.addlines(1);
|
2010-11-18 21:15:59 +00:00
|
|
|
ws.canBreakLine(c != '\n');
|
2006-10-22 10:15:23 +00:00
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WriteStream & operator<<(WriteStream & ws, int i)
|
|
|
|
{
|
2008-06-16 01:21:17 +00:00
|
|
|
if (ws.pendingBrace()) {
|
|
|
|
ws.os() << '}';
|
|
|
|
ws.pendingBrace(false);
|
|
|
|
ws.textMode(true);
|
|
|
|
}
|
2006-10-22 10:15:23 +00:00
|
|
|
ws.os() << i;
|
2010-11-18 14:05:50 +00:00
|
|
|
ws.canBreakLine(true);
|
2006-10-22 10:15:23 +00:00
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WriteStream & operator<<(WriteStream & ws, unsigned int i)
|
|
|
|
{
|
2008-06-16 01:21:17 +00:00
|
|
|
if (ws.pendingBrace()) {
|
|
|
|
ws.os() << '}';
|
|
|
|
ws.pendingBrace(false);
|
|
|
|
ws.textMode(true);
|
|
|
|
}
|
2006-10-22 10:15:23 +00:00
|
|
|
ws.os() << i;
|
2010-11-18 14:05:50 +00:00
|
|
|
ws.canBreakLine(true);
|
2006-10-22 10:15:23 +00:00
|
|
|
return ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
MathStream::MathStream(odocstream & os)
|
2010-11-18 09:58:35 +00:00
|
|
|
: os_(os), tab_(0), line_(0), in_text_(false)
|
2006-10-22 10:15:23 +00:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
2009-12-31 17:31:13 +00:00
|
|
|
void MathStream::cr()
|
|
|
|
{
|
|
|
|
os() << '\n';
|
|
|
|
for (int i = 0; i < tab(); ++i)
|
|
|
|
os() << ' ';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MathStream::defer(docstring const & s)
|
|
|
|
{
|
|
|
|
deferred_ << s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MathStream::defer(string const & s)
|
|
|
|
{
|
|
|
|
deferred_ << from_utf8(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
docstring MathStream::deferred() const
|
|
|
|
{
|
|
|
|
return deferred_.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
MathStream & operator<<(MathStream & ms, MathAtom const & at)
|
|
|
|
{
|
|
|
|
at->mathmlize(ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
MathStream & operator<<(MathStream & ms, MathData const & ar)
|
2001-12-05 08:04:20 +00:00
|
|
|
{
|
2006-10-22 10:15:23 +00:00
|
|
|
mathmlize(ar, ms);
|
2001-12-05 08:04:20 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
MathStream & operator<<(MathStream & ms, char const * s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathStream & operator<<(MathStream & ms, char c)
|
|
|
|
{
|
|
|
|
ms.os() << c;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-12-31 17:31:13 +00:00
|
|
|
MathStream & operator<<(MathStream & ms, char_type c)
|
|
|
|
{
|
2010-01-14 13:29:13 +00:00
|
|
|
ms.os().put(c);
|
2009-12-31 17:31:13 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
MathStream & operator<<(MathStream & ms, MTag const & t)
|
|
|
|
{
|
|
|
|
++ms.tab();
|
|
|
|
ms.cr();
|
2010-01-21 21:06:29 +00:00
|
|
|
ms.os() << '<' << from_ascii(t.tag_);
|
|
|
|
if (!t.attr_.empty())
|
|
|
|
ms.os() << " " << from_ascii(t.attr_);
|
|
|
|
ms << '>';
|
2006-10-22 10:15:23 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathStream & operator<<(MathStream & ms, ETag const & t)
|
|
|
|
{
|
|
|
|
ms.cr();
|
|
|
|
if (ms.tab() > 0)
|
|
|
|
--ms.tab();
|
2007-11-05 23:46:17 +00:00
|
|
|
ms.os() << "</" << from_ascii(t.tag_) << '>';
|
2006-10-22 10:15:23 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathStream & operator<<(MathStream & ms, docstring const & s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
2009-12-31 15:52:57 +00:00
|
|
|
|
2010-03-29 22:52:13 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
HtmlStream::HtmlStream(odocstream & os)
|
2010-11-18 09:58:35 +00:00
|
|
|
: os_(os), tab_(0), line_(0), in_text_(false)
|
2010-03-29 22:52:13 +00:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
|
|
void HtmlStream::defer(docstring const & s)
|
|
|
|
{
|
|
|
|
deferred_ << s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void HtmlStream::defer(string const & s)
|
|
|
|
{
|
|
|
|
deferred_ << from_utf8(s);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
docstring HtmlStream::deferred() const
|
|
|
|
{
|
|
|
|
return deferred_.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HtmlStream & operator<<(HtmlStream & ms, MathAtom const & at)
|
|
|
|
{
|
|
|
|
at->htmlize(ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HtmlStream & operator<<(HtmlStream & ms, MathData const & ar)
|
|
|
|
{
|
|
|
|
htmlize(ar, ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HtmlStream & operator<<(HtmlStream & ms, char const * s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
2009-12-31 19:49:29 +00:00
|
|
|
SetMode::SetMode(MathStream & os, bool text)
|
2011-04-01 22:34:40 +00:00
|
|
|
: os_(os)
|
2009-12-31 19:49:29 +00:00
|
|
|
{
|
|
|
|
was_text_ = os_.inText();
|
2011-04-01 22:34:40 +00:00
|
|
|
os_.setTextMode(text);
|
2009-12-31 19:35:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetMode::~SetMode()
|
|
|
|
{
|
2011-04-01 22:34:40 +00:00
|
|
|
os_.setTextMode(was_text_);
|
2009-12-31 19:35:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-03-30 02:37:05 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
SetHTMLMode::SetHTMLMode(HtmlStream & os, bool text)
|
2011-04-01 22:34:40 +00:00
|
|
|
: os_(os)
|
2010-03-30 02:37:05 +00:00
|
|
|
{
|
|
|
|
was_text_ = os_.inText();
|
2011-04-01 22:34:40 +00:00
|
|
|
os_.setTextMode(text);
|
2010-03-30 02:37:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SetHTMLMode::~SetHTMLMode()
|
|
|
|
{
|
2011-04-01 22:34:40 +00:00
|
|
|
os_.setTextMode(was_text_);
|
2010-03-30 02:37:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
MapleStream & operator<<(MapleStream & ms, MathAtom const & at)
|
2002-10-28 17:15:19 +00:00
|
|
|
{
|
2006-10-22 10:15:23 +00:00
|
|
|
at->maple(ms);
|
2002-10-28 17:15:19 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
MapleStream & operator<<(MapleStream & ms, MathData const & ar)
|
2002-07-01 11:17:14 +00:00
|
|
|
{
|
2006-10-22 10:15:23 +00:00
|
|
|
maple(ar, ms);
|
2002-07-01 11:17:14 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
MapleStream & operator<<(MapleStream & ms, char const * s)
|
2001-12-05 08:04:20 +00:00
|
|
|
{
|
2006-10-22 10:15:23 +00:00
|
|
|
ms.os() << s;
|
2001-12-05 08:04:20 +00:00
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
MapleStream & operator<<(MapleStream & ms, char c)
|
|
|
|
{
|
|
|
|
ms.os() << c;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MapleStream & operator<<(MapleStream & ms, int i)
|
|
|
|
{
|
|
|
|
ms.os() << i;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MapleStream & operator<<(MapleStream & ms, char_type c)
|
|
|
|
{
|
|
|
|
ms.os().put(c);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MapleStream & operator<<(MapleStream & ms, docstring const & s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
MaximaStream & operator<<(MaximaStream & ms, MathAtom const & at)
|
|
|
|
{
|
|
|
|
at->maxima(ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
MaximaStream & operator<<(MaximaStream & ms, MathData const & ar)
|
2006-10-22 10:15:23 +00:00
|
|
|
{
|
|
|
|
maxima(ar, ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MaximaStream & operator<<(MaximaStream & ms, char const * s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MaximaStream & operator<<(MaximaStream & ms, char c)
|
|
|
|
{
|
|
|
|
ms.os() << c;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MaximaStream & operator<<(MaximaStream & ms, int i)
|
|
|
|
{
|
|
|
|
ms.os() << i;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MaximaStream & operator<<(MaximaStream & ms, docstring const & s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MaximaStream & operator<<(MaximaStream & ms, char_type c)
|
|
|
|
{
|
|
|
|
ms.os().put(c);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, MathAtom const & at)
|
|
|
|
{
|
|
|
|
at->mathematica(ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, MathData const & ar)
|
2006-10-22 10:15:23 +00:00
|
|
|
{
|
|
|
|
mathematica(ar, ms);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, char const * s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, char c)
|
|
|
|
{
|
|
|
|
ms.os() << c;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, int i)
|
|
|
|
{
|
|
|
|
ms.os() << i;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, docstring const & s)
|
|
|
|
{
|
|
|
|
ms.os() << s;
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream & ms, char_type c)
|
|
|
|
{
|
|
|
|
ms.os().put(c);
|
|
|
|
return ms;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
OctaveStream & operator<<(OctaveStream & ns, MathAtom const & at)
|
|
|
|
{
|
|
|
|
at->octave(ns);
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-04-26 16:05:57 +00:00
|
|
|
OctaveStream & operator<<(OctaveStream & ns, MathData const & ar)
|
2006-10-22 10:15:23 +00:00
|
|
|
{
|
|
|
|
octave(ar, ns);
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OctaveStream & operator<<(OctaveStream & ns, char const * s)
|
|
|
|
{
|
|
|
|
ns.os() << s;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OctaveStream & operator<<(OctaveStream & ns, char c)
|
|
|
|
{
|
|
|
|
ns.os() << c;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OctaveStream & operator<<(OctaveStream & ns, int i)
|
|
|
|
{
|
|
|
|
ns.os() << i;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OctaveStream & operator<<(OctaveStream & ns, docstring const & s)
|
|
|
|
{
|
|
|
|
ns.os() << s;
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OctaveStream & operator<<(OctaveStream & ns, char_type c)
|
|
|
|
{
|
|
|
|
ns.os().put(c);
|
|
|
|
return ns;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-12-12 19:28:07 +00:00
|
|
|
OctaveStream & operator<<(OctaveStream & os, string const & s)
|
2001-12-05 08:04:20 +00:00
|
|
|
{
|
2006-10-21 00:16:43 +00:00
|
|
|
os.os() << from_utf8(s);
|
2001-12-05 08:04:20 +00:00
|
|
|
return os;
|
|
|
|
}
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
2016-06-30 02:39:42 +00:00
|
|
|
docstring convertDelimToXMLEscape(docstring const & name)
|
|
|
|
{
|
|
|
|
if (name.size() == 1) {
|
|
|
|
char_type const c = name[0];
|
|
|
|
if (c == '<')
|
|
|
|
return from_ascii("<");
|
|
|
|
else if (c == '>')
|
|
|
|
return from_ascii(">");
|
|
|
|
else
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
MathWordList const & words = mathedWordList();
|
|
|
|
MathWordList::const_iterator it = words.find(name);
|
|
|
|
if (it != words.end()) {
|
|
|
|
docstring const escape = it->second.xmlname;
|
|
|
|
return escape;
|
|
|
|
}
|
|
|
|
LYXERR0("Unable to find `" << name <<"' in the mathWordList.");
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
} // namespace lyx
|