[LyX/master] Output main definitions of theorem names before their use (#133ß7)
Juergen Spitzmueller
spitz at lyx.org
Sat May 2 11:12:04 UTC 2026
commit c63386e7c24a60129b2ea5b2b79c52717a05f711
Author: Juergen Spitzmueller <spitz at lyx.org>
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_;
More information about the lyx-cvs
mailing list