mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-09-20 06:49:56 +00:00
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
This commit is contained in:
parent
565cb2a3f0
commit
53436891f7
@ -71,3 +71,8 @@ End
|
|||||||
Counter footnote
|
Counter footnote
|
||||||
PrettyFormat "Footnote ##"
|
PrettyFormat "Footnote ##"
|
||||||
End
|
End
|
||||||
|
|
||||||
|
Counter thanks
|
||||||
|
PrettyFormat "Footnote ##"
|
||||||
|
LabelString "\fnsymbol{thanks}"
|
||||||
|
End
|
||||||
|
@ -39,6 +39,8 @@ End
|
|||||||
|
|
||||||
InsetLayout Foot
|
InsetLayout Foot
|
||||||
LabelString foot
|
LabelString foot
|
||||||
|
LatexType Command
|
||||||
|
LatexName footnote
|
||||||
Counter footnote
|
Counter footnote
|
||||||
Font
|
Font
|
||||||
Size Small
|
Size Small
|
||||||
@ -76,6 +78,39 @@ InsetLayout Foot
|
|||||||
EndHTMLStyle
|
EndHTMLStyle
|
||||||
End
|
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
|
InsetLayout Note:Comment
|
||||||
LabelString Comment
|
LabelString Comment
|
||||||
LatexType environment
|
LatexType environment
|
||||||
|
@ -444,6 +444,24 @@ docstring const lowerromanCounter(int const n)
|
|||||||
return lowercase(romanCounter(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
|
} // namespace anon
|
||||||
|
|
||||||
|
|
||||||
@ -475,6 +493,9 @@ docstring Counters::labelItem(docstring const & ctr,
|
|||||||
if (numbertype == "Roman")
|
if (numbertype == "Roman")
|
||||||
return romanCounter(val);
|
return romanCounter(val);
|
||||||
|
|
||||||
|
if (numbertype == "fnsymbol")
|
||||||
|
return fnsymbolCounter(val);
|
||||||
|
|
||||||
return convert<docstring>(val);
|
return convert<docstring>(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,10 +32,16 @@ using namespace std;
|
|||||||
namespace lyx {
|
namespace lyx {
|
||||||
|
|
||||||
InsetFoot::InsetFoot(Buffer * buf)
|
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)
|
void InsetFoot::updateBuffer(ParIterator const & it, UpdateType utype)
|
||||||
{
|
{
|
||||||
BufferParams const & bp = buffer().masterBuffer()->params();
|
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
|
// the footnote counter is local to this inset
|
||||||
cnts.saveLastCounter();
|
cnts.saveLastCounter();
|
||||||
}
|
}
|
||||||
Paragraph const & outer = it.paragraph();
|
|
||||||
if (!outer.layout().intitle) {
|
intitle_ = false;
|
||||||
InsetLayout const & il = getLayout();
|
for (size_type sl = 0 ; sl < it.depth() ; ++ sl) {
|
||||||
docstring const & count = il.counter();
|
if (it[sl].text() && it[sl].paragraph().layout().intitle) {
|
||||||
custom_label_ = translateIfPossible(il.labelstring());
|
intitle_ = true;
|
||||||
if (cnts.hasCounter(count))
|
break;
|
||||||
cnts.step(count, utype);
|
}
|
||||||
custom_label_ += ' ' +
|
|
||||||
cnts.theCounter(count, outer.getParLanguage(bp)->code());
|
|
||||||
setLabel(custom_label_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
InsetCollapsable::updateBuffer(it, utype);
|
||||||
if (utype == OutputUpdate)
|
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,
|
int InsetFoot::plaintext(odocstringstream & os,
|
||||||
OutputParams const & runparams, size_t max_length) const
|
OutputParams const & runparams, size_t max_length) const
|
||||||
{
|
{
|
||||||
|
@ -30,9 +30,7 @@ private:
|
|||||||
///
|
///
|
||||||
InsetCode lyxCode() const { return FOOT_CODE; }
|
InsetCode lyxCode() const { return FOOT_CODE; }
|
||||||
///
|
///
|
||||||
docstring layoutName() const { return from_ascii("Foot"); }
|
docstring layoutName() const;
|
||||||
///
|
|
||||||
void latex(otexstream &, OutputParams const &) const;
|
|
||||||
///
|
///
|
||||||
int plaintext(odocstringstream & ods, OutputParams const & op,
|
int plaintext(odocstringstream & ods, OutputParams const & op,
|
||||||
size_t max_length = INT_MAX) const;
|
size_t max_length = INT_MAX) const;
|
||||||
@ -48,6 +46,8 @@ private:
|
|||||||
Inset * clone() const { return new InsetFoot(*this); }
|
Inset * clone() const { return new InsetFoot(*this); }
|
||||||
///
|
///
|
||||||
docstring custom_label_;
|
docstring custom_label_;
|
||||||
|
///
|
||||||
|
bool intitle_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,12 +18,15 @@
|
|||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#include "MetricsInfo.h"
|
#include "MetricsInfo.h"
|
||||||
|
|
||||||
|
#include "support/lstrings.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
|
|
||||||
|
using support::token;
|
||||||
|
|
||||||
InsetFootlike::InsetFootlike(Buffer * buf)
|
InsetFootlike::InsetFootlike(Buffer * buf)
|
||||||
: InsetCollapsable(buf)
|
: InsetCollapsable(buf)
|
||||||
@ -50,7 +53,8 @@ void InsetFootlike::draw(PainterInfo & pi, int x, int y) const
|
|||||||
|
|
||||||
void InsetFootlike::write(ostream & os) 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);
|
InsetCollapsable::write(os);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user