tex2lyx: support for plural and capitalized refstyle

Also fix a glitch in non-refstyle import (getOpt() returns the option
with delimiter, so do not add them in ERT once more)

Candidate for stable
This commit is contained in:
Juergen Spitzmueller 2018-08-26 09:48:23 +02:00
parent d10c3bceb0
commit faf40fb408
2 changed files with 42 additions and 9 deletions

View File

@ -36,7 +36,6 @@ Format LaTeX feature LyX feature
443 unicode-math.sty InsetMath*
453 automatic stmaryrd loading \use_package stmaryrd
457 automatic stackrel loading \use_package stackrel
526 Plural and capitalized refstyles InsetRef
546 Landscape support
\begin{landscape}...\end{landscape} \begin_inset Flex Landscape (see #11259)
555 V column type (varwidth package) Automatically detected with newlines, paragraph breaks and environment content in cells of rows

View File

@ -539,6 +539,24 @@ string const fromPolyglossiaEnvironment(string const s)
}
string uncapitalize(string const s)
{
docstring in = from_ascii(s);
char_type t = lowercase(s[0]);
in[0] = t;
return to_ascii(in);
}
bool isCapitalized(string const s)
{
docstring in = from_ascii(s);
char_type t = uppercase(s[0]);
in[0] = t;
return to_ascii(in) == s;
}
} // namespace
@ -4182,21 +4200,37 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
continue;
}
// handle refstyle first to catch \eqref which can also occur
// without refstyle. Only recognize these commands if
// Handle refstyle first in order to to catch \eqref, because this
// can also occur without refstyle. Only recognize these commands if
// refstyle.sty was found in the preamble (otherwise \eqref
// and user defined ref commands could be misdetected).
if ((where = is_known(t.cs(), known_refstyle_commands))
// We uncapitalize the input in order to catch capitalized commands
// such as \Eqref.
if ((where = is_known(uncapitalize(t.cs()), known_refstyle_commands))
&& preamble.refstyle()) {
string const cap = isCapitalized(t.cs()) ? "true" : "false";
string plural = "false";
// Catch the plural option [s]
if (p.hasOpt()) {
string const opt = p.getOpt();
if (opt == "[s]")
plural = "true";
else {
// LyX does not yet support other optional arguments of ref commands
output_ert_inset(os, t.asInput() + opt + "{" +
p.verbatim_item() + '}', context);
continue;
}
}
context.check_layout(os);
begin_command_inset(os, "ref", "formatted");
os << "reference \"";
os << known_refstyle_prefixes[where - known_refstyle_commands]
<< ":";
os << convert_literate_command_inset_arg(p.verbatim_item())
os << convert_literate_command_inset_arg(p.getArg('{', '}'))
<< "\"\n";
os << "plural \"false\"\n";
os << "caps \"false\"\n";
os << "plural \"" << plural << "\"\n";
os << "caps \"" << cap << "\"\n";
os << "noprefix \"false\"\n";
end_inset(os);
preamble.registerAutomaticallyLoadedPackage("refstyle");
@ -4225,8 +4259,8 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
preamble.registerAutomaticallyLoadedPackage("prettyref");
} else {
// LyX does not yet support optional arguments of ref commands
output_ert_inset(os, t.asInput() + '[' + opt + "]{" +
p.verbatim_item() + '}', context);
output_ert_inset(os, t.asInput() + opt + "{" +
p.verbatim_item() + '}', context);
}
continue;
}