From 53436891f79150cdb053b52dfd38540b9652c9cc Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 14 Nov 2014 14:53:11 +0100 Subject: [PATCH] Let the Foot inset have a different Layout when inside a title This allows to address two main issues * \thanks does only accept one paragraph, while \footnote allows several (ticket #2666) * footnotes in titling environments were not numbered on screen. Moreover, the code reduces hardcoding of features, which is always a good thing. There are several pieces in this commit: * new numbering type \fnsymbol for counters * the Foot inset changes its layoutName() to Foot:InTitle when inside a paragraph with InTitle property. This is set when running updateBuffer. * Foot:intitle uses the \thanks command, does not allow multiple paragraphs and marks its contents as moving argument. * The InsetLayouts for Foot now have properLaTeXName/Type, so that InsetFoot::latex can be removed; further code simplification is probably possible. * HTML preamble has been updated (thanks rgheck). Fixes: #2666 --- lib/layouts/stdcounters.inc | 5 +++ lib/layouts/stdinsets.inc | 35 +++++++++++++++++++++ src/Counters.cpp | 21 +++++++++++++ src/insets/InsetFoot.cpp | 60 +++++++++++++++--------------------- src/insets/InsetFoot.h | 6 ++-- src/insets/InsetFootlike.cpp | 6 +++- 6 files changed, 94 insertions(+), 39 deletions(-) diff --git a/lib/layouts/stdcounters.inc b/lib/layouts/stdcounters.inc index f5b6e2f585..8750b386dd 100644 --- a/lib/layouts/stdcounters.inc +++ b/lib/layouts/stdcounters.inc @@ -71,3 +71,8 @@ End Counter footnote PrettyFormat "Footnote ##" End + +Counter thanks + PrettyFormat "Footnote ##" + LabelString "\fnsymbol{thanks}" +End diff --git a/lib/layouts/stdinsets.inc b/lib/layouts/stdinsets.inc index a0c0ce4deb..383da773cc 100644 --- a/lib/layouts/stdinsets.inc +++ b/lib/layouts/stdinsets.inc @@ -39,6 +39,8 @@ End InsetLayout Foot LabelString foot + LatexType Command + LatexName footnote Counter footnote Font Size Small @@ -76,6 +78,39 @@ InsetLayout Foot EndHTMLStyle End +InsetLayout Foot:InTitle + CopyStyle Foot + LatexName thanks + NeedProtect true + Counter thanks + MultiPar false + HTMLLabel \fnsymbol{thanks} + HTMLInnerTag span + HTMLStyle + span.foot_intitle_label { + vertical-align: super; + font-size: smaller; + font-weight: bold; + text-decoration: underline; + } + span.foot_intitle { + display: inline; + font-size: small; + font-weight: medium; + font-family: serif; + font-variant: normal; + font-style: normal; + } + span.foot_intitle_inner { display: none; } + span.foot_intitle:hover span.foot_intitle_inner { + display: block; + border: 1px double black; + margin: 0em 1em; + padding: 1em; + } + EndHTMLStyle +End + InsetLayout Note:Comment LabelString Comment LatexType environment diff --git a/src/Counters.cpp b/src/Counters.cpp index 5fb4f1b0b3..1c8bdf6e3b 100644 --- a/src/Counters.cpp +++ b/src/Counters.cpp @@ -444,6 +444,24 @@ docstring const lowerromanCounter(int const n) return lowercase(romanCounter(n)); } + +docstring const fnsymbolCounter(int const n) +{ + switch(n) { + case 1: return docstring(1, 0x002a); //* + case 2: return docstring(1, 0x2020); // dagger + case 3: return docstring(1, 0x2021); // double dagger + case 4: return docstring(1, 0x00A7); // section sign + case 5: return docstring(1, 0x00B6); // pilcrow sign + case 6: return docstring(1, 0x2016); // vertical bar + case 7: return docstring(2, 0x002a); // two * + case 8: return docstring(2, 0x2020); // two daggers + case 9: return docstring(2, 0x2021); // two double daggers + default: + return from_ascii("?"); + }; +} + } // namespace anon @@ -475,6 +493,9 @@ docstring Counters::labelItem(docstring const & ctr, if (numbertype == "Roman") return romanCounter(val); + if (numbertype == "fnsymbol") + return fnsymbolCounter(val); + return convert(val); } diff --git a/src/insets/InsetFoot.cpp b/src/insets/InsetFoot.cpp index 372bfabe39..5b107cf5d6 100644 --- a/src/insets/InsetFoot.cpp +++ b/src/insets/InsetFoot.cpp @@ -32,10 +32,16 @@ using namespace std; namespace lyx { InsetFoot::InsetFoot(Buffer * buf) - : InsetFootlike(buf) + : InsetFootlike(buf), intitle_(false) {} +docstring InsetFoot::layoutName() const +{ + return intitle_ ? from_ascii("Foot:InTitle") : from_ascii("Foot"); +} + + void InsetFoot::updateBuffer(ParIterator const & it, UpdateType utype) { BufferParams const & bp = buffer().masterBuffer()->params(); @@ -44,20 +50,27 @@ void InsetFoot::updateBuffer(ParIterator const & it, UpdateType utype) // the footnote counter is local to this inset cnts.saveLastCounter(); } - Paragraph const & outer = it.paragraph(); - if (!outer.layout().intitle) { - InsetLayout const & il = getLayout(); - docstring const & count = il.counter(); - custom_label_ = translateIfPossible(il.labelstring()); - if (cnts.hasCounter(count)) - cnts.step(count, utype); - custom_label_ += ' ' + - cnts.theCounter(count, outer.getParLanguage(bp)->code()); - setLabel(custom_label_); + + intitle_ = false; + for (size_type sl = 0 ; sl < it.depth() ; ++ sl) { + if (it[sl].text() && it[sl].paragraph().layout().intitle) { + intitle_ = true; + break; + } } + + Language const * lang = it.paragraph().getParLanguage(bp); + InsetLayout const & il = getLayout(); + docstring const & count = il.counter(); + custom_label_ = translateIfPossible(il.labelstring()); + if (cnts.hasCounter(count)) + cnts.step(count, utype); + custom_label_ += ' ' + cnts.theCounter(count, lang->code()); + setLabel(custom_label_); + InsetCollapsable::updateBuffer(it, utype); if (utype == OutputUpdate) - cnts.restoreLastCounter(); + cnts.restoreLastCounter(); } @@ -84,29 +97,6 @@ docstring InsetFoot::toolTip(BufferView const & bv, int x, int y) const } -void InsetFoot::latex(otexstream & os, OutputParams const & runparams_in) const -{ - OutputParams runparams = runparams_in; - // footnotes in titling commands like \title have moving arguments - runparams.moving_arg |= runparams_in.intitle; - - os << safebreakln; - if (runparams.lastid != -1) - os.texrow().start(runparams.lastid, runparams.lastpos); - - // in titling commands, \thanks should be used instead of \footnote. - // some classes (e.g. memoir) do not understand \footnote. - if (runparams_in.intitle) - os << "\\thanks{"; - else - os << "\\footnote{"; - - InsetText::latex(os, runparams); - os << "%\n}"; - runparams_in.encoding = runparams.encoding; -} - - int InsetFoot::plaintext(odocstringstream & os, OutputParams const & runparams, size_t max_length) const { diff --git a/src/insets/InsetFoot.h b/src/insets/InsetFoot.h index f308b142e6..165a7cf2b4 100644 --- a/src/insets/InsetFoot.h +++ b/src/insets/InsetFoot.h @@ -30,9 +30,7 @@ private: /// InsetCode lyxCode() const { return FOOT_CODE; } /// - docstring layoutName() const { return from_ascii("Foot"); } - /// - void latex(otexstream &, OutputParams const &) const; + docstring layoutName() const; /// int plaintext(odocstringstream & ods, OutputParams const & op, size_t max_length = INT_MAX) const; @@ -48,6 +46,8 @@ private: Inset * clone() const { return new InsetFoot(*this); } /// docstring custom_label_; + /// + bool intitle_; }; diff --git a/src/insets/InsetFootlike.cpp b/src/insets/InsetFootlike.cpp index 05d2ba8717..cb92320cdf 100644 --- a/src/insets/InsetFootlike.cpp +++ b/src/insets/InsetFootlike.cpp @@ -18,12 +18,15 @@ #include "Font.h" #include "MetricsInfo.h" +#include "support/lstrings.h" + #include using namespace std; namespace lyx { +using support::token; InsetFootlike::InsetFootlike(Buffer * buf) : InsetCollapsable(buf) @@ -50,7 +53,8 @@ void InsetFootlike::draw(PainterInfo & pi, int x, int y) const void InsetFootlike::write(ostream & os) const { - os << to_utf8(layoutName()) << "\n"; + // The layoutName may contain a "InTitle" qualifier + os << to_utf8(token(layoutName(), char_type(':'), 0)) << "\n"; InsetCollapsable::write(os); }