From 4431ae25058bbf456f733e1e57f945dd2178ab0c Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 26 Aug 2018 16:17:54 +0200 Subject: [PATCH] tex2lyx: support decimal alignment in tables (cherry picked from commit 8ef2558dc23a44185b246d3f66e1384a6144caa2) --- src/tex2lyx/TODO.txt | 1 - src/tex2lyx/table.cpp | 79 +++++++++++-- src/tex2lyx/test/beamer.lyx.lyx | 16 +++ src/tex2lyx/test/test-insets-basic.lyx.lyx | 127 ++++----------------- src/tex2lyx/test/test-insets.lyx.lyx | 127 ++++----------------- status.23x | 2 + 6 files changed, 130 insertions(+), 222 deletions(-) diff --git a/src/tex2lyx/TODO.txt b/src/tex2lyx/TODO.txt index a68cc375fa..a5f4f8ac3e 100644 --- a/src/tex2lyx/TODO.txt +++ b/src/tex2lyx/TODO.txt @@ -28,7 +28,6 @@ Format LaTeX feature LyX feature 364 branch file name suffix \filename_suffix 371 automatic mhchem loading \use_mhchem 390 forward/reverse search \forward_search, \forward_macro -391 decimal alignment in tables InsetTabular 399 automatic mathdots loading \use_mathdots 411 support for polyglossia \language_package (the cases of no package, of babel and of custom package is supported) 415 automatic undertilde loading \use_package undertilde diff --git a/src/tex2lyx/table.cpp b/src/tex2lyx/table.cpp index d3392b0077..98f3e03e3a 100644 --- a/src/tex2lyx/table.cpp +++ b/src/tex2lyx/table.cpp @@ -37,7 +37,8 @@ namespace { class ColInfo { public: - ColInfo() : align('n'), valign('n'), rightlines(0), leftlines(0) {} + ColInfo() : align('n'), valign('n'), rightlines(0), leftlines(0), + decimal_point('\0') {} /// column alignment char align; /// vertical alignment @@ -50,6 +51,8 @@ public: int rightlines; /// number of lines on the left int leftlines; + /// decimal separator + char decimal_point; }; @@ -177,6 +180,8 @@ inline char const * verbose_align(char c) return "right"; case 'l': return "left"; + case 'd': + return "decimal"; default: return "none"; } @@ -264,6 +269,17 @@ void ci2special(ColInfo & ci) // this case. return; + if (ci.decimal_point != '\0') { + // we only support decimal point natively + // with 'l' alignment in or 'n' alignment + // with width in second row + if (ci.align != 'l' && ci.align != 'n') { + ci.decimal_point = '\0'; + return; + } else + ci.special.clear(); + } + if (!ci.width.empty()) { switch (ci.align) { case 'l': @@ -338,8 +354,17 @@ void handle_colalign(Parser & p, vector & colinfo, case 'r': // new column, horizontal aligned next.align = t.character(); - if (!next.special.empty()) + if (!next.special.empty()) { ci2special(next); + // handle decimal separator + if (next.decimal_point != '\0') { + if (!colinfo.empty() && colinfo.back().align == 'r') { + colinfo.back().align = 'd'; + colinfo.back().decimal_point = next.decimal_point; + } else + next.decimal_point = '\0'; + } + } colinfo.push_back(next); next = ColInfo(); break; @@ -349,8 +374,17 @@ void handle_colalign(Parser & p, vector & colinfo, // new column, vertical aligned box next.valign = t.character(); next.width = p.verbatim_item(); - if (!next.special.empty()) + if (!next.special.empty()) { ci2special(next); + // handle decimal separator + if (next.decimal_point != '\0') { + if (!colinfo.empty() && colinfo.back().align == 'r') { + colinfo.back().align = 'd'; + colinfo.back().decimal_point = next.decimal_point; + } else + next.decimal_point = '\0'; + } + } colinfo.push_back(next); next = ColInfo(); break; @@ -426,11 +460,16 @@ void handle_colalign(Parser & p, vector & colinfo, } case '@': // text instead of the column spacing - case '!': + case '!': { // text in addition to the column spacing + string const arg = p.verbatim_item(); next.special += t.character(); - next.special += '{' + p.verbatim_item() + '}'; + next.special += '{' + arg + '}'; + string const sarg = arg.size() > 2 ? arg.substr(0, arg.size() - 1) : string(); + if (t.character() == '@' && sarg == "\\extracolsep{0pt}") + next.decimal_point = arg.back(); break; + } default: { // try user defined column types // unknown column types (nargs == -1) are @@ -1131,7 +1170,12 @@ void handle_tabular(Parser & p, ostream & os, string const & name, << cells[cell] << "'." << endl; continue; } - Parser p(cells[cell]); + string cellcont = cells[cell]; + // For decimal cells, ass the content of the second one to the first one + // of a pair. + if (colinfo[col].decimal_point != '\0' && colinfo[col].align == 'd' && cell < cells.size() - 1) + cellcont += colinfo[col].decimal_point + cells[cell + 1]; + Parser p(cellcont); p.skip_spaces(); //cells[cell] << "'\n"; if (p.next_token().cs() == "multirow") { @@ -1401,8 +1445,13 @@ void handle_tabular(Parser & p, ostream & os, string const & name, //cerr << "// output what we have\n"; // output what we have string const rotate = "0"; + size_type cols = colinfo.size(); + for (size_t col = 0; col < colinfo.size(); ++col) { + if (colinfo[col].decimal_point != '\0' && colinfo[col].align != 'd') + --cols; + } os << "\n\n"; + << "\" columns=\"" << cols << "\">\n"; os << "\n"; for (size_t col = 0; col < colinfo.size(); ++col) { CellInfo const & cell = cellinfo[row][col]; + if (colinfo[col].decimal_point != '\0' && colinfo[col].align != 'd') + // These are the second columns in a salign pair. Skip. + continue; os << " + - - - - - - + + + \begin_inset Text @@ -5049,7 +5046,7 @@ Two \end_inset - + \begin_inset Text \begin_layout Standard @@ -5058,12 +5055,7 @@ Three \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard @@ -5072,23 +5064,13 @@ Four \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard Five \end_layout -\end_inset - - -\begin_inset Text - \end_inset @@ -5111,7 +5093,7 @@ two \end_inset - + \begin_inset Text \begin_layout Standard @@ -5120,12 +5102,7 @@ three \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard @@ -5134,23 +5111,13 @@ four \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard five \end_layout -\end_inset - - -\begin_inset Text - \end_inset @@ -5173,52 +5140,29 @@ He \end_inset - + \begin_inset Text \begin_layout Standard -2 +2.77234 \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -77234 +45672. \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -45672 -\end_layout - -\end_inset - - -\begin_inset Text - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -69 +0.69 \end_layout \end_inset @@ -5243,56 +5187,29 @@ C \end_inset - + \begin_inset Text \begin_layout Standard -12537 +12537.64 \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -64 +37.66345 \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -37 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -66345 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -86 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -37 +86.37 \end_layout \end_inset diff --git a/src/tex2lyx/test/test-insets.lyx.lyx b/src/tex2lyx/test/test-insets.lyx.lyx index cebb68e2d9..d59a043064 100644 --- a/src/tex2lyx/test/test-insets.lyx.lyx +++ b/src/tex2lyx/test/test-insets.lyx.lyx @@ -5413,16 +5413,13 @@ status open \begin_layout Standard \begin_inset Tabular - + - - - - - - + + + \begin_inset Text @@ -5442,7 +5439,7 @@ Two \end_inset - + \begin_inset Text \begin_layout Standard @@ -5451,12 +5448,7 @@ Three \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard @@ -5465,23 +5457,13 @@ Four \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard Five \end_layout -\end_inset - - -\begin_inset Text - \end_inset @@ -5504,7 +5486,7 @@ two \end_inset - + \begin_inset Text \begin_layout Standard @@ -5513,12 +5495,7 @@ three \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard @@ -5527,23 +5504,13 @@ four \end_inset - -\begin_inset Text - -\end_inset - - + \begin_inset Text \begin_layout Standard five \end_layout -\end_inset - - -\begin_inset Text - \end_inset @@ -5566,52 +5533,29 @@ He \end_inset - + \begin_inset Text \begin_layout Standard -2 +2.77234 \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -77234 +45672. \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -45672 -\end_layout - -\end_inset - - -\begin_inset Text - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -69 +0.69 \end_layout \end_inset @@ -5636,56 +5580,29 @@ C \end_inset - + \begin_inset Text \begin_layout Standard -12537 +12537.64 \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -64 +37.66345 \end_layout \end_inset - + \begin_inset Text \begin_layout Standard -37 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -66345 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -86 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Standard -37 +86.37 \end_layout \end_inset diff --git a/status.23x b/status.23x index fea862abe2..81a153c0c1 100644 --- a/status.23x +++ b/status.23x @@ -41,6 +41,8 @@ What's new - Add support for btUnit (multibib). +- Add support for decimal alignment in table cells. + * USER INTERFACE