lyx_mirror/src/mathed/InsetMathDecoration.h
Jean-Marc Lasgouttes f96b99dcb3 Implement properly \limits and \nolimits
These are now properties of insets that can be operators :
InsetMathSymbols, InsetMathDecoration (for over/underbrace) and
InsetMathMacro (for its contents).

Each of these has a limit_ member that allows to remember a limit
forcing and a member defaultLimits() that indicates what to do in the
absence of such forcing. Moreover the write() method calls
writeLimits().

This allows to simplify the definitions of integrals in lib/symbols by
defining the integrals as macros of their "op" version, as it is done in
the style files.

Also, many hardcoded assumptions can now be removed.

The handling of LFUN_MATH_LIMITS is now done in InsetNest, which tries
successively to apply the limit change to (1) the character after
cursor, (2) the character before cursor and (3) the character at the
end of the inset (useful for script insets?)

The new code allows to define
  \newcommand\int{\intop\limits}
but not
  \newcommand\makelimits#1{#1\limits}

It is also possible to type explicitly \limits or \nolimits to modify
a symbol.
2020-07-20 23:20:26 +02:00

81 lines
1.8 KiB
C++

// -*- C++ -*-
/**
* \file InsetMathDecoration.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Alejandro Aguilar Sierra
* \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#ifndef MATH_DECORATIONINSET_H
#define MATH_DECORATIONINSET_H
#include "InsetMathNest.h"
namespace lyx {
class latexkeys;
/// Decorations and accents over (below) a math object
class InsetMathDecoration : public InsetMathNest {
public:
///
explicit InsetMathDecoration(Buffer * buf, latexkeys const * key);
///
mode_type currentMode() const;
///
void draw(PainterInfo &, int x, int y) const;
///
void write(WriteStream & os) const;
///
void metrics(MetricsInfo & mi, Dimension & dim) const;
///
void normalize(NormalStream & os) const;
///
void infoize(odocstream & os) const;
///
MathClass mathClass() const;
/// The default limits value
Limits defaultLimits() const { return allowsLimitsChange() ? LIMITS : NO_LIMITS; }
/// whether the inset has limit-like sub/superscript
Limits limits() const { return limits_; }
/// sets types of sub/superscripts
void limits(Limits lim) { limits_ = lim; }
///
void validate(LaTeXFeatures & features) const;
///
InsetCode lyxCode() const { return MATH_DECORATION_CODE; }
///
void mathmlize(MathStream &) const;
///
void htmlize(HtmlStream &) const;
private:
virtual Inset * clone() const;
///
bool upper() const;
///
bool protect() const;
/// is it a wide decoration?
bool wide() const;
///
latexkeys const * key_;
///
Limits limits_ = AUTO_LIMITS;
// FIXME: this should depend on BufferView
/// height cache of deco
mutable int dh_ = 0;
/// vertical offset cache of deco
mutable int dy_ = 0;
/// width for non-wide deco
mutable int dw_ = 0;
};
} // namespace lyx
#endif