From 0f30a858f868a2cd7d9412894feed2835865743f Mon Sep 17 00:00:00 2001 From: Julien Rioux Date: Mon, 12 Dec 2011 14:40:34 +0000 Subject: [PATCH] Add a document-wide default bibliography style \biblio_style. This holds the name of a BibTeX style file for now. Any BibTeX inset can set the style to "default" to use the document-wide style. LyX format incremented to 420. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40484 a592a061-630c-0410-9148-cb99ea01b6c8 --- development/FORMAT | 5 ++++ lib/lyx2lyx/lyx_2_1.py | 47 +++++++++++++++++++++++++++++++++++--- src/BufferParams.cpp | 5 ++++ src/BufferParams.h | 3 +++ src/insets/InsetBibtex.cpp | 3 +++ src/version.h | 4 ++-- 6 files changed, 62 insertions(+), 5 deletions(-) diff --git a/development/FORMAT b/development/FORMAT index 965dfd8fe3..d133dea45e 100644 --- a/development/FORMAT +++ b/development/FORMAT @@ -11,6 +11,11 @@ adjustments are made to tex2lyx and bugs are fixed in lyx2lyx. ----------------------- +2011-12-12 Julien Rioux + * Format incremented to 420 (r40484) + New buffer param \biblio_style to specify a document-wide + default bibliography style (BibTeX style for the moment). + 2011-12-09 Uwe Stöhr * Format incremented to 419 (r40452) support for the document languages australian and newzealand diff --git a/lib/lyx2lyx/lyx_2_1.py b/lib/lyx2lyx/lyx_2_1.py index 15e02ca8f8..fccea99ef7 100644 --- a/lib/lyx2lyx/lyx_2_1.py +++ b/lib/lyx2lyx/lyx_2_1.py @@ -25,8 +25,8 @@ import sys, os # Uncomment only what you need to import, please. -from parser_tools import find_token, find_end_of_inset, get_value, \ - del_token +from parser_tools import del_token, find_token, find_end_of_inset, get_value, \ + get_quoted_value #from parser_tools import find_token, find_end_of, find_tokens, \ #find_token_exact, find_end_of_inset, find_end_of_layout, \ @@ -222,6 +222,45 @@ def revert_australian(document): j += 1 +def convert_biblio_style(document): + "Add a sensible default for \\biblio_style based on the citation engine." + i = find_token(document.header, "\\cite_engine", 0) + if i != -1: + engine = get_value(document.header, "\\cite_engine", i).split("_")[0] + style = {"basic": "plain", "natbib": "plainnat", "jurabib": "jurabib"} + document.header.insert(i + 1, "\\biblio_style " + style[engine]) + + +def revert_biblio_style(document): + "BibTeX insets with default option use the style defined by \\biblio_style." + i = find_token(document.header, "\\biblio_style" , 0) + if i == -1: + document.warning("No \\biblio_style line. Nothing to do.") + return + + default_style = get_value(document.header, "\\biblio_style", i) + del document.header[i] + + # We are looking for bibtex insets having the default option + i = 0 + while True: + i = find_token(document.body, "\\begin_inset CommandInset bibtex", i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of bibtex inset at line " + str(i)) + i += 1 + return + k = find_token(document.body, "options", i, j) + if k != -1: + options = get_quoted_value(document.body, "options", k) + if "default" in options.split(","): + document.body[k] = 'options "%s"' \ + % options.replace("default", default_style) + i = j + + ## # Conversion hub # @@ -233,10 +272,12 @@ convert = [ [416, []], [417, [convert_japanese_encodings]], [418, []], - [419, []] + [419, []], + [420, [convert_biblio_style]], ] revert = [ + [419, [revert_biblio_style]], [418, [revert_australian]], [417, [revert_justification]], [416, [revert_japanese_encodings]], diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index e709cc6167..38f298c76f 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -367,6 +367,7 @@ BufferParams::BufferParams() use_mathdots = package_auto; use_undertilde = package_auto; cite_engine_ = ENGINE_BASIC; + biblio_style = "plain"; use_bibtopic = false; use_indices = false; trackChanges = false; @@ -698,6 +699,9 @@ string BufferParams::readToken(Lexer & lex, string const & token, string engine; lex >> engine; cite_engine_ = citeenginetranslator().find(engine); + } else if (token == "\\biblio_style") { + lex.eatLine(); + biblio_style = lex.getString(); } else if (token == "\\use_bibtopic") { lex >> use_bibtopic; } else if (token == "\\use_indices") { @@ -1001,6 +1005,7 @@ void BufferParams::writeFile(ostream & os) const << "\n\\use_mathdots " << use_mathdots << "\n\\use_undertilde " << use_undertilde << "\n\\cite_engine " << citeenginetranslator().find(cite_engine_) + << "\n\\biblio_style " << biblio_style << "\n\\use_bibtopic " << convert(use_bibtopic) << "\n\\use_indices " << convert(use_indices) << "\n\\paperorientation " << string_orientation[orientation] diff --git a/src/BufferParams.h b/src/BufferParams.h index 4a483b9948..5432a094ef 100644 --- a/src/BufferParams.h +++ b/src/BufferParams.h @@ -413,6 +413,9 @@ public: /// void setCiteEngine(CiteEngine const); + /// the default BibTeX style file for the document + std::string biblio_style; + /// options for pdf output PDFOptions & pdfoptions(); PDFOptions const & pdfoptions() const; diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index 9f85e2db6a..bd956330d8 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -336,6 +336,9 @@ void InsetBibtex::latex(otexstream & os, OutputParams const & runparams) const style = split(style, bibtotoc, ','); } + if (style == "default") + style = buffer().params().biblio_style; + if (!style.empty()) { string base = normalizeName(buffer(), runparams, style, ".bst"); FileName const try_in_file = diff --git a/src/version.h b/src/version.h index 3beaf9c4aa..92e2958b44 100644 --- a/src/version.h +++ b/src/version.h @@ -30,8 +30,8 @@ extern char const * const lyx_version_info; // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -#define LYX_FORMAT_LYX 419 // uwestoehr: support for the languages australian and newzealand -#define LYX_FORMAT_TEX2LYX 419 +#define LYX_FORMAT_LYX 420 // jrioux : document-wide bibliography style +#define LYX_FORMAT_TEX2LYX 420 // jrioux : document-wide bibliography style #if LYX_FORMAT_FOR_TEX2LYX != LYX_FORMAT_FOR_LYX #warning "tex2lyx produces an out of date file format."