From a7f8fb8c5fe8f99b30e3d507dc20d455c65a4b27 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Wed, 28 Nov 2012 20:55:21 +0100 Subject: [PATCH] Provide option to force a local language switch where a global is not allowed (fixes #8033) --- lib/doc/Customization.lyx | 80 +++++++++++++++++++++++++++++++++++++- lib/layouts/stdinsets.inc | 1 + src/insets/InsetLayout.cpp | 7 +++- src/insets/InsetLayout.h | 4 ++ src/output_latex.cpp | 32 +++++++++------ 5 files changed, 109 insertions(+), 15 deletions(-) diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index 693e1e4b10..4e70704d7b 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -1,5 +1,5 @@ #LyX 2.1 created this file. For more info see http://www.lyx.org/ -\lyxformat 446 +\lyxformat 448 \begin_document \begin_header \textclass scrbook @@ -140,6 +140,7 @@ End \author -712698321 "Jürgen Spitzmüller" \author -195340706 "Georg Baum" \author 5863208 "ab" +\author 155139281 "Jrgen Spitzmller" \author 1082167584 "Kayvan Sylvan" kayvan@sylvan.com \author 1414654397 "Richard Heck" \author 2090807402 "usti" @@ -15960,6 +15961,81 @@ LabelFont \end_inset later if you want them to be different. +\change_inserted 155139281 1354130923 + +\end_layout + +\begin_layout Description + +\change_inserted 155139281 1354130923 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted 155139281 1354130923 +ForceLocalFontSwitch +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted 155139281 1354130923 + +\emph on +0 +\end_layout + +\end_inset + +, +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted 155139281 1354130923 +1 +\end_layout + +\end_inset + +] When using babel, always use a local font switch ( +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted 155139281 1354130923 + +\backslash +foreignlanguage +\end_layout + +\end_inset + +), never a global one (such as +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted 155139281 1354130923 + +\backslash +selectlanguage +\end_layout + +\end_inset + +). +\change_unchanged + \end_layout \begin_layout Description @@ -16670,7 +16746,7 @@ string \end_inset ] A string that is put at the beginning of the layout content. -\change_unchanged +\change_inserted 155139281 1354130509 \end_layout diff --git a/lib/layouts/stdinsets.inc b/lib/layouts/stdinsets.inc index 57543f25a7..322247485c 100644 --- a/lib/layouts/stdinsets.inc +++ b/lib/layouts/stdinsets.inc @@ -406,6 +406,7 @@ InsetLayout Argument Size Small EndFont MultiPar false + ForceLocalFontSwitch 1 End InsetLayout Info diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp index 1d7d1f0ee4..9c9c7f2fce 100644 --- a/src/insets/InsetLayout.cpp +++ b/src/insets/InsetLayout.cpp @@ -41,7 +41,7 @@ InsetLayout::InsetLayout() : passthru_(false), parbreakisnewline_(false), freespacing_(false), keepempty_(false), forceltr_(false), needprotect_(false), intoc_(false), spellcheck_(true), - resetsfont_(true), display_(true) + resetsfont_(true), display_(true), forcelocalfontswitch_(false) { labelfont_.setColor(Color_error); } @@ -87,6 +87,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass) IL_DECORATION, IL_DISPLAY, IL_FONT, + IL_FORCE_LOCAL_FONT_SWITCH, IL_FORCELTR, IL_FORCEPLAIN, IL_FREESPACING, @@ -135,6 +136,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass) { "display", IL_DISPLAY }, { "end", IL_END }, { "font", IL_FONT }, + { "forcelocalfontswitch", IL_FORCE_LOCAL_FONT_SWITCH }, { "forceltr", IL_FORCELTR }, { "forceplain", IL_FORCEPLAIN }, { "freespacing", IL_FREESPACING }, @@ -236,6 +238,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass) case IL_LEFTDELIM: lex >> leftdelim_; break; + case IL_FORCE_LOCAL_FONT_SWITCH: + lex >> forcelocalfontswitch_; + break; case IL_RIGHTDELIM: lex >> rightdelim_; break; diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h index 7ae505ae75..25e58c9ec7 100644 --- a/src/insets/InsetLayout.h +++ b/src/insets/InsetLayout.h @@ -162,6 +162,8 @@ public: bool resetsFont() const { return resetsfont_; } /// bool isDisplay() const { return display_; } + /// + bool forcelocalfontswitch() const { return forcelocalfontswitch_; } private: /// void makeDefaultCSS() const; @@ -263,6 +265,8 @@ private: /// bool display_; /// + bool forcelocalfontswitch_; + /// Layout::LaTeXArgMap latexargs_; }; diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 551a2496bd..6785c2749e 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -551,10 +551,21 @@ void TeXOnePar(Buffer const & buf, getPolyglossiaEnvName(doc_language) : doc_language->babel(); string const outer_lang = use_polyglossia ? getPolyglossiaEnvName(outer_language) : outer_language->babel(); - string const lang_begin_command = use_polyglossia ? + string lang_begin_command = use_polyglossia ? "\\begin{$$lang}" : lyxrc.language_command_begin; - string const lang_end_command = use_polyglossia ? + string lang_end_command = use_polyglossia ? "\\end{$$lang}" : lyxrc.language_command_end; + // the '%' is necessary to prevent unwanted whitespace + string lang_command_termination = "%\n"; + + // In some insets (such as Arguments), we cannot use \selectlanguage + bool const localswitch = !use_polyglossia + && text.inset().getLayout().forcelocalfontswitch(); + if (localswitch) { + lang_begin_command = lyxrc.language_command_local; + lang_end_command = "}"; + lang_command_termination.clear(); + } if (par_lang != prev_lang // check if we already put language command in TeXEnvironment() @@ -570,8 +581,7 @@ void TeXOnePar(Buffer const & buf, os << from_ascii(subst(lang_end_command, "$$lang", prev_lang)) - // the '%' is necessary to prevent unwanted whitespace - << "%\n"; + << lang_command_termination; } // We need to open a new language if we couldn't close the previous @@ -629,8 +639,7 @@ void TeXOnePar(Buffer const & buf, os << "[" << from_ascii(par_language->polyglossiaOpts()) << "]"; - // the '%' is necessary to prevent unwanted whitespace - os << "%\n"; + os << lang_command_termination; } } } @@ -686,8 +695,7 @@ void TeXOnePar(Buffer const & buf, lang_begin_command, "$$lang", par_lang)) - // the '%' is necessary to prevent unwanted whitespace - << "%\n"; + << lang_command_termination; } runparams.encoding = encoding; } @@ -830,16 +838,16 @@ void TeXOnePar(Buffer const & buf, lang_begin_command, "$$lang", current_lang)); - pending_newline = true; - unskip_newline = true; + pending_newline = !localswitch; + unskip_newline = !localswitch; } } else if (!par_lang.empty()) { os << from_ascii(subst( lang_end_command, "$$lang", par_lang)); - pending_newline = true; - unskip_newline = true; + pending_newline = !localswitch; + unskip_newline = !localswitch; } } } -- 2.39.2