From 1fbddcb14980ce58380f36a486af65406502d6ba Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Thu, 28 Oct 2010 15:15:14 +0000 Subject: [PATCH] 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 --- src/LaTeXFeatures.cpp | 22 ------------- src/insets/InsetRef.cpp | 71 +++++++++++++++++++++++++++++++---------- src/insets/InsetRef.h | 7 +++- 3 files changed, 60 insertions(+), 40 deletions(-) diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 172dfdadca..d99c0fc6f5 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -256,25 +256,6 @@ static docstring const ogonek_def = from_ascii( " \\mathchar\"0\\hexnumber@\\symtipasymb0C}{#2}}\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 @@ -921,9 +902,6 @@ docstring const LaTeXFeatures::getMacros() const // floats getFloatDefinitions(macros); - if (mustProvide("refstyle")) - macros << lyxref_def << '\n'; - // change tracking if (mustProvide("ct-dvipost")) macros << changetracking_dvipost_def; diff --git a/src/insets/InsetRef.cpp b/src/insets/InsetRef.cpp index aa8d628c9a..b3fa322f7c 100644 --- a/src/insets/InsetRef.cpp +++ b/src/insets/InsetRef.cpp @@ -24,6 +24,7 @@ #include "sgml.h" #include "TocBackend.h" +#include "support/debug.h" #include "support/docstream.h" #include "support/gettext.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(); - docstring const ref = getParam("reference"); if (cmd != "formatted") { // 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. InsetCommandParams p(REF_CODE, cmd); + docstring const ref = getParam("reference"); p["reference"] = ref; - os << p.getCommand(runparams); + os << p.getCommand(rp); return 0; } // so we're doing a formatted reference. - // the command may need to be escaped. - InsetCommandParams const & p = params(); - ParamInfo const & pi = p.info(); - ParamInfo::ParamData const & pd = pi["reference"]; - docstring const data = - p.prepareCommand(runparams, ref, pd.handling()); - - if (!buffer().params().use_refstyle) { - os << "\\prettyref{" << data << '}'; - return 0; - } - - os << "\\lyxref{" << data << '}'; + docstring const data = getEscapedLabel(rp); + docstring label; + docstring const fcmd = getFormattedCmd(data, label); + os << fcmd << '{' << label << '}'; return 0; } @@ -235,7 +266,13 @@ void InsetRef::validate(LaTeXFeatures & features) const else if (getCmdName() == "formatted") { if (buffer().params().use_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 features.require("prettyref"); } else if (getCmdName() == "eqref" && !buffer().params().use_refstyle) diff --git a/src/insets/InsetRef.h b/src/insets/InsetRef.h index 1b3df34f20..5d2483fe0f 100644 --- a/src/insets/InsetRef.h +++ b/src/insets/InsetRef.h @@ -17,7 +17,6 @@ namespace lyx { - /// The reference inset class InsetRef : public InsetCommand { public: @@ -98,6 +97,12 @@ private: /// 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_; -- 2.39.2