commit 9235b09fd8253a65c9782579e1e634f02bc88257
Author: Juergen Spitzmueller <[email protected]>
Date:   Sat Oct 22 12:13:36 2016 +0200

    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
---
 src/insets/InsetTabular.cpp |   42 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
index 4df9232..3a16c81 100644
--- a/src/insets/InsetTabular.cpp
+++ b/src/insets/InsetTabular.cpp
@@ -1033,7 +1033,7 @@ bool Tabular::updateColumnWidths()
                        idx_type const i = cellIndex(r, c);
                        if (columnSpan(i) == 1) {
                                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
                                                + max_dwidth[c] - 
cellInfo(i).decimal_width);
                                else
@@ -2762,6 +2762,7 @@ void Tabular::latex(otexstream & os, OutputParams const & 
runparams) const
                        os << column_info[c].align_special;
                } else {
                        if (!column_info[c].p_width.zero()) {
+                               bool decimal = false;
                                switch (column_info[c].alignment) {
                                case LYX_ALIGN_LEFT:
                                        os << ">{\\raggedright}";
@@ -2776,24 +2777,49 @@ void Tabular::latex(otexstream & os, OutputParams const 
& runparams) const
                                case LYX_ALIGN_BLOCK:
                                case LYX_ALIGN_LAYOUT:
                                case LYX_ALIGN_SPECIAL:
+                                       break;
                                case LYX_ALIGN_DECIMAL:
+                                       os << ">{\\raggedleft}";
+                                       decimal = true;
                                        break;
                                }
 
+                               char valign = 'p';
                                switch (column_info[c].valignment) {
                                case LYX_VALIGN_TOP:
-                                       os << 'p';
+                                       // this is the default
                                        break;
                                case LYX_VALIGN_MIDDLE:
-                                       os << 'm';
+                                       valign = 'm';
                                        break;
                                case LYX_VALIGN_BOTTOM:
-                                       os << 'b';
+                                       valign = 'b';
                                        break;
-                       }
-                               os << '{'
-                                  << 
from_ascii(column_info[c].p_width.asLatexString())
-                                  << '}';
+                               }
+                               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 << '{'
+                                          << 
from_ascii(column_info[c].p_width.asLatexString())
+                                          << '}';
                        } else {
                                switch (column_info[c].alignment) {
                                case LYX_ALIGN_LEFT:

Reply via email to