/tblr

One header library for easy pretty printing of tables in C++. Supports markdown and latex.

Primary LanguageC++Apache License 2.0Apache-2.0

build Coverage Status

tblr (Tabular)

One header library for easy pretty printing of tables in C++. Supports markdown and latex. Use it by including tblr.h in your project.


  • Create a Table and stream cell by cell. Use endr to end a row.
Table t;
t << "animal" << "does what" << "when" << endr
  << "dog" << "barks" << "angry" << endr
  << "rooster" << "crows" << "in the morning" << endr
  << "computer" << "crashes" << "at night" << endr;
std::cout << t << std::endl;
animal   does what when
dog      barks     angry
rooster  crows     in the morning
computer crashes   at night
  • Stream multiply into the same cell by using Cell()
Table t;
t << "animal" << "does what" << "when" << endr;
for (int i = 0; i < 3; i ++) {
  t << (Cell() << "dog " << i)
    << (Cell() << "barks " << i << " times")
    << "angry" << endr;
}
std::cout << t << std::endl;
animal does what     when
dog 0  barks 0 times angry
dog 1  barks 1 times angry
dog 2  barks 2 times angry
  • Specify widths and alignments (justifications)
Table t;
t.aligns({Left, Center, Right})
 .widths({10, 10, 0}); // 0 is automatic
t << "animal" << "does what" << "when" << endr
  << "dog" << "barks" << "angry" << endr
  << "rooster" << "crows" << "in the morning" << endr
  << "computer" << "crashes" << "at night" << endr;
std::cout << t << std::endl;
animal     does what            when
dog          barks             angry
rooster      crows    in the morning
computer    crashes         at night
  • Specify what to do when content does not fit in width
Table t;
t.widths({10, 10, 7})
 .multiline(Space);
// t << ...;
std::cout << t << std::endl;
animal     does what  when
dog        barks      angry
rooster    crows      in the
                      morning
computer   crashes    at
                      night
t.multiline(Naive);
std::cout << t << std::endl;
animal     does what  when
dog        barks      angry
rooster    crows      in the
                      morning
computer   crashes    at nigh
                      t
t.multiline(SingleLine);
std::cout << t << std::endl;
animal     does what  when
dog        barks      angry
rooster    crows      in the
computer   crashes    at nigh
  • Specify layouts
Table t;
t.layout(markdown())
 .aligns({Left, Center, Right})
 .widths({10, 10, 0}); // 0 is automatic
// t << ...;
std::cout << t << std::endl;
| animal     | does what  |           when |
| ---------- | ---------- | -------------- |
| dog        |   barks    |          angry |
| rooster    |   crows    | in the morning |
| computer   |  crashes   |       at night |
t.layout(latex());
std::cout << t << std::endl;
\begin{tabular}{lcr}
\hline
animal     & does what  &           when \\
\hline
dog        &   barks    &          angry \\
rooster    &   crows    & in the morning \\
computer   &  crashes   &       at night \\
\hline
\end{tabular}
t.layout(unicode_box_light());
std::cout << t << std::endl;
┌──────────┬──────────┬──────────────┐
│animal    │does what │          when│
├──────────┼──────────┼──────────────┤
│dog       │  barks   │         angry│
├──────────┼──────────┼──────────────┤
│rooster   │  crows   │in the morning│
├──────────┼──────────┼──────────────┤
│computer  │ crashes  │      at night│
└──────────┴──────────┴──────────────┘
  • Customize layouts
auto layout = simple_border(/*left      */ "|| ",
                            /*mid       */ " | ",
                            /*right     */ " ||",
                            /*top       */ "^",
                            /*header mid*/ "-.",
                            /*mid       */ "-",
                            /*bottom    */ "vV");
Table t;
t.layout(layout)
 .aligns({Left, Center, Right})
 .widths({10, 10, 0}); // 0 is automatic
// t << ...;
std::cout << t << std::endl;
|| ^^^^^^^^^^ | ^^^^^^^^^^ | ^^^^^^^^^^^^^^ ||
|| animal     | does what  |           when ||
|| -.-.-.-.-. | -.-.-.-.-. | -.-.-.-.-.-.-. ||
|| dog        |   barks    |          angry ||
|| ---------- | ---------- | -------------- ||
|| rooster    |   crows    | in the morning ||
|| ---------- | ---------- | -------------- ||
|| computer   |  crashes   |       at night ||
|| vVvVvVvVvV | vVvVvVvVvV | vVvVvVvVvVvVvV ||

See tblr.h for finer grained layout customization.

  • UTF8
Table t;
 t.layout(markdown());
 t << "Op" << "Time" << endr
   << "f(x)" << "3ms" << endr
   << "∂f(x)/∂x" << "4μs" << endr;
 std::cout << t << std::endl;
| Op       | Time |
| -------- | ---- |
| f(x)     | 3ms  |
| ∂f(x)/∂x | 4μs  |
  • Tables within tables
Table t, mini;
mini.layout(markdown()).aligns({Right, Left}).widths({2, 2});
mini << "T" << "B" << endr
     << "L" << "R" << endr;

t.layout(extra_space());
t << mini << mini << endr
  << mini << mini << endr;

std::cout << t << std::endl;

  |  T | B  |  |  T | B  |
  | -- | -- |  | -- | -- |
  |  L | R  |  |  L | R  |

  |  T | B  |  |  T | B  |
  | -- | -- |  | -- | -- |
  |  L | R  |  |  L | R  |

  • ANSI color codes in tables
const auto green = "\033[1;32m";
const auto red = "\033[1;31m";
const auto blue = "\033[1;34m";
const auto underline = "\033[1;4m";
const auto clear = "\033[0m";

Table t;
t.layout(unicode_box_light())
    .widths({10, 10, 7})
    .aligns({Left, Left, Right})
    .multiline(Space);
t << "animal" << "does what" << "when" << endr
  << "dog" << "barks" << "angry" << endr
  << "rooster" << "crows"
               << (Cell() << green << "in the cool breezy morning" << clear)
               << endr
  << "computer" << "crashes"
                << (Cell() << underline << red << "at warm co"
                           << blue << "zy night" << clear)
                << endr;
std::cout << t << std::endl;

Limitations

  • Limited unicode support: UTF8 encoded unicode is generally supported but each character is assumed to be the same width as an ascii character. This is not true for zero-width or full-width characters. See demo.cpp, or above for a working example.

Building

make -j2 test demo

If you are using Visual Studio, you need the /permissive- option.