but my formula do not fit the screen and it becomes sometimes very annoying.
Often because of too wide delimiters of LyX.
It took me 1h to fix it. Smallest modifications of math_delim.C
yield really more pleasant formula.
Modified math_delim.C is attached.
LyX default:
Modified:
Regards
Alex
-- MAKARENKO Address: Boeretang 280/67 B-2400 MOL Belgium Alexandre Phones: (32)14-32.18.37 or (32)14-33.24.29 Fax: (32)14-32.05.13 E-mail: [EMAIL PROTECTED] Http: http://www.sckcen.be:/~amakaren (under const) SCK internal: http://pc785/
/* * File: math_delim.C * Purpose: Draw delimiters and decorations * Author: Alejandro Aguilar Sierra <[EMAIL PROTECTED]> * Created: January 1996 * Description: Vectorial fonts for simple and resizable objets. * * Dependencies: Xlib, XForms * * Copyright: (c) 1996, Alejandro Aguilar Sierra * * Version: 0.8beta, Mathed & Lyx project. * * You are free to use and modify this code under the terms of * the GNU General Public Licence version 2 or later. */
#include <config.h> #include FORMS_H_LOCATION #include <stdlib.h> #include "symbol_def.h" #include "math_inset.h" /* * Internal struct of a drawing: code n x1 y1 ... xn yn, where code is: * 0 = end, 1 = line, 2 = polyline, 3 = square line, 4= square polyline */ static float parenth[] = { 2.0, 13.0, 0.9930, 0.0071, 0.7324, 0.0578, 0.5141, 0.1126, 0.3380, 0.1714, 0.2183, 0.2333, 0.0634, 0.3621, 0.0141, 0.5000, 0.0563, 0.6369, 0.2113, 0.7647, 0.3310, 0.8276, 0.5070, 0.8864, 0.7254, 0.9412, 0.9930, 0.9919, 0.0 }; //---------------------------- modif static float parenthHigh[] = { 2.0, 13.0, 0.9840, 0.0014, 0.7143, 0.0323, 0.4603, 0.0772, 0.2540, 0.1278, 0.1746, 0.1966, 0.0952, 0.3300, 0.0950, 0.5000, 0.0952, 0.6700, 0.1746, 0.8034, 0.2540, 0.8722, 0.4603, 0.9228, 0.7143, 0.9677, 0.9840, 0.9986, 0.0 }; //---------------------------- end modif static float brace[] = { 2.0, 21.0, 0.9492, 0.0020, 0.9379, 0.0020, 0.7458, 0.0243, 0.5819, 0.0527, 0.4859, 0.0892, 0.4463, 0.1278, 0.4463, 0.3732, 0.4011, 0.4199, 0.2712, 0.4615, 0.0734, 0.4919, 0.0113, 0.5000, 0.0734, 0.5081, 0.2712, 0.5385, 0.4011, 0.5801, 0.4463, 0.6268, 0.4463, 0.8722, 0.4859, 0.9108, 0.5819, 0.9473, 0.7458, 0.9757, 0.9379, 0.9980, 0.9492, 0.9980, 0.0 }; static float arrow[] = { 4, 7, 0.015, 0.7500, 0.2, 0.6, 0.35, 0.35, 0.5, 0.05, 0.65, 0.35, 0.8, 0.6, 0.95, 0.7500, 3, 0.5, 0.15, 0.5, 0.95, 0.0 }; static float Arrow[] = { 4, 7, 0.015, 0.7500, 0.2, 0.6, 0.35, 0.35, 0.5, 0.05, 0.65, 0.35, 0.8, 0.6, 0.95, 0.7500, 3, 0.35, 0.5, 0.35, 0.95, 3, 0.65, 0.5, 0.65, 0.95, 0.0 }; static float udarrow[] = { 2, 3, 0.015, 0.25, 0.5, 0.05, 0.95, 0.25, 2, 3, 0.015, 0.75, 0.5, 0.95, 0.95, 0.75, 1, 0.5, 0.2, 0.5, 0.8, 0.0 }; static float Udarrow[] = { 2, 3, 0.015, 0.25, 0.5, 0.05, 0.95, 0.25, 2, 3, 0.015, 0.75, 0.5, 0.95, 0.95, 0.75, 1, 0.35, 0.2, 0.35, 0.8, 1, 0.65, 0.2, 0.65, 0.8, 0.0 }; static float brack[] = { 2.0, 4, 0.95, 0.05, 0.05, 0.05, 0.05, 0.95, 0.95, 0.95, 0.0 }; static float corner[] = { 2.0, 3, 0.95, 0.05, 0.05, 0.05, 0.05, 0.95, 0.0 }; static float angle[] = { 2.0, 3, 1, 0, 0.05, 0.5, 1, 1, 0.0 }; static float slash[] = { 1, 0.95, 0.05, 0.05, 0.95, 0.0 }; static float hline[] = { 1, 0.05, 0.5, 0.95, 0.5, 0.0 }; static float hline2[] = { 1, 0.1, 0.5, 0.3, 0.5, 1, 0.7, 0.5, 0.9, 0.5, 0.0 }; static float hline3[] = { 1, 0.1, 0, 0.15, 0, 1, 0.475, 0, 0.525, 0, 1, 0.85, 0, 0.9, 0, 0.0 }; static float dline3[] = { 1, 0.1, 0.1, 0.15, 0.15, 1, 0.475, 0.475, 0.525, 0.525, 1, 0.85, 0.85, 0.9, 0.9, 0.0 }; static float hlinesmall[] = { 1, 0.4, 0.5, 0.6, 0.5, 0.0 }; static float vert[] = { 1, 0.5, 0.05, 0.5, 0.95, 0.0 }; static float Vert[] = { 1, 0.3, 0.05, 0.3, 0.95, 1, 0.7, 0.05, 0.7, 0.95, 0.0 }; static float tilde[] = { 2.0, 4, 0.05, 0.8, 0.25, 0.2, 0.75, 0.8, 0.95, 0.2, 0.0 }; static struct math_deco_struct { int code; float *data; int angle; } math_deco_table[] = { // Decorations { LM_widehat, &angle[0], 3 }, { LM_widetilde, &tilde[0], 0 }, { LM_underline, &hline[0], 0 }, { LM_overline, &hline[0], 0 }, { LM_underbrace, &brace[0], 1 }, { LM_overbrace, &brace[0], 3 }, { LM_overleftarrow, &arrow[0], 1 }, { LM_overightarrow, &arrow[0], 3 }, // Delimiters { '(', &parenth[0], 0 }, { ')', &parenth[0], 2 }, { '{', &brace[0], 0 }, { '}', &brace[0], 2 }, { '[', &brack[0], 0 }, { ']', &brack[0], 2 }, { '|', &vert[0], 0 }, { '/', &slash[0], 0 }, { LM_Vert, &Vert[0], 0 }, { LM_backslash, &slash[0], 1 }, { LM_langle, &angle[0], 0 }, { LM_lceil, &corner[0], 0 }, { LM_lfloor, &corner[0], 1 }, { LM_rangle, &angle[0], 2 }, { LM_rceil, &corner[0], 3 }, { LM_rfloor, &corner[0], 2 }, { LM_downarrow, &arrow[0], 2 }, { LM_Downarrow, &Arrow[0], 2 }, { LM_uparrow, &arrow[0], 0 }, { LM_Uparrow, &Arrow[0], 0 }, { LM_updownarrow, &udarrow[0], 0 }, { LM_Updownarrow, &Udarrow[0], 0 }, // Accents { LM_ddot, &hline2[0], 0 }, { LM_hat, &angle[0], 3 }, { LM_grave, &slash[0], 1 }, { LM_acute, &slash[0], 0 }, { LM_tilde, &tilde[0], 0 }, { LM_bar, &hline[0], 0 }, { LM_dot, &hlinesmall[0], 0 }, { LM_check, &angle[0], 1 }, { LM_breve, &parenth[0], 1 }, { LM_vec, &arrow[0], 3 }, { LM_not, &slash[0], 0 }, // Dots { LM_ldots, &hline3[0], 0 }, { LM_cdots, &hline3[0], 0 }, { LM_vdots, &hline3[0], 1 }, { LM_ddots, &dline3[0], 0 }, { 0, 0, 0 } }; inline int odd(int x) { return ((x) & 1); } typedef float matriz_data[2][2]; const matriz_data MATIDEN={ {1,0}, {0,1}}; extern void mathed_set_font(short type, int style); extern int mathed_char_width(short type, int style, byte c); extern int mathed_char_height(short, int, byte, int&, int&); #define mateq(m1,m2) memcpy(m1,m2,sizeof(matriz_data)) class Matriz { public: Matriz() { mateq(m,MATIDEN); } void rota(int); void escala(float, float); void transf(float, float, float&, float&); protected: matriz_data m; void matmat(matriz_data& a); }; void Matriz::rota(int code) { float cs, sn; matriz_data r; mateq(r,MATIDEN); cs = (odd(code)) ? 0: 1 - code; sn = (odd(code)) ? 2 - code: 0; r[0][0] = cs; r[0][1] = sn; r[1][0] = -r[0][1]; r[1][1] = r[0][0]; matmat(r); } void Matriz::escala(float x, float y) { matriz_data s; mateq(s,MATIDEN); s[0][0] = x; s[1][1] = y; matmat(s); } void Matriz::matmat(matriz_data& a) { int i; matriz_data c; for (i=0;i<2; i++) { c[0][i] = a[0][0]*m[0][i] + a[0][1]*m[1][i]; c[1][i] = a[1][0]*m[0][i] + a[1][1]*m[1][i]; } mateq(m, c); } void Matriz::transf(float xp, float yp, float &x, float &y) { x = m[0][0]*xp + m[0][1]*yp; y = m[1][0]*xp + m[1][1]*yp; } extern GC latexGC, mathGC, mathLineGC, cursorGC; static int search_deco(int code) { int i=0; while (math_deco_table[i].code && math_deco_table[i].code!=code) i++; if (!math_deco_table[i].code) i = -1; return i; } void mathed_draw_deco(Window win, int x, int y, int w, int h, int code) { Matriz mt, sqmt; XPoint p[32]; float *d, xx, yy, x2, y2; int i=0,j, n, r; j = search_deco(code); if (j<0) return; r = math_deco_table[j].angle; d = math_deco_table[j].data; //---------------------------- modif if( h > 70 && ( math_deco_table[j].code == (int)'(' || math_deco_table[j].code == (int)')') ) d = parenthHigh; //---------------------------- end modif mt.rota(r); mt.escala(w, h); n = (w < h) ? w: h; sqmt.rota(r); sqmt.escala(n, n); if (r> 0 && r< 3) y += h; if (r>=2) x += w; do { code = (int)d[i++]; switch (code) { case 0: break; case 1: case 3: { xx = d[i++]; yy = d[i++]; x2 = d[i++]; y2 = d[i++]; if (code==3) sqmt.transf(xx, yy, xx, yy); else mt.transf(xx, yy, xx, yy); mt.transf(x2, y2, x2, y2); XDrawLine(fl_display, win, mathGC, x+(int)xx, y+(int)yy, x+(int)x2, y+(int)y2); XFlush(fl_display); break; } case 2: case 4: { n = (int)d[i++]; for (j=0; j<n; j++) { xx = d[i++]; yy = d[i++]; // fprintf(stderr, " %g %g ", xx, yy); if (code==4) sqmt.transf(xx, yy, xx, yy); else mt.transf(xx, yy, xx, yy); p[j].x = x+(int)xx; p[j].y = y+(int)yy; // fprintf(stderr, "P[%d %g %g %d %d]", j, xx, yy, x, y); } XDrawLines(fl_display, win, mathLineGC, p, n, CoordModeOrigin); XFlush(fl_display); } } } while (code); } void MathDelimInset::Draw(int x, int y) { xo = x; yo = y; MathParInset::Draw(x+dw+2, y-dh); //int h=Height(), hg=descent-1; if (left=='.') { XDrawLine(fl_display, pm, cursorGC, x+4, yo-ascent, x+4, yo+descent); XFlush(fl_display); } else mathed_draw_deco(pm, x, y-ascent, dw, Height(), left); x += Width()-dw-2; if (right=='.') { XDrawLine(fl_display, pm, cursorGC, x+4, yo-ascent, x+4, yo+descent); XFlush(fl_display); } else mathed_draw_deco(pm, x, y-ascent, dw, Height(), right); } void MathDelimInset::Metrics() { MathParInset::Metrics(); int d; mathed_char_height(LM_TC_CONST, size, 'I', d, dh); dh /= 2; ascent += 2 + dh; descent += 2 - dh; //---------------------------- modif dw = Height()/5; if ( dw > 15 ) dw = 15 ; //---------------------------- end modif if (dw<6) dw = 6; width += 2*dw+4; } void MathDecorationInset::Draw(int x, int y) { MathParInset::Draw(x+(width-dw)/2, y); mathed_draw_deco(pm, x, y+dy, width, dh, deco); } void MathDecorationInset::Metrics() { int h = 2*mathed_char_height(LM_TC_VAR, size, 'I', ascent, descent); MathParInset::Metrics(); int w = Width()+4; if (w<16) w = 16; dh = w/5; if (dh>h) dh = h; if (upper) { ascent += dh+2; dy = -ascent; } else { dy = descent+2; descent += dh+4; } dw = width; width = w; } void MathAccentInset::Draw(int x, int y) { int dw = width-2; /* char s[8]; mathed_set_font(fn, size); if (MathIsBinary(fn)) { s[0] = s[2] = ' '; s[1] = (char)c; ns = 3; dw = mathed_char_width(fn, size, c); } else s[0] = (char)c; */ if (inset) { inset->Draw(x, y); } else { drawStr(fn, size, x, y, &c, 1); XFlush(fl_display); } x += (code==LM_not) ? (width-dw)/2: 2; mathed_draw_deco(pm, x, y-dy, dw, dh, code); } void MathAccentInset::Metrics() { if (inset) { inset->Metrics(); ascent = inset->Ascent(); descent = inset->Descent(); width = inset->Width(); dh = ascent; } else { mathed_char_height(fn, size, c, ascent, descent); width = mathed_char_width(fn, size, c); dh = (width-2)/2; } if (code==LM_not) { ascent += dh; descent += dh; dh = Height(); } else ascent += dh+2; dy = ascent; // if (MathIsBinary(fn)) // width += 2*mathed_char_width(fn, size, ' '); } void MathDotsInset::Draw(int x, int y) { mathed_draw_deco(pm, x+2, y-dh, width-2, ascent, code); if (code==LM_vdots||code==LM_ddots) x++; if (code!=LM_vdots) y--; mathed_draw_deco(pm, x+2, y-dh, width-2, ascent, code); } void MathDotsInset::Metrics() { mathed_char_height(LM_TC_VAR, size, 'M', ascent, descent); width = mathed_char_width(LM_TC_VAR, size, 'M'); switch (code) { case LM_ldots: dh = 0; break; case LM_cdots: dh = ascent/2; break; case LM_vdots: width /=2; case LM_ddots: dh = ascent; break; } }