[BACK]Return to noro_print.rr CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / src

File: [local] / OpenXM / src / asir-contrib / packages / src / noro_print.rr (download)

Revision 1.23, Tue Mar 15 08:00:35 2022 UTC (2 years, 2 months ago) by takayama
Branch: MAIN
CVS Tags: HEAD
Changes since 1.22: +8 -4 lines

begin{array} end{array} is used for print_tex_form for matrices.

/* $OpenXM: OpenXM/src/asir-contrib/packages/src/noro_print.rr,v 1.23 2022/03/15 08:00:35 takayama Exp $ */
#include "tags.h"
#define NOT_YET   print("It has not yet been implemented.")

extern Taka_png_form_res$
extern AMSTeX$
Taka_png_form_res=150$

def taka_tex_form_top(S,Argv) {
  Opt=[];
  PrevSymTab = quotetotex_env("symbol_table");
  PrevConvFlag = quotetotex_env("conv_rule");
  for (I=0; I<length(Argv); I++) {
    if (Argv[I][0] == "table") {
	  quotetotex_env("symbol_table",Argv[I][1]);
	  quotetotex_env("conv_rule",ior(PrevConvFlag,1));
    }else if (Argv[I][0] == "raw") {
       Opt=cons(Argv[I],Opt);
    }else {
      error("Unknown option "+rtostr(Argv[I][0])+" in print_tex_form.");
    }
  }
  Tb = string_to_tb("");
  taka_tex_form(S,Tb | option_list=Opt);
  Str = tb_to_string(Tb);
  quotetotex_env("symbol_table",PrevSymTab);
  quotetotex_env("conv_rule",PrevConvFlag);
  return Str;
}

def taka_tex_form(S,Tb) {
  Raw=0;
  Raw=getopt(raw);
  if (type(S) == MATRIX) {
     taka_tex_form_matrix(S,Tb);
  }else if (type(S) == VECTOR) {
     taka_tex_form_vector(S,Tb);
  }else if (type(S) == LIST) {
     taka_tex_form_list(S,Tb);
  }else if (taka_is_fractional(S)) {
     ( taka_tex_form_frac(S,Tb) );
  }else if (type(S) == DPOLYNOMIAL) {
     taka_tex_form_polynomial(S,Tb);
  }else if (type(S) == RPOLYNOMIAL) {
     taka_tex_form_polynomial(S,Tb);
  }else if (type(S) == NUMBER) {
     taka_tex_form_polynomial(S,Tb);
  }else if (type(S) == STRUCT) {
     taka_tex_form_struct(S,Tb);
  }else if (type(S) == QUOTE) {
     taka_tex_form_quote(S,Tb);
  }else if (type(S) == STRING) {
    if (Raw == 1) {
      write_to_tb(S,Tb);
    }else if (Raw == 2) {
      write_to_tb("\\texttt{",Tb);
      write_to_tb(osm_verb_tex_form(S),Tb);
      write_to_tb("}",Tb);
    }else{
      write_to_tb("\\verb`",Tb);
      write_to_tb(S,Tb);
      write_to_tb("`",Tb);
    }
  }else {
   /* How to translate sin to \sin?
      Use vtype, get args, ... to print sin. 
      quote("x+2*y");  there is no way to get the left leaves and right leaves
      for now.   eval_quote.
   */
	 write_to_tb(rtostr(S),Tb);
  }
}

def taka_tex_form_list(A,Tb) {
  N = length(A);
  write_to_tb("[",Tb);
  for (I=0; I<N; I++) { 
    taka_tex_form(A[I],Tb);
    if (I != N-1) write_to_tb(",",Tb);
  }
  write_to_tb("]",Tb);
}

def taka_tex_form_polynomial(S,Tb) {
  S = objtoquote(S);
  S = quotetotex_tb(S,Tb);
}

def taka_tex_form_quote(S,Tb) {
  quotetotex_tb(S,Tb);
}

