mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-09-19 22:40:26 +00:00
Fix bug #11410.
Main part of patch from Daniel, adapted by me. I also added the lyx2lyx code.
This commit is contained in:
parent
053e858e2c
commit
d4f2460ac4
@ -4550,6 +4550,81 @@ def revert_index_macros(document):
|
|||||||
document.body[pl:pl+1] = document.body[pl:pl] + sortkey + put_cmd_in_ert("@")
|
document.body[pl:pl+1] = document.body[pl:pl] + sortkey + put_cmd_in_ert("@")
|
||||||
|
|
||||||
|
|
||||||
|
def revert_starred_refs(document):
|
||||||
|
i = find_token(document.header, "\\use_hyperref true", 0)
|
||||||
|
use_hyperref = (i != -1)
|
||||||
|
i = 0
|
||||||
|
in_inset = False
|
||||||
|
cmd = ref = ""
|
||||||
|
plural = caps = noprefix = nolink = False
|
||||||
|
nolinkline = -1
|
||||||
|
while True:
|
||||||
|
if not in_inset:
|
||||||
|
i = find_token(document.body, "\\begin_inset CommandInset ref", i)
|
||||||
|
if i == -1:
|
||||||
|
break
|
||||||
|
start = i
|
||||||
|
end = find_end_of_inset(document.body, i)
|
||||||
|
if end == -1:
|
||||||
|
document.warning("Malformed LyX document: Can't find end of inset at line %d" % i)
|
||||||
|
i += 1
|
||||||
|
continue
|
||||||
|
# If we are not using hyperref, then we just need to delete the line
|
||||||
|
if not use_hyperref:
|
||||||
|
i = find_token(document.body, "nolink", i, e)
|
||||||
|
if i == -1:
|
||||||
|
continue
|
||||||
|
del document.body[i]
|
||||||
|
i = e - 1
|
||||||
|
continue
|
||||||
|
# If we are using hyperref, then we'll need to do more.
|
||||||
|
in_inset = True
|
||||||
|
i += 1
|
||||||
|
continue
|
||||||
|
# so we are in an InsetRef
|
||||||
|
if i == end:
|
||||||
|
in_inset = False
|
||||||
|
# If nolink is False, just remove that line
|
||||||
|
if nolink == False or cmd == "formatted":
|
||||||
|
# document.warning("Skipping " + cmd + " " + ref)
|
||||||
|
if nolinkline != -1:
|
||||||
|
del document.body[nolinkline]
|
||||||
|
continue
|
||||||
|
# We need to construct a new command and put it in ERT
|
||||||
|
newcmd = "\\" + cmd + "*{" + ref + "}"
|
||||||
|
# document.warning(newcmd)
|
||||||
|
newlines = put_cmd_in_ert(newcmd)
|
||||||
|
document.body[start:end+1] = newlines
|
||||||
|
i += len(newlines) - (end - start) + 1
|
||||||
|
# reset variables
|
||||||
|
cmd = ref = ""
|
||||||
|
plural = caps = noprefix = nolink = False
|
||||||
|
nolinkline = -1
|
||||||
|
continue
|
||||||
|
l = document.body[i]
|
||||||
|
if l.startswith("LatexCommand"):
|
||||||
|
cmd = l[13:]
|
||||||
|
elif l.startswith("reference"):
|
||||||
|
ref = l[11:-1]
|
||||||
|
elif l.startswith("caps"):
|
||||||
|
tmp = l[6:-1]
|
||||||
|
caps = (tmp == "true")
|
||||||
|
elif l.startswith("plural"):
|
||||||
|
tmp = l[8:-1]
|
||||||
|
plural = (tmp == "true")
|
||||||
|
elif l.startswith("noprefix"):
|
||||||
|
tmp = l[10:-1]
|
||||||
|
noprefix = (tmp == "true")
|
||||||
|
elif l.startswith("nolink"):
|
||||||
|
tmp = l[8:-1]
|
||||||
|
nolink = (tmp == "true")
|
||||||
|
nolinkline = i
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Conversion hub
|
# Conversion hub
|
||||||
#
|
#
|
||||||
@ -4622,10 +4697,12 @@ convert = [
|
|||||||
[608, []],
|
[608, []],
|
||||||
[609, []],
|
[609, []],
|
||||||
[610, []],
|
[610, []],
|
||||||
[611, []]
|
[611, []],
|
||||||
|
[612, []]
|
||||||
]
|
]
|
||||||
|
|
||||||
revert = [[610, []],
|
revert = [[611, [revert_starred_refs]],
|
||||||
|
[610, []],
|
||||||
[609, [revert_index_macros]],
|
[609, [revert_index_macros]],
|
||||||
[608, [revert_document_metadata]],
|
[608, [revert_document_metadata]],
|
||||||
[607, [revert_docbook_mathml_prefix]],
|
[607, [revert_docbook_mathml_prefix]],
|
||||||
|
@ -124,6 +124,7 @@ Menuset
|
|||||||
OptItem "Plural|a" "inset-modify ref toggle-plural"
|
OptItem "Plural|a" "inset-modify ref toggle-plural"
|
||||||
OptItem "Capitalize|C" "inset-modify ref toggle-caps"
|
OptItem "Capitalize|C" "inset-modify ref toggle-caps"
|
||||||
OptItem "No Prefix" "inset-modify ref toggle-noprefix"
|
OptItem "No Prefix" "inset-modify ref toggle-noprefix"
|
||||||
|
OptItem "No Hyperlink" "inset-modify ref toggle-nolink"
|
||||||
Separator
|
Separator
|
||||||
Item "Settings...|S" "inset-settings"
|
Item "Settings...|S" "inset-settings"
|
||||||
End
|
End
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "Cursor.h"
|
#include "Cursor.h"
|
||||||
#include "FancyLineEdit.h"
|
#include "FancyLineEdit.h"
|
||||||
#include "FuncRequest.h"
|
#include "FuncRequest.h"
|
||||||
|
#include "PDFOptions.h"
|
||||||
|
|
||||||
#include "qt_helpers.h"
|
#include "qt_helpers.h"
|
||||||
|
|
||||||
@ -109,6 +110,8 @@ GuiRef::GuiRef(GuiView & lv)
|
|||||||
this, SLOT(changed_adaptor()));
|
this, SLOT(changed_adaptor()));
|
||||||
connect(noprefixCB, SIGNAL(clicked()),
|
connect(noprefixCB, SIGNAL(clicked()),
|
||||||
this, SLOT(changed_adaptor()));
|
this, SLOT(changed_adaptor()));
|
||||||
|
connect(nolinkCB, SIGNAL(clicked()),
|
||||||
|
this, SLOT(changed_adaptor()));
|
||||||
|
|
||||||
enableBoxes();
|
enableBoxes();
|
||||||
|
|
||||||
@ -142,9 +145,12 @@ void GuiRef::enableBoxes()
|
|||||||
bool const isLabelOnly = (reftype == "labelonly");
|
bool const isLabelOnly = (reftype == "labelonly");
|
||||||
bool const usingRefStyle = buffer().params().use_refstyle;
|
bool const usingRefStyle = buffer().params().use_refstyle;
|
||||||
bool const intext = bufferview()->cursor().inTexted();
|
bool const intext = bufferview()->cursor().inTexted();
|
||||||
|
bool const hyper_on = buffer().params().pdfoptions().use_hyperref;
|
||||||
pluralCB->setEnabled(intext && isFormatted && usingRefStyle);
|
pluralCB->setEnabled(intext && isFormatted && usingRefStyle);
|
||||||
capsCB->setEnabled(intext && isFormatted && usingRefStyle);
|
capsCB->setEnabled(intext && isFormatted && usingRefStyle);
|
||||||
noprefixCB->setEnabled(intext && isLabelOnly);
|
noprefixCB->setEnabled(intext && isLabelOnly);
|
||||||
|
// disabling of hyperlinks not supported by formatted references
|
||||||
|
nolinkCB->setEnabled(hyper_on && intext && !isFormatted && !isLabelOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -338,6 +344,7 @@ void GuiRef::updateContents()
|
|||||||
pluralCB->setChecked(params_["plural"] == "true");
|
pluralCB->setChecked(params_["plural"] == "true");
|
||||||
capsCB->setChecked(params_["caps"] == "true");
|
capsCB->setChecked(params_["caps"] == "true");
|
||||||
noprefixCB->setChecked(params_["noprefix"] == "true");
|
noprefixCB->setChecked(params_["noprefix"] == "true");
|
||||||
|
nolinkCB->setChecked(params_["nolink"] == "true");
|
||||||
|
|
||||||
// insert buffer list
|
// insert buffer list
|
||||||
bufferCO->clear();
|
bufferCO->clear();
|
||||||
@ -380,6 +387,8 @@ void GuiRef::applyView()
|
|||||||
from_ascii("true") : from_ascii("false");
|
from_ascii("true") : from_ascii("false");
|
||||||
params_["noprefix"] = noprefixCB->isChecked() ?
|
params_["noprefix"] = noprefixCB->isChecked() ?
|
||||||
from_ascii("true") : from_ascii("false");
|
from_ascii("true") : from_ascii("false");
|
||||||
|
params_["nolink"] = nolinkCB->isChecked() ?
|
||||||
|
from_ascii("true") : from_ascii("false");
|
||||||
restored_buffer_ = bufferCO->currentIndex();
|
restored_buffer_ = bufferCO->currentIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,6 +334,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="nolinkCB">
|
||||||
|
<property name="text">
|
||||||
|
<string>No Hyperlink</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer_2">
|
<spacer name="horizontalSpacer_2">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
@ -553,9 +553,11 @@ docstring InsetCommandParams::prepareCommand(OutputParams const & runparams,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
docstring InsetCommandParams::getCommand(OutputParams const & runparams) const
|
docstring InsetCommandParams::getCommand(OutputParams const & runparams, bool starred) const
|
||||||
{
|
{
|
||||||
docstring s = '\\' + from_ascii(cmdName_);
|
docstring s = '\\' + from_ascii(cmdName_);
|
||||||
|
if (starred)
|
||||||
|
s += from_utf8("*");
|
||||||
bool noparam = true;
|
bool noparam = true;
|
||||||
ParamInfo::const_iterator it = info_.begin();
|
ParamInfo::const_iterator it = info_.begin();
|
||||||
ParamInfo::const_iterator end = info_.end();
|
ParamInfo::const_iterator end = info_.end();
|
||||||
|
@ -136,7 +136,7 @@ public:
|
|||||||
///
|
///
|
||||||
void Write(std::ostream & os, Buffer const * buf) const;
|
void Write(std::ostream & os, Buffer const * buf) const;
|
||||||
/// Build the complete LaTeX command
|
/// Build the complete LaTeX command
|
||||||
docstring getCommand(OutputParams const &) const;
|
docstring getCommand(OutputParams const &, bool starred = false) const;
|
||||||
/// Return the command name
|
/// Return the command name
|
||||||
std::string const & getCmdName() const { return cmdName_; }
|
std::string const & getCmdName() const { return cmdName_; }
|
||||||
/// Set the name to \p n. This must be a known name. All parameters
|
/// Set the name to \p n. This must be a known name. All parameters
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "output_xhtml.h"
|
#include "output_xhtml.h"
|
||||||
#include "Paragraph.h"
|
#include "Paragraph.h"
|
||||||
#include "ParIterator.h"
|
#include "ParIterator.h"
|
||||||
|
#include "PDFOptions.h"
|
||||||
#include "xml.h"
|
#include "xml.h"
|
||||||
#include "texstream.h"
|
#include "texstream.h"
|
||||||
#include "TocBackend.h"
|
#include "TocBackend.h"
|
||||||
@ -74,6 +75,7 @@ ParamInfo const & InsetRef::findInfo(string const & /* cmdName */)
|
|||||||
param_info_.add("plural", ParamInfo::LYX_INTERNAL);
|
param_info_.add("plural", ParamInfo::LYX_INTERNAL);
|
||||||
param_info_.add("caps", ParamInfo::LYX_INTERNAL);
|
param_info_.add("caps", ParamInfo::LYX_INTERNAL);
|
||||||
param_info_.add("noprefix", ParamInfo::LYX_INTERNAL);
|
param_info_.add("noprefix", ParamInfo::LYX_INTERNAL);
|
||||||
|
param_info_.add("nolink", ParamInfo::LYX_INTERNAL);
|
||||||
}
|
}
|
||||||
return param_info_;
|
return param_info_;
|
||||||
}
|
}
|
||||||
@ -120,6 +122,8 @@ void InsetRef::doDispatch(Cursor & cur, FuncRequest & cmd)
|
|||||||
pstring = "caps";
|
pstring = "caps";
|
||||||
else if (arg == "toggle-noprefix")
|
else if (arg == "toggle-noprefix")
|
||||||
pstring = "noprefix";
|
pstring = "noprefix";
|
||||||
|
else if (arg == "toggle-nolink")
|
||||||
|
pstring = "nolink";
|
||||||
else if (arg == "changetarget") {
|
else if (arg == "changetarget") {
|
||||||
string const oldtarget = cmd.getArg(2);
|
string const oldtarget = cmd.getArg(2);
|
||||||
string const newtarget = cmd.getArg(3);
|
string const newtarget = cmd.getArg(3);
|
||||||
@ -170,6 +174,12 @@ bool InsetRef::getStatus(Cursor & cur, FuncRequest const & cmd,
|
|||||||
status.setOnOff(isSet);
|
status.setOnOff(isSet);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (arg == "toggle-nolink") {
|
||||||
|
status.setEnabled(params().getCmdName() != "formatted" && params().getCmdName() != "labelonly");
|
||||||
|
bool const isSet = (getParam("nolink") == "true");
|
||||||
|
status.setOnOff(isSet);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// otherwise not for us
|
// otherwise not for us
|
||||||
return InsetCommand::getStatus(cur, cmd, status);
|
return InsetCommand::getStatus(cur, cmd, status);
|
||||||
}
|
}
|
||||||
@ -250,6 +260,7 @@ void InsetRef::latex(otexstream & os, OutputParams const & rp) const
|
|||||||
{
|
{
|
||||||
string const & cmd = getCmdName();
|
string const & cmd = getCmdName();
|
||||||
docstring const & data = getEscapedLabel(rp);
|
docstring const & data = getEscapedLabel(rp);
|
||||||
|
bool const hyper_on = buffer().params().pdfoptions().use_hyperref;
|
||||||
|
|
||||||
if (rp.inulemcmd > 0)
|
if (rp.inulemcmd > 0)
|
||||||
os << "\\mbox{";
|
os << "\\mbox{";
|
||||||
@ -259,7 +270,11 @@ void InsetRef::latex(otexstream & os, OutputParams const & rp) const
|
|||||||
// for refstyle, since refstlye's own \eqref prints, by default,
|
// for refstyle, since refstlye's own \eqref prints, by default,
|
||||||
// "equation n". if one wants \eqref, one can get it by using a
|
// "equation n". if one wants \eqref, one can get it by using a
|
||||||
// formatted label in this case.
|
// formatted label in this case.
|
||||||
os << '(' << from_ascii("\\ref{") << data << from_ascii("})");
|
bool const use_nolink = hyper_on && getParam("nolink") == "true";
|
||||||
|
os << '(' << from_ascii("\\ref") +
|
||||||
|
// no hyperlink version?
|
||||||
|
(use_nolink ? from_utf8("*") : from_utf8("")) +
|
||||||
|
from_ascii("{") << data << from_ascii("})");
|
||||||
}
|
}
|
||||||
else if (cmd == "formatted") {
|
else if (cmd == "formatted") {
|
||||||
docstring label;
|
docstring label;
|
||||||
@ -291,9 +306,10 @@ void InsetRef::latex(otexstream & os, OutputParams const & rp) const
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
InsetCommandParams p(REF_CODE, cmd);
|
InsetCommandParams p(REF_CODE, cmd);
|
||||||
|
bool const use_nolink = hyper_on && getParam("nolink") == "true";
|
||||||
docstring const ref = getParam("reference");
|
docstring const ref = getParam("reference");
|
||||||
p["reference"] = ref;
|
p["reference"] = ref;
|
||||||
os << p.getCommand(rp);
|
os << p.getCommand(rp, use_nolink);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rp.inulemcmd > 0)
|
if (rp.inulemcmd > 0)
|
||||||
@ -461,6 +477,12 @@ void InsetRef::updateBuffer(ParIterator const & it, UpdateType, bool const /*del
|
|||||||
for (int i = 0; !types[i].latex_name.empty(); ++i) {
|
for (int i = 0; !types[i].latex_name.empty(); ++i) {
|
||||||
if (cmd == types[i].latex_name) {
|
if (cmd == types[i].latex_name) {
|
||||||
label = _(types[i].short_gui_name);
|
label = _(types[i].short_gui_name);
|
||||||
|
// indicate no hyperlink (starred)
|
||||||
|
if (cmd != "formatted" && cmd != "labelonly") {
|
||||||
|
bool const isNoLink = getParam("nolink") == "true";
|
||||||
|
if (isNoLink)
|
||||||
|
label += from_ascii("*");
|
||||||
|
}
|
||||||
// indicate plural and caps
|
// indicate plural and caps
|
||||||
if (cmd == "formatted") {
|
if (cmd == "formatted") {
|
||||||
bool const isPlural = getParam("plural") == "true";
|
bool const isPlural = getParam("plural") == "true";
|
||||||
|
@ -34,7 +34,7 @@ Format LaTeX feature LyX feature
|
|||||||
443 unicode-math.sty InsetMath*
|
443 unicode-math.sty InsetMath*
|
||||||
453 automatic stmaryrd loading \use_package stmaryrd
|
453 automatic stmaryrd loading \use_package stmaryrd
|
||||||
457 automatic stackrel loading \use_package stackrel
|
457 automatic stackrel loading \use_package stackrel
|
||||||
|
612 starred reference commands
|
||||||
|
|
||||||
General
|
General
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
|
|||||||
|
|
||||||
// Do not remove the comment below, so we get merge conflict in
|
// Do not remove the comment below, so we get merge conflict in
|
||||||
// independent branches. Instead add your own.
|
// independent branches. Instead add your own.
|
||||||
#define LYX_FORMAT_LYX 611 // Yuriy Skalko: semantic linefeeds
|
#define LYX_FORMAT_LYX 612 // RKH & DR: Starred cross-references
|
||||||
#define LYX_FORMAT_TEX2LYX 611
|
#define LYX_FORMAT_TEX2LYX 612
|
||||||
|
|
||||||
#if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
|
#if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
|
Loading…
Reference in New Issue
Block a user