void bridge_compound_rep::my_typeset (int desired_status) { int d; tree f; if (L(st) == COMPOUND) { d= 1; f= st[0]; if (is_compound (f)) f= env->exec (f); if (is_atomic (f)) { string var= f->label; if (env->provides (var)) f= env->read (var); else f= tree (ERROR, st); } } else { string var= as_string (L(st)); if (env->provides (var)) f= env->read (var); else f= tree (ERROR, st); d= 0; } if (is_applicable (f)) { int i, n=N(f)-1, m=N(st)-d; env->macro_arg= list<hashmap<string,tree> > ( hashmap<string,tree> (UNINIT), env->macro_arg); env->macro_src= list<hashmap<string,path> > ( hashmap<string,path> (path (DECORATION)), env->macro_src); if (L(f) == XMACRO) { if (is_atomic (f[0])) { string var= f[0]->label; env->macro_arg->item (var)= st; env->macro_src->item (var)= ip; } } else for (i=0; i<n; i++) if (is_atomic (f[i])) { string var= f[i]->label; env->macro_arg->item (var)= i<m? st[i+d]: attach_dip (tree (UNINIT), decorate_right (ip)); env->macro_src->item (var)= i<m? descend (ip,i+d): decorate_right(ip); } initialize (f[n], d, f); // /*IF_NON_CHILD_ENFORCING(st)*/ ttt->insert_marker (st, ip); if (!the_drd->is_child_enforcing (st)) ttt->insert_marker (st, ip); body->typeset (desired_status); env->macro_arg= env->macro_arg->next; env->macro_src= env->macro_src->next; } else { initialize (f, d, f); ///*IF_NON_CHILD_ENFORCING(st)*/ ttt->insert_marker (st, ip); if (!the_drd->is_child_enforcing (st)) ttt->insert_marker (st, ip); body->typeset (desired_status); } }
void bridge_argument_rep::my_typeset (int desired_status) { string name; tree value; path valip= decorate_right (ip); tree r= st[0]; if (is_compound (r)) value= tree (ERROR, "arg"); else { name = r->label; if ((!is_nil (env->macro_arg)) && env->macro_arg->item->contains (r->label)) { value= env->macro_arg->item [name]; if (!is_func (value, BACKUP)) { path new_valip= env->macro_src->item [name]; if (is_accessible (new_valip)) valip= new_valip; } } else value= compound ("src-unknown", name); } path prefix; if (N(st) > 1) { int i, n= N(st); for (i=1; i<n; i++) { tree r= env->exec (st[i]); if (!is_int (r)) { prefix= path (); value= tree (ERROR, "arg " * name); valip= decorate_right (ip); break; } int nr= as_int (r); if ((!is_compound (value)) || (nr<0) || (nr>=N(value))) { prefix= path (); value= tree (ERROR, "arg " * name); valip= decorate_right (ip); break; } value = value[nr]; valip = descend (valip, nr); prefix= prefix * nr; } } initialize (name, prefix, attach_here (value, valip)); ttt->insert_marker (body->st, ip); list<hashmap<string,tree> > old_var= env->macro_arg; list<hashmap<string,path> > old_src= env->macro_src; if (!is_nil (env->macro_arg)) env->macro_arg= env->macro_arg->next; if (!is_nil (env->macro_src)) env->macro_src= env->macro_src->next; body->typeset (desired_status); env->macro_arg= old_var; env->macro_src= old_src; }
bool bridge_compound_rep::notify_macro ( int type, string var, int l, path p, tree u) { /* cout << "Macro argument " << var << " [action=" << type << ", level=" << l << "] " << p << ", " << u << " in " << st << "\n"; */ bool flag; if (valid) { int i, n=N(fun)-1, m=N(st); env->macro_arg= list<hashmap<string,tree> > ( hashmap<string,tree> (UNINIT), env->macro_arg); env->macro_src= list<hashmap<string,path> > ( hashmap<string,path> (path (DECORATION)), env->macro_src); if (L(fun) == XMACRO) { if (is_atomic (fun[0])) { string var= fun[0]->label; env->macro_arg->item (var)= st; env->macro_src->item (var)= ip; } } else for (i=0; i<n; i++) if (is_atomic (fun[i])) { string var= fun[i]->label; env->macro_arg->item (var)= i+delta<m? st[i+delta]: attach_dip (tree (UNINIT), decorate_right (ip)); env->macro_src->item (var)= i+delta<m? descend (ip,i+delta): decorate_right(ip); } flag= body->notify_macro (type, var, l+1, p, u); env->macro_arg= env->macro_arg->next; env->macro_src= env->macro_src->next; } else flag= env->depends (st, var, l); if (flag) status= CORRUPTED; return flag; }
void concater_rep::flag_ok (string s, path ip, color col) { path dip = decorate_right (ip); SI h= 4*env->fn->wfn/5; int r, g, b, a; get_rgb_color (col, r, g, b, a); //r= 255- (255 - r)/6; //g= 255- (255 - g)/6; //b= 255- (255 - b)/6; a= a/6; color light= rgb_color (r, g, b, a); int info= env->info_level; if (info == INFO_MINIMAL || info == INFO_SHORT || info == INFO_SHORT_PAPER) { box infob= info_box (dip, h, pencil (col, env->fn->wline), light); if (info == INFO_SHORT_PAPER) { box b= resize_box (ip, infob, 0, 0, 0, env->fn->yx); print (b); } else { box specb= specific_box (ip, infob, "screen", env->fn); print (specb); } } else if (info == INFO_DETAILED || info == INFO_PAPER) { int sz= script (env->fn_size, env->index_level+2); font gfn (tex_font ("ecrm", sz, (int) (env->magn*env->dpi))); box textb= text_box (decorate (ip), 0, s, gfn, col); box flagb= flag_box (dip, textb, h, pencil (col, env->fn->wline), light); if (info == INFO_DETAILED) { box specb= specific_box (ip, flagb, "screen", env->fn); print (specb); } else { box b= resize_box (ip, flagb, 0, 0, 0, env->fn->yx); print (b); } } }
void decorate_ip (tree src, tree dest) { decorate_ip (dest, decorate_right (obtain_ip (src))); }