2001-12-05 08:04:20 +00:00
|
|
|
|
// -*- C++ -*-
|
2003-08-19 13:00:56 +00:00
|
|
|
|
/**
|
2006-09-17 09:14:18 +00:00
|
|
|
|
* \file MathStream.h
|
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.
|
|
|
|
|
*
|
|
|
|
|
* \author Andr<EFBFBD> P<EFBFBD>nitz
|
|
|
|
|
*
|
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
|
*/
|
2002-09-11 09:14:57 +00:00
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
|
#ifndef MATH_MATHMLSTREAM_H
|
|
|
|
|
#define MATH_MATHMLSTREAM_H
|
2001-12-03 16:24:50 +00:00
|
|
|
|
|
2007-11-05 23:46:17 +00:00
|
|
|
|
#include "support/strfwd.h"
|
2006-10-22 10:15:23 +00:00
|
|
|
|
|
2008-06-17 11:10:43 +00:00
|
|
|
|
#include "InsetMath.h"
|
2007-11-05 23:46:17 +00:00
|
|
|
|
// FIXME: Move to individual insets
|
2007-04-26 04:41:58 +00:00
|
|
|
|
#include "MetricsInfo.h"
|
2001-12-03 17:52:48 +00:00
|
|
|
|
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
|
|
2008-07-20 01:50:54 +00:00
|
|
|
|
class Encoding;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
class InsetMath;
|
|
|
|
|
class MathAtom;
|
2008-07-20 01:50:54 +00:00
|
|
|
|
class MathData;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// LaTeX/LyX
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
class WriteStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
2008-07-20 01:50:54 +00:00
|
|
|
|
WriteStream(odocstream & os, bool fragile, bool latex, bool dryrun,
|
|
|
|
|
Encoding const * encoding = 0);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
explicit WriteStream(odocstream & os);
|
|
|
|
|
///
|
|
|
|
|
~WriteStream();
|
|
|
|
|
///
|
|
|
|
|
int line() const { return line_; }
|
|
|
|
|
///
|
|
|
|
|
bool fragile() const { return fragile_; }
|
|
|
|
|
///
|
|
|
|
|
bool latex() const { return latex_; }
|
|
|
|
|
///
|
2008-05-31 20:54:50 +00:00
|
|
|
|
bool dryrun() const { return dryrun_; }
|
|
|
|
|
///
|
2006-10-22 10:15:23 +00:00
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
///
|
|
|
|
|
bool & firstitem() { return firstitem_; }
|
|
|
|
|
///
|
|
|
|
|
void addlines(unsigned int);
|
|
|
|
|
/// writes space if next thing is isalpha()
|
|
|
|
|
void pendingSpace(bool how);
|
|
|
|
|
/// writes space if next thing is isalpha()
|
|
|
|
|
bool pendingSpace() const { return pendingspace_; }
|
2008-06-16 01:21:17 +00:00
|
|
|
|
/// tell whether to write the closing brace of \ensuremath
|
|
|
|
|
void pendingBrace(bool brace);
|
|
|
|
|
/// tell whether to write the closing brace of \ensuremath
|
|
|
|
|
bool pendingBrace() const { return pendingbrace_; }
|
2008-06-04 00:36:04 +00:00
|
|
|
|
/// tell whether we are in text mode or not when producing latex code
|
|
|
|
|
void textMode(bool textmode);
|
|
|
|
|
/// tell whether we are in text mode or not when producing latex code
|
|
|
|
|
bool textMode() const { return textmode_; }
|
2008-07-20 01:50:54 +00:00
|
|
|
|
/// LaTeX encoding
|
|
|
|
|
Encoding const * encoding() const { return encoding_; }
|
2006-10-22 10:15:23 +00:00
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
/// do we have to write \\protect sometimes
|
|
|
|
|
bool fragile_;
|
2007-04-26 16:05:57 +00:00
|
|
|
|
/// are we at the beginning of an MathData?
|
2006-10-22 10:15:23 +00:00
|
|
|
|
bool firstitem_;
|
|
|
|
|
/// are we writing to .tex?
|
|
|
|
|
int latex_;
|
2008-05-31 20:54:50 +00:00
|
|
|
|
/// is it for preview?
|
|
|
|
|
bool dryrun_;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
/// do we have a space pending?
|
|
|
|
|
bool pendingspace_;
|
2008-06-16 01:21:17 +00:00
|
|
|
|
/// do we have a brace pending?
|
|
|
|
|
bool pendingbrace_;
|
2008-06-04 00:36:04 +00:00
|
|
|
|
/// are we in text mode when producing latex code?
|
|
|
|
|
bool textmode_;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
int line_;
|
2008-07-20 01:50:54 +00:00
|
|
|
|
///
|
|
|
|
|
Encoding const * encoding_;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
WriteStream & operator<<(WriteStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
WriteStream & operator<<(WriteStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
WriteStream & operator<<(WriteStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
WriteStream & operator<<(WriteStream &, char const * const);
|
|
|
|
|
///
|
|
|
|
|
WriteStream & operator<<(WriteStream &, char);
|
|
|
|
|
///
|
|
|
|
|
WriteStream & operator<<(WriteStream &, int);
|
|
|
|
|
///
|
|
|
|
|
WriteStream & operator<<(WriteStream &, unsigned int);
|
|
|
|
|
|
2008-06-17 11:10:43 +00:00
|
|
|
|
/// ensure math mode, possibly by opening \ensuremath
|
|
|
|
|
bool ensureMath(WriteStream & os, bool needs_math_mode = true, bool macro = false);
|
|
|
|
|
|
|
|
|
|
/// ensure the requested mode, possibly by closing \ensuremath
|
|
|
|
|
bool ensureMode(WriteStream & os, InsetMath::mode_type mode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* MathEnsurer - utility class for ensuring math mode
|
|
|
|
|
*
|
|
|
|
|
* A local variable of this type can be used to either ensure math mode
|
|
|
|
|
* or delay the writing of a pending brace when outputting LaTeX.
|
|
|
|
|
*
|
|
|
|
|
* Example 1:
|
|
|
|
|
*
|
|
|
|
|
* MathEnsurer ensurer(os);
|
|
|
|
|
*
|
|
|
|
|
* If not already in math mode, inserts an \ensuremath command followed
|
|
|
|
|
* by an open brace. This brace will be automatically closed when exiting
|
|
|
|
|
* math mode. Math mode is automatically exited when writing something
|
|
|
|
|
* that doesn't explicitly require math mode.
|
|
|
|
|
*
|
|
|
|
|
* Example 2:
|
|
|
|
|
*
|
|
|
|
|
* MathEnsurer ensurer(os, false);
|
|
|
|
|
*
|
|
|
|
|
* Simply suspend writing a closing brace until the end of ensurer's scope.
|
|
|
|
|
*
|
|
|
|
|
* Example 3:
|
|
|
|
|
*
|
|
|
|
|
* MathEnsurer ensurer(os, needs_math_mode, true);
|
|
|
|
|
*
|
|
|
|
|
* The third parameter is set to true only for a user defined macro, which
|
|
|
|
|
* needs special handling. When it is a MathMacro, the needs_math_mode
|
|
|
|
|
* parameter is true and the behavior is as in Example 1. When the
|
|
|
|
|
* needs_math_mode parameter is false (not a MathMacro) and the macro
|
|
|
|
|
* was entered in a text box and we are in math mode, the mode is reset
|
|
|
|
|
* to text. This is because the macro was probably designed for text mode
|
|
|
|
|
* (given that it was entered in text mode and we have no way to tell the
|
|
|
|
|
* contrary).
|
|
|
|
|
*/
|
|
|
|
|
class MathEnsurer
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit MathEnsurer(WriteStream & os, bool needs_math_mode = true, bool macro = false)
|
|
|
|
|
: os_(os), brace_(ensureMath(os, needs_math_mode, macro)) {}
|
|
|
|
|
///
|
|
|
|
|
~MathEnsurer() { os_.pendingBrace(brace_); }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
WriteStream & os_;
|
|
|
|
|
///
|
|
|
|
|
bool brace_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* ModeSpecifier - utility class for specifying a given mode (math or text)
|
|
|
|
|
*
|
|
|
|
|
* A local variable of this type can be used to specify that a command or
|
|
|
|
|
* environment works in a given mode. For example, \mbox works in text
|
|
|
|
|
* mode, but \boxed works in math mode. Note that no mode changing commands
|
|
|
|
|
* are needed, but we have to track the current mode, hence this class.
|
|
|
|
|
*
|
|
|
|
|
* Example:
|
|
|
|
|
*
|
|
|
|
|
* ModeSpecifier specifier(os, TEXT_MODE);
|
|
|
|
|
*
|
|
|
|
|
* Sets the current mode to text mode.
|
|
|
|
|
*
|
|
|
|
|
* At the end of specifier's scope the mode is reset to its previous value.
|
|
|
|
|
*/
|
|
|
|
|
class ModeSpecifier
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit ModeSpecifier(WriteStream & os, InsetMath::mode_type mode)
|
|
|
|
|
: os_(os), textmode_(ensureMode(os, mode)) {}
|
|
|
|
|
///
|
|
|
|
|
~ModeSpecifier() { os_.textMode(textmode_); }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
WriteStream & os_;
|
|
|
|
|
///
|
|
|
|
|
bool textmode_;
|
|
|
|
|
};
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// MathML
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
class MTag {
|
|
|
|
|
public:
|
|
|
|
|
///
|
2007-11-05 23:46:17 +00:00
|
|
|
|
MTag(char const * const tag) : tag_(tag) {}
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
2007-11-05 23:46:17 +00:00
|
|
|
|
char const * const tag_;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ETag {
|
|
|
|
|
public:
|
|
|
|
|
///
|
2007-11-05 23:46:17 +00:00
|
|
|
|
ETag(char const * const tag) : tag_(tag) {}
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
2007-11-05 23:46:17 +00:00
|
|
|
|
char const * const tag_;
|
2006-10-22 10:15:23 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class MathStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit MathStream(odocstream & os);
|
|
|
|
|
///
|
|
|
|
|
void cr();
|
|
|
|
|
///
|
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
///
|
|
|
|
|
int line() const { return line_; }
|
|
|
|
|
///
|
|
|
|
|
int & tab() { return tab_; }
|
|
|
|
|
///
|
|
|
|
|
friend MathStream & operator<<(MathStream &, char const *);
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
///
|
|
|
|
|
int tab_;
|
|
|
|
|
///
|
|
|
|
|
int line_;
|
|
|
|
|
///
|
|
|
|
|
char lastchar_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
MathStream & operator<<(MathStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
MathStream & operator<<(MathStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
MathStream & operator<<(MathStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
MathStream & operator<<(MathStream &, char const *);
|
|
|
|
|
///
|
|
|
|
|
MathStream & operator<<(MathStream &, char);
|
|
|
|
|
///
|
|
|
|
|
MathStream & operator<<(MathStream &, MTag const &);
|
|
|
|
|
///
|
|
|
|
|
MathStream & operator<<(MathStream &, ETag const &);
|
|
|
|
|
|
|
|
|
|
|
2001-12-03 16:24:50 +00:00
|
|
|
|
|
|
|
|
|
//
|
2006-10-22 10:15:23 +00:00
|
|
|
|
// Debugging
|
2001-12-03 16:24:50 +00:00
|
|
|
|
//
|
|
|
|
|
|
2006-10-22 10:15:23 +00:00
|
|
|
|
class NormalStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit NormalStream(odocstream & os) : os_(os) {}
|
|
|
|
|
///
|
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
NormalStream & operator<<(NormalStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
NormalStream & operator<<(NormalStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
NormalStream & operator<<(NormalStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
NormalStream & operator<<(NormalStream &, char const *);
|
|
|
|
|
///
|
|
|
|
|
NormalStream & operator<<(NormalStream &, char);
|
|
|
|
|
///
|
|
|
|
|
NormalStream & operator<<(NormalStream &, int);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Maple
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MapleStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit MapleStream(odocstream & os) : os_(os) {}
|
|
|
|
|
///
|
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
MapleStream & operator<<(MapleStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
MapleStream & operator<<(MapleStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
MapleStream & operator<<(MapleStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
MapleStream & operator<<(MapleStream &, char_type);
|
|
|
|
|
///
|
|
|
|
|
MapleStream & operator<<(MapleStream &, char const *);
|
|
|
|
|
///
|
|
|
|
|
MapleStream & operator<<(MapleStream &, char);
|
|
|
|
|
///
|
|
|
|
|
MapleStream & operator<<(MapleStream &, int);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Maxima
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MaximaStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit MaximaStream(odocstream & os) : os_(os) {}
|
|
|
|
|
///
|
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
MaximaStream & operator<<(MaximaStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
MaximaStream & operator<<(MaximaStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
MaximaStream & operator<<(MaximaStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
MaximaStream & operator<<(MaximaStream &, char_type);
|
|
|
|
|
///
|
|
|
|
|
MaximaStream & operator<<(MaximaStream &, char const *);
|
|
|
|
|
///
|
|
|
|
|
MaximaStream & operator<<(MaximaStream &, char);
|
|
|
|
|
///
|
|
|
|
|
MaximaStream & operator<<(MaximaStream &, int);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Mathematica
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MathematicaStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit MathematicaStream(odocstream & os) : os_(os) {}
|
|
|
|
|
///
|
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
MathematicaStream & operator<<(MathematicaStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream &, char const *);
|
|
|
|
|
///
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream &, char);
|
|
|
|
|
///
|
|
|
|
|
MathematicaStream & operator<<(MathematicaStream &, int);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Octave
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OctaveStream {
|
|
|
|
|
public:
|
|
|
|
|
///
|
|
|
|
|
explicit OctaveStream(odocstream & os) : os_(os) {}
|
|
|
|
|
///
|
|
|
|
|
odocstream & os() { return os_; }
|
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
odocstream & os_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
OctaveStream & operator<<(OctaveStream &, MathAtom const &);
|
|
|
|
|
///
|
2007-04-26 16:05:57 +00:00
|
|
|
|
OctaveStream & operator<<(OctaveStream &, MathData const &);
|
2006-10-22 10:15:23 +00:00
|
|
|
|
///
|
|
|
|
|
OctaveStream & operator<<(OctaveStream &, docstring const &);
|
|
|
|
|
///
|
|
|
|
|
OctaveStream & operator<<(OctaveStream &, char_type);
|
|
|
|
|
///
|
|
|
|
|
OctaveStream & operator<<(OctaveStream &, char const *);
|
|
|
|
|
///
|
|
|
|
|
OctaveStream & operator<<(OctaveStream &, char);
|
|
|
|
|
///
|
|
|
|
|
OctaveStream & operator<<(OctaveStream &, int);
|
2006-10-21 00:16:43 +00:00
|
|
|
|
|
|
|
|
|
} // namespace lyx
|
|
|
|
|
|
2001-12-03 16:24:50 +00:00
|
|
|
|
#endif
|