Fix the display of column spacing in AMS environments

AMS align environment should have some spacing between odd and even columns.

Add a new virtual method displayColSpace() to InsetMathGrid, InsetMathHull and
InsetMathSplit.
This commit is contained in:
Guillaume Munch 2015-12-20 20:56:34 +00:00 committed by Richard Heck
parent f3b70fd2cd
commit d4b56646b4
6 changed files with 70 additions and 14 deletions

View File

@ -486,7 +486,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
colinfo_[col].offset_ =
colinfo_[col - 1].offset_ +
colinfo_[col - 1].width_ +
colinfo_[col - 1].skip_ +
displayColSpace(col - 1) +
colsep() +
colinfo_[col].lines_ * vlinesep();
}
@ -508,7 +508,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
int const nextoffset =
colinfo_[first].offset_ +
wid +
colinfo_[last].skip_ +
displayColSpace(last) +
colsep() +
colinfo_[last+1].lines_ * vlinesep();
int const dx = nextoffset - colinfo_[last+1].offset_;
@ -741,7 +741,7 @@ void InsetMathGrid::metricsT(TextMetricsInfo const & mi, Dimension & dim) const
colinfo_[col].offset_ =
colinfo_[col - 1].offset_ +
colinfo_[col - 1].width_ +
colinfo_[col - 1].skip_ +
displayColSpace(col - 1) +
1 ; //colsep() +
//colinfo_[col].lines_ * vlinesep();
}
@ -953,7 +953,7 @@ int InsetMathGrid::cellWidth(idx_type idx) const
col_type c2 = c1 + ncellcols(idx);
return colinfo_[c2].offset_
- colinfo_[c1].offset_
- colinfo_[c2].skip_
- displayColSpace(c2)
- colsep()
- colinfo_[c2].lines_ * vlinesep();
}
@ -1378,6 +1378,11 @@ char InsetMathGrid::displayColAlign(idx_type idx) const
}
int InsetMathGrid::displayColSpace(col_type col) const
{
return colinfo_[col].skip_;
}
void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd)
{
//lyxerr << "*** InsetMathGrid: request: " << cmd << endl;
@ -1851,5 +1856,32 @@ char InsetMathGrid::colAlign(HullType type, col_type col)
}
//static
int InsetMathGrid::colSpace(HullType type, col_type col)
{
int alignInterSpace;
switch (type) {
case hullEqnArray:
return 5;
case hullAlign:
alignInterSpace = 20;
break;
case hullAlignAt:
alignInterSpace = 0;
break;
case hullXAlignAt:
alignInterSpace = 40;
break;
case hullXXAlignAt:
case hullFlAlign:
alignInterSpace = 60;
break;
default:
return 0;
}
return (col % 2) ? alignInterSpace : 0;
}
} // namespace lyx

View File

@ -261,8 +261,16 @@ protected:
/// Column alignment for display of cell \p idx.
/// Must not be written to file!
virtual char displayColAlign(idx_type idx) const;
/// Column spacing for display of column \p col.
/// Must not be written to file!
virtual int displayColSpace(col_type col) const;
// The following two functions are used in InsetMathHull and
// InsetMathSplit.
/// The value of a fixed col align for a certain hull type
static char colAlign(HullType type, col_type col);
/// The value of a fixed col spacing for a certain hull type
static int colSpace(HullType type, col_type col);
/// row info.
/// rowinfo_[nrows()] is a dummy row used only for hlines.

View File

@ -351,9 +351,9 @@ bool InsetMathHull::idxLast(Cursor & cur) const
// FIXME: InsetMathGrid should be changed to let the real column alignment be
// given by a virtual method like displayColAlign, because the values produced
// by defaultColAlign can be invalidated by lfuns such as add-column. I suspect
// that for the moment the values produced by defaultColAlign are not used,
// notably because alignment is not implemented in the LyXHTML output.
// by defaultColAlign can be invalidated by lfuns such as add-column. For the
// moment the values produced by defaultColAlign are not used, notably because
// alignment is not implemented in the LyXHTML output.
char InsetMathHull::defaultColAlign(col_type col)
{
return colAlign(type_, col);
@ -386,15 +386,16 @@ char InsetMathHull::displayColAlign(idx_type idx) const
}
int InsetMathHull::displayColSpace(col_type col) const
{
return colSpace(type_, col);
}
// FIXME: same comment as for defaultColAlign applies.
int InsetMathHull::defaultColSpace(col_type col)
{
if (type_ == hullAlign || type_ == hullAlignAt)
return 0;
if (type_ == hullXAlignAt)
return (col & 1) ? 20 : 0;
if (type_ == hullXXAlignAt || type_ == hullFlAlign)
return (col & 1) ? 40 : 0;
return 0;
return colSpace(type_, col);
}

View File

@ -111,6 +111,8 @@ public:
///
int defaultColSpace(col_type col);
///
int displayColSpace(col_type col) const;
///
char defaultColAlign(col_type col);
///
char displayColAlign(idx_type idx) const;

View File

@ -87,6 +87,17 @@ char InsetMathSplit::displayColAlign(idx_type idx) const
}
int InsetMathSplit::displayColSpace(col_type col) const
{
if (name_ == "split" || name_ == "aligned" || name_ == "align")
return colSpace(hullAlign, col);
if (name_ == "alignedat")
return colSpace(hullAlignAt, col);
return 0;
}
void InsetMathSplit::draw(PainterInfo & pi, int x, int y) const
{
InsetMathGrid::draw(pi, x, y);

View File

@ -41,6 +41,8 @@ public:
///
int defaultColSpace(col_type) { return 0; }
///
int displayColSpace(col_type col) const;
///
char defaultColAlign(col_type);
///
char displayColAlign(idx_type idx) const;