def taka_tex_form_matrix(A,Tb) {
  N = size(A)[0];
  M = size(A)[1];
  write_to_tb(AMSTeX?"\\begin{pmatrix}\n":"\\left(\\begin{array}{",Tb);
  if (!AMSTeX) {
    for (J=0; J<M; J++) write_to_tb("c",Tb);
    write_to_tb("}\n",Tb);
  }
  for (I=0; I<N; I++) {
    for (J=0; J<M; J++) {
      taka_tex_form(A[I][J],Tb);
      if (J != M-1) write_to_tb("& ",Tb);
    }
    write_to_tb(AMSTeX?" \\\\\n":" \\\\\n",Tb);
  }
  write_to_tb(AMSTeX?"\\\end{pmatrix}\n":"\\end{array}\\right)\n",Tb);
}

def taka_tex_form_vector(A,Tb) {
  N = size(A)[0];
  write_to_tb(AMSTeX?"\\begin{pmatrix}\n":"\\pmatrix{\n",Tb);
  for (I=0; I<N; I++) {
    taka_tex_form(A[I],Tb);
    if (I != N-1) write_to_tb("& ",Tb);
  }
  write_to_tb(AMSTeX?"\\\\\n\\end{pmatrix}\n":"\\cr}\n",Tb);
}

def taka_is_fractional(A) {
  if (type(A) == RATIONAL) return 1;
  else if (type(A) == NUMBER && dn(A) != 1) return 1;
  else return 0;
}

def taka_tex_form_frac(A,Tb) {
  extern Print_tex_form_fraction_format;
  if (Print_tex_form_fraction_format == "frac") {
    write_to_tb("\\frac{",Tb);
    taka_tex_form(nm(A),Tb); write_to_tb("}{",Tb);
    taka_tex_form(dn(A),Tb); write_to_tb("}",Tb);
  }else if (Print_tex_form_fraction_format == "auto") {
	Ntb = string_to_tb(""); taka_tex_form(nm(A),Ntb);
	Dtb = string_to_tb(""); taka_tex_form(dn(A),Dtb);
    if (str_len(Ntb) > 120 || str_len(Dtb) > 120) {
      write_to_tb("(",Tb); write_to_tb(Ntb,Tb); write_to_tb(")/",Tb);
      write_to_tb("(",Tb); write_to_tb(Dtb,Tb); write_to_tb(")",Tb);
    }else {
      write_to_tb("\\frac{",Tb); write_to_tb(Ntb,Tb);
	  write_to_tb("}{",Tb); write_to_tb(Dtb,Tb); write_to_tb("}",Tb);
    }
  }else {
    write_to_tb("(",Tb); taka_tex_form(nm(A),Tb); write_to_tb(")/",Tb);
    write_to_tb("(",Tb); taka_tex_form(dn(A),Tb); write_to_tb(")",Tb);
  } 
}

/* Tentative */
def taka_tex_form_struct(S,Tb) {
  if (struct_type(S) == POLY_FACTORED_POLYNOMIAL || 
      struct_type(S) == POLY_FACTORED_RATIONAL) {
      taka_poly_tex_form_poly_factored_polynomial(S,Tb);
  }
  else if (struct_type(S) == POLY_RING) {
      taka_poly_tex_form_poly_ring(S,Tb);
  }
  else if (struct_type(S) == POLY_POLYNOMIAL) {
      taka_poly_tex_form_poly_polynomial(S,Tb);
  }
  else if (struct_type(S) == POLY_IDEAL) {
      taka_poly_tex_form_poly_ideal(S,Tb);
  }else {
     Name = get_struct_name(S);
     taka_tex_form(Name,Tb);
     write_to_tb("[",Tb);
     Elm = get_element_names(S);
     for (I=0; I<length(Elm); I++) {
       taka_tex_form(Elm[I],Tb);
       write_to_tb(" \\rightarrow ",Tb);
       T = get_element_at(S,Elm[I]);
       taka_tex_form(T,Tb);
       if (I != length(Elm)-1) write_to_tb(",",Tb);
     }
     write_to_tb("]",Tb);
  }
}

