Support for nocite, provided by Bernhard Reiter.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22217 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2007-12-20 15:46:14 +00:00
parent 1f3234b3ae
commit e285d2a7d8
10 changed files with 139 additions and 60 deletions

View File

@ -1,6 +1,9 @@
LyX file-format changes
-----------------------
2007-12-11 Bernhard Reiter <ockham@gmx.net>
* Format incremented to 309: support for \nocite
2007-12-15 Uwe Stöhr <uwestoehr@web.de>
* Format incremented to 308: support for Serbian (Latin)

View File

@ -80,7 +80,7 @@ format_relation = [("0_06", [200], minor_versions("0.6" , 4)),
("1_3", [221], minor_versions("1.3" , 7)),
("1_4", range(222,246), minor_versions("1.4" , 5)),
("1_5", range(246,277), minor_versions("1.5" , 2)),
("1_6", range(277,309), minor_versions("1.6" , 0))] # Uwe: Serbian-Latin
("1_6", range(277,310), minor_versions("1.6" , 0))] # Bernhard Reiter: nocite
def formats_list():

View File

@ -945,6 +945,39 @@ def revert_nobreakdash(document):
document.header[j] = "\\use_amsmath 2"
def revert_nocite_key(body, start, end):
'key "..." -> \nocite{...}'
for i in range(start, end):
if (body[i][0:5] == 'key "'):
body[i] = body[i].replace('key "', "\\backslash\nnocite{")
body[i] = body[i].replace('"', "}")
else:
body[i] = ""
def revert_nocite(document):
"Revert LatexCommand nocite to ERT"
i = 0
while 1:
i = find_token(document.body, "\\begin_inset CommandInset citation", i)
if i == -1:
return
i = i + 1
if (document.body[i] == "LatexCommand nocite"):
j = find_end_of_inset(document.body, i + 1)
if j == -1:
#this should not happen
document.warning("End of CommandInset citation not found in revert_nocite!")
revert_nocite_key(document.body, i + 1, len(document.body))
return
revert_nocite_key(document.body, i + 1, j)
document.body[i-1] = "\\begin_inset ERT"
document.body[i] = "status collapsed\n\n" \
"\\begin_layout Standard"
document.body.insert(j, "\\end_layout\n");
i = j
def revert_bahasam(document):
"Set language Bahasa Malaysia to Bahasa Indonesia"
i = 0
@ -1032,10 +1065,12 @@ convert = [[277, [fix_wrong_tables]],
[305, []],
[306, []],
[307, []],
[308, []]
[308, []],
[309, []]
]
revert = [[307, [revert_serbianlatin]],
revert = [[308, [revert_nocite]],
[307, [revert_serbianlatin]],
[306, [revert_slash, revert_nobreakdash]],
[305, [revert_interlingua]],
[304, [revert_bahasam]],

View File

@ -282,7 +282,8 @@ vector<docstring> const BiblioInfo::getCiteStrings(
docstring const & key, Buffer const & buf) const
{
biblio::CiteEngine const engine = buf.params().getEngine();
if (engine == biblio::ENGINE_NATBIB_NUMERICAL)
if (engine == biblio::ENGINE_BASIC ||
engine == biblio::ENGINE_NATBIB_NUMERICAL)
return getNumericalStrings(key, buf);
else
return getAuthorYearStrings(key, buf);
@ -304,7 +305,7 @@ vector<docstring> const BiblioInfo::getNumericalStrings(
biblio::getCiteStyles(buf.params().getEngine());
vector<docstring> vec(styles.size());
for (size_t i = 0; i != vec.size(); ++i) {
for (vector<docstring>::size_type i = 0; i != vec.size(); ++i) {
docstring str;
switch (styles[i]) {
@ -313,6 +314,10 @@ vector<docstring> const BiblioInfo::getNumericalStrings(
str = from_ascii("[#ID]");
break;
case biblio::NOCITE:
str = _("Add to bibliography only.");
break;
case biblio::CITET:
str = author + " [#ID]";
break;
@ -370,6 +375,10 @@ vector<docstring> const BiblioInfo::getAuthorYearStrings(
str = author + "/<" + _("before") + '>';
break;
case biblio::NOCITE:
str = _("Add to bibliography only.");
break;
case biblio::CITET:
str = author + " (" + year + ')';
break;
@ -435,15 +444,15 @@ namespace {
char const * const citeCommands[] = {
"cite", "citet", "citep", "citealt", "citealp", "citeauthor",
"citeyear", "citeyearpar" };
"cite", "nocite", "citet", "citep", "citealt", "citealp",
"citeauthor", "citeyear", "citeyearpar" };
unsigned int const nCiteCommands =
sizeof(citeCommands) / sizeof(char *);
CiteStyle const citeStyles[] = {
CITE, CITET, CITEP, CITEALT, CITEALP,
CITEAUTHOR, CITEYEAR, CITEYEARPAR };
CITE, NOCITE, CITET, CITEP, CITEALT,
CITEALP, CITEAUTHOR, CITEYEAR, CITEYEARPAR };
unsigned int const nCiteStyles =
sizeof(citeStyles) / sizeof(CiteStyle);
@ -517,7 +526,7 @@ vector<CiteStyle> const getCiteStyles(CiteEngine const engine)
switch (engine) {
case ENGINE_BASIC:
nStyles = 1;
nStyles = 2;
start = 0;
break;
case ENGINE_NATBIB_AUTHORYEAR:

View File

@ -36,6 +36,7 @@ enum CiteEngine {
enum CiteStyle {
CITE,
NOCITE,
CITET,
CITEP,
CITEALT,

View File

@ -118,7 +118,7 @@ namespace os = support::os;
namespace {
int const LYX_FORMAT = 308; // Uwe: Serbian-Latin
int const LYX_FORMAT = 309; // Bernhard Reiter: support for \nocite
} // namespace anon

View File

@ -82,7 +82,7 @@ GuiCitation::GuiCitation(GuiView & lv)
setViewTitle(_("Citation"));
connect(citationStyleCO, SIGNAL(activated(int)),
this, SLOT(changed()));
this, SLOT(on_citationStyleCO_currentIndexChanged(int)));
connect(fulllistCB, SIGNAL(clicked()),
this, SLOT(changed()));
connect(forceuppercaseCB, SIGNAL(clicked()),
@ -188,7 +188,7 @@ void GuiCitation::updateView()
// called in update() do not need to be called for INTERNAL updates,
// such as when addPB is pressed, as the list of fields, entries, etc,
// will not have changed. At the moment, however, the division between
// fillStyles() and updateStyles() doesn't lend itself to dividing the
// fillStyles() and updateStyle() doesn't lend itself to dividing the
// two methods, though they should be divisible.
void GuiCitation::updateDialog()
{
@ -212,7 +212,7 @@ void GuiCitation::updateDialog()
}
void GuiCitation::updateStyle()
void GuiCitation::updateFormatting(biblio::CiteStyle currentStyle)
{
biblio::CiteEngine const engine = getEngine();
bool const natbib_engine =
@ -222,15 +222,22 @@ void GuiCitation::updateStyle()
bool const haveSelection =
selectedLV->model()->rowCount() > 0;
fulllistCB->setEnabled(natbib_engine && haveSelection);
forceuppercaseCB->setEnabled(natbib_engine && haveSelection);
textBeforeED->setEnabled(!basic_engine && haveSelection);
textBeforeLA->setEnabled(!basic_engine && haveSelection);
textAfterED->setEnabled(haveSelection);
textAfterLA->setEnabled(haveSelection);
citationStyleCO->setEnabled(!basic_engine && haveSelection);
citationStyleLA->setEnabled(!basic_engine && haveSelection);
bool const isNocite = currentStyle == biblio::NOCITE;
fulllistCB->setEnabled(natbib_engine && haveSelection && !isNocite);
forceuppercaseCB->setEnabled(natbib_engine && haveSelection && !isNocite);
textBeforeED->setEnabled(!basic_engine && haveSelection && !isNocite);
textBeforeLA->setEnabled(!basic_engine && haveSelection && !isNocite);
textAfterED->setEnabled(haveSelection && !isNocite);
textAfterLA->setEnabled(haveSelection && !isNocite);
citationStyleCO->setEnabled(haveSelection);
citationStyleLA->setEnabled(haveSelection);
}
void GuiCitation::updateStyle()
{
string const & command = params_.getCmdName();
// Find the style of the citekeys
@ -255,9 +262,9 @@ void GuiCitation::updateStyle()
fulllistCB->setChecked(false);
forceuppercaseCB->setChecked(false);
}
updateFormatting(cs.style);
}
//This one needs to be called whenever citationStyleCO needs
//to be updated---and this would be on anything that changes the
//selection in selectedLV, or on a general update.
@ -283,12 +290,10 @@ void GuiCitation::fillStyles()
QStringList sty = citationStyles(curr);
bool const basic_engine = (getEngine() == biblio::ENGINE_BASIC);
citationStyleCO->setEnabled(!sty.isEmpty());
citationStyleLA->setEnabled(!sty.isEmpty());
citationStyleCO->setEnabled(!sty.isEmpty() && !basic_engine);
citationStyleLA->setEnabled(!sty.isEmpty() && !basic_engine);
if (sty.isEmpty() || basic_engine)
if (sty.isEmpty())
return;
citationStyleCO->insertItems(0, sty);
@ -403,6 +408,15 @@ void GuiCitation::on_entriesCO_currentIndexChanged(int /*index*/)
}
void GuiCitation::on_citationStyleCO_currentIndexChanged(int index)
{
if (index >= 0 && index < citationStyleCO->count()) {
vector<biblio::CiteStyle> const & styles = citeStyles_;
updateFormatting(styles[index]);
}
}
void GuiCitation::on_findLE_textChanged(const QString & text)
{
clearPB->setDisabled(text.isEmpty());
@ -426,19 +440,24 @@ void GuiCitation::on_regexCB_stateChanged(int)
void GuiCitation::changed()
{
fillStyles();
setButtons();
}
void GuiCitation::apply(int const choice, bool const full, bool const force,
void GuiCitation::apply(int const choice, bool full, bool force,
QString before, QString after)
{
if (cited_keys_.isEmpty())
return;
vector<biblio::CiteStyle> const & styles = citeStyles_;
if (styles[choice] == biblio::NOCITE) {
full = false;
force = false;
before.clear();
after.clear();
}
string const command =
biblio::CitationStyle(styles[choice], full, force)
.asLatexStr();
@ -575,17 +594,9 @@ bool GuiCitation::initialiseParams(string const & data)
biblio::CiteEngine const engine = buffer().params().getEngine();
bool use_styles = engine != biblio::ENGINE_BASIC;
bibkeysInfo_.fillWithBibKeys(&buffer());
if (citeStyles_.empty())
citeStyles_ = biblio::getCiteStyles(engine);
else {
if ((use_styles && citeStyles_.size() == 1) ||
(!use_styles && citeStyles_.size() != 1))
citeStyles_ = biblio::getCiteStyles(engine);
}
citeStyles_ = biblio::getCiteStyles(engine);
return true;
}

View File

@ -65,6 +65,7 @@ private Q_SLOTS:
void on_findLE_textChanged(const QString & text);
void on_fieldsCO_currentIndexChanged(int index);
void on_entriesCO_currentIndexChanged(int index);
void on_citationStyleCO_currentIndexChanged(int index);
void on_caseCB_stateChanged(int);
void on_regexCB_stateChanged(int);
void changed();
@ -84,6 +85,8 @@ private:
void fillEntries();
/// set the styles combo
void updateStyle();
/// set the formatting widgets
void updateFormatting(biblio::CiteStyle currentStyle);
/// last used citation style
int style_;

View File

@ -17,6 +17,7 @@
#include "BufferParams.h"
#include "support/debug.h"
#include "DispatchResult.h"
#include "support/gettext.h"
#include "FuncRequest.h"
#include "LaTeXFeatures.h"
@ -36,7 +37,7 @@ namespace {
vector<string> const init_possible_cite_commands()
{
char const * const possible[] = {
"cite", "citet", "citep", "citealt", "citealp",
"cite", "nocite", "citet", "citep", "citealt", "citealp",
"citeauthor", "citeyear", "citeyearpar",
"citet*", "citep*", "citealt*", "citealp*", "citeauthor*",
"Citet", "Citep", "Citealt", "Citealp", "Citeauthor",
@ -91,7 +92,7 @@ string const
string output;
switch (engine) {
case biblio::ENGINE_BASIC:
output = default_str;
output = input;
break;
case biblio::ENGINE_NATBIB_AUTHORYEAR:
@ -125,7 +126,7 @@ string const
}
docstring const getNatbibLabel(Buffer const & buffer,
docstring const getComplexLabel(Buffer const & buffer,
string const & citeType, docstring const & keyList,
docstring const & before, docstring const & after,
biblio::CiteEngine engine)
@ -209,16 +210,25 @@ docstring const getNatbibLabel(Buffer const & buffer,
}
docstring after_str;
if (!after.empty()) {
// The "after" key is appended only to the end of the whole.
// The "after" key is appended only to the end of the whole.
if (cite_type == "nocite")
after_str = " (" + _("not cited") + ')';
else if (!after.empty()) {
after_str = ", " + after;
}
// One day, these might be tunable (as they are in BibTeX).
char const op = '('; // opening parenthesis.
char const cp = ')'; // closing parenthesis.
// puctuation mark separating citation entries.
char const * const sep = ";";
char op, cp; // opening and closing parenthesis.
char * sep; // punctuation mark separating citation entries.
if (engine == biblio::ENGINE_BASIC) {
op = '[';
cp = ']';
sep = ",";
} else {
op = '(';
cp = ')';
sep = ";";
}
docstring const op_str = ' ' + docstring(1, op);
docstring const cp_str = docstring(1, cp) + ' ';
@ -239,11 +249,19 @@ docstring const getNatbibLabel(Buffer const & buffer,
// authors1/<before>; ... ;
// authors_last, <after>
if (cite_type == "cite" && engine == biblio::ENGINE_JURABIB) {
if (it == keys.begin())
label += author + before_str + sep_str;
else
label += author + sep_str;
if (cite_type == "cite") {
if (engine == biblio::ENGINE_BASIC) {
label += *it + sep_str;
} else if (engine == biblio::ENGINE_JURABIB) {
if (it == keys.begin())
label += author + before_str + sep_str;
else
label += author + sep_str;
}
// nocite
} else if (cite_type == "nocite") {
label += *it + sep_str;
// (authors1 (<before> year); ... ;
// authors_last (<before> year, <after>)
@ -324,7 +342,8 @@ docstring const getNatbibLabel(Buffer const & buffer,
label = before_str + label;
}
if (cite_type == "citep" || cite_type == "citeyearpar")
if (cite_type == "citep" || cite_type == "citeyearpar" ||
(cite_type == "cite" && engine == biblio::ENGINE_BASIC) )
label = op + label + cp;
return label;
@ -390,10 +409,8 @@ docstring const InsetCitation::generateLabel(Buffer const & buffer) const
docstring label;
biblio::CiteEngine const engine = buffer.params().getEngine();
if (engine != biblio::ENGINE_BASIC) {
label = getNatbibLabel(buffer, getCmdName(), getParam("key"),
before, after, engine);
}
label = getComplexLabel(buffer, getCmdName(), getParam("key"),
before, after, engine);
// Fallback to fail-safe
if (label.empty())

View File

@ -87,7 +87,7 @@ string parse_text_snippet(Parser & p, unsigned flags, const bool outer,
}
char const * const known_latex_commands[] = { "ref", "cite", "label",
char const * const known_latex_commands[] = { "ref", "cite", "nocite", "label",
"index", "printindex", "pageref", "url", "vref", "vpageref", "prettyref",
"eqref", 0 };