]> git.lyx.org Git - features.git/blob - src/Layout.h
Convenience LFUN to split an environment
[features.git] / src / Layout.h
1 // -*- C++ -*-
2 /**
3  * \file Layout.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Lars Gullik Bjønnes
8  * \author Jean-Marc Lasgouttes
9  * \author André Pönitz
10  *
11  * Full author contact details are available in file CREDITS.
12  */
13
14 #ifndef LAYOUT_H
15 #define LAYOUT_H
16
17 #include "FontInfo.h"
18 #include "LayoutEnums.h"
19 #include "Spacing.h"
20 #include "support/debug.h"
21 #include "support/docstring.h"
22
23 #include <map>
24 #include <set>
25 #include <string>
26
27 namespace lyx {
28
29 class Lexer;
30 class TextClass;
31
32 /* Fixed labels are printed flushright, manual labels flushleft.
33  * MARGIN_MANUAL and MARGIN_FIRST_DYNAMIC are *only* for LABEL_MANUAL,
34  * MARGIN_DYNAMIC and MARGIN_STATIC are *not* for LABEL_MANUAL.
35  * This seems a funny restriction, but I think other combinations are
36  * not needed, so I will not change it yet.
37  * Correction: MARGIN_FIRST_DYNAMIC also usable with LABEL_STATIC.
38  */
39
40
41 /* There is a parindent and a parskip. Which one is used depends on the
42  * paragraph_separation-flag of the text-object.
43  * BUT: parindent is only thrown away, if a parskip is defined! So if you
44  * want a space between the paragraphs and a parindent at the same time,
45  * you should set parskip to zero and use topsep, parsep and bottomsep.
46  *
47  * The standard layout is an exception: its parindent is only set, if the
48  * previous paragraph is standard too. Well, this is LateX and it is good!
49  */
50
51 ///
52 class Layout {
53 public:
54         ///
55         Layout();
56         /// is this layout a default layout created for an unknown layout
57         bool isUnknown() const { return unknown_; }
58         void setUnknown(bool unknown) { unknown_ = unknown; }
59         /// Reads a layout definition from file
60         /// \return true on success.
61         bool read(Lexer &, TextClass const &);
62         ///
63         void readAlign(Lexer &);
64         ///
65         void readAlignPossible(Lexer &);
66         ///
67         void readLabelType(Lexer &);
68         ///
69         void readEndLabelType(Lexer &);
70         ///
71         void readMargin(Lexer &);
72         ///
73         void readLatexType(Lexer &);
74         ///
75         void readSpacing(Lexer &);
76         ///
77         void readArgument(Lexer &);
78         ///
79         docstring const & name() const { return name_; }
80         ///
81         void setName(docstring const & n) { name_ = n; }
82         ///
83         docstring const & obsoleted_by() const { return obsoleted_by_; }
84         ///
85         docstring const & depends_on() const { return depends_on_; }
86         ///
87         std::string const & latexname() const { return latexname_; }
88         ///
89         std::string const & itemcommand() const { return itemcommand_; }
90         ///
91         void setLatexName(std::string const & n) { latexname_ = n; }
92         /// The arguments of this layout
93         struct latexarg {
94                 docstring labelstring;
95                 docstring menustring;
96                 bool mandatory;
97                 docstring ldelim;
98                 docstring rdelim;
99                 docstring presetarg;
100                 docstring tooltip;
101                 std::string requires;
102                 std::string decoration;
103                 FontInfo font;
104                 FontInfo labelfont;
105                 bool autoinsert;
106         };
107         ///
108         typedef std::map<std::string, latexarg> LaTeXArgMap;
109         ///
110         LaTeXArgMap args() const;
111         ///
112         LaTeXArgMap const & latexargs() const { return latexargs_; }
113         ///
114         LaTeXArgMap const & itemargs() const { return itemargs_; }
115         ///
116         int optArgs() const;
117         ///
118         int requiredArgs() const;
119         ///
120         docstring const & labelstring(bool in_appendix) const 
121         { return in_appendix ? labelstring_appendix_ : labelstring_; }
122         ///
123         docstring const & endlabelstring() const { return endlabelstring_; }
124         ///
125         docstring const & category() const { return category_; }
126         ///
127         docstring const & preamble() const { return preamble_; }
128         /// Get language dependent macro definitions needed for this layout
129         /// for language \p lang
130         docstring const langpreamble() const { return langpreamble_; }
131         /// Get language and babel dependent macro definitions needed for
132         /// this layout for language \p lang
133         docstring const babelpreamble() const { return babelpreamble_; }
134         ///
135         std::set<std::string> const & requires() const { return requires_; }
136         ///
137         std::string const & latexparam() const { return latexparam_; }
138         ///
139         docstring leftdelim() const { return leftdelim_; }
140         ///
141         docstring rightdelim() const { return rightdelim_; }
142         ///
143         std::string const & innertag() const { return innertag_; }
144         ///
145         std::string const & labeltag() const { return labeltag_; }
146         ///
147         std::string const & itemtag() const { return itemtag_; }
148         /// 
149         std::string const & htmltag() const;
150         /// 
151         std::string const & htmlattr() const;
152         /// 
153         std::string const & htmlitemtag() const;
154         /// 
155         std::string const & htmlitemattr() const;
156         /// 
157         std::string const & htmllabeltag() const;
158         /// 
159         std::string const & htmllabelattr() const;
160         ///
161         std::string defaultCSSClass() const;
162         ///
163         bool htmllabelfirst() const { return htmllabelfirst_; }
164         /// 
165         docstring htmlstyle() const;
166         /// 
167         docstring const & htmlpreamble() const { return htmlpreamble_; }
168         ///
169         bool htmltitle() const { return htmltitle_; }
170         ///
171         bool isParagraph() const { return latextype == LATEX_PARAGRAPH; }
172         ///
173         bool isCommand() const { return latextype == LATEX_COMMAND; }
174         ///
175         bool isEnvironment() const {
176                 return latextype == LATEX_ENVIRONMENT
177                         || latextype == LATEX_BIB_ENVIRONMENT
178                         || latextype == LATEX_ITEM_ENVIRONMENT
179                         || latextype == LATEX_LIST_ENVIRONMENT;
180         }
181
182         ///
183         bool operator==(Layout const &) const;
184         ///
185         bool operator!=(Layout const & rhs) const 
186                 { return !(*this == rhs); }
187
188         ////////////////////////////////////////////////////////////////
189         // members
190         ////////////////////////////////////////////////////////////////
191         /** Default font for this layout/environment.
192             The main font for this kind of environment. If an attribute has
193             INHERITED_*, it means that the value is specified by
194             the defaultfont for the entire layout. If we are nested, the
195             font is inherited from the font in the environment one level
196             up until the font is resolved. The values :IGNORE_*
197             and FONT_TOGGLE are illegal here.
198         */
199         FontInfo font;
200
201         /** Default font for labels.
202             Interpretation the same as for font above
203         */
204         FontInfo labelfont;
205
206         /** Resolved version of the font for this layout/environment.
207             This is a resolved version the default font. The font is resolved
208             against the defaultfont of the entire layout.
209         */
210         FontInfo resfont;
211
212         /** Resolved version of the font used for labels.
213             This is a resolved version the label font. The font is resolved
214             against the defaultfont of the entire layout.
215         */
216         FontInfo reslabelfont;
217
218         /// Text that dictates how wide the left margin is on the screen
219         docstring leftmargin;
220         /// Text that dictates how wide the right margin is on the screen
221         docstring rightmargin;
222         /// Text that dictates how much space to leave after a potential label
223         docstring labelsep;
224         /// Text that dictates how much space to leave before a potential label
225         docstring labelindent;
226         /// Text that dictates the width of the indentation of indented pars
227         docstring parindent;
228         ///
229         double parskip;
230         ///
231         double itemsep;
232         ///
233         double topsep;
234         ///
235         double bottomsep;
236         ///
237         double labelbottomsep;
238         ///
239         double parsep;
240         ///
241         Spacing spacing;
242         ///
243         LyXAlignment align;
244         ///
245         LyXAlignment alignpossible;
246         ///
247         LabelType labeltype;
248         ///
249         EndLabelType endlabeltype;
250         ///
251         MarginType margintype;
252         ///
253         bool newline_allowed;
254         ///
255         bool nextnoindent;
256         ///
257         bool free_spacing;
258         ///
259         bool pass_thru;
260         ///
261         bool parbreak_is_newline;
262         /// show this in toc
263         int toclevel;
264         /// special value of toclevel for non-section layouts
265         static const int NOT_IN_TOC;
266
267         /** true when the fragile commands in the paragraph need to be
268             \protect'ed. */
269         bool needprotect;
270         /// true when empty paragraphs should be kept.
271         bool keepempty;
272         /// Type of LaTeX object
273         LatexType latextype;
274         /// Does this object belong in the title part of the document?
275         bool intitle;
276         /// Is the content to go in the preamble rather than the body?
277         bool inpreamble;
278         /// Which counter to step
279         docstring counter;
280         /// Prefix to use when creating labels
281         docstring refprefix;
282         /// Depth of XML command
283         int commanddepth;
284
285         /// Return a pointer on a new layout suitable to describe a caption.
286         /// FIXME: remove this eventually. This is only for tex2lyx
287         /// until it has proper support for the caption inset (JMarc)
288         static Layout * forCaption();
289
290         /// Is this spellchecked?
291         bool spellcheck;
292
293
294 private:
295         /// generates the default CSS for this layout
296         void makeDefaultCSS() const;
297         ///
298         std::string defaultCSSItemClass() const { return defaultCSSClass() + "_item"; }
299         ///
300         std::string defaultCSSLabelClass() const { return defaultCSSClass() + "_label"; }
301         
302         /// Name of the layout/paragraph environment
303         docstring name_;
304
305         /// LaTeX name for environment
306         std::string latexname_;
307
308         /** Is this layout the default layout for an unknown layout? If
309          * so, its name will be displayed as xxx (unknown).
310          */
311         bool unknown_;
312
313         /** Name of an layout that has replaced this layout.
314             This is used to rename a layout, while keeping backward
315             compatibility
316         */
317         docstring obsoleted_by_;
318
319         /** Name of an layout which preamble must come before this one
320             This is used when the preamble snippet uses macros defined in
321             another preamble
322          */
323         docstring depends_on_;
324
325         /// Label string. "Abstract", "Reference", "Caption"...
326         docstring labelstring_;
327         ///
328         docstring endlabelstring_;
329         /// Label string inside appendix. "Appendix", ...
330         docstring labelstring_appendix_;
331         /// LaTeX parameter for environment
332         std::string latexparam_;
333         /// Item command in lists
334         std::string itemcommand_;
335         /// Left delimiter of the content
336         docstring leftdelim_;
337         /// Right delimiter of the content
338         docstring rightdelim_;
339         /// Internal tag to use (e.g., <title></title> for sect header)
340         std::string innertag_;
341         /// Internal tag to use (e.g. to surround varentrylist label)
342         std::string labeltag_;
343         /// Internal tag to surround the item text in a list.
344         std::string itemtag_;
345         /// The interpretation of this tag varies depending upon the latextype.
346         /// In an environment, it is the tag enclosing all content for this set of 
347         /// paragraphs. So for quote, e.g,. it would be: blockquote. For itemize, 
348         /// it would be: ul. (You get the idea.)
349         ///
350         /// For a command, it is the tag enclosing the content of the command.
351         /// So, for section, it might be: h2.
352         /// 
353         /// For the paragraph type, it is the tag that will enclose each paragraph.
354         ///
355         /// Defaults to "div".
356         mutable std::string htmltag_;
357         /// Additional attributes for inclusion with the start tag. Defaults
358         /// to: class="layoutname".
359         mutable std::string htmlattr_;
360         /// Tag for individual paragraphs in an environment. In lists, this
361         /// would be something like "li". But it also needs to be set for
362         /// quotation, e.g., since the paragraphs in a quote need to be 
363         /// in "p" tags. Default is "div".
364         /// Note that when I said "environment", I meant it: This has no
365         /// effect for LATEX_PARAGRAPH type layouts.
366         mutable std::string htmlitemtag_;
367         /// Attributes for htmlitemtag_. Default is: class="layoutname_item".
368         mutable std::string htmlitemattr_;
369         /// Tag for labels, of whatever sort. One use for this is in setting
370         /// descriptions, in which case it would be: dt. Another use is to
371         /// customize the display of, say, the auto-generated label for 
372         /// sections. Defaults to "span".
373         /// If set to "NONE", this suppresses the printing of the label.
374         mutable std::string htmllabeltag_;
375         /// Attributes for the label. Defaults to: class="layoutname_label".
376         mutable std::string htmllabelattr_;
377         /// Whether to put the label before the item, or within the item.
378         /// I.e., do we have (true):
379         ///    <label>...</label><item>...</item>
380         /// or instead (false):
381         ///    <item><label>...</label>...</item>
382         /// The latter is the default.
383         bool htmllabelfirst_;
384         /// CSS information needed by this layout.
385         docstring htmlstyle_;
386         /// Should we generate the default CSS for this layout, even if HTMLStyle
387         /// has been given? Default is false.
388         /// Note that the default CSS is output first, then the user CSS, so it is
389         /// possible to override what one does not want.
390         bool htmlforcecss_;
391         /// A cache for the default style info so generated.
392         mutable docstring htmldefaultstyle_;
393         /// Any other info for the HTML header.
394         docstring htmlpreamble_;
395         /// Whether this is the <title> paragraph.
396         bool htmltitle_;
397         /// calculating this is expensive, so we cache it.
398         mutable std::string defaultcssclass_;
399         /// This is the `category' for this layout. The following are
400         /// recommended basic categories: FrontMatter, BackMatter, MainText,
401         /// Section, Starred, List, Theorem.
402         docstring category_;
403         /// Macro definitions needed for this layout
404         docstring preamble_;
405         /// Language dependent macro definitions needed for this layout
406         docstring langpreamble_;
407         /// Language and babel dependent macro definitions needed for this layout
408         docstring babelpreamble_;
409         /// Packages needed for this layout
410         std::set<std::string> requires_;
411         ///
412         LaTeXArgMap latexargs_;
413         ///
414         LaTeXArgMap itemargs_;
415 };
416
417 } // namespace lyx
418
419 #endif