/* This file is part of * ====================================================== * * LyX, The Document Processor * * Copyright (C) 1995 Matthias Ettrich * Copyright (C) 1995-1998 The LyX Team. *
*======================================================*/
/* LatexAccent. Proper handling of accented characters */ /* This part is done by Ivan Schreter, schreter@ccsun.tuke.sk */ /* Later modified by Lars G. Bjonnes, larsbj@ifi.uio.no */
switch (contents[1]) { // second char should be one of these case'\'': // acute
modtype = ACUTE; // acute
plusasc = true; // at the top of character break; case'`': // grave
modtype = GRAVE; // grave
plusasc = true; // at the top break; case'=': // macron
modtype = MACRON; // macron
plusasc = true; // at the top break; case'~': // tilde
modtype = TILDE; // tilde
plusasc = true; // at the top break; case'b': // underbar
modtype = UNDERBAR; // underbar
plusdesc = true; // at the bottom break; case'c': // cedilla
modtype = CEDILLA; // cedilla
plusdesc = true; // at the bottom break; case'd': // underdot
modtype = UNDERDOT; // underdot
plusdesc = true; // at the bottom break; case'r': // circle
modtype = CIRCLE; // circle
plusasc = true; // at the top break; case't': // tie
modtype = TIE; // tie
plusasc = true; // at the top break; case'u': // breve
modtype = BREVE; // breve
plusasc = true; // at the top break; case'v': // caron
modtype = CARON; // caron
plusasc = true; // at the top break; case'q': // special caron
modtype = SPECIAL_CARON; // special caron
plusasc = true; // at the top break; case'H': // hungarian umlaut
modtype = HUNGARIAN_UMLAUT; // hungarian umlaut
plusasc = true; // at the top break; case'"': // umlaut
modtype = UMLAUT; // umlaut
plusasc = true; // at the top break; case'.': // dot
modtype = DOT; // dot
plusasc = true; // at the top break; case'^': // circumflex
modtype = CIRCUMFLEX; // circumflex
plusasc = true; // at the top break; case'k': // ogonek
modtype = OGONEK; // ogonek
plusdesc = true; break; case'i': // dot-less-i
modtype = DOT_LESS_I; // dot-less-i
plusasc = true; // at the top (not really needed)
remdot = true; break; case'j': // dot-less-j
modtype = DOT_LESS_J; // dot-less-j
plusasc = true; // at the top (not really needed)
remdot = true; break; case'l': // lslash
modtype = lSLASH;
plusasc = true; // at the top (not really needed) break; case'L': // lslash
modtype = LSLASH;
plusasc = true; // at the top (not really needed) break; default:
printf ("Default\n"); // unknow accent (or something else) return;
}
// we demand that third char is a '{' (Lgb) if (contents[2] != '{') return;
// special clause for \i{}, \j{} \l{} and \L{} if ((modtype == DOT_LESS_I || modtype == DOT_LESS_J
|| modtype == lSLASH || modtype == LSLASH)
&& contents[3] == '}' ) { switch (modtype) { case DOT_LESS_I: ic = 'i'; break; case DOT_LESS_J: ic = 'j'; break; case lSLASH: ic = 'l'; break; case LSLASH: ic = 'L'; break; default: // if this happens something is really wrong
lyxerr.print("InsetLaTexAccent: weird error."); break;
} //ic = (modtype == DOT_LESS_J ? 'j' : 'i');
lyxerr.debug("Contents: [" + contents + "], ic: " + ic + ", top: " + plusasc + ", bot: " + plusdesc + ", dot: " + remdot + ", mod: " + (long)modtype); // Special case for space
} elseif (contents[3] == '}') {
ic = ' ';
} else { int i = 3;
// now get the char
ic = contents[3]; // i will always be 3 here
// ic should now be a alfa-char or '\\' if (ic == '\\') {
ic = contents[++i]; // will only allow \<foo>{\i} and \<foo>{\j} if (ic == 'i' || ic == 'j')
remdot = true; else return;
} elseif ( (ic=='i'|| ic=='j') && contents[4]=='}') { // Do a rewrite: \<foo>{i} --> \<foo>{\i}
LString temp=contents;
temp.substring(0,2);
temp+='\\';
temp+=char(ic); for(int j=4;j<contents.length();j++)
temp+=contents[j];
contents=temp;
i++;
remdot=true;
}
// demand a '}' at the end if (contents[++i] != '}' && contents[++i]) return;
int InsetLatexAccent::Ascent(LyXFont const &font) const
{ int max; if (candisp) { if (ic == ' ')
max = font.ascent('a'); else
max = font.ascent(ic); if (plusasc)
max += (font.maxAscent()+3) / 3;
} else
max = font.maxAscent()+4; return max;
}
int InsetLatexAccent::Descent(LyXFont const &font) const
{ int max; if (candisp) { if (ic==' ')
max = font.descent('a'); else
max = font.descent(ic); if (plusdesc)
max += 3;
} else
max = font.maxDescent() + 4; return max;
}
int InsetLatexAccent::Width(LyXFont const &font) const
{ if (candisp) return font.textWidth(&ic, 1); else return font.stringWidth(contents) + 4;
}
switch (modtype) { case CEDILLA:
{ if (ic == 'c') tmpic = 0xe7; if (ic == 'C') tmpic = 0xc7; if (ic == 's') tmpic = 0xfe; if (ic == 'S') tmpic = 0xde; break;
} case BREVE:
{ if (ic == 'g') tmpic = 0xf0; if (ic == 'G') tmpic = 0xd0; break;
} case UMLAUT:
{ if (ic == 'o') tmpic = 0xf6; if (ic == 'O') tmpic = 0xd6; if (ic == 'u') tmpic = 0xfc; if (ic == 'U') tmpic = 0xdc; break;
} case DOT: if (ic == 'I') tmpic = 0xdd; break; case DOT_LESS_I: tmpic = 0xfd; break; default: returnfalse;
} if (tmpic != ic) { char ch = char(tmpic);
scr.drawText(font, &ch, 1, baseline, int(x));
x += Width (font); returntrue;
} else returnfalse;
}
void InsetLatexAccent::Draw(LyXFont font,
LyXScreen &scr, int baseline, float &x)
{ if (lyxrc->font_norm=="iso8859-9") if (DisplayISO8859_9 (font, scr, baseline, x)) return;
/* draw it! */
if (candisp) { int asc = Ascent(font); int desc = Descent(font); int wid = Width(font); float x2 = x+(float(wid)/2); float hg35; int hg, y; if (plusasc) { // mark at the top
hg = font.maxDescent();
y = baseline - asc;
if (font.shape() == LyXFont::ITALIC_SHAPE) x2 += (4*hg)/5; // italic
} else { // at the bottom
hg = desc;
y = baseline;
}
hg35 = float(hg*3)/5;
// display with proper accent mark // first the letter
scr.drawText(font, &ic, 1, baseline, int(x));
GC pgc = GetAccentGC(font, (hg+3)/5);
if (remdot) { int tmpvar = baseline - font.ascent('i'); float tmpx = 0; if (font.shape() == LyXFont::ITALIC_SHAPE) tmpx += (8*hg)/10; // italic
lyxerr.debug("Removing dot.", Error::ANY); // remove the dot first
scr.fillRectangle(gc_clear, int(x + tmpx),
tmpvar, wid,
font.ascent('i') -
font.ascent('x')-1);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.