José Matos wrote:
On Wednesday 18 July 2007 22:35:52 Dov Feldstern wrote:
Jose --- can I commit the patch itself, along with these additions?

  Without the placeholder for the file format yes.

Committed (finally :) ) as r19150, without the placeholder format.

I made some changes to this since the last version I sent in. One of them was to deal with other RTL languages (I had had a FIXME in the previous version, so now I fixed it); and the other was an encoding fix which I discovered while working on the adaptations to ArabTeX. The changes relative to the last version are attached (but they've been committed already along with the rest of the patch).

Regarding Arabic(Arabi) and Farsi: I'm not sure what the correct way to deal with this is. I don't have a working setup of arabi, so I couldn't test. The question is whether or not the "local" language switches are sophisticated enough to deal with multi-paragraph insets inside them: \L and \R in ivritex are; apparently ArabTeX's commands are not. So if this patch is causing trouble for Farsi/Arabic (Arabi), it should be easy to fix as needed, just let me know. (If you're not sure what you should be testing, ask me that, too.)

Jose --- I wasn't sure if you were ready to commit your release notes or not, so I didn't include them in my patch.

Everyone: if you use only one language, this patch shouldn't affect you at all. If you do use multiple languages, it should only affect you for the better. Let me know if there are any problems which you think may be related (encoding issues / wrong LaTeX output, especially around insets).

Dov
Index: lyx-devel/RELEASE-NOTES
===================================================================
--- lyx-devel.orig/RELEASE-NOTES        2007-07-20 03:47:00.000000000 +0300
+++ lyx-devel/RELEASE-NOTES     2007-07-20 03:47:27.000000000 +0300
@@ -35,6 +35,22 @@
 same document, the cursor position is sometimes not correctly restored
 when you switch from one view to the other.
 
+- Languages/encodings and insets
+
+One of the bugs fixed in LyX 1.5.0 is that previously, there were certain 
+specific cases in which the LaTeX generated did not correctly reflect 
+language/encoding transitions in and around insets (footnotes, LyX notes).
+After much deliberation, it was decided not to change older files such that
+they will still reflect the old LaTeX output; rather, they will now correctly
+reflect the situation as it appears in the GUI. This means, however, that if 
+you mangled the text in the GUI in the older versions, in order that it
+generate the correct LaTeX output, the LaTeX will now generate the mangled 
+text. If this is problematic for you, please get in touch with us on the
+developers mailing list, we do have some possible solutions for this.
+
+The effects of this will be more pronounced for RTL (Hebrew, Arabic, Farsi) 
+users --- though they affect users of other languages as well.
+
 
 Note: There may later be an updated list of known issues online at
        http://wiki.lyx.org/LyX/ReleaseNotes
Index: lyx-devel/src/Paragraph.cpp
===================================================================
--- lyx-devel.orig/src/Paragraph.cpp    2007-07-20 03:47:27.000000000 +0300
+++ lyx-devel/src/Paragraph.cpp 2007-07-20 03:52:10.000000000 +0300
@@ -756,9 +756,12 @@
                // However, even such insets *can* be placed in \L or \R
                // or their equivalents (for RTL language switches), so we don't
                // close the language in those cases.
+               // ArabTeX, though, cannot handle this special behavior, it 
seems.
+               bool arabtex = basefont.language()->lang() == "arabic_arabtex" 
||
+                                          running_font.language()->lang() == 
"arabic_arabtex";
                if (open_font && inset->noFontChange()) {
-                       bool closeLanguage = 
-                               (basefont.isRightToLeft() == 
running_font.isRightToLeft());
+                       bool closeLanguage = arabtex ||
+                               basefont.isRightToLeft() == 
running_font.isRightToLeft();
                        unsigned int count = running_font.latexWriteEndChanges(
                                        os, bparams, runparams,
                                                basefont, basefont, 
closeLanguage);
@@ -2138,6 +2141,10 @@
                                        texrow, rp, running_font,
                                        basefont, outerfont, open_font,
                                        runningChange, *style, i, column, c);
+
+               // Set the encoding to that returned from simpleTeXSpecialChars 
(see
+               // comment for encoding member in OutputParams.h)
+               runparams.encoding = rp.encoding;
        }
 
        // If we have an open font definition, we have to close it
Index: lyx-devel/src/output_latex.cpp
===================================================================
--- lyx-devel.orig/src/output_latex.cpp 2007-07-20 03:47:27.000000000 +0300
+++ lyx-devel/src/output_latex.cpp      2007-07-20 03:47:27.000000000 +0300
@@ -306,7 +306,10 @@
                        // (or equivalents), then within the inset, too, any 
opposite
                        // language paragraph should appear within an \L or \R 
(in addition
                        // to, outside of, the normal language switch commands).
-                       if (lyxrc.rtl_support &&
+                       // This behavior is not correct for ArabTeX, though.
+                       if (    // not for ArabTeX
+                                       (par_language->lang() != 
"arabic_arabtex" &&
+                                        outer_language->lang() != 
"arabic_arabtex") &&
                                        // are we in an inset?
                                        runparams.local_font != 0 &&
                                        // is the inset within an \L or \R?
@@ -317,10 +320,21 @@
                                        // 
                                        // is this paragraph in the opposite 
direction?
                                        runparams.local_font->isRightToLeft() !=
-                                               par_language->rightToLeft()) {
-                               // FIXME: instead of \\R, \\L, use correct 
form, depending 
-                               // on the language (arabic, farsi, etc.)
-                               if (par_language->rightToLeft())
+                                               par_language->rightToLeft()
+                               ) {
+                               // FIXME: I don't have a working copy of the 
Arabi package, so
+                               // I'm not sure if the farsi and arabic_arabi 
stuff is correct
+                               // or not...
+                               if (par_language->lang() == "farsi")
+                                       os << "\\textFR{";
+                               else if (outer_language->lang() == "farsi")
+                                       os << "\\textLR{";
+                               else if (par_language->lang() == "arabic_arabi")
+                                       os << "\\textAR{";
+                               else if (outer_language->lang() == 
"arabic_arabi")
+                                       os << "\\textLR{";
+                               // remaining RTL languages currently is hebrew
+                               else if (par_language->rightToLeft())
                                        os << "\\R{";
                                else
                                        os << "\\L{";
@@ -498,7 +512,9 @@
        // needed if we're within an \L or \R that we may have opened above (not
        // necessarily in this paragraph) and are about to close.
        bool closing_rtl_ltr_environment = 
-               lyxrc.rtl_support && 
+               // not for ArabTeX
+               (par_language->lang() != "arabic_arabtex" &&
+                outer_language->lang() != "arabic_arabtex") &&
                // have we opened and \L or \R environment?
                runparams.local_font != 0 &&
                runparams.local_font->isRightToLeft() != 
par_language->rightToLeft() &&
@@ -548,9 +564,13 @@
        // encoding. We don't use switchEncoding(), because no explicit encoding
        // switch command is needed, since latex will automatically revert to it
        // when this inset closes.
+       // This switch is only necessary if we're using "auto" or "default" 
+       // encoding. 
        if (boost::next(pit) == paragraphs.end() && runparams_in.local_font != 
0) {
                runparams_in.encoding = 
runparams_in.local_font->language()->encoding();
-               os << setEncoding(runparams_in.encoding->iconvName());
+               if (bparams.inputenc == "auto" || bparams.inputenc == "default")
+                       os << setEncoding(runparams_in.encoding->iconvName());
+
        }
        // Otherwise, the current encoding should be set for the next paragraph.
        else

Reply via email to