static string merge_packages (string olds, string news) { // Extract usepackage commands from news hashmap<string,path> oldp= latex_get_packages (olds); hashmap<string,path> newp= latex_get_packages (news); hashmap<int,string> packs; iterator<string> it= iterate (newp); while (it->busy ()) { string name= it->next (); if (!oldp->contains (name)) { path p= newp [name]; packs (p[0])= news (p[0], p[1]); } } string accum; for (int i=0; i<N(news); i++) if (test (news, i, "\\begin{document}")) break; else if (packs->contains (i)) accum << packs[i] << "\n"; // Insert result into olds, just after last \usepackage{...} int docpos= search_forwards ("\\begin{document}", olds); if (docpos < 0) return olds; int start= search_backwards ("\\usepackage", docpos, olds); if (start < 0) start= search_backwards ("\\documentclass", docpos, olds); if (start < 0) start= search_backwards ("\\documentstyle", docpos, olds); if (start < 0) return olds; skip_line (olds, start); if (start > docpos) return olds; return olds (0, start) * accum * olds (start, N(olds)); }
static string large_type (string s) { int pos= search_backwards ("-", N(s), s); if (pos > 6 && s[pos-1] == '-') pos--; if (pos > 6) return s (1, pos); else if (!starts (s, "<") || !ends (s, ">")) return s; else return s (1, N(s) - 1); }
static int large_size (string s) { int pos= search_backwards ("-", N(s), s); if (pos > 6) { if (s[pos-1] == '-') pos--; string r= s (pos + 1, N(s) - 1); return as_int (r); } return 0; }
void search() { int cpos = 0; int c; point_t o_point = curbp->b_point; point_t found; searchtext[0] = '\0'; display_prompt_and_response(m_sprompt, searchtext); cpos = strlen(searchtext); for (;;) { c = getch(); /* ignore control keys other than C-g, backspace, CR, C-s, C-R, ESC */ if (c < 32 && c != 07 && c != 0x08 && c != 0x13 && c != 0x12 && c != 0x1b) continue; switch(c) { case 0x1b: /* esc */ searchtext[cpos] = '\0'; flushinp(); /* discard any escape sequence without writing in buffer */ return; case 0x07: /* ctrl-g */ curbp->b_point = o_point; return; case 0x13: /* ctrl-s, do the search */ found = search_forward(searchtext); display_search_result(found, FWD_SEARCH, m_sprompt, searchtext); break; case 0x12: /* ctrl-r, do the search */ found = search_backwards(searchtext); display_search_result(found, REV_SEARCH, m_sprompt, searchtext); break; case 0x7f: /* del, erase */ case 0x08: /* backspace */ if (cpos == 0) continue; searchtext[--cpos] = '\0'; display_prompt_and_response(m_sprompt, searchtext); break; default: if (cpos < STRBUF_M - 1) { searchtext[cpos++] = c; searchtext[cpos] = '\0'; display_prompt_and_response(m_sprompt, searchtext); } break; } } }
static void insert_recursively (array<string>& a, string s, hashmap<string,tree>& h) { // cout << "Insert recursively \t" << s << "\n"; int i= search_backwards ("\t", s); if (i != -1) { string r= s (0, i); if (!h->contains (r)) { tree u= h[s][0][0]; h (r)= tuple (tuple (copy (u (0, N(u)-1)), "")); insert_recursively (a, s (0, i), h); } } a << s; }
bool poor_rubber_font_rep::supports (string s) { if (starts (s, "<big-") && (ends (s, "-1>") || ends (s, "-2>"))) { string r= s (5, N(s) - 3); if (ends (r, "lim")) r= r (0, N(r) - 3); if (starts (r, "up")) r= r (2, N(r)); if (N(r) > 1) r= "<" * r * ">"; return base->supports (r); } if (starts (s, "<mid-")) s= "<left-" * s (5, N(s)); if (starts (s, "<right-")) s= "<left-" * s (7, N(s)); if (starts (s, "<large-")) s= "<left-" * s (7, N(s)); if (starts (s, "<left-")) { string r; int pos= search_backwards ("-", N(s), s); if (pos > 6) r= s (6, pos); else r= s (6, N(s)-1); //cout << "Check " << base->res_name << ", " << s // << ", " << r << LF; if (r == "(" || r == ")" || r == "[" || r == "]" || r == "{" || r == "}" || r == "/" || r == "\\" || r == "|") return base->supports (r); if (r == "||" || r == "interleave") { if (base->supports ("<" * r * ">")) return true; return base->supports ("|"); } if (r == "llbracket" || r == "rrbracket" || r == "lfloor" || r == "rfloor" || r == "lceil" || r == "rceil" || r == "dlfloor" || r == "drfloor" || r == "dlceil" || r == "drceil" || r == "tlbracket" || r == "trbracket" || r == "tlfloor" || r == "trfloor" || r == "tlceil" || r == "trceil") { if (base->supports ("<" * r * ">")) return true; return base->supports ("[") && base->supports ("]"); } if (r == "langle" || r == "rangle") { if (base->supports ("<" * r * ">")) return true; //return base->supports ("<less>") && base->supports ("<gtr>"); } } return false; }
int rubber_stix_font_rep::search_font_sub (string s, string& rew, string& ltype) { ltype= ""; if (starts (s, "<big-") && ends (s, "-1>")) { string r= s (5, N(s) - 3); if (ends (r, "lim")) r= r (0, N(r) - 3); if (starts (r, "up") && ends (r, "int")) { rew= "<big-" * r (2, N(r)) * ">"; return 4; } if (ends (r, "int") || r == "sum" || r == "prod" || r == "pluscup") { rew= s; return 0; } if (r == "box") s= "<big-square-1>"; rew= s; return 1; } if (starts (s, "<big-") && ends (s, "-2>")) { string r= s (5, N(s) - 3); if (ends (r, "lim")) r= r (0, N(r) - 3); if (starts (r, "up") && ends (r, "int")) { rew= "<big-" * r (2, N(r)) * ">"; return 5; } if (ends (r, "int")) { rew= "<big-" * r * ">"; return 3; } if (r == "sum" || r == "prod" || r == "amalg" || r == "cap" || r == "cup" || r == "vee" || r == "wedge") { rew= "<big-" * r * ">"; return 6; } if (r == "pluscup") { rew= "<big-" * r * ">"; return 1; } if (r == "box") s= "<big-square-2>"; rew= s; return 2; } if (starts (s, "<mid-")) s= "<left-" * s (5, N(s)); if (starts (s, "<right-")) s= "<left-" * s (7, N(s)); if (starts (s, "<large-")) s= "<left-" * s (7, N(s)); if (starts (s, "<left-")) { int pos= search_backwards ("-", N(s), s); if (pos > 6) ltype= s (6, pos); } if (starts (s, "<left-.")) { rew= ""; return 0; } if (starts (s, "<left-|") || starts (s, "<left-interleave-")) { int nr= large_size (s); if (nr <= 0) { string r= large_type (s); r= r (5, N(r)); if (N(r) > 1) r= "<" * r * ">"; rew= r; return 0; } else { rew= "<" * large_type (s) * "-" * as_string (nr + 9) * ">"; return 16; } } if (starts (s, "<left-") && ends (s, "-0>")) { rew= s; return 0; } if (starts (s, "<left-") && ends (s, "-1>")) { string r= s (6, N(s) - 3); if (N(r) > 1) r= "<" * r * ">"; rew= r; return 7; } if (starts (s, "<left-") && ends (s, "-2>")) { string r= s (6, N(s) - 3); if (N(r) > 1) r= "<" * r * ">"; rew= r; return 8; } if (starts (s, "<left-") && ends (s, "-3>")) { string r= s (6, N(s) - 3); if (N(r) > 1) r= "<" * r * ">"; rew= r; return 9; } if (starts (s, "<left-") && ends (s, "-4>")) { string r= s (6, N(s) - 3); if (N(r) > 1) r= "<" * r * ">"; rew= r; return 10; } if (starts (s, "<left-")) { int pos= search_backwards ("-", N(s), s); if (pos > 6) { string r= s (6, pos); int nr= as_int (s (pos+1, N(s)-1)); if (r == "(" || r == ")" || r == "[" || r == "]") { rew= "<left-" * r * "-" * as_string (nr + 5) * ">"; return 17; } if (r == "{" || r == "}") { rew= "<left-" * r * "-" * as_string (nr + 2) * ">"; return 17; } if (r == "lfloor" || r == "rfloor" || r == "lceil" || r == "rceil") { rew= "<left-" * r * "-" * as_string (nr + 9) * ">"; return 17; } if (r == "/" || r == "\\" || r == "langle" || r == "rangle") { if (N(r) == 1) rew= r; else rew= "<" * r * ">"; return 10; } } } if (starts (s, "<rubber-") && ends (s, ">")) { int pos= search_backwards ("-", N(s), s); if (pos > 8) { string r= s (8, pos); int nr= as_int (s (pos+1, N(s)-1)); if (nr < 0) nr= 0; if (nr > 5) nr= 5; if (r == "hat") rew= "<#2C6>"; else if (r == "tilde") rew= "<#2DC>"; else if (r == "check") rew= "<#2C7>"; else if (r == "bar") rew= "<#203E>"; else if (r == "vect") rew= "<#20D7>"; else if (r == "breve") rew= "<#2D8>"; else if (r == "invbreve") rew= "<#311>"; else if (r == "punderbrace") rew= "<#23DD>"; else if (r == "punderbrace*") rew= "<#23DD>"; else if (r == "underbrace") rew= "<#23DF>"; else if (r == "underbrace*") rew= "<#23DF>"; else if (r == "squnderbrace") rew= "<#23B5>"; else if (r == "squnderbrace*") rew= "<#23B5>"; else if (r == "poverbrace") rew= "<#23DC>"; else if (r == "poverbrace*") rew= "<#23DC>"; else if (r == "overbrace") rew= "<#23DE>"; else if (r == "overbrace*") rew= "<#23DE>"; else if (r == "sqoverbrace") rew= "<#23B4>"; else if (r == "sqoverbrace*") rew= "<#23B4>"; else { rew= s; return 0; } if (nr == 0) return 0; else return 10 + nr; } } rew= s; return 0; }
int poor_rubber_font_rep::search_font (string s, string& r) { if (starts (s, "<big-") && (ends (s, "-1>") || ends (s, "-2>"))) { r= s; return 2*MAGNIFIED_NUMBER + 4; } if (starts (s, "<mid-")) s= "<left-" * s (5, N(s)); if (starts (s, "<right-")) s= "<left-" * s (7, N(s)); if (starts (s, "<large-")) s= "<left-" * s (7, N(s)); if (starts (s, "<left-")) { int pos= search_backwards ("-", N(s), s), num; if (pos > 6) { r= s (6, pos); num= as_int (s (pos+1, N(s)-1)); } else { r= s (6, N(s)-1); num= 0; } //cout << "Search " << base->res_name << ", " << s // << ", " << r << ", " << num << LF; int nr= max (num - 5, 0); int thin= (is_thin (r)? 1: 0); int code; if (num <= MAGNIFIED_NUMBER || r == "/" || r == "\\" || r == "langle" || r == "rangle") { num= min (num, MAGNIFIED_NUMBER); if (N(r) > 1) r= "<" * r * ">"; if (N(r)>1 && !base->supports (r)) { if (r == "<||>") r= "<emu-dbar>"; else if (r == "<interleave>") r= "<emu-tbar>"; else if (r == "<llbracket>") r= "<emu-dlbracket>"; else if (r == "<rrbracket>") r= "<emu-drbracket>"; else r= "<emu-" * r (1, N(r)-1) * ">"; } else if (r == "\\" && base->supports ("/")) { metric ex1, ex2; base -> get_extents ("/", ex1); base -> get_extents ("\\", ex2); double h1= ex1->y2 - ex1->y1; double h2= ex2->y2 - ex2->y1; if (fabs ((h2/h1) - 1.0) > 0.05) r= "<emu-backslash>"; } return 2*num + thin; } else if (r == "(") code= virt->dict ["<rubber-lparenthesis-#>"]; else if (r == ")") code= virt->dict ["<rubber-rparenthesis-#>"]; else if (r == "[") code= virt->dict ["<rubber-lbracket-#>"]; else if (r == "]") code= virt->dict ["<rubber-rbracket-#>"]; else if (r == "{") code= virt->dict ["<rubber-lcurly-#>"]; else if (r == "}") code= virt->dict ["<rubber-rcurly-#>"]; else if (r == "|") code= virt->dict ["<rubber-bar-#>"]; else if (r == "||") { if (base->supports ("<||>")) code= virt->dict ["<rubber-parallel-#>"]; else code= virt->dict ["<rubber-parallel*-#>"]; } else if (r == "interleave") { if (base->supports ("<interleave>")) code= virt->dict ["<rubber-interleave-#>"]; else code= virt->dict ["<rubber-interleave*-#>"]; } else if (r == "lfloor" || r == "rfloor" || r == "lceil" || r == "rceil" || r == "llbracket" || r == "rrbracket") { if (base->supports ("<" * r * ">")) code= virt->dict ["<rubber-" * r * "-#>"]; else code= virt->dict ["<rubber-" * r * "*-#>"]; } else if (r == "dlfloor" || r == "drfloor" || r == "dlceil" || r == "drceil" || r == "tlbracket" || r == "trbracket" || r == "tlfloor" || r == "trfloor" || r == "tlceil" || r == "trceil") code= virt->dict ["<rubber-" * r * "-#>"]; else code= virt->dict ["<rubber-lparenthesis-#>"]; r= string ((char) code) * as_string (nr + HUGE_ADJUST) * ">"; return 2*MAGNIFIED_NUMBER + 2 + thin; } r= s; return 0; }