Add possibility to manually specify longest label in nomenclature

File format change
This commit is contained in:
Juergen Spitzmueller 2024-07-21 17:59:34 +02:00
parent eb1ac06a9a
commit ae1e1cb069
8 changed files with 210 additions and 28 deletions

View 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.

View 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

View 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

View 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, []],

View 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();
}

View 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()) {

View 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);

View 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