[LyX/master] Output main definitions of theorem names before their use (#133ß7)

Juergen Spitzmueller <[email protected]> Sat, 02 May 2026 11:12:04 +0000
Newsgroups gmane.editors.lyx.cvs
Message-ID <[email protected]>
commit c63386e7c24a60129b2ea5b2b79c52717a05f711
Author: Juergen Spitzmueller <[email protected]>
Date:   Sat May 2 13:10:13 2026 +0200

    Output main definitions of theorem names before their use (#133ß7)
    
    pandoc cannot deal with the oder we had
---
 src/BufferParams.cpp  |   2 +-
 src/LaTeXFeatures.cpp | 101 ++++++++++++++++++++++++++++++++------------------
 src/LaTeXFeatures.h   |   7 +++-
 3 files changed, 72 insertions(+), 38 deletions(-)

diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index f7a0c50c43..fecee6f225 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -2948,7 +2948,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
 
 	// theorem definitions: Must be loaded after user preamble
 	// but before babel
-	os << features.getThmDefinitions();
+	os << features.getThmDefinitions(use_polyglossia);
 
 	// We try to load babel late, in case it interferes with other packages.
 	// Jurabib, hyperref, varioref, bicaption, menukeys and listings (bug 8995)
diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp
index 308951bd7d..8914b9fd2b 100644
--- a/src/LaTeXFeatures.cpp
+++ b/src/LaTeXFeatures.cpp
@@ -2067,10 +2067,22 @@ bool LaTeXFeatures::haveOtherForceProvide() const
 }
 
 
-string const LaTeXFeatures::getThmDefinitions() const
+string const LaTeXFeatures::getThmDefinitions(bool const use_polyglossia) const
 {
 	ostringstream tmp;
 
+	// language dependent commands need to be done here
+	// for theorems (#13307)
+	for (auto const & lay : usedLayouts_) {
+		Layout const layout = params_.documentClass()[lay];
+		if (layout.thmName().empty())
+			continue;
+		tmp << to_utf8(prepareI18nPreamble(layout.langpreamble(),
+						   buffer().language(),
+						   buffer().params().encoding(),
+						   use_polyglossia, false));
+	}
+
 	string laststyle;
 	for (auto const & thm : usedTheorems_) {
 		if (isProvided("newtheorem:" + thm.name))
@@ -2314,10 +2326,12 @@ docstring const getFloatI18nPreamble(docstring const & type,
 	return os.str();
 }
 
+} // namespace
+
 
-docstring const i18npreamble(docstring const & templ, Language const * lang,
-                             Encoding const & enc, bool const polyglossia,
-                             bool const need_fixedwidth)
+docstring const LaTeXFeatures::prepareI18nPreamble(docstring const & templ, Language const * lang,
+						   Encoding const & enc, bool const polyglossia,
+						   bool const need_fixedwidth) const
 {
 	if (templ.empty())
 		return templ;
@@ -2379,8 +2393,6 @@ docstring const i18npreamble(docstring const & templ, Language const * lang,
 	return from_utf8(preamble);
 }
 
-} // namespace
-
 
 docstring const LaTeXFeatures::getThmI18nDefs(Layout const & lay, bool const force) const
 {
@@ -2631,95 +2643,106 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel,
 	list<docstring>::const_iterator end = usedLayouts_.end();
 	for (; cit != end; ++cit) {
 		// language dependent commands (once per document)
-		snippets.insert(i18npreamble(tclass[*cit].langpreamble(),
-						buffer().language(),
-						buffer().params().encoding(),
-						use_polyglossia, false));
+		// theorems have been already done in getThmDefinitions()
+		if (tclass[*cit].thmName().empty()) {
+			snippets.insert(prepareI18nPreamble(tclass[*cit].langpreamble(),
+							    buffer().language(),
+							    buffer().params().encoding(),
+							    use_polyglossia, false));
+		}
 		docstring const cnt = (tclass[*cit].latextype == LATEX_ITEM_ENVIRONMENT)
 				? tclass[*cit].counter + from_ascii("i")
 				: tclass[*cit].counter;
-		snippets.insert(i18npreamble(getXRefDefs(tclass[*cit].refprefix, cnt,
 						         tclass[*cit].needCrossrefDefs(),
 							 tclass[*cit].latexname(),
 							 tclass[*cit].isEnvironment()),
 						buffer().language(),
 						buffer().params().encoding(),
 						use_polyglossia, false));
+		snippets.insert(prepareI18nPreamble(getXRefDefs(tclass[*cit].refprefix, cnt,
 		docstring xxref = getXRefI18nDefs(tclass[*cit].refprefix, cnt,
 						  !buffer().language()->supportedBy(xref_package));
 		if (!xxref.empty()) {
 			if (xref_package == "zref" && !buffer().language()->supportedBy(xref_package))
-				snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 							     buffer().language(),
 							     buffer().params().encoding(),
 							     use_polyglossia, false));
-			snippets.insert(i18npreamble(xxref,
 						     buffer().language(),
 						     buffer().params().encoding(),
 						     use_polyglossia, false));
+				snippets.insert(prepareI18nPreamble(
+							from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+			snippets.insert(prepareI18nPreamble(xxref,
 		}
 		docstring thmxref = getThmI18nDefs(tclass[*cit],
 						   !buffer().language()->supportedBy(xref_package));
 		if (!thmxref.empty()) {
 			if (xref_package == "zref" && !buffer().language()->supportedBy(xref_package))
-				snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 							     buffer().language(),
 							     buffer().params().encoding(),
 							     use_polyglossia, false));
-			snippets.insert(i18npreamble(thmxref,
 						     buffer().language(),
 						     buffer().params().encoding(),
 						     use_polyglossia, false));
+				snippets.insert(prepareI18nPreamble(
+							from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+			snippets.insert(prepareI18nPreamble(thmxref,
 		}
 		// commands for language changing (for multilanguage documents)
 		if ((use_babel || use_polyglossia) && !UsedLanguages_.empty()) {
-			snippets.insert(i18npreamble(
+			snippets.insert(prepareI18nPreamble(
 						tclass[*cit].babelpreamble(),
 						buffer().language(),
 						buffer().params().encoding(),
 						use_polyglossia, false));
 			if (!thmxref.empty() && xref_package != "zref")
-				snippets.insert(i18npreamble("\\addto\\captions$$lang{" + rtrim(thmxref, "\n") + "}\n",
 							     buffer().language(),
 							     buffer().params().encoding(),
 							     use_polyglossia, false));
+				snippets.insert(prepareI18nPreamble(
+							"\\addto\\captions$$lang{" + rtrim(thmxref, "\n") + "}\n",
 			if (!xxref.empty() && xref_package != "zref")
-				snippets.insert(i18npreamble("\\addto\\captions$$lang{" + rtrim(xxref, "\n") + "}\n",
 							     buffer().language(),
 							     buffer().params().encoding(),
 							     use_polyglossia, false));
+				snippets.insert(prepareI18nPreamble(
+							"\\addto\\captions$$lang{" + rtrim(xxref, "\n") + "}\n",
 			for (lang_it lit = lbeg; lit != lend; ++lit) {
 				thmxref = getThmI18nDefs(tclass[*cit],
 							 !(*lit)->supportedBy(xref_package));
 				if (!thmxref.empty()) {
 					if (xref_package == "zref" && !(*lit)->supportedBy(xref_package))
-						snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 									     *lit,
 									     buffer().params().encoding(),
 									     use_polyglossia, false));
-					snippets.insert(i18npreamble(xref_package == "zref" ?
 									     thmxref
 									   : "\\addto\\captions$$lang{" + rtrim(thmxref, "\n") + "}\n",
 								     *lit,
 								     buffer().params().encoding(),
 								     use_polyglossia, false));
+						snippets.insert(prepareI18nPreamble(
+									from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+					snippets.insert(prepareI18nPreamble(
+								xref_package == "zref" ?
 				}
 				xxref = getXRefI18nDefs(tclass[*cit].refprefix, cnt,
 							!(*lit)->supportedBy(xref_package));
 				if (!xxref.empty()) {
 					if (xref_package == "zref" && !(*lit)->supportedBy(xref_package))
-						snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 									     *lit,
 									     buffer().params().encoding(),
 									     use_polyglossia, false));
-					snippets.insert(i18npreamble(xref_package == "zref" ?
 								xxref
 							      : "\\addto\\captions$$lang{" + rtrim(xxref, "\n") + "}\n",
 							*lit,
 							buffer().params().encoding(),
 							use_polyglossia, false));
+						snippets.insert(prepareI18nPreamble(
+									from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+					snippets.insert(prepareI18nPreamble(
+								xref_package == "zref" ?
 				}
-				snippets.insert(i18npreamble(
+				snippets.insert(prepareI18nPreamble(
 						tclass[*cit].babelpreamble(),
 						*lit,
 						buffer().params().encoding(),
@@ -2740,20 +2763,21 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel,
 			getXRefI18nDefs(from_ascii(fl.refPrefix()), from_ascii(fl.floattype()),
 					!buffer().language()->supportedBy(xref_package));
 		if (!float_defs.empty())
-			snippets.insert(i18npreamble(float_defs,
 					buffer().language(),
 					buffer().params().encoding(),
 					use_polyglossia, false));
+			snippets.insert(prepareI18nPreamble(float_defs,
 		if (!floats_l7n_defs.empty() && floats_l7n_defs != float_defs) {
 			if (xref_package == "zref" && !buffer().language()->supportedBy(xref_package))
-				snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 							     buffer().language(),
 							     buffer().params().encoding(),
 							     use_polyglossia, false));
-			snippets.insert(i18npreamble(floats_l7n_defs,
 					buffer().language(),
 					buffer().params().encoding(),
 					use_polyglossia, false));
+				snippets.insert(prepareI18nPreamble(
+							from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+			snippets.insert(prepareI18nPreamble(floats_l7n_defs,
 		}
 		if (!UsedLanguages_.empty() && (use_babel || use_polyglossia)) {
 			docstring const type = from_ascii(fl.floattype());
@@ -2785,16 +2809,18 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel,
 								   !(*lit)->supportedBy(xref_package));
 				if (!floats_l7n_defs.empty()) {
 					if (xref_package == "zref" && !(*lit)->supportedBy(xref_package))
-						snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 									     *lit,
 									     buffer().params().encoding(),
 									     use_polyglossia, false));
-					snippets.insert(i18npreamble(xref_package == "zref" ?
 									     floats_l7n_defs
 									   : "\\addto\\captions$$lang{" + rtrim(floats_l7n_defs, "\n") + "}\n",
 								     *lit,
 								     buffer().params().encoding(),
 								     use_polyglossia, false));
+						snippets.insert(prepareI18nPreamble(
+									from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+					snippets.insert(prepareI18nPreamble(
+								xref_package == "zref" ?
 				}
 			}
 		}
@@ -2818,39 +2844,40 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel,
 		  			buffer().params().encoding().package() != Encoding::japanese &&
 					it->second.fixedwidthpreambleencoding();
 		// language dependent commands (once per document)
-		snippets.insert(i18npreamble(it->second.langpreamble(),
 						buffer().language(),
 						buffer().params().encoding(),
 						use_polyglossia, need_fixedwidth));
-		snippets.insert(i18npreamble(getXRefDefs(it->second.refprefix(), it->second.counter(),
 							 it->second.needCrossrefDefs(),
 							 it->second.latexname(),
 							 it->second.latextype() == InsetLaTeXType::ENVIRONMENT),
 						buffer().language(),
 						buffer().params().encoding(),
 						use_polyglossia, false));
+		snippets.insert(prepareI18nPreamble(it->second.langpreamble(),
+		snippets.insert(prepareI18nPreamble(getXRefDefs(it->second.refprefix(), it->second.counter(),
 		docstring xxref = getXRefI18nDefs(it->second.refprefix(), it->second.counter(),
 						   !buffer().language()->supportedBy(xref_package));
 		if (!xxref.empty()) {
 			if (xref_package == "zref" && !buffer().language()->supportedBy(xref_package))
-				snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 							     buffer().language(),
 							     buffer().params().encoding(),
 							     use_polyglossia, false));
-			snippets.insert(i18npreamble(xxref,
 						     buffer().language(),
 						     buffer().params().encoding(),
 						     use_polyglossia, false));
+				snippets.insert(prepareI18nPreamble(
+							from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+			snippets.insert(prepareI18nPreamble(xxref,
 		}
 		// commands for language changing (for multilanguage documents)
 		if ((use_babel || use_polyglossia) && !UsedLanguages_.empty()) {
-			snippets.insert(i18npreamble(
+			snippets.insert(prepareI18nPreamble(
 						it->second.babelpreamble(),
 						buffer().language(),
 						buffer().params().encoding(),
 						use_polyglossia, need_fixedwidth));
 			for (lang_it lit = lbeg; lit != lend; ++lit) {
-				snippets.insert(i18npreamble(
+				snippets.insert(prepareI18nPreamble(
 						it->second.babelpreamble(),
 						*lit,
 						buffer().params().encoding(),
@@ -2859,16 +2886,18 @@ docstring const LaTeXFeatures::getTClassI18nPreamble(bool use_babel,
 							!(*lit)->supportedBy(xref_package));
 				if (!xxref.empty()) {
 					if (xref_package == "zref" && !(*lit)->supportedBy(xref_package))
-						snippets.insert(i18npreamble(from_ascii("\\zcDeclareLanguage{$$lang}\n"),
 									     *lit,
 									     buffer().params().encoding(),
 									     use_polyglossia, false));
-					snippets.insert(i18npreamble(xref_package == "zref" ?
 									     xxref
 									   : "\\addto\\captions$$lang{" + rtrim(xxref, "\n") + "}\n",
 							*lit,
 							buffer().params().encoding(),
 							use_polyglossia, false));
+						snippets.insert(prepareI18nPreamble(
+									from_ascii("\\zcDeclareLanguage{$$lang}\n"),
+					snippets.insert(prepareI18nPreamble(
+								xref_package == "zref" ?
 				}
 			}
 		}
diff --git a/src/LaTeXFeatures.h b/src/LaTeXFeatures.h
index ccba1cdfae..91505a5933 100644
--- a/src/LaTeXFeatures.h
+++ b/src/LaTeXFeatures.h
@@ -25,6 +25,7 @@ namespace lyx {
 
 class Buffer;
 class BufferParams;
+class Encoding;
 class Floating;
 class InsetLayout;
 class Language;
@@ -83,7 +84,7 @@ public:
 	/// Extra preamble code after babel is called
 	docstring const getBabelPostsettings() const;
 	/// get theorem definitions
-	std::string const getThmDefinitions() const;
+	std::string const getThmDefinitions(bool const use_polyglossia) const;
 	/// get theorem extra (package specific) definitions
 	std::string const getThmExtraDefinitions() const;
 	/// Load AMS packages when appropriate
@@ -239,6 +240,10 @@ private:
 	///
 	bool refPrefixUsed(docstring const & pr) const;
 	///
+	docstring const prepareI18nPreamble(docstring const & templ, Language const * lang,
+					    Encoding const & enc, bool const polyglossia,
+					    bool const need_fixedwidth) const;
+	///
 	std::list<docstring> usedLayouts_;
 	///
 	std::list<docstring> usedInsetLayouts_;
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs