The attached patch implements nameref support in cross-references. The only thing I'm not sure about, which Uwe mentioned in the bug, is the precise loading order of packages. If we're loading hyperref anyway, then there's no issue, since it loads nameref. But if we aren't, then maybe nameref should be loaded after babel. Any views?
rh
Index: lib/lyx2lyx/lyx_2_0.py =================================================================== --- lib/lyx2lyx/lyx_2_0.py (revision 34853) +++ lib/lyx2lyx/lyx_2_0.py (working copy) @@ -1931,6 +1931,42 @@ del document.body[i:j + 1] +def revert_nameref(document): + " Convert namerefs to regular references " + # We cannot really revert these properly, so we will + # revert them to commands we understand. + cmds = [["Nameref", "vref"], ["nameref", "ref"]] + for cmd in cmds: + i = 0 + oldcmd = "LatexCommand " + cmd[0] + newcmd = "LatexCommand " + cmd[1] + while 1: + i = find_token(document.body, oldcmd, i) + if i == -1: + break + # Make sure it is actually in an inset! + # We could just check document.lines[i-1], but that relies + # upon something that might easily change. + # We'll look back a few lines. + j = i - 10 + if j < 0: + j = 0 + j = find_token(document.body, "\\begin_inset CommandInset ref", j) + if j == -1 or j > i: + i += 1 + continue + k = find_end_of_inset(document.body, i) + if k == -1: + document.warning("Can't find end of inset at line " + j + "!!") + i += 1 + continue + if k < i: + i += 1 + continue + document.body[i] = newcmd + i += 1 + + ## # Conversion hub # @@ -1984,10 +2020,12 @@ [391, []], [392, [convert_beamer_args]], [393, [convert_optarg]], - [394, []] + [394, []], + [395, []] ] -revert = [[393, [revert_makebox]], +revert = [[394, [revert_nameref]], + [393, [revert_makebox]], [392, [revert_argument]], [391, [revert_beamer_args]], [390, [revert_align_decimal, revert_IEEEtran]], Index: src/Buffer.cpp =================================================================== --- src/Buffer.cpp (revision 34853) +++ src/Buffer.cpp (working copy) @@ -126,7 +126,7 @@ // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -int const LYX_FORMAT = 394; // uwestoehr: support for \makebox +int const LYX_FORMAT = 395; // rgh: nameref typedef map<string, bool> DepClean; typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache; Index: src/BufferParams.cpp =================================================================== --- src/BufferParams.cpp (revision 34881) +++ src/BufferParams.cpp (working copy) @@ -1732,7 +1732,9 @@ texrow.newlines(lines); // set back for the rest lyxpreamble.clear(); - } + } else if (features.isRequired("nameref")) + // hyperref loads this automatically + lyxpreamble += "\\usepackage{nameref}\n"; // Will be surrounded by \makeatletter and \makeatother when not empty docstring atlyxpreamble; Index: src/frontends/qt4/ui/RefUi.ui =================================================================== --- src/frontends/qt4/ui/RefUi.ui (revision 34853) +++ src/frontends/qt4/ui/RefUi.ui (working copy) @@ -1,105 +1,103 @@ -<ui version="4.0" > +<ui version="4.0"> <class>RefUi</class> - <widget class="QDialog" name="RefUi" > - <property name="geometry" > + <widget class="QDialog" name="RefUi"> + <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>386</width> + <width>435</width> <height>443</height> </rect> </property> - <property name="windowTitle" > + <property name="windowTitle"> <string/> </property> - <property name="sizeGripEnabled" > + <property name="sizeGripEnabled"> <bool>true</bool> </property> - <layout class="QGridLayout" > - <property name="margin" > + <layout class="QGridLayout"> + <property name="margin"> <number>9</number> </property> - <property name="spacing" > + <property name="spacing"> <number>6</number> </property> - <item row="2" column="0" colspan="3" > - <layout class="QHBoxLayout" > - <property name="margin" > + <item row="2" column="0" colspan="3"> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> <number>0</number> </property> - <property name="spacing" > - <number>6</number> - </property> <item> - <widget class="QLabel" name="findKeysLA" > - <property name="text" > + <widget class="QLabel" name="findKeysLA"> + <property name="text"> <string>Fil&ter:</string> </property> - <property name="alignment" > + <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> - <property name="buddy" > + <property name="buddy"> <cstring>findLE</cstring> </property> </widget> </item> <item> - <widget class="QLineEdit" name="findLE" > - <property name="toolTip" > + <widget class="QLineEdit" name="findLE"> + <property name="toolTip"> <string>Enter string to filter the label list</string> </property> - <property name="text" > + <property name="text"> <string/> </property> </widget> </item> <item> - <widget class="QCheckBox" name="csFindCB" > - <property name="toolTip" > + <widget class="QCheckBox" name="csFindCB"> + <property name="toolTip"> <string>Filter case-sensitively</string> </property> - <property name="text" > + <property name="text"> <string>Case-sensiti&ve</string> </property> </widget> </item> </layout> </item> - <item row="7" column="0" colspan="3" > - <layout class="QHBoxLayout" > - <property name="margin" > + <item row="7" column="0" colspan="3"> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> <number>0</number> </property> - <property name="spacing" > - <number>6</number> - </property> <item> - <widget class="QPushButton" name="updatePB" > - <property name="sizePolicy" > - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> + <widget class="QPushButton" name="updatePB"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > + <property name="toolTip"> <string>Update the label list</string> </property> - <property name="text" > + <property name="text"> <string>&Update</string> </property> </widget> </item> <item> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeType" > + <property name="sizeType"> <enum>QSizePolicy::Expanding</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>31</width> <height>30</height> @@ -108,88 +106,88 @@ </spacer> </item> <item> - <widget class="QPushButton" name="okPB" > - <property name="text" > + <widget class="QPushButton" name="okPB"> + <property name="text"> <string>&OK</string> </property> - <property name="autoDefault" > + <property name="autoDefault"> <bool>true</bool> </property> - <property name="default" > + <property name="default"> <bool>true</bool> </property> </widget> </item> <item> - <widget class="QPushButton" name="applyPB" > - <property name="text" > + <widget class="QPushButton" name="applyPB"> + <property name="text"> <string>&Apply</string> </property> - <property name="autoDefault" > + <property name="autoDefault"> <bool>false</bool> </property> - <property name="default" > + <property name="default"> <bool>false</bool> </property> </widget> </item> <item> - <widget class="QPushButton" name="closePB" > - <property name="text" > + <widget class="QPushButton" name="closePB"> + <property name="text"> <string>&Close</string> </property> - <property name="autoDefault" > + <property name="autoDefault"> <bool>false</bool> </property> </widget> </item> </layout> </item> - <item row="3" column="0" colspan="3" > - <layout class="QHBoxLayout" > - <property name="margin" > + <item row="3" column="0" colspan="3"> + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> <number>0</number> </property> - <property name="spacing" > - <number>6</number> - </property> <item> - <layout class="QHBoxLayout" > - <property name="margin" > + <layout class="QHBoxLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> <number>0</number> </property> - <property name="spacing" > - <number>6</number> - </property> <item> - <widget class="QCheckBox" name="sortCB" > - <property name="toolTip" > + <widget class="QCheckBox" name="sortCB"> + <property name="toolTip"> <string>Sort labels in alphabetical order (case-insensitively unless the Case-sensitive option is checked)</string> </property> - <property name="text" > + <property name="text"> <string>&Sort</string> </property> </widget> </item> <item> - <widget class="QCheckBox" name="caseSensitiveCB" > - <property name="enabled" > + <widget class="QCheckBox" name="caseSensitiveCB"> + <property name="enabled"> <bool>false</bool> </property> - <property name="toolTip" > + <property name="toolTip"> <string>Sort labels case-sensitively in alphabetical order</string> </property> - <property name="text" > + <property name="text"> <string>Cas&e-sensitive</string> </property> </widget> </item> <item> - <widget class="QCheckBox" name="groupCB" > - <property name="toolTip" > - <string>Group labels by prefix (e.g. "sec:")</string> + <widget class="QCheckBox" name="groupCB"> + <property name="toolTip"> + <string>Group labels by prefix (e.g. "sec:")</string> </property> - <property name="text" > + <property name="text"> <string>Grou&p</string> </property> </widget> @@ -198,10 +196,10 @@ </item> <item> <spacer> - <property name="orientation" > + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="sizeHint" > + <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>20</height> @@ -210,143 +208,153 @@ </spacer> </item> <item> - <widget class="QPushButton" name="gotoPB" > - <property name="sizePolicy" > - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>0</vsizetype> + <widget class="QPushButton" name="gotoPB"> + <property name="sizePolicy"> + <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text" > + <property name="text"> <string>&Go to Label</string> </property> </widget> </item> </layout> </item> - <item row="0" column="0" colspan="2" > - <widget class="QLabel" name="refsL" > - <property name="text" > + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="refsL"> + <property name="text"> <string>La&bels in:</string> </property> - <property name="buddy" > + <property name="buddy"> <cstring>bufferCO</cstring> </property> </widget> </item> - <item row="0" column="2" > - <widget class="QComboBox" name="bufferCO" > - <property name="sizePolicy" > - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>0</vsizetype> + <item row="0" column="2"> + <widget class="QComboBox" name="bufferCO"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> </widget> </item> - <item row="6" column="0" > - <widget class="QLabel" name="nameL" > - <property name="enabled" > + <item row="6" column="0"> + <widget class="QLabel" name="nameL"> + <property name="enabled"> <bool>false</bool> </property> - <property name="text" > + <property name="text"> <string>&Name:</string> </property> - <property name="alignment" > + <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> - <property name="buddy" > + <property name="buddy"> <cstring>nameED</cstring> </property> </widget> </item> - <item row="6" column="1" colspan="2" > - <widget class="QLineEdit" name="nameED" > - <property name="enabled" > + <item row="6" column="1" colspan="2"> + <widget class="QLineEdit" name="nameED"> + <property name="enabled"> <bool>false</bool> </property> </widget> </item> - <item row="5" column="0" > - <widget class="QLabel" name="typeLA" > - <property name="text" > + <item row="5" column="0"> + <widget class="QLabel" name="typeLA"> + <property name="text"> <string>&Format:</string> </property> - <property name="alignment" > + <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> - <property name="buddy" > + <property name="buddy"> <cstring>typeLA</cstring> </property> </widget> </item> - <item row="5" column="1" colspan="2" > - <widget class="QComboBox" name="typeCO" > - <property name="sizePolicy" > - <sizepolicy> - <hsizetype>1</hsizetype> - <vsizetype>0</vsizetype> + <item row="5" column="1" colspan="2"> + <widget class="QComboBox" name="typeCO"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="toolTip" > + <property name="toolTip"> <string>Cross-reference as it appears in output</string> </property> <item> - <property name="text" > - <string><reference></string> + <property name="text"> + <string><reference></string> </property> </item> <item> - <property name="text" > - <string>(<reference>)</string> + <property name="text"> + <string>(<reference>)</string> </property> </item> <item> - <property name="text" > - <string><page></string> + <property name="text"> + <string><page></string> </property> </item> <item> - <property name="text" > - <string>on page <page></string> + <property name="text"> + <string>on page <page></string> </property> </item> <item> - <property name="text" > - <string><reference> on page <page></string> + <property name="text"> + <string><reference> on page <page></string> </property> </item> <item> - <property name="text" > + <property name="text"> <string>Formatted reference</string> </property> </item> + <item> + <property name="text"> + <string>Textual reference</string> + </property> + </item> + <item> + <property name="text"> + <string>Textual reference plus <page></string> + </property> + </item> </widget> </item> - <item row="4" column="0" > - <widget class="QLabel" name="referenceL" > - <property name="text" > + <item row="4" column="0"> + <widget class="QLabel" name="referenceL"> + <property name="text"> <string>&Label:</string> </property> - <property name="alignment" > + <property name="alignment"> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> - <property name="buddy" > + <property name="buddy"> <cstring>referenceED</cstring> </property> </widget> </item> - <item row="4" column="1" colspan="2" > - <widget class="QLineEdit" name="referenceED" /> + <item row="4" column="1" colspan="2"> + <widget class="QLineEdit" name="referenceED"/> </item> - <item row="1" column="0" colspan="3" > - <widget class="QTreeWidget" name="refsTW" /> + <item row="1" column="0" colspan="3"> + <widget class="QTreeWidget" name="refsTW"> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + </widget> </item> </layout> </widget> @@ -363,7 +371,7 @@ <tabstop>closePB</tabstop> </tabstops> <includes> - <include location="local" >qt_i18n.h</include> + <include location="local">qt_i18n.h</include> </includes> <resources/> <connections/> Index: src/insets/InsetRef.cpp =================================================================== --- src/insets/InsetRef.cpp (revision 34853) +++ src/insets/InsetRef.cpp (working copy) @@ -52,7 +52,9 @@ || s == "vref" || s == "vpageref" || s == "prettyref" - || s == "eqref"; + || s == "eqref" + || s == "nameref" + || s == "Nameref"; } @@ -132,9 +134,11 @@ display_string = _("elsewhere"); else if (cmd == "eqref") display_string = bformat(from_ascii("equation (%1$s)"), value); - else { // "prettyref" + else if (cmd == "prettyref" + // we don't really have the ability to handle these + // properly in XHTML output + || cmd == "nameref" || cmd == "Nameref") display_string = il->prettyCounter(); - } } else display_string = ref; @@ -206,12 +210,15 @@ void InsetRef::validate(LaTeXFeatures & features) const { - if (getCmdName() == "vref" || getCmdName() == "vpageref") + string const cmd = getCmdName(); + if (cmd == "vref" || cmd == "vpageref") features.require("varioref"); - else if (getCmdName() == "prettyref") + else if (cmd == "prettyref") features.require("prettyref"); - else if (getCmdName() == "eqref") + else if (cmd == "eqref") features.require("amsmath"); + else if (cmd == "nameref" || cmd == "Nameref") + features.require("nameref"); } @@ -222,6 +229,8 @@ { "vpageref", N_("Textual Page Number"), N_("TextPage: ")}, { "vref", N_("Standard+Textual Page"), N_("Ref+Text: ")}, { "prettyref", N_("PrettyRef"), N_("FrmtRef: ")}, + { "nameref", N_("Reference to Name"), N_("NameRef:")}, + { "Nameref", N_("Name+Textual Page"), N_("NamePgRef:")}, { "", "", "" } };