commit 34cadc8b6eca9095febc6b47a03d7f71afbac6f5
Author: Juergen Spitzmueller <sp...@lyx.org>
Date: Sun Apr 27 16:19:32 2025 +0200
Support formatted references to theorems via refstyle (#8535)
These are not provided by the package, so we create those
definitions on the fly when needed.
---
src/LaTeXFeatures.cpp | 56 ++++++++++++++++++++++++++++++++++++------------
src/LaTeXFeatures.h | 1 +
src/insets/InsetRef.cpp | 2 ++
src/support/lstrings.cpp | 9 ++++++++
src/support/lstrings.h | 3 +++
5 files changed, 57 insertions(+), 14 deletions(-)
diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp
index cfa06f747a..072b4a10a1 100644
--- a/src/LaTeXFeatures.cpp
+++ b/src/LaTeXFeatures.cpp
@@ -477,17 +477,6 @@ static docstring const smallLetterFrac_def = from_ascii(
" {phantom=c, scale-factor=1.0, slash-left-kern=-.05em}\n"
"\\NewCommandCopy\\smallLetterFrac\\sfrac\n");
-static docstring const lyxref_def = from_ascii(
- "\\RS@ifundefined{subsecref}\n"
- " {\\newref{subsec}{name = \\RSsectxt}}\n"
- " {}\n"
- "\\RS@ifundefined{thmref}\n"
- " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n"
- " {}\n"
- "\\RS@ifundefined{lemref}\n"
- " {\\def\\RSlemtxt{lemma~}\\newref{lem}{name = \\RSlemtxt}}\n"
- " {}\n");
-
// Make sure the columns are also outputed as rtl
static docstring const rtloutputdblcol_def = from_ascii(
"\\def\\@outputdblcol{%\n"
@@ -712,6 +701,7 @@ void LaTeXFeatures::useLayout(docstring const & layoutname,
int level)
thm.parent_counter = layout.thmParentCounter();
thm.style = layout.thmStyle();
thm.zrefname = layout.thmZRefName();
+ thm.refprefix = to_ascii(layout.refprefix);
usedTheorems_.push_back(thm);
require("amsthm");
}
@@ -1809,8 +1799,23 @@ TexString LaTeXFeatures::getMacros() const
// floats
getFloatDefinitions(macros);
- if (mustProvide("refstyle"))
- macros << lyxref_def << '\n';
+ if (mustProvide("refstyle:subsecref")) {
+ // this is not provided by the package, but we use the prefix
+ // the definition is a copy of secref
+ macros << "\\RS@ifundefined{subsecref}{\n"
+ << " \\newref{subsec}{\n"
+ << " name = \\RSsectxt,\n"
+ << " names = \\RSsecstxt,\n"
+ << " Name = \\RSSectxt,\n"
+ << " Names = \\RSSecstxt,\n"
+ << " refcmd = {\\S\\ref{#1}},\n"
+ << " rngtxt = \\RSrngtxt,\n"
+ << " lsttwotxt = \\RSlsttwotxt,\n"
+ << " lsttxt = \\RSlsttxt\n"
+ << " }\n"
+ << "}{}\n"
+ << '\n';
+ }
// change tracking
if (mustProvide("ct-xcolor-ulem")) {
@@ -1974,7 +1979,7 @@ string const LaTeXFeatures::getThmDefinitions() const
}
}
}
- // or cleveref
+ // cleveref
else if (thm.counter != "none" && !thm.counter.empty() &&
params_.xref_package == "cleveref") {
if (isAvailableAtLeastFrom("LaTeX", 2020, 10))
// we have hooks
@@ -1987,6 +1992,19 @@ string const LaTeXFeatures::getThmDefinitions() const
<< "\\lyxsave" << thm.name << "}\n";
}
}
+ // and refstyle
+ else if (params_.xref_package == "refstyle") {
+ tmp << "\\newref{" << thm.refprefix << "}{\n"
+ << " name = \\RS" << thm.name <<
"txt,\n"
+ << " names = \\RS" << thm.name <<
"stxt,\n"
+ << " Name = \\RS" << capitalize(thm.name) <<
"txt,\n"
+ << " Names = \\RS" << capitalize(thm.name) <<
"stxt,\n"
+ << " rngtxt = \\RSrngtxt,\n"
+ << " lsttwotxt = \\RSlsttwotxt,\n"
+ << " lsttxt = \\RSlsttxt\n"
+ << "}\n"
+ << '\n';
+ }
}
return tmp.str();
@@ -2220,6 +2238,16 @@ docstring const LaTeXFeatures::getThmI18nDefs(Layout const
& lay) const
<< "name-pl = _(" << lowercase(tnp) << ")"
<< "}\n";
return ods.str();
+ } else if (params_.xref_package == "refstyle" &&
!lay.thmXRefName().empty()) {
+ docstring const tn = from_utf8(lay.thmXRefName());
+ docstring const tnp = from_utf8(lay.thmXRefNamePl());
+ odocstringstream ods;
+ docstring const thmname = from_utf8(lay.thmName());
+ ods << "\\def\\RS" << thmname << "txt{_(" << lowercase(tn) <<
")~}\n"
+ << "\\def\\RS" << thmname << "stxt{_(" << lowercase(tnp) <<
")~}\n"
+ << "\\def\\RS" << capitalize(thmname) << "txt{_(" << tn <<
")~}\n"
+ << "\\def\\RS" << capitalize(thmname) << "stxt{_(" << tnp <<
")~}\n";
+ return ods.str();
}
return docstring();
}
diff --git a/src/LaTeXFeatures.h b/src/LaTeXFeatures.h
index 4a1c593b95..55cb1b5ac1 100644
--- a/src/LaTeXFeatures.h
+++ b/src/LaTeXFeatures.h
@@ -40,6 +40,7 @@ struct ThmInfo {
std::string parent_counter;
std::string style;
std::string zrefname;
+ std::string refprefix;
};
diff --git a/src/insets/InsetRef.cpp b/src/insets/InsetRef.cpp
index 055aca8174..77db418ae4 100644
--- a/src/insets/InsetRef.cpp
+++ b/src/insets/InsetRef.cpp
@@ -891,6 +891,8 @@ void InsetRef::validate(LaTeXFeatures & features) const
features.require("refstyle");
if (prefix == "cha")
features.addPreambleSnippet(from_ascii("\\let\\charef=\\chapref"));
+ else if (prefix == "subsec")
+ features.require("refstyle:subsecref");
else if (!prefix.empty()) {
docstring lcmd =
"\\AtBeginDocument{\\providecommand" +
fcmd + "[1]{\\ref{" + prefix +
":#1}}}";
diff --git a/src/support/lstrings.cpp b/src/support/lstrings.cpp
index 6cc99ad176..e26955dfb8 100644
--- a/src/support/lstrings.cpp
+++ b/src/support/lstrings.cpp
@@ -550,6 +550,15 @@ docstring const uppercase(docstring const & a)
}
+string capitalize(string const & s)
+{
+ string ret = s;
+ char t = uppercase(ret[0]);
+ ret[0] = t;
+ return ret;
+}
+
+
docstring capitalize(docstring const & s) {
docstring ret = s;
char_type t = uppercase(ret[0]);
diff --git a/src/support/lstrings.h b/src/support/lstrings.h
index 715d9b0b02..07888c6b3a 100644
--- a/src/support/lstrings.h
+++ b/src/support/lstrings.h
@@ -181,6 +181,9 @@ docstring const token(docstring const & a, char_type delim,
int n);
int tokenPos(std::string const & a, char delim, std::string const & tok);
int tokenPos(docstring const & a, char_type delim, docstring const & tok);
+///
+std::string capitalize(std::string const & s);
+
///
docstring capitalize(docstring const & s);