]> git.lyx.org Git - lyx.git/commitdiff
Add possibility to manually specify longest label in nomenclature
authorJuergen Spitzmueller <spitz@lyx.org>
Sun, 21 Jul 2024 15:59:34 +0000 (17:59 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 21 Jul 2024 15:59:34 +0000 (17:59 +0200)
File format change

development/FORMAT
lib/doc/UserGuide.lyx
lib/doc/de/UserGuide.lyx
lib/lyx2lyx/lyx_2_5.py
src/frontends/qt/GuiPrintNomencl.cpp
src/insets/InsetNomencl.cpp
src/tex2lyx/text.cpp
src/version.h

index 34149fee02f08fd60566a7d05ca74e408469f850..a8617da9ca18e503d09b62fbc92a9e291ac945d1 100644 (file)
@@ -7,9 +7,21 @@ changes happened in particular if possible. A good example would be
 
 -----------------------
 
+2024-07-21 Jürgen Spitzmüller <spitz@lyx.org> 
+       * 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}{<text>}
+         before \printnomencl, which we will revert to ERT.
+
+2024-07-11 Jürgen Spitzmüller <spitz@lyx.org> 
+       * 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 <spitz@lyx.org> 
        * 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 <ufogiel@lyx.org>
        * Format incremented to 623: Remove hebrew letter document class.
index 1bddb09500605296d3f5e37b16b74484b9a15ebb..1284d6bd0ee519e69f06f993920f2526d843681e 100644 (file)
@@ -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
index da998308087fee66a33825658bc281338c42e6f3..bcaa1126776011c03351aeee0c0a92278fc6dfdd 100644 (file)
@@ -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
index e76bed5d370906d187e379120e9c9199b69f5a67..2afba6e813fe6538cb937e52b19bd513c198cd8d 100644 (file)
@@ -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, []],
index a70a9e091ce535d2eda06467e16c19e94e8f95f4..6533f89a4de42c69344abf049c7474155ce7ce8d 100644 (file)
@@ -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();
 }
 
index da628442cd09b3cb704d0c3c9f8d416c7c073a04..9762f8bae9dc7b9f5b98fac702989c5699e19530 100644 (file)
@@ -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()) {
index 44de49635fd9616018362653b8a1f3ecbe7f8e84..cd16531d18576e5fb73d532a852397e6c0ee903d 100644 (file)
@@ -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);
index 5fea4b14644905d0a509aca6af26852b2362473e..d1523c6054051e62abc68ffcd5e11f6c493bc505 100644 (file)
@@ -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