]> git.lyx.org Git - features.git/commitdiff
Let the Foot inset have a different Layout when inside a title
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 14 Nov 2014 13:53:11 +0000 (14:53 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 21 Nov 2014 09:23:56 +0000 (10:23 +0100)
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.

Fixes: #2666
lib/layouts/stdcounters.inc
lib/layouts/stdinsets.inc
src/Counters.cpp
src/insets/InsetFoot.cpp
src/insets/InsetFoot.h
src/insets/InsetFootlike.cpp

index f5b6e2f585ae820c009106cf5bf8a2235d0ca502..8750b386ddcb8af0f3838d29ad37a1bd2660164e 100644 (file)
@@ -71,3 +71,8 @@ End
 Counter footnote
        PrettyFormat         "Footnote ##"
 End
+
+Counter thanks
+       PrettyFormat         "Footnote ##"
+       LabelString          "\fnsymbol{thanks}"
+End
index a0c0ce4debfe424d1f622bf1ef1fa203d5ca4dcf..eb14595f12d49ae73c65d1779bd94eb2870ed0b9 100644 (file)
@@ -39,6 +39,8 @@ End
 
 InsetLayout Foot
        LabelString           foot
+       LatexType             Command
+       LatexName             footnote
        Counter               footnote
        Font
          Size                Small
@@ -76,6 +78,16 @@ InsetLayout Foot
        EndHTMLStyle
 End
 
+InsetLayout Foot:InTitle
+       CopyStyle             Foot
+       LatexName             thanks
+       NeedProtect           true
+       Counter               thanks
+       MultiPar              false
+       # FIXME: this is probably not correct
+       HTMLLabel             \arabic{thanks}
+End
+
 InsetLayout Note:Comment
        LabelString           Comment
        LatexType             environment
index 5fb4f1b0b398732fd33891238aed0e6c0351d695..1c8bdf6e3b9fecfb3bbe4420c8a46d06c480d9ad 100644 (file)
@@ -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<docstring>(val);
 }
 
index bfb637e49831dfc8f082644045539ab85a82f6a5..9df6f5d590f60073648efd7bc38475951f4c3244 100644 (file)
@@ -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
 {
index f308b142e6cb244ab9170a6d9dd1f9ff6f8559fe..165a7cf2b42427b721f62d6f6f60feb30a663f04 100644 (file)
@@ -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_;
 };
 
 
index 05d2ba87173ac1fade4d569cef061be8c1b9a0fa..cb92320cdfa048ff5a04c6ed28f6dec3888d7e97 100644 (file)
 #include "Font.h"
 #include "MetricsInfo.h"
 
+#include "support/lstrings.h"
+
 #include <iostream>
 
 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);
 }