def taka_output(S) {
  shell("rm t.tex ");
  output("t.tex");
  print(S);
  output();
}

def taka_print(S) {
  if (type(S) == DPOLYNOMIAL) {
    return taka_dp_print(S);
  }else{
    return rtostr(S);
  }
}
def taka_dp_print(F) {
  if (F != 0) {
    N = size(dp_etov(dp_hm(F)))[0];
    Vlist = newvect(N);
    for (I=0; I<N; I++) {
      Vlist[I] = taka_print_dp_vlist(I);
    }
    Vlist = vtol(Vlist);
    Ans="distributed_polynomial(\"   ";
  }else{
    Ans="0";
  }
  C = 0;
  while (F != 0) {
     G = dp_hm(F);
     F = dp_rest(F);
     if (dp_hc(G)>0 && C != 0) {
       Ans += "+";
     }
     Ans += rtostr(dp_dtop(G,Vlist));
     if (C == 0) C = 1;
  }
  Ans += "   \")";
  return Ans;
}

def taka_dvi_form(S,Opt) {
  if (type(getopt(texstr))>0) {
    /* no translation */
  }else{
    S = taka_tex_form_top(S,Opt);
  }
  File0 = ox_work_dir()+"/"+ox_new_file_name();
  File = File0+".tex";
  shell("rm -f "+File);
  output(File);
  if (!AMSTeX) {
  S = "\\documentclass[12pt]{article} \\pagestyle{empty} \\oddsidemargin 0cm \\begin{document}\n"+
      "$"+
      S + "$ \n \\end{document}\n";
  }else{
  S = "\\documentclass[12pt]{article} \\usepackage{amsmath} \\usepackage{amssymb} \\pagestyle{empty} \\oddsidemargin 0cm \\begin{document}\n"+
      "$"+
      S + "$ \n \\end{document}\n";
  }
  print(S);
  output();
  shell(" (cd "+ox_work_dir()+" ; latex "+File0+" >>/dev/null) ");
  return [File0+".dvi",File0,File,ox_work_dir()];
         /* (0) .dvi, (1) no extension, (2) .tex, (3) workding dir */
}
def taka_xdvi_form(S) {
  F = taka_dvi_form(S,[] | option_list=getopt());
  /* Use xdvi for a moment. */
  shell(" xdvi -s 3 -geometry 800x300 "+F[1]+"  >>/dev/null & ");
  return F;
}
/* test data 
 print_xdvi_form(quote_sort_polynomial((x-sin(x)*y)^3,[x,y],[1,1]));
*/


def taka_ps_form(S,Opt) {
  F = taka_dvi_form(S,Opt);
  File0 = F[1];
  Work_dir = F[3];
  shell(" (cd "+Work_dir+" ; dvips -f "+File0+" >"+File0+".ps ) ");
  return [File0+".ps",F[1],F[2],F[3]];
}

/* memo. dvipng should be installed.
   Ref.  imgtex
   dvipng -q -D $res -T tight -M -pp 1 --noghostscript t.dvi -o t%03d.png > /dev/null 2>&1
*/
def taka_png_form3(S) {
  F = taka_dvi_form(S,[]);
  File0 = F[1];
  Work_dir = F[3];
  shell(" (cd "+Work_dir+" ; dvipng -q -D "+rtostr(Taka_png_form_res)+
        " -T tight -M -pp 1 --noghostscript "+File0+" -o "+File0+".png >/dev/null 2>&1 ) ");
  return [File0+".png",F[1],F[2],F[3]];
}

/* memo: pstoimg should be installed from the source code of
   latex2html on freebsd.  cf. orange:/usr/local/src/latex2*
*/
def taka_png_form(S) {
  F = taka_ps_form(S,[]);
  File0 = F[1];
  File = F[0];
  /* BUG: it does not work for now. We need png, too */
  shell(" (cd "+Work_dir+" ; pstoimg -type png -crop a -scale 2 "+File0+".ps ) ");
  return [File0+".png",F[1],F[2],F[3]];
}

def taka_dvi_form2(S,Opt) {
  if (type(getopt(texstr))>0) {
    /* no translation */
  }else {
    S = taka_tex_form_top(S,Opt);
  }
  File0 = ox_work_dir()+"/"+ox_new_file_name();
  File = File0+".tex";
  shell("rm -f "+File);
  output(File);
  S = "\\documentclass[12pt]{article} \\pagestyle{empty} \\begin{document}\n"+
      "$"+
      S + "$ \n \\end{document}\n";
  print(S);
  output();
  shell(" (cd "+ox_work_dir()+" ; latex "+File0+" >>/dev/null) >/dev/null ");
  return [File0+".dvi",File0,File,ox_work_dir()];
         /* (0) .dvi, (1) no extension, (2) .tex, (3) workding dir */
}
def taka_ps_form2(S,Opt) {
  F = taka_dvi_form2(S,Opt);
  File0 = F[1];
  Work_dir = F[3];
  shell(" (cd "+Work_dir+" ; dvips -f "+File0+" >"+File0+".ps ) > /dev/null 2>&1");
  return [File0+".ps",F[1],F[2],F[3]];
}
def taka_png_form2_old(S) {
  F = taka_ps_form2(S,[]);
  File0 = F[1];
  File = F[0];
  /* BUG: it does not work for now. We need png, too */
  shell(" (cd "+Work_dir+" ; pstoimg -type png -crop a -scale 2 "+File0+".ps ) >/dev/null");
  return [taka_input_form(S),File0+".png",F[1],F[2],F[3]];
}
def taka_png_form2(S) {
  return cons(taka_input_form(S),taka_png_form3(S));
}

def taka_gif_form(S,Opt) {
  F = taka_ps_form(S,Opt);
  File0 = F[1];
  Work_dir = F[3];
  /* 
  latex2html does not always generate image output for a simple expression.
  shell(" (cd "+Work_dir+" ; latex2html -tmp /tmp "+File0+" >>/dev/null) ");
  shell(" (cd "+Work_dir+" ; cp "+File0+"/?*.gif "+File0+".gif"+ " ) ");
  */
  /* shell(" (cd "+Work_dir+" ; rm -rf "+File0+" ) "); */

  shell(" (cd "+Work_dir+" ; pstoimg -type gif -crop a -scale 2 "+File0+".ps >>/dev/null) ");

  return [File0+".gif",F[1],F[2],F[3]];
}

def taka_jpeg_form(S) {
  F = taka_ps_form(S,[]);
  File0 = F[1];
  File = F[0];
  /* BUG: it does not work for now. We need png, too */
  shell(" (cd "+Work_dir+" ; pstoimg -type jpeg -crop a -scale 2 "+File0+".ps ) ");
  return [File0+".jpeg",F[1],F[2],F[3]];
}

def taka_xv_form(S,Argv) {
  Format = "gif";
  Input = 0;
  for (I=0; I<length(Argv); I++) {
    if (Argv[I][0] == "format") {
      Format = Argv[I][1];
    }else if (Argv[I][0] == "input") {
      Input = Artv[I][1];
    }else {
      error("Unknown option "+rtostr(Argv[I][0])+" in print_xv_form.");
    }
  } 
  if (Input != 0) {
    shell(" xv "+Input+" &");
    return Input;
  }
  if (Format == "gif") {
    F = taka_gif_form(S,[]);
  }else if (Format == "png") {
    F = taka_png_form(S);
  }else {  
    error("Unknown format " + rtostr(Format) + " in print_xv_form.");
  }
  shell(" xv "+F[1]+"."+Format+" &");
  return F;
}

def taka_pdf_form(S) {
  F=taka_dvi_form(S,[]);
  shell(" dvipdfmx "+" -o "+F[1]+".pdf "+F[1]); // +" >>/dev/null & ");
  if (type(getopt(nopreview))>0) NoPreview=1;
  else NoPreview=0; 
  if (NoPreview) return append(F,[F[1]+".pdf"]);
  if (sysinfo()[0] == "macosx") {
    shell("open "+F[1]+".pdf");
  }else if (sysinfo()[0] == "windows") {
    shell(F[1]+".pdf");
  }else {
    shell("xdg-open "+F[1]+".pdf");
  }
  return append(F,[F[1]+".pdf"]);
}

def taka_input_form(S) {
  A = 0;
  if (type(S) == QUOTE) {
    A = quote_input_form(S);
  }
  else if (type(S) == STRUCT) {
    if (struct_type(S) == POLY_FACTORED_POLYNOMIAL) {
       A = taka_poly_input_form_poly_factored_polynomial(S);
    }else if (struct_type(S) == POLY_FACTORED_RATIONAL) {
       A = taka_poly_input_form_poly_factored_rational(S);
    }else if (struct_type(S) == POLY_RING) {
       A = taka_poly_input_form_poly_ring(S);
    }else if (struct_type(S) == POLY_POLYNOMIAL) {
       A = taka_poly_input_form_poly_polynomial(S);
    }else if (struct_type(S) == POLY_IDEAL) {
       A = taka_poly_input_form_poly_ideal(S);
    }else {
       taka_print_warning("input_form() for this object has not yet been implemented.");
       A = rtostr(S);
    }
  }else if (type(S) == LIST) { 
    return rtostr(map(taka_input_form,S));
  }else if (type(S) == VECTOR) {
    return "newvect("+rtostr(length(S))+","+
           rtostr(vtol(map(taka_input_form,S)))+")";
  }else if (type(S) == MATRIX) {
    Iform="newmat(";  Size=size(S);
    for (I=0; I<length(Size); I++) {
      Iform += rtostr(Size[I])+",";
    }
    Iform += "[";
    for (I=0; I<Size[0]; I++) {
      Iform += rtostr(vtol(map(taka_input_form,S[I])));
      if (I != Size[0]-1) Iform += ",";
    }
    Iform += "])";
    A=Iform;
  }else {
    A = rtostr(S);
  }
  return A;
}

def taka_terminal_form(S) {
  A = 0;
  if (type(S) == QUOTE) {
    A = quote_terminal_form(S);
  }
  else if (type(S) == STRUCT) {
    if (struct_type(S) == POLY_FACTORED_POLYNOMIAL) {
       A = taka_poly_terminal_form_poly_factored_polynomial(S);
    }else if (struct_type(S) == POLY_FACTORED_RATIONAL) {
       A = taka_poly_terminal_form_poly_factored_rational(S);
    }else if (struct_type(S) == POLY_RING) {
       A = taka_poly_terminal_form_poly_ring(S);
    }else if (struct_type(S) == POLY_POLYNOMIAL) {
       A = taka_poly_terminal_form_poly_polynomial(S);
    }else if (struct_type(S) == POLY_IDEAL) {
       A = taka_poly_terminal_form_poly_ideal(S);
    }else{
       error("terminal_form() for this object has not yet been implemented.");
    }
  }
  else if (type(S) == LIST || type(S) == VECTOR || type(S) == MATRIX) {
    return rtostr(map(taka_terminal_form,S));
  }
  else{
    A = rtostr(S);
  }
  return A;
}

/* List of printing functions 
   cf. def taka_tex_form_quote_list_function(S) 
*/
def print_tex_form_topology_open_segment(S) {
    T = cdr(S);
    A = " [ ";
    N = length(T);
    for (I=0; I<N; I++) {
      A += taka_tex_form_quote_list(T[I]);
      if (I != N-1) {
        A += ", ";
      }
    }
    A += "]";
    return A;
}
def print_tex_form_topology_circle(S) {
    T = cdr(S);
    A = "S_{";
    A += taka_tex_form_quote_list(T[1]);
    A += "}(";
    A += taka_tex_form_quote_list(T[0]);
    A += ")";
    N = length(T);
    if (N>=3) A+= "(";
    for (I=2; I<N; I++) {
      A += taka_tex_form_quote_list(T[I]);
      if (I != N-1) {
        A += ",";
      }
    }
    if (N>=3) A += ")";
    return A;
}

/* XML/OpenMath form */
def taka_om_xml_form(R) {
  if (type(R) != DPOLYNOMIAL) {
    R = quote_new(R);
    return taka_xml_basic_form_quote(R);
  }else{
    return om_xml(R);
  }
}

def taka_xml_basic_form_quote(S) {
  if (type(S) == LIST) {
    A = taka_oma_basic("list");
    SS = map(taka_xml_basic_form_quote,S);
    for (I=0; I<length(SS); I++) {
      A += SS[I];
    }
    A += taka_end_oma();
    return A;
  }
  S = quotetolist(S);
  return taka_xml_basic_form_quote_list(S);
}

def taka_xml_basic_form_quote_list(S) {
  if (type(S) != LIST) return taka_xml_basic_form_node_name(S);
  A = " ";
  if (S[0] == "u_op") {
     return taka_xml_basic_form_quote_list_u_op(cdr(S));
  }else if (S[0] == "b_op") {
     return taka_xml_basic_form_quote_list_b_op(cdr(S));
  }else if (S[0] == "t_op") {
     return taka_xml_basic_form_quote_list_t_op(cdr(S));
  }else if (S[0] == "list") {
     return taka_xml_basic_form_quote_list_list(cdr(S));
  }else if (S[0] == "exponent_vector") {
     return taka_xml_basic_form_quote_list_exponent_vector(cdr(S));
  }else if (S[0] == "internal") {
     return taka_xml_basic_form_quote_list_internal(cdr(S));
  }else if (S[0] == "variable") {
     return taka_xml_basic_form_quote_list_variable(cdr(S));
  }else if (S[0] == "function") {
     return taka_xml_basic_form_quote_list_function(cdr(S));
  }else {
     error("Unknown quote format.");
  }
}

def taka_oma(S,CD) {
  return "<oma> "+"<oms name=\""+S+"\" cd=\""+CD+"\"/>";
}
def taka_oma_basic(S) {
  return "<oma> "+"<oms name=\""+S+"\" cd=\"basic\"/>";
}
def taka_end_oma() {
  return "</oma>";
}
def taka_omv(S) {
  return "<omv name=\""+S+"\"/>";
}

def taka_xml_basic_form_quote_list_u_op(S) {
  if (S[0] == "()") {
    /* Remove ( ) */
    A += taka_xml_basic_form_quote_list(S[1]);
  }else
  if (S[0] == "!") {
    A += taka_oma_basic("not");
    A += taka_xml_basic_form_quote_list(S[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "@!") {
    A += taka_oma_basic("not");
    A += taka_xml_basic_form_quote_list(S[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "-") {
    A += taka_oma_basic("minus");
    A += taka_xml_basic_form_quote_list(S[1]);
    A += taka_end_oma();
  }else{
    error("Not implemented");
  }
  return A;
}

def taka_xml_basic_form_quote_list_b_op(S) {
   if (S[0] == "+") {
    T = cdr(S);
    N = length(T);
    A += taka_oma_basic("plus");
    for (I=0; I<N; I++) {
      A += taka_xml_basic_form_quote_list(T[I]);
    }
    A += taka_end_oma();
  }else
  if (S[0] == "-") {
    T = cdr(S);
    N = length(T);
    A += taka_oma_basic("minus");
    for (I=0; I<N; I++) {
      if (I == 0 && taka_is_internal_zero(T[I])) {
         /* Do not print 0. */
      } else {
         A += taka_xml_basic_form_quote_list(T[I]);
      }
    }
    A += taka_end_oma();
  } else
  if (S[0] == "*") {
    T = cdr(S);
    N = length(T);
    A += taka_oma_basic("times");
    for (I=0; I<N; I++) {
      A += taka_xml_basic_form_quote_list(T[I]);
      A += " ";
    }
    A += taka_end_oma();
  } else
  if (S[0] == "/") {
    T = cdr(S);
    A += taka_oma_basic("over");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  } else
  if (S[0] == "^") {
    T = cdr(S);
    A += taka_oma_basic("power");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  } else
  if (S[0] == "%") {
    T = cdr(S);
    A += taka_oma_basic("% (undefined)");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  } else
  if (S[0] == "==" || S[0] == "@==") {
    T = cdr(S);
    A += taka_oma_basic("equal");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "&&") {
    T = cdr(S);
    A += taka_oma_basic("and");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "||") {
    T = cdr(S);
    A += taka_oma_basic("or");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "<" || S[0] == "@<") {
    T = cdr(S);
    A += taka_oma_basic("less");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == ">" || S[0] == "@>") {
    T = cdr(S);
    A += taka_oma_basic("greater");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "<=" || S[0] == "@<=") {
    T = cdr(S);
    A += taka_oma_basic("lessequal");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == ">=" || S[0] == "@>=") {
    T = cdr(S);
    A += taka_oma_basic("greaterequal");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else
  if (S[0] == "!=" || S[0] == "@!=") {
    T = cdr(S);
    A += taka_oma_basic("unequal");
    A += taka_xml_basic_form_quote_list(T[0]);
    A += taka_xml_basic_form_quote_list(T[1]);
    A += taka_end_oma();
  }else {
    error("Not implemented.");
  }
  return A;
}

def taka_xml_basic_form_list_t_op(S) {
  NOT_YET ;
}


def taka_xml_basic_form_quote_list_list(S) {
    T = S;
    A = taka_oma_basic("list");
    N = length(T);
    for (I=0; I<N; I++) {
      A += taka_xml_basic_form_quote_list(T[I]);
      if (I != N-1) {
        A += ", ";
      }
    }
    A += taka_end_oma();
    return A;
}

def taka_xml_basic_form_quote_list_exponent_vector(S) {
    NOT_YET;
    A = "(";
    T = cdr(S);
    N = length(T);
    for (I=0; I<N; I++) {
      A += taka_xml_basic_form_quote_list(T[I]);
      if (I != N-1) {
        A += ", ";
      }
    }
    A += ")";
    return(A);
}

def taka_xml_basic_form_quote_list_function(S) {
    if (S[0] == "exponent_vector") {
      return taka_xml_basic_form_quote_list_exponent_vector(cdr(S));
    }
    if (S[0] == "topology_circle") {
      return print_xml_basic_form_topology_circle(S);
    }else if (S[0] == "topology_open_segment") {
      return print_xml_basic_form_topology_open_segment(S);
    }else if (taka_is_infix(S[0])) {
      /* printing general infix function */
      NOT_YET;
      A = "(";
      T = cdr(S);
      N = length(T);
      for (I=0; I<N; I++) {
        A += "(";
        A += taka_xml_basic_form_quote_list(T[I]);
        A += ")";
        if (I != N-1) {
          A += taka_xml_basic_form_node_name(S[0]);
        }
      }
      A += ")";
      return(A);
    }else {
      /* printing general prefix functions. */
      TT = taka_xml_basic_form_node_name_cd(S[0]);
      A = taka_oma(taka_xml_basic_form_node_name(S[0]),TT);
      T = cdr(S);
      N = length(T);
      for (I=0; I<N; I++) {
        A += taka_xml_basic_form_quote_list(T[I]);
      }
      A += taka_end_oma();
      return(A);
   }
}

def taka_xml_basic_form_quote_list_internal(S) {
  X = car(S);
  if (type(X) == RPOLYNOMIAL) {
    return taka_omv(taka_xml_basic_symbol(rtostr(X)));
  }
  if (type(X) == NUMBER && ntype(X) == 0) {
    return "<omi>"+rtostr(X)+"</omi>";
  }
  return rtostr(X);
}
def taka_xml_basic_form_quote_list_variable(S) {
  X = car(S);
  if (type(X) == STRING) return X;
  else return rtostr(X);
}

def taka_xml_basic_form_node_name(S) {
  if (type(S) != STRING) return rtostr(S);
  /* Table of Mathematical Symbols. */
  return taka_xml_basic_symbol(S);
}


def taka_xml_basic_symbol(S) {
  /* R = taka_is_indexed(S);
  if (R[0]) {
    return taka_xml_basic_symbol_(R[1])+"_{"+R[2]+"}";
  } 
  return taka_xml_basic_symbol_(R[1]);
  */
  return taka_xml_basic_symbol_(S);

}

def taka_xml_basic_symbol_(S) {
  extern Xml_basic_symbol_table;
  extern Xml_basic_symbol_table;
  N = size(Xml_basic_symbol_table)[0];
  /* Linear search for now*/
  for (I=0; I<N; I++) {
    if (S == Xml_basic_symbol_table[I][0]) {
       return Xml_basic_symbol_table[I][1];
    }
  }
  return S;
}

def taka_xml_basic_form_node_name_cd(S) {
  extern Xml_basic_symbol_table;
  extern Xml_basic_symbol_table;
  N = size(Xml_basic_symbol_table)[0];
  /* Linear search for now*/
  for (I=0; I<N; I++) {
    if (S == Xml_basic_symbol_table[I][0]) {
       return Xml_basic_symbol_table[I][2];
    }
  }
  return "unknown";
}

def taka_print_output(Obj,F,Mode) {
  S = taka_terminal_form(Obj);
  if (type(F) != 7) {
    error("taka_print_output(Obj, Filename, Mode): Filename must be a string.");
    return;
  }
  if (Mode == "w") {
    Fd = open_file(F,"w");
  }else {
    Fd = open_file(F,"a");
  }
  if (Fd < 0) {
    error("Failed to open the file "+rtostr(F));
    return ;
  }
  S2 = strtoascii(S);
  N = length(S2);
  for (I=0; I<N; I++) {
    put_byte(Fd,S2[I]);
  }
  close_file(Fd);
}
def taka_print_warning(S) {
  extern Taka_print_warning;
  if (Taka_print_warning) {
    print(S);
  }
}
def taka_em(S) {
  S1 = asciitostr([0x1b])+"[31m";  /* "[1m" */
  S2 = asciitostr([0x1b])+"[0m";
  print(S1+rtostr(S)+S2);
}
def noro_print_env(Mode) {
    if (Mode==0 || Mode=="default" || Mode=="clear") {
        quotetotex_env(0);
        load("noro_print_default.rr");
    }else if (Mode=="weyl") {
        quotetotex_env("conv_rule",7);
        quotetotex_env("dp_vars_hweyl",1);
    }else if (Mode=="diff_ring") {
        quotetotex_env("conv_rule",7);
        quotetotex_env("dp_vars_prefix", "\\partial");
    }else if (Mode=="yang") {
        quotetotex_env("conv_rule",7);
        quotetotex_env("dp_vars_prefix", "theta");
    }
}

/* 
 Example.
 "\texttt{ "+osm_verb_tex_form("\\sum_{i=1}^n a_i")+" }"
*/
def osm_verb_tex_form(P)
{
  L = reverse(strtoascii(rtostr(P)));
  for(SS = []; L != []; L = cdr(L)){
    Ch = car(L); /* ^~\{} */
    if(Ch == 92 || Ch == 94 || Ch == 123 || Ch == 125 || Ch == 126){
      SS = append([92,Ch,123,125],SS); /* \Ch{} */
      if(Ch != 94 && Ch != 126) /* \char` */
      SS = append([92,99,104,97,114,96],SS);
      continue;
    }
    SS = cons(Ch, SS);
    if((Ch >= 35 && Ch <= 38) || Ch == 95) /* #$%&_ */
      SS = cons(92, SS); /* \Ch */
  }
  return asciitostr(SS);
}


Loaded_noro_print=1$
end$