Fix LaTeX output of fixed-width cells with decimal separator

This follows Uwe's suggestions (and discharges my own).

The result is not ideal, but there is currently no ideal solution.

Fixes: #9568
This commit is contained in:
Juergen Spitzmueller 2016-10-22 12:13:36 +02:00
parent 95db20e008
commit 9235b09fd8

View File

@ -1033,7 +1033,7 @@ bool Tabular::updateColumnWidths()
idx_type const i = cellIndex(r, c); idx_type const i = cellIndex(r, c);
if (columnSpan(i) == 1) { if (columnSpan(i) == 1) {
if (getAlignment(i) == LYX_ALIGN_DECIMAL if (getAlignment(i) == LYX_ALIGN_DECIMAL
&& cell_info[r][c].decimal_width!=0) && cell_info[r][c].decimal_width != 0)
new_width = max(new_width, cellInfo(i).width new_width = max(new_width, cellInfo(i).width
+ max_dwidth[c] - cellInfo(i).decimal_width); + max_dwidth[c] - cellInfo(i).decimal_width);
else else
@ -2762,6 +2762,7 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
os << column_info[c].align_special; os << column_info[c].align_special;
} else { } else {
if (!column_info[c].p_width.zero()) { if (!column_info[c].p_width.zero()) {
bool decimal = false;
switch (column_info[c].alignment) { switch (column_info[c].alignment) {
case LYX_ALIGN_LEFT: case LYX_ALIGN_LEFT:
os << ">{\\raggedright}"; os << ">{\\raggedright}";
@ -2776,21 +2777,46 @@ void Tabular::latex(otexstream & os, OutputParams const & runparams) const
case LYX_ALIGN_BLOCK: case LYX_ALIGN_BLOCK:
case LYX_ALIGN_LAYOUT: case LYX_ALIGN_LAYOUT:
case LYX_ALIGN_SPECIAL: case LYX_ALIGN_SPECIAL:
break;
case LYX_ALIGN_DECIMAL: case LYX_ALIGN_DECIMAL:
os << ">{\\raggedleft}";
decimal = true;
break; break;
} }
char valign = 'p';
switch (column_info[c].valignment) { switch (column_info[c].valignment) {
case LYX_VALIGN_TOP: case LYX_VALIGN_TOP:
os << 'p'; // this is the default
break; break;
case LYX_VALIGN_MIDDLE: case LYX_VALIGN_MIDDLE:
os << 'm'; valign = 'm';
break; break;
case LYX_VALIGN_BOTTOM: case LYX_VALIGN_BOTTOM:
os << 'b'; valign = 'b';
break; break;
} }
os << valign;
// Fixed-width cells with alignment at decimal separator
// are output as two cells of half the width with the decimal
// separator as column sep. This effectively puts the content
// centered, which differs from the normal decimal sep alignment
// and is not ideal, but we cannot do better ATM (see #9568).
// FIXME: Implement proper decimal sep alignment, e.g. via siunitx.
if (decimal) {
docstring const halffixedwith =
from_ascii(Length(column_info[c].p_width.value() / 2,
column_info[c].p_width.unit()).asLatexString());
os << '{'
<< halffixedwith
<< '}'
<< "@{\\extracolsep{0pt}" << column_info[c].decimal_point << "}"
<< valign
<< '{'
<< halffixedwith
<< '}';
} else
os << '{' os << '{'
<< from_ascii(column_info[c].p_width.asLatexString()) << from_ascii(column_info[c].p_width.asLatexString())
<< '}'; << '}';