📄 table.cc
字号:
print_contents(); prints("\002");}void right_text_entry::add_tab(){ printfs(" \\n[%1]u", column_end_reg(end_col));}center_text_entry::center_text_entry(char *s, const entry_modifier *m): simple_text_entry(s, m){}void center_text_entry::simple_print(int){ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col)); prints("\002\003"); print_contents(); prints("\003\002");}void center_text_entry::add_tab(){ printfs(" \\n[%1]u", column_end_reg(end_col));}numeric_text_entry::numeric_text_entry(char *s, const entry_modifier *m, int pos): text_entry(s, m), dot_pos(pos){}void numeric_text_entry::do_width(){ if (dot_pos != 0) { set_location(); printfs(".nr %1 0\\w" DELIMITER_CHAR, block_width_reg(start_row, start_col)); set_inline_modifier(mod); for (int i = 0; i < dot_pos; i++) prints(contents[i]); restore_inline_modifier(mod); prints(DELIMITER_CHAR "\n"); printfs(".nr %1 \\n[%1]>?\\n[%2]\n", span_left_numeric_width_reg(start_col, end_col), block_width_reg(start_row, start_col)); } else printfs(".nr %1 0\n", block_width_reg(start_row, start_col)); if (contents[dot_pos] != '\0') { set_location(); printfs(".nr %1 \\n[%1]>?\\w" DELIMITER_CHAR, span_right_numeric_width_reg(start_col, end_col)); set_inline_modifier(mod); prints(contents + dot_pos); restore_inline_modifier(mod); prints(DELIMITER_CHAR "\n"); }}void numeric_text_entry::simple_print(int){ printfs("\\h'|(\\n[%1]u-\\n[%2]u-\\n[%3]u/2u+\\n[%2]u+\\n[%4]u-\\n[%5]u)'", span_width_reg(start_col, end_col), span_left_numeric_width_reg(start_col, end_col), span_right_numeric_width_reg(start_col, end_col), column_start_reg(start_col), block_width_reg(start_row, start_col)); print_contents();}alphabetic_text_entry::alphabetic_text_entry(char *s, const entry_modifier *m): text_entry(s, m){}void alphabetic_text_entry::do_width(){ set_location(); printfs(".nr %1 \\n[%1]>?\\w" DELIMITER_CHAR, span_alphabetic_width_reg(start_col, end_col)); print_contents(); prints(DELIMITER_CHAR "\n");}void alphabetic_text_entry::simple_print(int){ printfs("\\h'|\\n[%1]u'", column_start_reg(start_col)); printfs("\\h'\\n[%1]u-\\n[%2]u/2u'", span_width_reg(start_col, end_col), span_alphabetic_width_reg(start_col, end_col)); print_contents();}// The only point of this is to make `\a' ``work'' as in Unix tbl. Grrr.void alphabetic_text_entry::add_tab(){ printfs(" \\n[%1]u", column_end_reg(end_col));}block_entry::block_entry(char *s, const entry_modifier *m): table_entry(m), contents(s){}block_entry::~block_entry(){ a_delete contents;}void block_entry::position_vertically(){ if (start_row != end_row) switch(mod->vertical_alignment) { case entry_modifier::TOP: printfs(".sp |\\n[%1]u\n", row_start_reg(start_row)); break; case entry_modifier::CENTER: // Peform the motion in two stages so that the center is rounded // vertically upwards even if net vertical motion is upwards. printfs(".sp |\\n[%1]u\n", row_start_reg(start_row)); printfs(".sp \\n[" BOTTOM_REG "]u-\\n[%1]u-\\n[%2]u/2u\n", row_start_reg(start_row), block_height_reg(start_row, start_col)); break; case entry_modifier::BOTTOM: printfs(".sp |\\n[%1]u+\\n[" BOTTOM_REG "]u-\\n[%1]u-\\n[%2]u\n", row_start_reg(start_row), block_height_reg(start_row, start_col)); break; default: assert(0); } if (mod->stagger) prints(".sp -.5v\n");}int block_entry::divert(int ncols, const string *mw, int *sep){ do_divert(0, ncols, mw, sep); return 1;}void block_entry::do_divert(int alphabetic, int ncols, const string *mw, int *sep){ printfs(".di %1\n", block_diversion_name(start_row, start_col)); prints(".if \\n[" SAVED_FILL_REG "] .fi\n" ".in 0\n"); prints(".ll "); for (int i = start_col; i <= end_col; i++) if (mw[i].empty()) break; if (i > end_col) { // Every column spanned by this entry has a minimum width. for (int i = start_col; i <= end_col; i++) { if (i > start_col) { if (sep) printfs("+%1n", as_string(sep[i - 1])); prints('+'); } printfs("(n;%1)", mw[i]); } printfs(">?\\n[%1]u", span_width_reg(start_col, end_col)); } else printfs("(u;\\n[%1]>?(\\n[.l]*%2/%3))", span_width_reg(start_col, end_col), as_string(end_col - start_col + 1), as_string(ncols + 1)); if (alphabetic) prints("-2n"); prints("\n"); set_modifier(mod); prints(".cp \\n(" COMPATIBLE_REG "\n"); set_location(); prints(contents); prints(".br\n.di\n.cp 0\n"); if (!mod->zero_width) { if (alphabetic) { printfs(".nr %1 \\n[%1]>?(\\n[dl]+2n)\n", span_width_reg(start_col, end_col)); printfs(".nr %1 \\n[%1]>?\\n[dl]\n", span_alphabetic_width_reg(start_col, end_col)); } else printfs(".nr %1 \\n[%1]>?\\n[dl]\n", span_width_reg(start_col, end_col)); } printfs(".nr %1 \\n[dn]\n", block_height_reg(start_row, start_col)); printfs(".nr %1 \\n[dl]\n", block_width_reg(start_row, start_col)); prints("." RESET_MACRO_NAME "\n" ".in \\n[" SAVED_INDENT_REG "]u\n" ".nf\n"); // the block might have contained .lf commands location_force_filename = 1;}void block_entry::do_width(){ // do nothing; the action happens in divert}void block_entry::do_depth(){ printfs(".nr " BOTTOM_REG " \\n[" BOTTOM_REG "]>?(\\n[%1]+\\n[%2])\n", row_start_reg(start_row), block_height_reg(start_row, start_col));}left_block_entry::left_block_entry(char *s, const entry_modifier *m): block_entry(s, m){}void left_block_entry::print(){ printfs(".in +\\n[%1]u\n", column_start_reg(start_col)); printfs(".%1\n", block_diversion_name(start_row, start_col)); prints(".in\n");}right_block_entry::right_block_entry(char *s, const entry_modifier *m): block_entry(s, m){}void right_block_entry::print(){ printfs(".in +\\n[%1]u+\\n[%2]u-\\n[%3]u\n", column_start_reg(start_col), span_width_reg(start_col, end_col), block_width_reg(start_row, start_col)); printfs(".%1\n", block_diversion_name(start_row, start_col)); prints(".in\n");}center_block_entry::center_block_entry(char *s, const entry_modifier *m): block_entry(s, m){}void center_block_entry::print(){ printfs(".in +\\n[%1]u+(\\n[%2]u-\\n[%3]u/2u)\n", column_start_reg(start_col), span_width_reg(start_col, end_col), block_width_reg(start_row, start_col)); printfs(".%1\n", block_diversion_name(start_row, start_col)); prints(".in\n");}alphabetic_block_entry::alphabetic_block_entry(char *s, const entry_modifier *m): block_entry(s, m){}int alphabetic_block_entry::divert(int ncols, const string *mw, int *sep){ do_divert(1, ncols, mw, sep); return 1;}void alphabetic_block_entry::print(){ printfs(".in +\\n[%1]u+(\\n[%2]u-\\n[%3]u/2u)\n", column_start_reg(start_col), span_width_reg(start_col, end_col), span_alphabetic_width_reg(start_col, end_col)); printfs(".%1\n", block_diversion_name(start_row, start_col)); prints(".in\n");}line_entry::line_entry(const entry_modifier *m): simple_entry(m), double_vrule_on_right(0), double_vrule_on_left(0){}void line_entry::note_double_vrule_on_right(int is_corner){ double_vrule_on_right = is_corner ? 1 : 2;}void line_entry::note_double_vrule_on_left(int is_corner){ double_vrule_on_left = is_corner ? 1 : 2;}single_line_entry::single_line_entry(const entry_modifier *m): line_entry(m){}int single_line_entry::line_type(){ return 1;}void single_line_entry::simple_print(int dont_move){ printfs("\\h'|\\n[%1]u", column_divide_reg(start_col)); if (double_vrule_on_left) { prints(double_vrule_on_left == 1 ? "-" : "+"); prints(HALF_DOUBLE_LINE_SEP); } prints("'"); if (!dont_move) prints("\\v'-" BAR_HEIGHT "'"); printfs("\\s[\\n[" LINESIZE_REG "]]" "\\D'l |\\n[%1]u", column_divide_reg(end_col+1)); if (double_vrule_on_right) { prints(double_vrule_on_left == 1 ? "+" : "-"); prints(HALF_DOUBLE_LINE_SEP); } prints("0'\\s0"); if (!dont_move) prints("\\v'" BAR_HEIGHT "'");} single_line_entry *single_line_entry::to_single_line_entry(){ return this;}double_line_entry::double_line_entry(const entry_modifier *m): line_entry(m){}int double_line_entry::line_type(){ return 2;}void double_line_entry::simple_print(int dont_move){ if (!dont_move) prints("\\v'-" BAR_HEIGHT "'"); printfs("\\h'|\\n[%1]u", column_divide_reg(start_col)); if (double_vrule_on_left) { prints(double_vrule_on_left == 1 ? "-" : "+"); prints(HALF_DOUBLE_LINE_SEP); } prints("'"); printfs("\\v'-" HALF_DOUBLE_LINE_SEP "'" "\\s[\\n[" LINESIZE_REG "]]" "\\D'l |\\n[%1]u", column_divide_reg(end_col+1)); if (double_vrule_on_right) prints("-" HALF_DOUBLE_LINE_SEP); prints(" 0'"); printfs("\\v'" DOUBLE_LINE_SEP "'" "\\D'l |\\n[%1]u", column_divide_reg(start_col)); if (double_vrule_on_right) { prints(double_vrule_on_left == 1 ? "+" : "-"); prints(HALF_DOUBLE_LINE_SEP); } prints(" 0'"); prints("\\s0" "\\v'-" HALF_DOUBLE_LINE_SEP "'"); if (!dont_move) prints("\\v'" BAR_HEIGHT "'");}double_line_entry *double_line_entry::to_double_line_entry(){ return this;}short_line_entry::short_line_entry(const entry_modifier *m): simple_entry(m){}int short_line_entry::line_type(){ return 1;}void short_line_entry::simple_print(int dont_move){ if (mod->stagger) prints("\\v'-.5v'"); if (!dont_move) prints("\\v'-" BAR_HEIGHT "'"); printfs("\\h'|\\n[%1]u'", column_start_reg(start_col)); printfs("\\s[\\n[" LINESIZE_REG "]]" "\\D'l \\n[%1]u 0'" "\\s0", span_width_reg(start_col, end_col)); if (!dont_move) prints("\\v'" BAR_HEIGHT "'"); if (mod->stagger) prints("\\v'.5v'");}short_double_line_entry::short_double_line_entry(const entry_modifier *m): simple_entry(m){}int short_double_line_entry::line_type(){ return 2;}void short_double_line_entry::simple_print(int dont_move){ if (mod->stagger) prints("\\v'-.5v'"); if (!dont_move) prints("\\v'-" BAR_HEIGHT "'"); printfs("\\h'|\\n[%2]u'" "\\v'-" HALF_DOUBLE_LINE_SEP "'" "\\s[\\n[" LINESIZE_REG "]]" "\\D'l \\n[%1]u 0'" "\\v'" DOUBLE_LINE_SEP "'" "\\D'l |\\n[%2]u 0'" "\\s0" "\\v'-" HALF_DOUBLE_LINE_SEP "'", span_width_reg(start_col, end_col), column_start_reg(start_col)); if (!dont_move) prints("\\v'" BAR_HEIGHT "'"); if (mod->stagger) prints("\\v'.5v'");}void set_modifier(const entry_modifier *m){ if (!m->font.empty()) printfs(".ft %1\n", m->font); if (m->point_size.val != 0) { prints(".ps "); if (m->point_size.inc > 0) prints('+'); else if (m->point_size.inc < 0) prints('-'); printfs("%1\n", as_string(m->point_size.val)); } if (m->vertical_spacing.val != 0) { prints(".vs "); if (m->vertical_spacing.inc > 0) prints('+'); else if (m->vertical_spacing.inc < 0) prints('-'); printfs("%1\n", as_string(m->vertical_spacing.val)); }}void set_inline_modifier(const entry_modifier *m){ if (!m->font.empty()) printfs("\\f[%1]", m->font); if (m->point_size.val != 0) { prints("\\s["); if (m->point_size.inc > 0) prints('+'); else if (m->point_size.inc < 0) prints('-'); printfs("%1]", as_string(m->point_size.val)); } if (m->stagger) prints("\\v'-.5v'");}void restore_inline_modifier(const entry_modifier *m){ if (!m->font.empty()) prints("\\f[\\n[" SAVED_FONT_REG "]]"); if (m->point_size.val != 0) prints("\\s[\\n[" SAVED_SIZE_REG "]]"); if (m->stagger) prints("\\v'.5v'");}struct stuff { stuff *next; int row; // occurs before row `row' char printed; // has it been printed? stuff(int); virtual void print(table *) = 0; virtual ~stuff(); virtual int is_single_line() { return 0; }; virtual int is_double_line() { return 0; };};stuff::stuff(int r) : row(r), next(0), printed(0){}stuff::~stuff(){}struct text_stuff : stuff { string contents; const char *filename; int lineno; text_stuff(const string &, int r, const char *fn, int ln); ~text_stuff(); void print(table *);};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -