Rev 8499 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8499 | Rev 12243 | ||
---|---|---|---|
Line 20... | Line 20... | ||
20 | 20 | ||
21 | void exec_instex(char *p); |
21 | void exec_instex(char *p); |
22 | void calc_instexst(char *p); |
22 | void calc_instexst(char *p); |
23 | 23 | ||
24 | struct { |
24 | struct { |
25 |
|
25 | char src[124], name[128]; |
26 |
|
26 | int size; |
27 | } oldinstex[100]; |
27 | } oldinstex[100]; |
28 | int oldtexcnt=0; |
28 | int oldtexcnt=0; |
29 | 29 | ||
30 | /* check whether the same tex source has already been produced */ |
30 | /* check whether the same tex source has already been produced */ |
31 | int instex_ready(char *p, char *n) |
31 | int instex_ready(char *p, char *n) |
32 | { |
32 | { |
33 |
|
33 | int i; |
34 |
|
34 | char *cl, buf[MAX_LINELEN+1]; |
35 | 35 | ||
36 |
|
36 | if(strlen(p)>=124) return 0; |
37 |
|
37 | cl=getvar("instex_color"); if(cl!=NULL && *cl!=0) return 0; |
38 |
|
38 | mystrncpy(buf,p,sizeof(buf)); tex_nospace(buf); |
39 |
|
39 | for(i=0;i<oldtexcnt;i++) { |
40 |
|
40 | if(oldinstex[i].size==current_tex_size && |
41 |
|
41 | strcmp(oldinstex[i].src,buf)==0) { |
42 |
|
42 | ovlstrcpy(n,oldinstex[i].name); return 1; |
43 | } |
- | |
44 | } |
43 | } |
- | 44 | } |
|
45 |
|
45 | if(strlen(n)>=128 || oldtexcnt>=100) return 0; |
46 |
|
46 | ovlstrcpy(oldinstex[oldtexcnt].src,buf); |
47 |
|
47 | ovlstrcpy(oldinstex[oldtexcnt].name,n); |
48 |
|
48 | oldinstex[oldtexcnt].size=current_tex_size; |
49 |
|
49 | oldtexcnt++; return 0; |
50 | } |
50 | } |
51 | 51 | ||
52 | /* returns NULL if instex can use static */ |
52 | /* returns NULL if instex can use static */ |
53 | char *instex_check_static(char *p) |
53 | char *instex_check_static(char *p) |
54 | { |
54 | { |
Line 64... | Line 64... | ||
64 | char tnames[]="sqrt int integrate sum prod product \ |
64 | char tnames[]="sqrt int integrate sum prod product \ |
65 | Int Sum Prod conj abs"; |
65 | Int Sum Prod conj abs"; |
66 | 66 | ||
67 | int __gototex (char *p, char *f, int ts) |
67 | int __gototex (char *p, char *f, int ts) |
68 | { |
68 | { |
69 |
|
69 | char alignbak[2048]; |
70 |
|
70 | char *pp, buf[MAX_LINELEN+1]; |
71 |
|
71 | ovlstrcpy(buf,p); |
72 |
|
72 | instex_style="$$"; |
73 |
|
73 | if(!ts) texmath(buf); |
74 |
|
74 | /* ts=0 but there is some computer matrix to transform |
75 |
|
75 | * done by texmath, but it does much more as replacing strings in tmathfn |
76 |
|
76 | * OK if buf contains " math computer-syntax" ; if not, the result may be bad |
77 |
|
77 | */ |
78 |
|
78 | else {// seems tex : need to interpret names of variables as \x or \calB |
79 |
|
79 | //if (mathalign_base < 2) { //to check |
80 |
|
80 | char *p1; |
81 |
|
81 | p1=find_word_start(buf); |
82 |
|
82 | if(*p1=='\\') { |
83 |
|
83 | int i; |
84 |
|
84 | char *pt; |
85 |
|
85 | for(i=1;isalnum(p1[i]);i++); /* find an alphanumeric string beginning by \\ */ |
86 |
|
86 | if(p1[i]==0 && (pt=mathfont(p1))!=NULL) { |
87 |
|
87 | _output_(pt); *p=0; return 1; |
88 | } |
- | |
89 | } |
- | |
90 | // } |
- | |
91 | } |
88 | } |
- | 89 | } |
|
- | 90 | // } |
|
- | 91 | } |
|
92 | /* send to mathml */ |
92 | /* send to mathml */ |
93 |
|
93 | if( strcmp( getvar("force_mathml") , "yes" ) == 0 ){/* override math-with-gifs */ |
94 |
|
94 | mathalign_base = 2; |
95 |
|
95 | } |
96 |
|
96 | if (mathalign_base == 2 && mathml(buf,0)) { *p=0 ;return 1; } |
97 | /* end if mathml option in case ts=1 or "computer matrix" */ |
97 | /* end if mathml option in case ts=1 or "computer matrix" */ |
98 | 98 | ||
99 | /* creating images*/ |
99 | /* creating images*/ |
100 |
|
100 | pp=getvar("ins_align"); |
101 |
|
101 | if(pp!=NULL) mystrncpy(alignbak,pp,sizeof(alignbak)); |
102 |
|
102 | setvar("ins_align","middle"); |
103 |
|
103 | mystrncpy(ins_alt,buf,sizeof(ins_alt)); |
104 |
|
104 | if(f==NULL) { |
105 |
|
105 | calc_instexst(buf); output("%s",buf); |
106 |
|
106 | } |
107 |
|
107 | else { |
108 |
|
108 | instex_usedynamic=1; exec_instex(buf); instex_usedynamic=0; |
109 |
|
109 | } |
110 |
|
110 | instex_style=""; |
111 |
|
111 | if(alignbak[0]) setvar("ins_align",alignbak); |
112 |
|
112 | *p=0; return 0; |
113 | } |
113 | } |
114 | 114 | ||
115 | /* Intelligent insertion of math formulas, kernel */ |
115 | /* Intelligent insertion of math formulas, kernel */ |
116 | void __insmath(char *p) |
116 | void __insmath(char *p) |
117 | { |
117 | { |
118 |
|
118 | char *f, *pp, *pe, *p1, buf[MAX_LINELEN+1], nbuf[256]; |
119 |
|
119 | int ts, n, rawmathready; |
120 | 120 | ||
121 |
|
121 | ovlstrcpy(buf,p); strip_trailing_spaces(buf); singlespace(buf); |
122 |
|
122 | p1=getvar("insmath_slashsubst"); |
123 |
|
123 | if(p1!=NULL && strstr(p1,"yes")!=NULL) slashsubst(buf); // substitute backslash parameters |
124 |
|
124 | f=instex_check_static(buf); //decide if image already exists |
125 |
|
125 | substit(buf);//substitute the variables |
126 |
|
126 | /* here replace .. by , : i=1 .. 5 -> i=1, 5 !*/ |
127 |
|
127 | for(pp=strstr(buf,".."); pp!=NULL; pp=strstr(pp,"..")) { |
128 |
|
128 | if(*(pp+2)=='.' || *(pp+2)==',') { |
129 |
|
129 | do pp++; while(*pp=='.'); continue; |
130 |
|
130 | } |
131 |
|
131 | *pp=','; *(pp+1)=' '; |
132 |
|
132 | } |
133 |
|
133 | /* decide if it should be tex */ |
134 |
|
134 | ts=0; if(strchr(buf,'\\') || strchr(buf,'}')) ts=1; |
135 |
|
135 | /* if not and if variable insmath_rawmath is there, do rawmath */ |
136 |
|
136 | rawmathready=0; |
137 |
|
137 | if(!ts) { /* not tex, looking if rawmath is asked */ |
138 |
|
138 | pp=getvar("insmath_rawmath"); |
139 |
|
139 | if(pp!=NULL && strstr(pp,"yes")!=NULL) { |
140 |
|
140 | rawmath(buf); rawmathready=1; |
141 |
|
141 | } |
142 |
|
142 | } |
143 |
|
143 | if(ts) { |
144 |
|
144 | _replace_matrix (buf,"\\matrix{","matrix"); //could be done in any case if ts=1 |
145 |
|
145 | _replace_matrix (buf,"\\pmatrix{","pmatrix"); |
146 |
|
146 | } |
147 | /* if ts=1 (it should be a tex formula) or if there is a [ , ; ] matrix */ |
147 | /* if ts=1 (it should be a tex formula) or if there is a [ , ; ] matrix */ |
148 |
|
148 | if(ts || |
149 |
|
149 | (strchr(buf,'[')!=NULL && (strchr(buf,',')!=NULL || strchr(buf,';')!=NULL))) { |
150 |
|
150 | if(__gototex(buf, f, ts)) return; |
151 |
|
151 | } |
152 | 152 | ||
153 | /* end creating images |
153 | /* end creating images |
154 | * we are now in the case where ts=0 and no need of tex for matrix */ |
154 | * we are now in the case where ts=0 and no need of tex for matrix */ |
155 | 155 | ||
156 | /* find math variables */ |
156 | /* find math variables */ |
157 |
|
157 | for(pp=find_mathvar_start(buf); *pp; pp=find_mathvar_start(pe)) { |
158 |
|
158 | pe=find_mathvar_end(pp); n=pe-pp; |
159 |
|
159 | /* non alpha variable or too short or too long to be interpreted as tnames */ |
160 |
|
160 | if(!isalpha(*pp) || n<3 || n>16) continue; |
161 |
|
161 | memmove(nbuf,pp,n); nbuf[n]=0; |
162 |
|
162 | if(wordchr(tnames,nbuf)!=NULL) { if(__gototex(buf, f, 0)) return;} |
163 |
|
163 | /* find sqrt int integrate sum prod product Int Sum Prod conj abs, |
164 |
|
164 | * so must be texmath interpretated ; after going to tex, return in any case |
165 |
|
165 | */ |
166 |
|
166 | } |
167 | /* look for / to interpretate as quotients - |
167 | /* look for / to interpretate as quotients - |
168 | * extend the version by accepting something else than ( |
168 | * extend the version by accepting something else than ( |
169 | */ |
169 | */ |
170 | //for(pp=strchr(buf,'/'); pp!=NULL && *find_word_start(pp+1)!='('; pp=strchr(pp+1,'/')); |
170 | //for(pp=strchr(buf,'/'); pp!=NULL && *find_word_start(pp+1)!='('; pp=strchr(pp+1,'/')); |
171 |
|
171 | pp=strchr(buf,'/'); |
172 |
|
172 | if(pp!=NULL){ if( __gototex(buf,f,0)) return;} /* so a/4 can be reinterpreted as {a over 4 } ; transform also 5/(x+1) */ |
173 |
|
173 | if(rawmathready) rawmath_easy=1; |
174 |
|
174 | for(pp=strchr(buf,'<'); pp!=NULL; pp=strchr(pp+1,'<')) |
175 |
|
175 | string_modify(buf,pp,pp+1,"<"); |
176 |
|
176 | for(pp=strchr(buf,'>'); pp!=NULL; pp=strchr(pp+1,'>')) |
177 |
|
177 | string_modify(buf,pp,pp+1,">"); |
178 | /* no tex has been introduced - so go to mathmlmath */ |
178 | /* no tex has been introduced - so go to mathmlmath */ |
179 |
|
179 | mathmlmath(buf); output("%s",buf); |
180 |
|
180 | rawmath_easy=0; |
181 | } |
181 | } |
182 | 182 | ||
183 | /* the following is not used in modules : no insmath_logic=yes somewhere */ |
183 | /* the following is not used in modules : no insmath_logic=yes somewhere */ |
184 | 184 | ||
185 | char *andor[]={"and","or","not","is","isnot"}; |
185 | char *andor[]={"and","or","not","is","isnot"}; |
Line 187... | Line 187... | ||
187 | char *andorlang[andorcnt], andorlangbuf[1024]; |
187 | char *andorlang[andorcnt], andorlangbuf[1024]; |
188 | int andorlangcnt=-1; |
188 | int andorlangcnt=-1; |
189 | 189 | ||
190 | /* Processing logic statements in math formulas */ |
190 | /* Processing logic statements in math formulas */ |
191 | void _mathlogic(char *p, void _put(char *pp)) |
191 | void _mathlogic(char *p, void _put(char *pp)) |
192 | { |
192 | { |
193 |
|
193 | char *p1, *p2, *ps; |
194 |
|
194 | int i; |
195 |
|
195 | if(strstr(p,"qzis")==NULL) { |
196 |
|
196 | for(i=0;i<andorcnt && varchr(p,andor[i])==NULL; i++); |
197 |
|
197 | if(i>=andorcnt) { |
198 |
|
198 | _put(p); return; |
199 |
|
199 | } |
200 |
|
200 | } |
201 |
|
201 | if(andorlangcnt<0) { |
202 |
|
202 | char buf[MAX_LINELEN+1]; |
203 |
|
203 | accessfile(buf,"r","bases/sys/andor.%s",lang); |
204 |
|
204 | mystrncpy(andorlangbuf,find_word_start(buf),sizeof(andorlangbuf)); |
205 |
|
205 | for(i=0,p1=andorlangbuf;i<andorcnt;i++,p1=find_word_start(p2)) { |
206 |
|
206 | p2=strchr(p1,','); |
207 |
|
207 | if(p2==NULL) p2=p1+strlen(p1); else *p2++=0; |
208 |
|
208 | strip_trailing_spaces(p1); |
209 |
|
209 | if(*p1) andorlang[i]=p1; else break; |
210 |
|
210 | } |
211 |
|
211 | andorlangcnt=i; |
212 |
|
212 | } |
213 |
|
213 | for(ps=p, p1=find_mathvar_start(p); *p1; p1=find_mathvar_start(p2)) { |
214 |
|
214 | p2=find_mathvar_end(p1); |
215 |
|
215 | if(!isalpha(*p1)) continue; |
216 |
|
216 | if(strncmp(p1,"qzis",4)==0) { |
217 |
|
217 | char *p3, *p4, *p5; |
218 |
|
218 | /*int tt;*/ |
219 |
|
219 | p4=find_word_start(p2); |
220 |
|
220 | if(*p4!='(') continue; |
221 |
|
221 | if(strncmp(p1+4,"not",3)==0) {/*tt=4;*/ p3=p1+7;} |
222 |
|
222 | else {/*tt=3; */p3=p1+4;} |
223 |
|
223 | if(!isalpha(*p3)) continue; |
224 |
|
224 | p4++; p5=find_matching(p4,')'); |
225 |
|
225 | if(*p5!=')') continue; |
226 |
|
226 | *p5=0; *p2=0; p2=p5+1; |
227 | 227 | ||
228 | 228 | ||
229 |
|
229 | continue; |
230 |
|
230 | } |
231 |
|
231 | for(i=0;i<andorlangcnt;i++) if(strncmp(p1,andor[i],p2-p1)==0) break; |
232 |
|
232 | if(i<andorlangcnt) { |
233 |
|
233 | *p1=0; ps=find_word_start(ps); if(*ps) _put(ps); |
234 |
|
234 | output(" %s ",andorlang[i]); ps=p2; |
235 | } |
- | |
236 | } |
235 | } |
- | 236 | } |
|
237 |
|
237 | ps=find_word_start(ps); if(*ps) _put(ps); |
238 | } |
238 | } |
239 | 239 | ||
240 | /* Intelligent insertion of math formulas */ |
240 | /* Intelligent insertion of math formulas */ |
241 | void insmath(char *p) |
241 | void insmath(char *p) |
242 | { |
242 | { |
243 |
|
243 | char *pt; |
244 |
|
244 | if(!outputing) goto end; |
245 |
|
245 | pt=getvar("insmath_logic"); |
246 |
|
246 | if(pt==NULL || strstr(pt,"yes")==NULL) { |
247 |
|
247 | __insmath(p); |
248 |
|
248 | end: *p=0; return; |
249 |
|
249 | } |
250 |
|
250 | _mathlogic(p,__insmath); |
251 | } |
251 | } |