2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
7 * Copyright 1995 Matthias Ettrich
8 * Copyright 1995-2001 The LyX Team.
10 * ====================================================== */
24 #include <boost/utility.hpp>
26 /// Reads the style files
27 extern void LyXSetStyle();
31 LYX_LAYOUT_DEFAULT = 99
34 // Could this cause confusion that both DUMMY_LAYOUT and LAYOUT_DEFAULT has
35 // the same value? (Lgb)
37 #define LYX_DUMMY_LAYOUT 99
40 /// The different output types
52 /// The different margin types
53 enum LYX_MARGIN_TYPE {
63 MARGIN_RIGHT_ADDRESS_BOX
80 LYX_ALIGN_LAYOUT = 16,
82 LYX_ALIGN_SPECIAL = 32
87 void operator|=(LyXAlignment & la1, LyXAlignment la2) {
88 la1 = static_cast<LyXAlignment>(la1 | la2);
91 /// The different LaTeX-Types
92 enum LYX_LATEX_TYPES {
100 LATEX_ITEM_ENVIRONMENT,
102 LATEX_LIST_ENVIRONMENT
105 /// The different label types
106 enum LYX_LABEL_TYPES {
114 LABEL_TOP_ENVIRONMENT,
116 LABEL_CENTERED_TOP_ENVIRONMENT,
118 // the flushright labels following now must start with LABEL_STATIC
124 LABEL_COUNTER_CHAPTER,
126 LABEL_COUNTER_SECTION,
128 LABEL_COUNTER_SUBSECTION,
130 LABEL_COUNTER_SUBSUBSECTION,
132 LABEL_COUNTER_PARAGRAPH,
134 LABEL_COUNTER_SUBPARAGRAPH,
138 LABEL_COUNTER_ENUMII,
140 LABEL_COUNTER_ENUMIII,
146 enum LYX_END_LABEL_TYPES {
152 END_LABEL_FILLED_BOX,
156 END_LABEL_ENUM_FIRST = END_LABEL_NO_LABEL,
158 END_LABEL_ENUM_LAST = END_LABEL_STATIC
161 /* Fix labels are printed flushright, manual labels flushleft.
162 * MARGIN_MANUAL and MARGIN_FIRST_DYNAMIC are *only* for LABEL_MANUAL,
163 * MARGIN_DYNAMIC and MARGIN_STATIC are *not* for LABEL_MANUAL.
164 * This seems a funny restriction, but I think other combinations are
165 * not needed, so I will not change it yet.
166 * Correction: MARGIN_FIRST_DYNAMIC also usable with LABEL_STATIC
170 /* There is a parindent and a parskip. Which one is used depends on the
171 * paragraph_separation-flag of the text-object.
172 * BUT: parindent is only thrown away, if a parskip is defined! So if you
173 * want a space between the paragraphs and a parindent at the same time,
174 * you should set parskip to zero and use topsep, parsep and bottomsep.
176 * The standard layout is an exception: its parindent is only set, if the
177 * previous paragraph is standard too. Well, this is LateX and it is good!
181 // Attributes of a layout/paragraph environment
191 bool Read (LyXLex &, LyXTextClass const &);
193 void readAlign(LyXLex &);
195 void readAlignPossible(LyXLex &);
197 void readLabelType(LyXLex &);
199 void readEndLabelType(LyXLex &);
201 void readMargin(LyXLex &);
203 void readLatexType(LyXLex &);
205 void readSpacing(LyXLex &);
207 string const & name() const { return name_; }
209 void setName(string const & n) { name_ = n; }
211 string const & obsoleted_by() const { return obsoleted_by_; }
213 string const & latexname() const { return latexname_; }
215 string const & labelstring() const { return labelstring_; }
217 string const & endlabelstring() const { return endlabelstring_; }
219 string const & preamble() const { return preamble_; }
221 string const & latexparam() const { return latexparam_; }
223 string const & labelstring_appendix() const {
224 return labelstring_appendix_;
226 /** Default font for this layout/environment.
227 The main font for this kind of environment. If an attribute has
228 LyXFont::INHERITED_*, it means that the value is specified by
229 the defaultfont for the entire layout. If we are nested, the
230 font is inherited from the font in the environment one level
231 up until the font is resolved. The values LyXFont::IGNORE_*
232 and LyXFont::TOGGLE are illegal here.
236 /** Default font for labels.
237 Interpretation the same as for font above
241 /** Resolved version of the font for this layout/environment.
242 This is a resolved version the default font. The font is resolved
243 against the defaultfont of the entire layout.
247 /** Resolved version of the font used for labels.
248 This is a resolved version the label font. The font is resolved
249 against the defaultfont of the entire layout.
251 LyXFont reslabelfont;
253 /// Text that dictates how wide the left margin is on the screen
256 /// Text that dictates how wide the right margin is on the screen
259 /// Text that dictates how much space to leave after a potential label
262 /// Text that dictates how much space to leave before a potential label
265 /** Text that dictates the width of the indentation of
283 float labelbottomsep;
295 LyXAlignment alignpossible;
298 char labeltype; // add approp. type
301 LYX_END_LABEL_TYPES endlabeltype;
304 LYX_MARGIN_TYPE margintype;
313 bool newline_allowed;
324 /** true when the fragile commands in the paragraph need to be
327 /// true when empty paragraphs should be kept.
330 bool isParagraph() const {
331 return latextype == LATEX_PARAGRAPH;
334 bool isCommand() const {
335 return latextype == LATEX_COMMAND;
338 bool isEnvironment() const {
339 return (latextype == LATEX_ENVIRONMENT
340 || latextype == LATEX_ITEM_ENVIRONMENT
341 || latextype == LATEX_LIST_ENVIRONMENT);
343 /// Type of LaTeX object
344 LYX_LATEX_TYPES latextype;
345 /// Does this object belong in the title part of the document?
348 /// Name of the layout/paragraph environment
351 /** Name of an layout that has replaced this layout.
352 This is used to rename a layout, while keeping backward
355 string obsoleted_by_;
357 /// LaTeX name for environment
360 /// Label string. "Abstract", "Reference", "Caption"...
364 string endlabelstring_;
366 /// Label string inside appendix. "Appendix", ...
367 string labelstring_appendix_;
369 /// LaTeX parameter for environment
372 /// Macro definitions needed for this layout
381 typedef std::vector<LyXLayout> LayoutList;
383 typedef LayoutList::const_iterator const_iterator;
385 typedef LayoutList::size_type size_type;
388 LyXTextClass (string const & = string(),
389 string const & = string(),
390 string const & = string());
393 const_iterator begin() const { return layoutlist.begin(); }
395 const_iterator end() const { return layoutlist.end(); }
398 bool Read(string const & filename, bool merge = false);
400 void readOutputType(LyXLex &);
402 void readMaxCounter(LyXLex &);
404 void readClassOptions(LyXLex &);
406 bool hasLayout(string const & name) const;
409 LyXLayout const & GetLayout(string const & vname) const;
412 LyXLayout & GetLayout(string const & vname);
414 /// Sees to that the textclass structure has been loaded
418 string const & name() const { return name_; }
420 string const & latexname() const { return latexname_; }
422 string const & description() const { return description_; }
424 string const & opt_fontsize() const { return opt_fontsize_; }
426 string const & opt_pagestyle() const { return opt_pagestyle_; }
428 string const & options() const { return options_; }
430 string const & pagestyle() const { return pagestyle_; }
432 string const & preamble() const { return preamble_; }
434 /// Packages that are already loaded by the class
446 bool provides(Provides p) const { return provides_ & p; }
449 unsigned int columns() const { return columns_; }
458 PageSides sides() const { return sides_; }
460 int secnumdepth() const { return secnumdepth_; }
462 int tocdepth() const { return tocdepth_; }
465 OutputType outputType() const { return outputType_; }
468 LyXFont const & defaultfont() const { return defaultfont_; }
470 /// Text that dictates how wide the left margin is on the screen
471 string const & leftmargin() const { return leftmargin_; }
473 /// Text that dictates how wide the right margin is on the screen
474 string const & rightmargin() const { return rightmargin_; }
476 int maxcounter() const { return maxcounter_; }
478 size_type numLayouts() const { return layoutlist.size(); }
480 LyXLayout const & operator[](size_type i) const {
481 return layoutlist[i];
485 bool delete_layout(string const &);
487 bool do_readStyle(LyXLex &, LyXLayout &);
494 /// Specific class options
495 string opt_fontsize_;
497 string opt_pagestyle_;
507 unsigned int columns_;
515 OutputType outputType_;
516 /** Base font. The paragraph and layout fonts are resolved against
517 this font. This has to be fully instantiated. Attributes
518 LyXFont::INHERIT, LyXFont::IGNORE, and LyXFont::TOGGLE are
521 LyXFont defaultfont_;
522 /// Text that dictates how wide the left margin is on the screen
525 /// Text that dictates how wide the right margin is on the screen
528 int maxcounter_; // add approp. signedness
531 LayoutList layoutlist;
533 /// Has this layout file been loaded yet?
539 void operator|=(LyXTextClass::Provides & p1, LyXTextClass::Provides p2)
541 p1 = static_cast<LyXTextClass::Provides>(p1 | p2);
546 std::ostream & operator<<(std::ostream & os, LyXTextClass::PageSides p);
550 class LyXTextClassList : boost::noncopyable {
553 typedef std::vector<LyXTextClass> ClassList;
555 typedef ClassList::const_iterator const_iterator;
557 typedef ClassList::size_type size_type;
559 const_iterator begin() const { return classlist.begin(); }
561 const_iterator end() const { return classlist.end(); }
563 /// Gets layout structure from layout number and textclass number
564 LyXLayout const & Style(size_type textclass,
565 LyXTextClass::size_type layout) const;
567 /// Gets layout number from textclass number and layout name
568 std::pair<bool, LyXTextClass::size_type> const
569 NumberOfLayout(size_type textclass,
570 string const & name) const;
572 /// Gets a layout name from layout number and textclass number
574 NameOfLayout(size_type textclass,
575 LyXTextClass::size_type layout) const;
577 /** Gets textclass number from name.
578 Returns -1 if textclass name does not exist
580 std::pair<bool, size_type> const
581 NumberOfClass(string const & textclass) const;
584 string const & NameOfClass(size_type number) const;
587 string const & LatexnameOfClass(size_type number) const;
590 string const & DescOfClass(size_type number) const;
593 LyXTextClass const & TextClass(size_type textclass) const;
595 /** Read textclass list.
596 Returns false if this fails
601 Returns false if this fails
603 bool Load(size_type number) const;
606 mutable ClassList classlist;
608 void Add (LyXTextClass const &);
612 extern LyXTextClassList textclasslist;