Hi, allIs there anybody can remember that I had asked how to insert raw latex command in gnumeric for exporting latex?
http://mail.gnome.org/archives/gnumeric-list/2004-June/msg00023.htmlSome people on this list told me that no way. Now I implement it myself and the patch is attached(latex.patch).
Let me give some explanations:1. I tested on gnumeirc-1.2.13, it worked fine. If you don't want to compile it from source, you may try the pre-compiled file. Extract the attachment to overrite your original html plugins, backup your files first! 2. To insert raw latex command, please put them between '\L{' and '}'. The '{'s and '}'s must be matched, that is to say you can't put a unmatched brackets in it, I think there is no need to to so in latex. What's in gnumeric What's in latex foo \L{E=m\cdot{}c^2} foo foo E=m\cdot{}c^2 foo
foo \L{{aa}{bb}{a{b}c}} foo foo {aa}{bb}{a{b}c} foo foo \L{a}\L{b} foo foo ab fooI think this patch would be very convinient for those who take gnumeric as their latex table-maker, just as me. :-)
Any reply please cc to me, for I don't subscribe the mailing list. -- Best regards Shixin Zeng
--- gnumeric-1.2.13/plugins/html/latex.c 2004-05-13 02:41:22.000000000 +0800 +++ gnumeric-1.2.13.new/plugins/html/latex.c 2004-11-20 16:32:14.434540992 +0800 @@ -133,6 +133,89 @@ }; /** + * latex_raw_utf : + * @p : a pointer to a char, start of the string to be processed + * @output : output stream where the processed characters are written. + * + * This determinate the mode of the string. + * If @p is in form of \L{foo}, the exact "foo" will be put into @output, without any esacaping. + * return the char pointer next to '}' of \L{foo} + * else return @p untouched; + */ +static const char* +latex_raw_utf(const char *p, GsfOutput *output) +{ + const char *p_begin, *p_end, *p_orig; + p_orig = p; + if(g_utf8_get_char(p) == '\\'){ + p = g_utf8_next_char(p); + if(g_utf8_get_char(p) == 'L'){ + p = g_utf8_next_char(p); + if(g_utf8_get_char(p) == '{'){ + p_begin = g_utf8_next_char(p); + /* to find the matching close bracket */ + int depth = 1; + for(; *p; p = g_utf8_next_char(p)){ + if(g_utf8_get_char(p) == '{') + depth++; + else if(g_utf8_get_char(p) == '}'){ + depth--; + if(depth == 0){ + p_end = p; + /* put the string beginning from p_begin to p_end to output */ + gsf_output_write(output, p_end - p_begin, p_begin); + return p; + } + } + } + } + } + } + return p_orig; +} + +/** + * latex_raw_latin : + * @p : a pointer to a char, start of the string to be processed + * @output : output stream where the processed characters are written. + * + * This determinate the mode of the string. + * If @p is in form of \L{foo}, the exact "foo" will be put into @output, without any esacaping. + * return the char pointer next to '}' of \L{foo} + * else return @p untouched; + */ +static const char* +latex_raw_latin(const char *p, GsfOutput *output) +{ + const char *p_begin, *p_end, *p_orig; + + p_orig = p; + if(*p++ == '\\'){ + if(*p++ == 'L'){ + if(*p++ == '{'){ + p_begin = p; + /* to find the matching close bracket */ + int depth = 1; + for(; *p; p++){ + if(*p == '{') + depth++; + else if(*p == '}'){ + depth--; + if(depth == 0){ + p_end = p; + /* put the string beginning from p_begin to p_end to output */ + gsf_output_write(output, p_end - p_begin, p_begin); + return p; + } + } + } + } + } + } + return p_orig; +} + +/** * latex_fputs_utf : * * @p : a pointer to a char, start of the string to be processed. @@ -144,9 +227,10 @@ static void latex_fputs_utf (char const *p, GsfOutput *output) { + const char *rlt; for (; *p; p = g_utf8_next_char (p)) { switch (g_utf8_get_char (p)) { - + /* These are the classic TeX symbols $ & % # _ { } (see Lamport, p.15) */ case '$': case '&': case '%': case '#': case '_': case '{': case '}': @@ -157,7 +241,11 @@ gsf_output_printf (output, "\\%c{ }", *p); break; case '\\': - gsf_output_puts (output, "$\\backslash$"); + rlt = latex_raw_utf(p, output); + if(rlt == p) + gsf_output_puts (output, "$\\backslash$"); + else + p = rlt; break; /* Are these available only in LaTeX through mathmode? */ case '>': case '<': @@ -185,6 +273,7 @@ static void latex_math_fputs_utf (char const *p, GsfOutput *output) { + const char *rlt; for (; *p; p = g_utf8_next_char (p)) { switch (g_utf8_get_char (p)) { @@ -197,9 +286,12 @@ gsf_output_printf (output, "\\%c{ }", *p); break; case '\\': - gsf_output_puts (output, "\\backslash"); + rlt = latex_raw_utf(p, output); + if(rlt == p) + gsf_output_puts (output, "$\\backslash$"); + else + p = rlt; break; - default: gsf_output_write (output, (g_utf8_next_char (p)) - p, p); @@ -222,6 +314,7 @@ { char * encoded_text = NULL; char * p; + const char * rlt; gsize bytes_read; gsize bytes_written; GError * error = NULL; @@ -249,7 +342,11 @@ gsf_output_printf (output, "\\%c{ }", *p); break; case '\\': - gsf_output_puts (output, "$\\backslash$"); + rlt = latex_raw_latin(p, output); + if(rlt == p) + gsf_output_puts (output, "$\\backslash$"); + else + p = rlt; break; /* Are these available only in LaTeX through mathmode? */ case '>': case '<': case 'ยต': @@ -279,6 +376,7 @@ { char * encoded_text = NULL; char * p; + const char * rlt; gsize bytes_read; gsize bytes_written; GError * error = NULL; @@ -305,7 +403,11 @@ gsf_output_printf (output, "\\%c{ }", *p); break; case '\\': - gsf_output_puts (output, "\\backslash"); + rlt = latex_raw_latin(p, output); + if(rlt == p) + gsf_output_puts (output, "$\\backslash$"); + else + p = rlt; break; default:
Attachment:
html.tgz
Description: GNU Unix tar archive