Change the way we output formatted references under refstyle to avoid

some problems with the previous \\lyxref macro.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@35882 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2010-10-28 15:15:14 +00:00
parent f6b76a4f50
commit 1fbddcb149
3 changed files with 60 additions and 40 deletions

View File

@ -256,25 +256,6 @@ static docstring const ogonek_def = from_ascii(
" \\mathchar\"0\\hexnumber@\\symtipasymb0C}{#2}}\n" " \\mathchar\"0\\hexnumber@\\symtipasymb0C}{#2}}\n"
"\\newcommand{\\ogonek}[1]{\\mathpalette\\doogonek{#1}}\n"); "\\newcommand{\\ogonek}[1]{\\mathpalette\\doogonek{#1}}\n");
static docstring const lyxref_def = from_ascii(
"\\makeatletter\n"
"\\def\\lyxref#1{\\@lyxref#1:@@@@@:}\n"
"\\def\\@lyxref#1:#2:{%\n"
"\\ifthenelse{\\equal{#2}{@@@@@}}%\n"
" {\\ref{#1}}%\n"
" {\\@@lyxref#1:#2:}%\n"
"}\n"
"\\def\\@@lyxref#1:#2:@@@@@:{%\n"
" \\RS@ifundefined{#1ref}%\n"
" {\\ref{#1:#2}}%\n"
" {\\RS@nameuse{#1ref}{#2}}%\n"
"}\n"
"\\RS@ifundefined{\thmref}\n"
" {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n"
" {}\n"
"\\makeatother\n"
);
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// //
// LaTeXFeatures // LaTeXFeatures
@ -921,9 +902,6 @@ docstring const LaTeXFeatures::getMacros() const
// floats // floats
getFloatDefinitions(macros); getFloatDefinitions(macros);
if (mustProvide("refstyle"))
macros << lyxref_def << '\n';
// change tracking // change tracking
if (mustProvide("ct-dvipost")) if (mustProvide("ct-dvipost"))
macros << changetracking_dvipost_def; macros << changetracking_dvipost_def;

View File

@ -24,6 +24,7 @@
#include "sgml.h" #include "sgml.h"
#include "TocBackend.h" #include "TocBackend.h"
#include "support/debug.h"
#include "support/docstream.h" #include "support/docstream.h"
#include "support/gettext.h" #include "support/gettext.h"
#include "support/lstrings.h" #include "support/lstrings.h"
@ -69,33 +70,63 @@ ParamInfo const & InsetRef::findInfo(string const & /* cmdName */)
} }
int InsetRef::latex(odocstream & os, OutputParams const & runparams) const // for refstyle, given pfx:suffix, we want to return "\\pfxcmd"
// and put "suffix" into label
docstring InsetRef::getFormattedCmd(
docstring const & ref, docstring & label) const
{
static docstring const defcmd = from_ascii("\\ref");
if (!buffer().params().use_refstyle)
return from_ascii("\\prettyref");
docstring prefix;
label = split(ref, prefix, ':');
if (prefix.empty()) {
LYXERR0("Label `" << label << "' contains no prefix.");
return defcmd;
}
// make sure the prefix is legal for a latex command
int const len = prefix.size();
for (int i = 0; i < len; i++) {
if (!isalpha(prefix[i])) {
LYXERR0("Prefix `" << prefix << "' contains non-letters.");
// restore the label
label = ref;
return defcmd;
}
}
return from_ascii("\\") + prefix + from_ascii("ref");
}
docstring InsetRef::getEscapedLabel(OutputParams const & rp) const
{
InsetCommandParams const & p = params();
ParamInfo const & pi = p.info();
ParamInfo::ParamData const & pd = pi["reference"];
return p.prepareCommand(rp, getParam("reference"), pd.handling());
}
int InsetRef::latex(odocstream & os, OutputParams const & rp) const
{ {
string const cmd = getCmdName(); string const cmd = getCmdName();
docstring const ref = getParam("reference");
if (cmd != "formatted") { if (cmd != "formatted") {
// We don't want to output p_["name"], since that is only used // We don't want to output p_["name"], since that is only used
// in docbook. So we construct new params, without it, and use that. // in docbook. So we construct new params, without it, and use that.
InsetCommandParams p(REF_CODE, cmd); InsetCommandParams p(REF_CODE, cmd);
docstring const ref = getParam("reference");
p["reference"] = ref; p["reference"] = ref;
os << p.getCommand(runparams); os << p.getCommand(rp);
return 0; return 0;
} }
// so we're doing a formatted reference. // so we're doing a formatted reference.
// the command may need to be escaped. docstring const data = getEscapedLabel(rp);
InsetCommandParams const & p = params(); docstring label;
ParamInfo const & pi = p.info(); docstring const fcmd = getFormattedCmd(data, label);
ParamInfo::ParamData const & pd = pi["reference"]; os << fcmd << '{' << label << '}';
docstring const data =
p.prepareCommand(runparams, ref, pd.handling());
if (!buffer().params().use_refstyle) {
os << "\\prettyref{" << data << '}';
return 0;
}
os << "\\lyxref{" << data << '}';
return 0; return 0;
} }
@ -235,7 +266,13 @@ void InsetRef::validate(LaTeXFeatures & features) const
else if (getCmdName() == "formatted") { else if (getCmdName() == "formatted") {
if (buffer().params().use_refstyle) { if (buffer().params().use_refstyle) {
features.require("refstyle"); features.require("refstyle");
features.require("ifthen"); docstring const data = getEscapedLabel(features.runparams());
docstring label;
string const fcmd = to_utf8(getFormattedCmd(data, label));
if (fcmd != "\\ref") {
string lcmd = "\\providecommand" + fcmd + "[1]{\\ref{#1}}";
features.addPreambleSnippet(lcmd);
}
} else } else
features.require("prettyref"); features.require("prettyref");
} else if (getCmdName() == "eqref" && !buffer().params().use_refstyle) } else if (getCmdName() == "eqref" && !buffer().params().use_refstyle)

View File

@ -17,7 +17,6 @@
namespace lyx { namespace lyx {
/// The reference inset /// The reference inset
class InsetRef : public InsetCommand { class InsetRef : public InsetCommand {
public: public:
@ -99,6 +98,12 @@ private:
Inset * clone() const { return new InsetRef(*this); } Inset * clone() const { return new InsetRef(*this); }
//@} //@}
/// \return the label with things that need to be escaped escaped
docstring getEscapedLabel(OutputParams const &) const;
/// \return the command for a formatted reference to ref
/// \param label gets what follows the prefix, for refstyle
docstring getFormattedCmd(docstring const & ref, docstring & label) const;
/// ///
mutable docstring screen_label_; mutable docstring screen_label_;
/// ///