From ae1e1cb06936ee744dfcf39e5cbb776f9c86cc4c Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 21 Jul 2024 17:59:34 +0200 Subject: [PATCH] Add possibility to manually specify longest label in nomenclature File format change --- development/FORMAT | 14 ++++++- lib/doc/UserGuide.lyx | 63 +++++++++++++++++++++++++++- lib/doc/de/UserGuide.lyx | 38 ++++++++++++++++- lib/lyx2lyx/lyx_2_5.py | 43 ++++++++++++++++++- src/frontends/qt/GuiPrintNomencl.cpp | 36 +++++++++++----- src/insets/InsetNomencl.cpp | 8 ++-- src/tex2lyx/text.cpp | 32 ++++++++++---- src/version.h | 4 +- 8 files changed, 210 insertions(+), 28 deletions(-) diff --git a/development/FORMAT b/development/FORMAT index 34149fee02..a8617da9ca 100644 --- a/development/FORMAT +++ b/development/FORMAT @@ -7,9 +7,21 @@ changes happened in particular if possible. A good example would be ----------------------- +2024-07-21 Jürgen Spitzmüller + * Format incremented to 626: Support for manuel longest label in + \printnomencl (via new param option set_width "textwidth"). + In LaTeX, this will be output as + \settowidth{\nomlabelwidth}{} + before \printnomencl, which we will revert to ERT. + +2024-07-11 Jürgen Spitzmüller + * Format incremented to 625: Support for \nptextcite (biblatex-apa) + and \autocite*/\Autocite* (biblatex-mla). + We will revert new commands to ERT where necessary. + 2024-07-09 Jürgen Spitzmüller * Format incremented to 624: Add biblatex-chicago cite engine. - We will revert new commands to ERT where necessary + We will revert new commands to ERT where necessary. 2024-06-11 Udi Fogiel * Format incremented to 623: Remove hebrew letter document class. diff --git a/lib/doc/UserGuide.lyx b/lib/doc/UserGuide.lyx index 1bddb09500..1284d6bd0e 100644 --- a/lib/doc/UserGuide.lyx +++ b/lib/doc/UserGuide.lyx @@ -34065,11 +34065,15 @@ status open \change_inserted -712698321 1720530576 biblatex-chicago +\change_unchanged + \end_layout \end_inset +\change_unchanged + \end_layout \end_inset @@ -34088,6 +34092,8 @@ status collapsed \change_inserted -712698321 1720530576 authordate +\change_unchanged + \end_layout \end_inset @@ -34100,6 +34106,8 @@ status collapsed \change_inserted -712698321 1720530576 notes-bibliography +\change_unchanged + \end_layout \end_inset @@ -37390,7 +37398,60 @@ label \begin_inset space ~ \end_inset -width the width of the widest symbol of all nomenclature entries is used +width +\change_inserted -712698321 1721576787 + +\begin_inset space ~ +\end_inset + +(guessed) +\change_unchanged + +\change_inserted -712698321 1721576880 +\SpecialChar LyX + tries to guess the +\change_deleted -712698321 1721576836 +the width of the +\change_unchanged +widest symbol of all nomenclature entries +\change_deleted -712698321 1721576839 +is +\change_inserted -712698321 1721576839 +and +\change_unchanged + use +\change_inserted -712698321 1721576845 + this. +\change_deleted -712698321 1721576844 +d +\change_inserted -712698321 1721576994 + Note that this guessing might go wrong, + as \SpecialChar LyX + does not know how how the formatted output in your PDF will look like exactly. +\change_unchanged + +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1721577537 +Longest +\begin_inset space ~ +\end_inset + +label +\begin_inset space ~ +\end_inset + +width +\begin_inset space ~ +\end_inset + +(set) here you can enter the widest symbol yourself to use its width. + While this is more accurate than the second method, + the disadvantage is that you need to keep this up-to date if new (longer) entries are added to the nomenclature. +\change_unchanged + \end_layout \begin_layout Description diff --git a/lib/doc/de/UserGuide.lyx b/lib/doc/de/UserGuide.lyx index da99830808..bcaa112677 100644 --- a/lib/doc/de/UserGuide.lyx +++ b/lib/doc/de/UserGuide.lyx @@ -36707,7 +36707,43 @@ längsten \begin_inset space ~ \end_inset -Marke die Breite des breitesten Symbols aller Nomenklatureinträge wird verwendet +Marke +\begin_inset space ~ +\end_inset + +(geschätzt) \SpecialChar LyX + versucht zu schätzen, + welches das breiteste Symbol aller Nomenklatureinträge ist und verwendet dessen Breite. + Beachten Sie, + dass diese Schätzung falsch sein kann, + da \SpecialChar LyX + nicht genau weiß, + wie Ihr Text in der Ausgabe formatiert sein wird. +\end_layout + +\begin_layout Description +Breite +\begin_inset space ~ +\end_inset + +der +\begin_inset space ~ +\end_inset + +längsten +\begin_inset space ~ +\end_inset + +Marke +\begin_inset space ~ +\end_inset + +(gesetzt) Hier können Sie selbst das breiteste Symbol angeben, + dessen Breite dann verwendet wird. + Das ist zuverlässiger als die zweite Methode. + Der Nachteil allerdings ist, + dass Sie dies selbst aktualisieren müssen, + wenn neue (längere) Einträge hinzukommen. \end_layout \begin_layout Description diff --git a/lib/lyx2lyx/lyx_2_5.py b/lib/lyx2lyx/lyx_2_5.py index e76bed5d37..2afba6e813 100644 --- a/lib/lyx2lyx/lyx_2_5.py +++ b/lib/lyx2lyx/lyx_2_5.py @@ -31,13 +31,14 @@ from lyx2lyx_tools import ( ) # Uncomment only what you need to import, please (parser_tools): -# check_token, count_pars_in_inset, del_complete_lines, del_token, +# check_token, count_pars_in_inset, del_complete_lines, # del_value, find_complete_lines, find_end_of, find_end_of_layout, # find_re, find_substring, find_token_backwards, find_token_exact, # find_tokens, get_bool_value, get_containing_inset, # get_containing_layout, get_option_value, # is_in_inset, set_bool_value from parser_tools import ( + del_token, find_end_of_inset, find_re, find_token, @@ -442,6 +443,42 @@ def revert_nptextcite(document): document.body[i : j + 1] = put_cmd_in_ert([res]) i = j + 1 + +def revert_nomencl_textwidth(document): + """Revert nomencl textwidth parameter to ERT.""" + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset CommandInset nomencl_print", i) + if i == -1: + return + + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning( + "Malformed LyX document: Can't find end of command inset at line %d" % i + ) + i += 1 + continue + + sw = get_quoted_value(document.body, "set_width", i, j) + if sw != "textwidth": + i += 1 + continue + + # change set_width to "none" + k = find_token(document.body, "set_width", i, j) + if k != -1: + document.body[k] = "set_width \"none\"" + tw = get_quoted_value(document.body, "width", i, j) + # delete width + del_token(document.body, "width", i, j) + # Insert ERT + res = "\\settowidth{\\nomlabelwidth}{" + tw + "}" + document.body[i : i] = put_cmd_in_ert([res]) + i = j + + ## # Conversion hub # @@ -452,11 +489,13 @@ convert = [ [622, []], [623, [convert_he_letter]], [624, [convert_biblatex_chicago]], - [625, []] + [625, []], + [626, []] ] revert = [ + [625, [revert_nomencl_textwidth]], [624, [revert_nptextcite]], [623, [revert_biblatex_chicago]], [622, []], diff --git a/src/frontends/qt/GuiPrintNomencl.cpp b/src/frontends/qt/GuiPrintNomencl.cpp index a70a9e091c..6533f89a4d 100644 --- a/src/frontends/qt/GuiPrintNomencl.cpp +++ b/src/frontends/qt/GuiPrintNomencl.cpp @@ -46,8 +46,10 @@ GuiPrintNomencl::GuiPrintNomencl(QWidget * parent) : InsetParamsWidget(parent) setWidthCO->addItem(qt_("Default"), QVariant(toqstr("none"))); - setWidthCO->addItem(qt_("Longest label width"), + setWidthCO->addItem(qt_("Longest label width (guessed)"), QVariant(toqstr("auto"))); + setWidthCO->addItem(qt_("Longest label width (set)"), + QVariant(toqstr("textwidth"))); setWidthCO->addItem(qt_("Custom"), QVariant(toqstr("custom"))); } @@ -61,11 +63,15 @@ void GuiPrintNomencl::on_setWidthCO_activated(int /*i*/) void GuiPrintNomencl::paramsToDialog(InsetCommandParams const & params) { - setWidthCO->setCurrentIndex( - setWidthCO->findData(toqstr(params["set_width"]))); + QString const set_width = toqstr(params["set_width"]); - lengthToWidgets(valueLE, unitLC, - params["width"], Length::defaultUnit()); + setWidthCO->setCurrentIndex(setWidthCO->findData(set_width)); + + if (set_width == "textwidth") + valueLE->setText(toqstr(params["width"])); + else + lengthToWidgets(valueLE, unitLC, + params["width"], Length::defaultUnit()); } @@ -85,6 +91,8 @@ docstring GuiPrintNomencl::dialogToParams() const docstring width; if (set_width == from_ascii("custom")) width = from_utf8(widgetsToLength(valueLE, unitLC)); + else if (set_width == from_ascii("textwidth")) + width = qstring_to_ucs4(valueLE->text()); params["width"] = width; return from_ascii(InsetNomencl::params2string(params)); } @@ -92,23 +100,29 @@ docstring GuiPrintNomencl::dialogToParams() const bool GuiPrintNomencl::checkWidgets(bool readonly) const { + QString const set_width = + setWidthCO->itemData(setWidthCO->currentIndex()).toString(); + bool const custom = (set_width == "custom"); + bool const textwidth = (set_width == "textwidth"); valueLE->setReadOnly(readonly); if (readonly) { setWidthCO->setEnabled(false); unitLC->setEnabled(false); valueLA->setEnabled(false); } else { - bool const custom = - (setWidthCO->itemData(setWidthCO->currentIndex()).toString() == "custom"); - valueLE->setEnabled(custom); + valueLE->setEnabled(custom || textwidth); unitLC->setEnabled(custom); - valueLA->setEnabled(custom); + valueLA->setEnabled(custom || textwidth); } + if (textwidth) + // opt-out validator + valueLE->setValidator(nullptr); + else + valueLE->setValidator(unsignedLengthValidator(valueLE)); if (!InsetParamsWidget::checkWidgets()) return false; - return setWidthCO->itemData( - setWidthCO->currentIndex()).toString() != "custom" + return (!custom && !textwidth) || !valueLE->text().isEmpty(); } diff --git a/src/insets/InsetNomencl.cpp b/src/insets/InsetNomencl.cpp index da628442cd..9762f8bae9 100644 --- a/src/insets/InsetNomencl.cpp +++ b/src/insets/InsetNomencl.cpp @@ -153,7 +153,7 @@ ParamInfo const & InsetPrintNomencl::findInfo(string const & /* cmdName */) static ParamInfo param_info_; if (param_info_.empty()) { // how is the width set? - // values: none|auto|custom + // values: none|auto|custom|textwidth param_info_.add("set_width", ParamInfo::LYX_INTERNAL); // custom width param_info_.add("width", ParamInfo::LYX_INTERNAL); @@ -424,8 +424,10 @@ docstring nomenclWidest(Buffer const & buffer, OutputParams const & runparams) void InsetPrintNomencl::latex(otexstream & os, OutputParams const & runparams_in) const { OutputParams runparams = runparams_in; - if (getParam("set_width") == "auto") { - docstring widest = nomenclWidest(buffer(), runparams); + bool const autowidth = getParam("set_width") == "auto"; + if (autowidth || getParam("set_width") == "textwidth") { + docstring widest = autowidth ? nomenclWidest(buffer(), runparams) + : getParam("width"); // Set the label width via nomencl's command \nomlabelwidth. // This must be output before the command \printnomenclature if (!widest.empty()) { diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp index 44de49635f..cd16531d18 100644 --- a/src/tex2lyx/text.cpp +++ b/src/tex2lyx/text.cpp @@ -144,6 +144,7 @@ string parse_text_snippet(Parser & p, unsigned flags, const bool outer, string fboxrule = ""; string fboxsep = ""; string shadow_size = ""; +string printnomencl_textwidth = ""; char const * const known_babel_shorthands[] = { "\"", "|", "-", "~", "=", "/", "~", "*", ":", "_", "x", "'", "`", "<", ">", 0 }; @@ -5083,6 +5084,24 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, continue; } + if (t.cs() == "settowidth") { + context.check_layout(os); + string arg = p.getArg('{', '}'); + // we are only interested in this: + if (arg == "\\nomlabelwidth") { + printnomencl_textwidth = p.getArg('{', '}'); + eat_whitespace(p, os, context, false); + continue; + } + // for any other length, do ERT + string arg2 = p.getArg('{', '}'); + string const ert = t.asInput() + + '{' + arg + '}' + + '{' + arg2 + '}'; + output_ert_inset(os, ert, context); + continue; + } + if (t.cs() == "printnomenclature") { string width = ""; string width_type = ""; @@ -5094,16 +5113,15 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer, width = translate_len(width); width_type = "custom"; } - // case of no custom width - // the case of no custom width but the width set - // via \settowidth{\nomlabelwidth}{***} cannot be supported - // because the user could have set anything, not only the width - // of the longest label (which would be width_type = "auto") string label = convert_literate_command_inset_arg(p.getArg('{', '}')); - if (label.empty() && width_type.empty()) + if (!printnomencl_textwidth.empty()) { + width_type = "textwidth"; + width = printnomencl_textwidth; + } + else if (label.empty() && width_type.empty()) width_type = "none"; os << "set_width \"" << width_type << "\"\n"; - if (width_type == "custom") + if (width_type == "custom" || width_type == "textwidth") os << "width \"" << width << '\"'; end_inset(os); skip_spaces_braces(p); diff --git a/src/version.h b/src/version.h index 5fea4b1464..d1523c6054 100644 --- a/src/version.h +++ b/src/version.h @@ -32,8 +32,8 @@ extern char const * const lyx_version_info; // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -#define LYX_FORMAT_LYX 625 // spitz: \nptextcite (APA) -#define LYX_FORMAT_TEX2LYX 625 +#define LYX_FORMAT_LYX 626 // spitz: printnomencl setwidth +#define LYX_FORMAT_TEX2LYX 626 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX #ifndef _MSC_VER -- 2.39.5