📄 env.cc
字号:
fatal("font number 1 not a valid font"); if (family->make_definite(1) < 0) fatal("invalid default family `%1'", default_family.contents()); prev_fontno = fontno;}environment::environment(const environment *e): name(e->name), // so that eg `.if "\n[.ev]"0"' works prev_line_length(e->prev_line_length), line_length(e->line_length), prev_title_length(e->prev_title_length), title_length(e->title_length), prev_size(e->prev_size), size(e->size), prev_requested_size(e->prev_requested_size), requested_size(e->requested_size), char_height(e->char_height), char_slant(e->char_slant), space_size(e->space_size), sentence_space_size(e->sentence_space_size), adjust_mode(e->adjust_mode), fill(e->fill), interrupted(0), prev_line_interrupted(0), center_lines(0), right_justify_lines(0), prev_vertical_spacing(e->prev_vertical_spacing), vertical_spacing(e->vertical_spacing), prev_line_spacing(e->prev_line_spacing), line_spacing(e->line_spacing), prev_indent(e->prev_indent), indent(e->indent), have_temporary_indent(0), temporary_indent(0), underline_lines(0), input_trap_count(0), prev_text_length(e->prev_text_length), width_total(0), space_total(0), input_line_start(0), control_char(e->control_char), no_break_control_char(e->no_break_control_char), hyphen_indicator_char(e->hyphen_indicator_char), spread_flag(0), line(0), pending_lines(0), discarding(0), tabs(e->tabs), current_tab(TAB_NONE), current_field(0), margin_character_flags(e->margin_character_flags), margin_character_node(e->margin_character_node), margin_character_distance(e->margin_character_distance), numbering_nodes(0), number_text_separation(e->number_text_separation), line_number_multiple(e->line_number_multiple), line_number_indent(e->line_number_indent), no_number_count(e->no_number_count), tab_char(e->tab_char), leader_char(e->leader_char), hyphenation_flags(e->hyphenation_flags), fontno(e->fontno), prev_fontno(e->prev_fontno), dummy(1), family(e->family), prev_family(e->prev_family), leader_node(0),#ifdef WIDOW_CONTROL widow_control(e->widow_control),#endif /* WIDOW_CONTROL */ hyphen_line_max(e->hyphen_line_max), hyphen_line_count(0), hyphenation_space(e->hyphenation_space), hyphenation_margin(e->hyphenation_margin), composite(0){}environment::~environment(){ delete leader_node; delete_node_list(line); delete_node_list(numbering_nodes);}hunits environment::get_input_line_position(){ hunits n; if (line == 0) n = -input_line_start; else n = width_total - input_line_start; if (current_tab) n += tab_width; return n;}void environment::set_input_line_position(hunits n){ input_line_start = line == 0 ? -n : width_total - n; if (current_tab) input_line_start += tab_width;}hunits environment::get_line_length(){ return line_length;}hunits environment::get_saved_line_length(){ if (line) return target_text_length + saved_indent; else return line_length;}vunits environment::get_vertical_spacing(){ return vertical_spacing;}int environment::get_line_spacing(){ return line_spacing;}int environment::get_bold(){ return get_bold_fontno(fontno);}hunits environment::get_digit_width(){ return env_digit_width(this);} int environment::get_adjust_mode(){ return adjust_mode;}int environment::get_fill(){ return fill;}hunits environment::get_indent(){ return indent;}hunits environment::get_saved_indent(){ if (line) return saved_indent; else if (have_temporary_indent) return temporary_indent; else return indent;}hunits environment::get_temporary_indent(){ return temporary_indent;}hunits environment::get_title_length(){ return title_length;}node *environment::get_prev_char(){ for (node *n = current_tab ? tab_contents : line; n; n = n->next) { node *last = n->last_char_node(); if (last) return last; } return 0;}hunits environment::get_prev_char_width(){ node *last = get_prev_char(); if (!last) return H0; return last->width();}hunits environment::get_prev_char_skew(){ node *last = get_prev_char(); if (!last) return H0; return last->skew();}vunits environment::get_prev_char_height(){ node *last = get_prev_char(); if (!last) return V0; vunits min, max; last->vertical_extent(&min, &max); return -min;}vunits environment::get_prev_char_depth(){ node *last = get_prev_char(); if (!last) return V0; vunits min, max; last->vertical_extent(&min, &max); return max;}hunits environment::get_text_length(){ hunits n = line == 0 ? H0 : width_total; if (current_tab) n += tab_width; return n;}hunits environment::get_prev_text_length(){ return prev_text_length;}static int sb_reg_contents = 0;static int st_reg_contents = 0;static int ct_reg_contents = 0;static int rsb_reg_contents = 0;static int rst_reg_contents = 0;static int skw_reg_contents = 0;static int ssc_reg_contents = 0;void environment::width_registers(){ // this is used to implement \w; it sets the st, sb, ct registers vunits min = 0, max = 0, cur = 0; int character_type = 0; ssc_reg_contents = line ? line->subscript_correction().to_units() : 0; skw_reg_contents = line ? line->skew().to_units() : 0; line = reverse_node_list(line); vunits real_min = V0; vunits real_max = V0; vunits v1, v2; for (node *tem = line; tem; tem = tem->next) { tem->vertical_extent(&v1, &v2); v1 += cur; if (v1 < real_min) real_min = v1; v2 += cur; if (v2 > real_max) real_max = v2; if ((cur += tem->vertical_width()) < min) min = cur; else if (cur > max) max = cur; character_type |= tem->character_type(); } line = reverse_node_list(line); st_reg_contents = -min.to_units(); sb_reg_contents = -max.to_units(); rst_reg_contents = -real_min.to_units(); rsb_reg_contents = -real_max.to_units(); ct_reg_contents = character_type;}node *environment::extract_output_line(){ if (current_tab) wrap_up_tab(); node *n = line; line = 0; return n;}/* environment related requests */void environment_switch(){ int pop = 0; // 1 means pop, 2 means pop but no error message on underflow if (curenv->is_dummy()) error("can't switch environments when current environment is dummy"); else if (!has_arg()) pop = 1; else { symbol nm; if (!tok.delimiter()) { // It looks like a number. int n; if (get_integer(&n)) { if (n >= 0 && n < NENVIRONMENTS) { env_stack = new env_list(curenv, env_stack); if (env_table[n] == 0) env_table[n] = new environment(itoa(n)); curenv = env_table[n]; } else nm = itoa(n); } else pop = 2; } else { nm = get_long_name(1); if (nm.is_null()) pop = 2; } if (!nm.is_null()) { environment *e = (environment *)env_dictionary.lookup(nm); if (!e) { e = new environment(nm); (void)env_dictionary.lookup(nm, e); } env_stack = new env_list(curenv, env_stack); curenv = e; } } if (pop) { if (env_stack == 0) { if (pop == 1) error("environment stack underflow"); } else { curenv = env_stack->env; env_list *tem = env_stack; env_stack = env_stack->next; delete tem; } } skip_line();}static symbol P_symbol("P");void font_change(){ symbol s = get_name(); int is_number = 1; if (s.is_null() || s == P_symbol) { s = P_symbol; is_number = 0; } else { for (const char *p = s.contents(); p != 0 && *p != 0; p++) if (!csdigit(*p)) { is_number = 0; break; } } if (is_number) curenv->set_font(atoi(s.contents())); else curenv->set_font(s); skip_line();}void family_change(){ symbol s = get_name(1); if (!s.is_null()) curenv->set_family(s); skip_line();}void point_size(){ int n; if (has_arg() && get_number(&n, 'z', curenv->get_requested_point_size())) { if (n <= 0) n = 1; curenv->set_size(n); } else curenv->set_size(0); skip_line();}void space_size(){ int n; if (get_integer(&n)) { curenv->space_size = n; if (has_arg() && get_integer(&n)) curenv->sentence_space_size = n; else curenv->sentence_space_size = curenv->space_size; } skip_line();}void fill(){ while (!tok.newline() && !tok.eof()) tok.next(); if (break_flag) curenv->do_break(); curenv->fill = 1; tok.next();}void no_fill(){ while (!tok.newline() && !tok.eof()) tok.next(); if (break_flag) curenv->do_break(); curenv->fill = 0; tok.next();}void center(){ int n; if (!has_arg() || !get_integer(&n)) n = 1; else if (n < 0) n = 0; while (!tok.newline() && !tok.eof()) tok.next(); if (break_flag) curenv->do_break(); curenv->right_justify_lines = 0; curenv->center_lines = n; tok.next();}void right_justify(){ int n; if (!has_arg() || !get_integer(&n)) n = 1; else if (n < 0) n = 0; while (!tok.newline() && !tok.eof()) tok.next(); if (break_flag) curenv->do_break(); curenv->center_lines = 0; curenv->right_justify_lines = n; tok.next();}void line_length(){ hunits temp; if (has_arg() && get_hunits(&temp, 'm', curenv->line_length)) { if (temp < H0) { warning(WARN_RANGE, "bad line length %1u", temp.to_units()); temp = H0; } } else temp = curenv->prev_line_length; curenv->prev_line_length = curenv->line_length; curenv->line_length = temp; skip_line();}void title_length(){ hunits temp; if (has_arg() && get_hunits(&temp, 'm', curenv->title_length)) { if (temp < H0) { warning(WARN_RANGE, "bad title length %1u", temp.to_units()); temp = H0; } } else temp = curenv->prev_title_length; curenv->prev_title_length = curenv->title_length; curenv->title_length = temp; skip_line();}void vertical_spacing(){ vunits temp; if (has_arg() && get_vunits(&temp, 'p', curenv->vertical_spacing)) { if (temp <= V0) { warning(WARN_RANGE, "vertical spacing must be greater than 0"); temp = vresolution; } } else temp = curenv->prev_vertical_spacing; curenv->prev_vertical_spacing = curenv->vertical_spacing; curenv->vertical_spacing = temp; skip_line();}void line_spacing(){ int temp; if (has_arg() && get_integer(&temp)) { if (temp < 1) { warning(WARN_RANGE, "value %1 out of range: interpreted as 1", temp); temp = 1; } } else temp = curenv->prev_line_spacing; curenv->prev_line_spacing = curenv->line_spacing; curenv->line_spacing = temp; skip_line();}void indent(){ hunits temp; if (has_arg() && get_hunits(&temp, 'm', curenv->indent)) { if (temp < H0) { warning(WARN_RANGE, "indent cannot be negative"); temp = H0; } } else temp = curenv->prev_indent; while (!tok.newline() && !tok.eof()) tok.next(); if (break_flag) curenv->do_break(); curenv->have_temporary_indent = 0; curenv->prev_indent = curenv->indent; curenv->indent = temp; tok.next();}void temporary_indent(){ int err = 0; hunits temp; if (!get_hunits(&temp, 'm', curenv->get_indent())) err = 1; while (!tok.newline() && !tok.eof()) tok.next(); if (break_flag) curenv->do_break(); if (temp < H0) { warning(WARN_RANGE, "total indent cannot be negative"); temp = H0; } if (!err) { curenv->temporary_indent = temp; curenv->have_temporary_indent = 1; } tok.next();}void underline(){ int n; if (!has_arg() || !get_integer(&n)) n = 1; if (n <= 0) { if (curenv->underline_lines > 0) { curenv->prev_fontno = curenv->fontno; curenv->fontno = curenv->pre_underline_fontno; } curenv->underline_lines = 0; } else { curenv->underline_lines = n; curenv->pre_underline_fontno = curenv->fontno; curenv->fontno = get_underline_fontno(); } skip_line();}void control_char(){ curenv->control_char = '.'; if (has_arg()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -