I believe I followed the directions given bellow. The only problem with this tm_axiom is that I don't get output except for graphics. That is: first prompt -> x -> i.e. next line is a new prompt with no output? The good news is that draw() does work -> draw(x,x=0..5) produces the Axiom graphic panel.
If you have time attached is my altered tm_axiom.c file. Best, Yigal Weinstein ------------------------------------------------------------------ TeXmacs --Andrey, Wed, 12 Oct 2005 03:49:57 -0500 reply It is easy to modify tm_axiom.c to start axiom (with hypertex and graphics) Instead of starting AXIOMsys, it should start axiom -noclef Also, in void session(void), declare: int prompts=0; and, a few lines later, replace the line: else if (code==PROMPT) break; by the line: else if (code==PROMPT) { if ((++prompts)==2) break; } However, it would be much better to fix this damn double-prompt problem once and for all. Axiom must not write a prompt when it is not prompting the user to input something. Andrey
/****************************************************************************** * MODULE : tm_axiom.c * DESCRIPTION: Glue between TeXmacs and Axiom * COPYRIGHT : (C) 1999 Andrey Grozin ******************************************************************************* * This software falls under the GNU general public license and comes WITHOUT * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details. * If you don't have this file, write to the Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define NORMAL 0 #define LONG 1 #define END 2 #define PROMPT 3 #define MATH 4 #define TYPE 5 #define LEN 256 /* #define LOG "/tmp/tm_axiom.log" */ char buf[LEN]; char mathbuf[4096]; int len,code,writing=0,wait_type=0,mmode=0; /* was writing=1 */ char prompt[]="-> "; char math[]="$$\n"; char Type[]="Type: "; FILE *axin,*axout; #ifdef LOG FILE *log; int details=0; void lline(void) { switch (code) { case NORMAL: fputs("NORMAL",log); break; case LONG: fputs("LONG ",log); break; case END: fputs("END ",log); break; case PROMPT: fputs("PROMPT",log); break; case MATH: fputs("MATH ",log); break; case TYPE: fputs("TYPE ",log); break; } fprintf(log," %3d: ",len); fputs(buf,log); if ((code==PROMPT)||(code==MATH)) fputs("\n",log); fflush(log); } #endif int ch(void) { char c; while (1) { c=getc(axout); #ifdef LOG if (details) { fprintf(log,"%02x",c); if (c>=' ') fprintf(log," [%c]",c); fprintf(log,"\n"); fflush(log); } #endif if (c!='\r') return c; } } void tail(void) { int c; while (1) { c=ch(); if (c==EOF) { code=END; break; } else if (c=='\r') { c=ch(); if (c==EOF) { code=END; break; } else if (c=='\n') { if (writing) putchar('\n'); break; } else if (writing) putchar(c); } else if (writing) putchar(c); } } void iline(void) { int i=0,j=0,k,c; while (1) { c=ch(); if (c==prompt[j]) if (j==2) { code=PROMPT; break; } else j++; else { for (k=0;k<j;) buf[i++]=prompt[k++]; j=0; if (i>LEN-4) { code=LONG; break; } else if (c==EOF) { code=END; break; } else if (c=='\n') { buf[i++]='\n'; code=NORMAL; break; } else buf[i++]=c; } } buf[i]='\0'; len=i; if (len==78) if (buf[77]=='\n') { j=1; for (k=0;k<76;k++) if (buf[k]!='-') { j=0; break; } if (j) code=TYPE; } #ifdef LOG lline(); #endif if (code==PROMPT) return; if (writing) fputs(buf,stdout); if (code==LONG) tail(); if (code==END) { fputs("\n\2latex:\\red Unexpected end\\black5\5",stdout); exit(1); } if (code==LONG) code=NORMAL; } void line(void) { int i=0,j,k,c; char *s; code=NORMAL; c=ch(); if (c==EOF) code=END; else if (c=='-') { j=1; while (1) { c=ch(); if (c==prompt[j]) if (j==2) { code=PROMPT; break; } else j++; else { for (k=0;k<j;) buf[i++]=prompt[k++]; break; } } } else if (c=='$') { j=1; while (1) { c=ch(); if (c==math[j]) if (j==2) { code=MATH; break; } else j++; else { for (k=0;k<j;) buf[i++]=math[k++]; buf[i++]=c; } } } if (c!=EOF) buf[i++]=c; if ((code==PROMPT)||(code==MATH)||(code==END)) { buf[i]='\0'; len=i; #ifdef LOG lline(); #endif return; } while (1) { if (i>LEN-2) { code=LONG; break; } else if (c=='\n') break; c=ch(); if (c==EOF) { code=END; break; } else buf[i++]=c; } buf[i]='\0'; len=i; #ifdef LOG lline(); #endif if (/*wait_type && */(code==NORMAL)) { if (len==1) return; wait_type=0; if (len==78) { for (s=buf,k=0;k<len-7;s++,k++) if ((*s)!=' ') break; for (k=0;k<6;s++,k++) if ((*s)!=Type[k]) break; if (k==6) { /* buf[77]='\0'; */ wait_type=1; printf("\2latex:\\axiomtype{%s}\5",s); return; } } }; if (wait_type) printf("\2latex:\\red$\\rightarrow$\\black\\ \5"); if (mmode) { strcat(mathbuf,buf); } else { fputs(buf,stdout); }; if (code==LONG) tail(); if (code==LONG) code=NORMAL; } void must_be_prompt(char *mess) { iline(); if (code!=PROMPT) { printf("\2latex:\\red Cannot get prompt %s\\black\5\5",mess); exit(1); } } void tex_to_latex(char buf[]) { char *ptr1, *ptr2; while ((ptr1=strchr(buf,'\n'))) { strcpy(ptr1,ptr1+1); }; while ((ptr1=strstr(buf,"\\root {"))) { if ((ptr2=strstr(ptr1,"} \\of "))) { strncpy(ptr1,"\\sqrt[",6); strncpy(ptr1+6,ptr1+7,ptr2-ptr1-7); strncpy(ptr1+6+(ptr2-ptr1-7),"]",1); strcpy(ptr1+7+(ptr2-ptr1-7),ptr2+6); } } } void session(void) { int c,delims=0; int prompts=0; #ifdef LOG log=fopen(LOG,"w"); #endif /* Write initial lines up to (but not including) the line with the first prompt */ fputs("\2verbatim:",stdout); while (1) { iline(); if (code==TYPE) { if ((++delims)==2) writing=0; } else if (code==PROMPT) { if ((++prompts)==2) break; } } /* force-feeding */ fputs(")set messages prompt plain\n",axin); fflush(axin); #ifdef LOG fputs("SENT )set messages prompt plain\n",log); fflush(log); #endif must_be_prompt("0"); fputs(")set messages autoload off\n",axin); fflush(axin); #ifdef LOG fputs("SENT )set messages autoload off\n",log); fflush(log); #endif must_be_prompt("1"); fputs(")set quit unprotected\n",axin); fflush(axin); #ifdef LOG fputs("SENT )set quit unprotected\n",log); fflush(log); #endif must_be_prompt("2"); fputs(")set output tex on\n",axin); fflush(axin); #ifdef LOG fputs("SENT )set output tex on\n",log); fflush(log); #endif must_be_prompt("3"); fputs(")set output algebra off\n",axin); fflush(axin); #ifdef LOG fputs("SENT )set output algebra off\n",log); fflush(log); #endif must_be_prompt("4"); /* Main prompt-read-write loop */ while (1) { fputs("\2channel:prompt\5\2latex:\\red$\\rightarrow$\\ \5\5",stdout); fflush(stdout); fputs("\2verbatim:",stdout); while (1) { c=getchar(); if ((c==EOF)||(c=='\n')) break; putc(c,axin); } if (c==EOF) fputs(")quit\n",axin); else putc('\n',axin); fflush(axin); mmode=0; while (1) { line(); if ((code==PROMPT)||(code==END)) break; if (code==MATH) { if (mmode) { /* convert TeX to LaTex etc. */ tex_to_latex(mathbuf); fputs(mathbuf,stdout); mmode=0; wait_type=1; fputs("$\5\n",stdout); } else { strcpy(mathbuf,""); mmode=1; fputs("\2latex:$\\displaystyle\n",stdout); } }; } if (code==END) break; } fputs("\2latex:\\red The end\\black\5\5",stdout); } void fatal(char *mess) { fprintf(stdout,"\2latex:\\red Cannot %s\\black\5\5",mess); exit(1); } int main() { int p1[2],p2[2]; if (pipe(p1)<0) fatal("create pipe"); if (pipe(p2)<0) fatal("create pipe"); switch (fork()) { case -1: fatal("fork"); case 0: /* Axiom */ dup2(p1[1],1); close(p1[1]); close(p1[0]); dup2(p2[0],0); close(p2[0]); close(p2[1]); execlp("axiom","axiom","-noclef",0); fatal("exec axiom"); default: /* parent */ close(p1[1]); close(p2[0]); axin=fdopen(p2[1],"w"); axout=fdopen(p1[0],"r"); session(); } return 0; }
_______________________________________________ Axiom-math mailing list Axiom-math@nongnu.org http://lists.nongnu.org/mailman/listinfo/axiom-math