This was completely broken: the IDs have been escaped in the LyX file
(which they absolutely shouldn't) but not in all LaTeX output (which
they should).
-docstring InsetCommandParams::getCommand(OutputParams const & runparams, bool starred) const
+docstring InsetCommandParams::getCommand(OutputParams const & runparams, bool starred, bool unhandled) const
{
docstring s = '\\' + from_ascii(cmdName_);
if (starred)
{
docstring s = '\\' + from_ascii(cmdName_);
if (starred)
ParamInfo::const_iterator end = info_.end();
for (; it != end; ++it) {
std::string const & name = it->name();
ParamInfo::const_iterator end = info_.end();
for (; it != end; ++it) {
std::string const & name = it->name();
+ ParamInfo::ParamHandling handling = unhandled ?
+ ParamInfo::HANDLING_NONE
+ : it->handling();
switch (it->type()) {
case ParamInfo::LYX_INTERNAL:
break;
case ParamInfo::LATEX_REQUIRED: {
docstring const data =
switch (it->type()) {
case ParamInfo::LYX_INTERNAL:
break;
case ParamInfo::LATEX_REQUIRED: {
docstring const data =
- prepareCommand(runparams, (*this)[name], it->handling());
+ prepareCommand(runparams, (*this)[name], handling);
s += '{' + data + '}';
noparam = false;
break;
}
case ParamInfo::LATEX_OPTIONAL: {
docstring data =
s += '{' + data + '}';
noparam = false;
break;
}
case ParamInfo::LATEX_OPTIONAL: {
docstring data =
- prepareCommand(runparams, (*this)[name], it->handling());
+ prepareCommand(runparams, (*this)[name], handling);
if (!data.empty()) {
s += '[' + protectArgument(data) + ']';
noparam = false;
if (!data.empty()) {
s += '[' + protectArgument(data) + ']';
noparam = false;
///
void Write(std::ostream & os, Buffer const * buf) const;
/// Build the complete LaTeX command
///
void Write(std::ostream & os, Buffer const * buf) const;
/// Build the complete LaTeX command
- docstring getCommand(OutputParams const &, bool starred = false) const;
+ docstring getCommand(OutputParams const &, bool starred = false, bool unhandled = false) const;
/// Return the command name
std::string const & getCmdName() const { return cmdName_; }
/// Set the name to \p n. This must be a known name. All parameters
/// Return the command name
std::string const & getCmdName() const { return cmdName_; }
/// Set the name to \p n. This must be a known name. All parameters
switch (cmd.action()) {
case LFUN_INSET_MODIFY: {
string const arg0 = cmd.getArg(0);
switch (cmd.action()) {
case LFUN_INSET_MODIFY: {
string const arg0 = cmd.getArg(0);
- string const arg1 = cmd.getArg(1);
+ string const arg1 = cmd.getArg(1);
if (arg0 == "ref") {
if (arg1 == "changetarget") {
string const oldtarget = cmd.getArg(2);
if (arg0 == "ref") {
if (arg1 == "changetarget") {
string const oldtarget = cmd.getArg(2);
LYXERR0("Unassigned buffer_ in InsetMathRef::write!");
LYXERR0("LaTeX output may be wrong!");
}
LYXERR0("Unassigned buffer_ in InsetMathRef::write!");
LYXERR0("LaTeX output may be wrong!");
}
+ // are we writing to the LyX file?
+ if (!os.latex()) {
+ // if so, then this is easy
+ InsetMathCommand::write(os);
+ return;
+ }
bool const use_refstyle =
buffer_ && buffer().params().use_refstyle;
bool special_case = cmd == "formatted" ||
cmd == "labelonly" ||
(cmd == "eqref" && use_refstyle);
bool const use_refstyle =
buffer_ && buffer().params().use_refstyle;
bool special_case = cmd == "formatted" ||
cmd == "labelonly" ||
(cmd == "eqref" && use_refstyle);
- // are we writing to the LyX file or not in a special case?
- if (!os.latex() || !special_case) {
- // if so, then this is easy
- InsetMathCommand::write(os);
- return;
- }
// we need to translate 'formatted' to prettyref or refstyle-type
// commands and just output the label with labelonly
// most of this is borrowed from InsetRef and should be kept in
// sync with that.
ModeSpecifier specifier(os, currentMode(), lockedMode(), asciiOnly());
MathEnsurer ensurer(os, false);
// we need to translate 'formatted' to prettyref or refstyle-type
// commands and just output the label with labelonly
// most of this is borrowed from InsetRef and should be kept in
// sync with that.
ModeSpecifier specifier(os, currentMode(), lockedMode(), asciiOnly());
MathEnsurer ensurer(os, false);
-
- if (use_refstyle && cmd == "eqref") {
+ if (!special_case) {
+ os << from_ascii("\\") << cmd << "{" << cell(0) << from_ascii("}");
+ }
+ else if (use_refstyle && cmd == "eqref") {
// we advertise this as printing "(n)", so we'll do that, at least
// for refstyle, since refstlye's own \eqref prints, by default,
// "equation n". if one wants \eqref, one can get it by using a
// we advertise this as printing "(n)", so we'll do that, at least
// for refstyle, since refstlye's own \eqref prints, by default,
// "equation n". if one wants \eqref, one can get it by using a
if (!use_refstyle)
os << "\\prettyref{" << cell(0) << "}";
else {
if (!use_refstyle)
os << "\\prettyref{" << cell(0) << "}";
else {
// get the label we are referencing
for (auto const & d : cell(0)) {
ods << d;
// get the label we are referencing
for (auto const & d : cell(0)) {
ods << d;
void writeString(docstring const & s, TeXMathStream & os)
{
if (!os.latex()) {
void writeString(docstring const & s, TeXMathStream & os)
{
if (!os.latex()) {
- os << (os.asciiOnly() ? escape(s) : s);
- else if (os.output() == TeXMathStream::wsSearchAdv) {
- os << s;
+
+ docstring str = s;
+ if (os.asciiOnly())
+ str = escape(s);
+
+ if (os.output() == TeXMathStream::wsSearchAdv) {
+ os << str;
return;
}
if (os.lockedMode()) {
bool space;
docstring cmd;
return;
}
if (os.lockedMode()) {
bool space;
docstring cmd;
- for (char_type c : s) {
+ for (char_type c : str) {
try {
Encodings::latexMathChar(c, true, os.encoding(), cmd, space);
os << cmd;
try {
Encodings::latexMathChar(c, true, os.encoding(), cmd, space);
os << cmd;
// We will take care of matching braces.
os.pendingBrace(false);
// We will take care of matching braces.
os.pendingBrace(false);
- for (char_type const c : s) {
+ for (char_type const c : str) {
bool mathmode = in_forced_mode ? os.textMode() : !os.textMode();
docstring command(1, c);
try {
bool mathmode = in_forced_mode ? os.textMode() : !os.textMode();
docstring command(1, c);
try {
InsetCommand::string2params(to_utf8(str), icp);
Encoding const * const utf8 = encodings.fromLyXName("utf8");
OutputParams op(utf8);
InsetCommand::string2params(to_utf8(str), icp);
Encoding const * const utf8 = encodings.fromLyXName("utf8");
OutputParams op(utf8);
- mathed_parse_cell(ar, icp.getCommand(op));
+ mathed_parse_cell(ar, icp.getCommand(op, false, true));
} else if (name == "mathspace") {
InsetSpaceParams isp(true);
InsetSpace::string2params(to_utf8(str), isp);
} else if (name == "mathspace") {
InsetSpaceParams isp(true);
InsetSpace::string2params(to_utf8(str), isp);