]> git.lyx.org Git - lyx.git/blob - src/Layout.cpp
Remove invalid comment.
[lyx.git] / src / Layout.cpp
1 /**
2  * \file Layout.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author Jean-Marc Lasgouttes
8  * \author André Pönitz
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12
13 #include <config.h>
14
15 #include "Layout.h"
16 #include "TextClass.h"
17 #include "Lexer.h"
18 #include "Font.h"
19
20 #include "support/debug.h"
21 #include "support/lstrings.h"
22
23 using namespace std;
24 using namespace lyx::support;
25
26 namespace lyx {
27
28 /// Special value of toclevel for layouts that to not belong in a TOC
29 const int Layout::NOT_IN_TOC = -1000;
30
31 //  The order of the LayoutTags enum is no more important. [asierra300396]
32 // Tags indexes.
33 enum LayoutTags {
34         LT_ALIGN = 1,
35         LT_ALIGNPOSSIBLE,
36         LT_MARGIN,
37         LT_BOTTOMSEP,
38         LT_CATEGORY,
39         LT_COMMANDDEPTH,
40         LT_COPYSTYLE,
41         LT_DEPENDSON,
42         LT_OBSOLETEDBY,
43         //LT_EMPTY,
44         LT_END,
45         //LT_ENVIRONMENT_DEFAULT,
46         //LT_FANCYHDR,
47         LT_FILL_BOTTOM,
48         LT_FILL_TOP,
49         //LT_FIRST_COUNTER,
50         LT_FONT,
51         LT_FREE_SPACING,
52         LT_PASS_THRU,
53         //LT_HEADINGS,
54         LT_ITEMSEP,
55         LT_KEEPEMPTY,
56         LT_LABEL_BOTTOMSEP,
57         LT_LABELFONT,
58         LT_TEXTFONT,
59         LT_LABELINDENT,
60         LT_LABELSEP,
61         LT_LABELSTRING,
62         LT_LABELSTRING_APPENDIX,
63         LT_LABELCOUNTER,
64         LT_LABELTYPE,
65         LT_ENDLABELSTRING,
66         LT_ENDLABELTYPE,
67         LT_LATEXNAME,
68         LT_LATEXPARAM,
69         LT_OPTARGS,
70         LT_LATEXTYPE,
71         LT_LATEXHEADER,
72         LT_LATEXFOOTER,
73         LT_LATEXPARAGRAPH,
74         LT_LEFTMARGIN,
75         LT_NEED_PROTECT,
76         LT_NEWLINE,
77         LT_NEXTNOINDENT,
78         LT_PARINDENT,
79         LT_PARSEP,
80         LT_PARSKIP,
81         //LT_PLAIN,
82         LT_PREAMBLE,
83         LT_REQUIRES,
84         LT_RIGHTMARGIN,
85         LT_SPACING,
86         LT_TOPSEP,
87         LT_TOCLEVEL,
88         LT_INNERTAG,
89         LT_LABELTAG,
90         LT_ITEMTAG,
91         LT_INTITLE // keep this last!
92 };
93
94 /////////////////////
95
96 Layout::Layout()
97 {
98         unknown_ = false;
99         margintype = MARGIN_STATIC;
100         latextype = LATEX_PARAGRAPH;
101         intitle = false;
102         optionalargs = 0;
103         needprotect = false;
104         keepempty = false;
105         font = inherit_font;
106         labelfont = inherit_font;
107         resfont = sane_font;
108         reslabelfont = sane_font;
109         nextnoindent = false;
110         parskip = 0.0;
111         itemsep = 0;
112         topsep = 0.0;
113         bottomsep = 0.0;
114         labelbottomsep = 0.0;
115         parsep = 0;
116         align = LYX_ALIGN_BLOCK;
117         alignpossible = LYX_ALIGN_NONE | LYX_ALIGN_LAYOUT;
118         labeltype = LABEL_NO_LABEL;
119         endlabeltype = END_LABEL_NO_LABEL;
120         // Should or should not. That is the question.
121         // spacing.set(Spacing::OneHalf);
122         fill_top = false;
123         fill_bottom = false;
124         newline_allowed = true;
125         free_spacing = false;
126         pass_thru = false;
127         toclevel = NOT_IN_TOC;
128         commanddepth = 0;
129 }
130
131
132 bool Layout::read(Lexer & lex, TextClass const & tclass)
133 {
134         // This table is sorted alphabetically [asierra 30March96]
135         LexerKeyword layoutTags[] = {
136                 { "align",          LT_ALIGN },
137                 { "alignpossible",  LT_ALIGNPOSSIBLE },
138                 { "bottomsep",      LT_BOTTOMSEP },
139                 { "category",       LT_CATEGORY },
140                 { "commanddepth",   LT_COMMANDDEPTH },
141                 { "copystyle",      LT_COPYSTYLE },
142                 { "dependson",      LT_DEPENDSON },
143                 { "end",            LT_END },
144                 { "endlabelstring", LT_ENDLABELSTRING },
145                 { "endlabeltype",   LT_ENDLABELTYPE },
146                 { "fill_bottom",    LT_FILL_BOTTOM },
147                 { "fill_top",       LT_FILL_TOP },
148                 { "font",           LT_FONT },
149                 { "freespacing",    LT_FREE_SPACING },
150                 { "innertag",       LT_INNERTAG },
151                 { "intitle",        LT_INTITLE },
152                 { "itemsep",        LT_ITEMSEP },
153                 { "itemtag",        LT_ITEMTAG },
154                 { "keepempty",      LT_KEEPEMPTY },
155                 { "labelbottomsep", LT_LABEL_BOTTOMSEP },
156                 { "labelcounter",   LT_LABELCOUNTER },
157                 { "labelfont",      LT_LABELFONT },
158                 { "labelindent",    LT_LABELINDENT },
159                 { "labelsep",       LT_LABELSEP },
160                 { "labelstring",    LT_LABELSTRING },
161                 { "labelstringappendix", LT_LABELSTRING_APPENDIX },
162                 { "labeltag",       LT_LABELTAG },
163                 { "labeltype",      LT_LABELTYPE },
164                 { "latexfooter",    LT_LATEXFOOTER },
165                 { "latexheader",    LT_LATEXHEADER },
166                 { "latexname",      LT_LATEXNAME },
167                 { "latexparagraph", LT_LATEXPARAGRAPH },
168                 { "latexparam",     LT_LATEXPARAM },
169                 { "latextype",      LT_LATEXTYPE },
170                 { "leftmargin",     LT_LEFTMARGIN },
171                 { "margin",         LT_MARGIN },
172                 { "needprotect",    LT_NEED_PROTECT },
173                 { "newline",        LT_NEWLINE },
174                 { "nextnoindent",   LT_NEXTNOINDENT },
175                 { "obsoletedby",    LT_OBSOLETEDBY },
176                 { "optionalargs",   LT_OPTARGS },
177                 { "parindent",      LT_PARINDENT },
178                 { "parsep",         LT_PARSEP },
179                 { "parskip",        LT_PARSKIP },
180                 { "passthru",       LT_PASS_THRU },
181                 { "preamble",       LT_PREAMBLE },
182                 { "requires",       LT_REQUIRES },
183                 { "rightmargin",    LT_RIGHTMARGIN },
184                 { "spacing",        LT_SPACING },
185                 { "textfont",       LT_TEXTFONT },
186                 { "toclevel",       LT_TOCLEVEL },
187                 { "topsep",         LT_TOPSEP }
188         };
189
190         bool error = false;
191         bool finished = false;
192         lex.pushTable(layoutTags);
193         // parse style section
194         while (!finished && lex.isOK() && !error) {
195                 int le = lex.lex();
196                 // See comment in LyXRC.cpp.
197                 switch (le) {
198                 case Lexer::LEX_FEOF:
199                         continue;
200
201                 case Lexer::LEX_UNDEF:          // parse error
202                         lex.printError("Unknown layout tag `$$Token'");
203                         error = true;
204                         continue;
205                 default: break;
206                 }
207                 switch (static_cast<LayoutTags>(le)) {
208                 case LT_END:            // end of structure
209                         finished = true;
210                         break;
211
212                 case LT_CATEGORY:
213                         lex >> category_;
214                         break;
215
216                 case LT_COPYSTYLE: {     // initialize with a known style
217                         docstring style;
218                         lex >> style;
219                         style = subst(style, '_', ' ');
220
221                         if (tclass.hasLayout(style)) {
222                                 docstring const tmpname = name_;
223                                 this->operator=(tclass[style]);
224                                 name_ = tmpname;
225                         } else {
226                                 LYXERR0("Cannot copy unknown style `"
227                                         << style << "'\n"
228                                         << "All layouts so far:");
229                                 DocumentClass::const_iterator lit = tclass.begin();
230                                 DocumentClass::const_iterator len = tclass.end();
231                                 for (; lit != len; ++lit)
232                                         LYXERR0(lit->name());
233                         }
234                         break;
235                         }
236
237                 case LT_OBSOLETEDBY: {   // replace with a known style
238                         docstring style;
239                         lex >> style;
240                         style = subst(style, '_', ' ');
241
242                         if (tclass.hasLayout(style)) {
243                                 docstring const tmpname = name_;
244                                 this->operator=(tclass[style]);
245                                 name_ = tmpname;
246                                 if (obsoleted_by().empty())
247                                         obsoleted_by_ = style;
248                         } else {
249                                 LYXERR0("Cannot replace with unknown style `" 
250                                         << style << '\'');
251
252                                 //lex.printError("Cannot replace with"
253                                 //               " unknown style "
254                                 //               "`$$Token'");
255                         }
256                         break;
257                 }
258
259                 case LT_DEPENDSON:
260                         lex >> depends_on_;
261                         depends_on_ = subst(depends_on_, '_', ' ');
262                         break;
263
264                 case LT_MARGIN:         // margin style definition.
265                         readMargin(lex);
266                         break;
267
268                 case LT_LATEXTYPE:      // LaTeX style definition.
269                         readLatexType(lex);
270                         break;
271
272                 case LT_LATEXHEADER:    // header for environments
273                         lex >> latexheader;
274                         break;
275
276                 case LT_LATEXFOOTER:    // footer for environments
277                         lex >> latexfooter;
278                         break;
279
280                 case LT_LATEXPARAGRAPH:
281                         lex >> latexparagraph;
282                         break;
283
284                 case LT_INTITLE:
285                         lex >> intitle;
286                         break;
287
288                 case LT_TOCLEVEL:
289                         lex >> toclevel;
290                         break;
291
292                 case LT_OPTARGS:
293                         lex >> optionalargs ;
294                         break;
295
296                 case LT_NEED_PROTECT:
297                         lex >> needprotect;
298                         break;
299
300                 case LT_KEEPEMPTY:
301                         lex >> keepempty;
302                         break;
303
304                 case LT_FONT:
305                         font = lyxRead(lex, font);
306                         labelfont = font;
307                         break;
308
309                 case LT_TEXTFONT:
310                         font = lyxRead(lex, font);
311                         break;
312
313                 case LT_LABELFONT:
314                         labelfont = lyxRead(lex, labelfont);
315                         break;
316
317                 case LT_NEXTNOINDENT:   // Indent next paragraph?
318                         lex >> nextnoindent;
319                         break;
320
321                 case LT_COMMANDDEPTH:
322                         lex >> commanddepth;
323                         break;
324
325                 case LT_LATEXNAME:
326                         lex >> latexname_;
327                         break;
328
329                 case LT_LATEXPARAM:
330                         lex >> latexparam_;
331                         latexparam_ = subst(latexparam_, "&quot;", "\"");
332                         break;
333
334                 case LT_INNERTAG:
335                         lex >> innertag_;
336                         break;
337
338                 case LT_LABELTAG:
339                         lex >> labeltag_;
340                         break;
341
342                 case LT_ITEMTAG:
343                         lex >> itemtag_;
344                         break;
345
346                 case LT_PREAMBLE:
347                         preamble_ = from_utf8(lex.getLongString("EndPreamble"));
348                         break;
349
350                 case LT_LABELTYPE:
351                         readLabelType(lex);
352                         break;
353
354                 case LT_ENDLABELTYPE:
355                         readEndLabelType(lex);
356                         break;
357
358                 case LT_LEFTMARGIN:     // left margin type
359                         lex >> leftmargin;
360                         break;
361
362                 case LT_RIGHTMARGIN:    // right margin type
363                         lex >> rightmargin;
364                         break;
365
366                 case LT_LABELINDENT:    // label indenting flag
367                         lex >> labelindent;
368                         break;
369
370                 case LT_PARINDENT:      // paragraph indent. flag
371                         lex >> parindent;
372                         break;
373
374                 case LT_PARSKIP:        // paragraph skip size
375                         lex >> parskip;
376                         break;
377
378                 case LT_ITEMSEP:        // item separation size
379                         lex >> itemsep;
380                         break;
381
382                 case LT_TOPSEP:         // top separation size
383                         lex >> topsep;
384                         break;
385
386                 case LT_BOTTOMSEP:      // bottom separation size
387                         lex >> bottomsep;
388                         break;
389
390                 case LT_LABEL_BOTTOMSEP: // label bottom separation size
391                         lex >> labelbottomsep;
392                         break;
393
394                 case LT_LABELSEP:       // label separator
395                         lex >> labelsep;
396                         labelsep = subst(labelsep, 'x', ' ');
397                         break;
398
399                 case LT_PARSEP:         // par. separation size
400                         lex >> parsep;
401                         break;
402
403                 case LT_FILL_TOP:       // fill top flag
404                         lex >> fill_top;
405                         break;
406
407                 case LT_FILL_BOTTOM:    // fill bottom flag
408                         lex >> fill_bottom;
409                         break;
410
411                 case LT_NEWLINE:        // newlines allowed?
412                         lex >> newline_allowed;
413                         break;
414
415                 case LT_ALIGN:          // paragraph align
416                         readAlign(lex);
417                         break;
418                 case LT_ALIGNPOSSIBLE:  // paragraph allowed align
419                         readAlignPossible(lex);
420                         break;
421
422                 case LT_LABELSTRING:    // label string definition
423                         // FIXME: this means LT_ENDLABELSTRING may only
424                         // occur after LT_LABELSTRING
425                         lex >> labelstring_;    
426                         labelstring_ = trim(labelstring_);
427                         labelstring_appendix_ = labelstring_;
428                         break;
429
430                 case LT_ENDLABELSTRING: // endlabel string definition
431                         lex >> endlabelstring_; 
432                         endlabelstring_ = trim(endlabelstring_);
433                         break;
434
435                 case LT_LABELSTRING_APPENDIX: // label string appendix definition
436                         lex >> labelstring_appendix_;   
437                         labelstring_appendix_ = trim(labelstring_appendix_);
438                         break;
439
440                 case LT_LABELCOUNTER: // name of counter to use
441                         lex >> counter; 
442                         counter = trim(counter);
443                         break;
444
445                 case LT_FREE_SPACING:   // Allow for free spacing.
446                         lex >> free_spacing;
447                         break;
448
449                 case LT_PASS_THRU:      // Allow for pass thru.
450                         lex >> pass_thru;
451                         break;
452
453                 case LT_SPACING: // setspace.sty
454                         readSpacing(lex);
455                         break;
456
457                 case LT_REQUIRES:
458                         lex.eatLine();
459                         vector<string> const req = 
460                                 getVectorFromString(lex.getString());
461                         requires_.insert(req.begin(), req.end());
462                         break;
463
464                 }
465         }
466         lex.popTable();
467
468         return !error;
469 }
470
471
472 enum {
473         AT_BLOCK = 1,
474         AT_LEFT,
475         AT_RIGHT,
476         AT_CENTER,
477         AT_LAYOUT
478 };
479
480
481 LexerKeyword alignTags[] = {
482         { "block",  AT_BLOCK },
483         { "center", AT_CENTER },
484         { "layout", AT_LAYOUT },
485         { "left",   AT_LEFT },
486         { "right",  AT_RIGHT }
487 };
488
489
490 void Layout::readAlign(Lexer & lex)
491 {
492         PushPopHelper pph(lex, alignTags);
493         int le = lex.lex();
494         switch (le) {
495         case Lexer::LEX_UNDEF:
496                 lex.printError("Unknown alignment `$$Token'");
497                 return;
498         default: break;
499         };
500         switch (le) {
501         case AT_BLOCK:
502                 align = LYX_ALIGN_BLOCK;
503                 break;
504         case AT_LEFT:
505                 align = LYX_ALIGN_LEFT;
506                 break;
507         case AT_RIGHT:
508                 align = LYX_ALIGN_RIGHT;
509                 break;
510         case AT_CENTER:
511                 align = LYX_ALIGN_CENTER;
512                 break;
513         case AT_LAYOUT:
514                 align = LYX_ALIGN_LAYOUT;
515                 break;
516         }
517 }
518
519
520 void Layout::readAlignPossible(Lexer & lex)
521 {
522         lex.pushTable(alignTags);
523         alignpossible = LYX_ALIGN_NONE | LYX_ALIGN_LAYOUT;
524         int lineno = lex.lineNumber();
525         do {
526                 int le = lex.lex();
527                 switch (le) {
528                 case Lexer::LEX_UNDEF:
529                         lex.printError("Unknown alignment `$$Token'");
530                         continue;
531                 default: break;
532                 };
533                 switch (le) {
534                 case AT_BLOCK:
535                         alignpossible |= LYX_ALIGN_BLOCK;
536                         break;
537                 case AT_LEFT:
538                         alignpossible |= LYX_ALIGN_LEFT;
539                         break;
540                 case AT_RIGHT:
541                         alignpossible |= LYX_ALIGN_RIGHT;
542                         break;
543                 case AT_CENTER:
544                         alignpossible |= LYX_ALIGN_CENTER;
545                         break;
546                 case AT_LAYOUT:
547                         alignpossible |= LYX_ALIGN_LAYOUT;
548                         break;
549                 }
550         } while (lineno == lex.lineNumber());
551         lex.popTable();
552 }
553
554
555 void Layout::readLabelType(Lexer & lex)
556 {
557         enum {
558                 LA_NO_LABEL = 1,
559                 LA_MANUAL,
560                 LA_TOP_ENVIRONMENT,
561                 LA_CENTERED_TOP_ENVIRONMENT,
562                 LA_STATIC,
563                 LA_SENSITIVE,
564                 LA_COUNTER,
565                 LA_ENUMERATE,
566                 LA_ITEMIZE,
567                 LA_BIBLIO
568         };
569
570
571         LexerKeyword labelTypeTags[] = {
572                 { "bibliography",             LA_BIBLIO },
573                 { "centered_top_environment", LA_CENTERED_TOP_ENVIRONMENT },
574                 { "counter",                  LA_COUNTER },
575                 { "enumerate",                LA_ENUMERATE },
576                 { "itemize",                  LA_ITEMIZE },
577                 { "manual",                   LA_MANUAL },
578                 { "no_label",                 LA_NO_LABEL },
579                 { "sensitive",                LA_SENSITIVE },
580                 { "static",                   LA_STATIC },
581                 { "top_environment",          LA_TOP_ENVIRONMENT }
582         };
583
584         PushPopHelper pph(lex, labelTypeTags);
585         int le = lex.lex();
586         switch (le) {
587         case Lexer::LEX_UNDEF:
588                 lex.printError("Unknown labeltype tag `$$Token'");
589                 return;
590         default: break;
591         }
592         switch (le) {
593         case LA_NO_LABEL:
594                 labeltype = LABEL_NO_LABEL;
595                 break;
596         case LA_MANUAL:
597                 labeltype = LABEL_MANUAL;
598                 break;
599         case LA_TOP_ENVIRONMENT:
600                 labeltype = LABEL_TOP_ENVIRONMENT;
601                 break;
602         case LA_CENTERED_TOP_ENVIRONMENT:
603                 labeltype = LABEL_CENTERED_TOP_ENVIRONMENT;
604                 break;
605         case LA_STATIC:
606                 labeltype = LABEL_STATIC;
607                 break;
608         case LA_SENSITIVE:
609                 labeltype = LABEL_SENSITIVE;
610                 break;
611         case LA_COUNTER:
612                 labeltype = LABEL_COUNTER;
613                 break;
614         case LA_ENUMERATE:
615                 labeltype = LABEL_ENUMERATE;
616                 break;
617         case LA_ITEMIZE:
618                 labeltype = LABEL_ITEMIZE;
619                 break;
620         case LA_BIBLIO:
621                 labeltype = LABEL_BIBLIO;
622                 break;
623         }
624 }
625
626
627 void Layout::readEndLabelType(Lexer & lex)
628 {
629         static LexerKeyword endlabelTypeTags[] = {
630                 { "box",              END_LABEL_BOX },
631                 { "filled_box", END_LABEL_FILLED_BOX },
632                 { "no_label",     END_LABEL_NO_LABEL },
633                 { "static",     END_LABEL_STATIC }
634         };
635
636         PushPopHelper pph(lex, endlabelTypeTags);
637         int le = lex.lex();
638         switch (le) {
639         case Lexer::LEX_UNDEF:
640                 lex.printError("Unknown labeltype tag `$$Token'");
641                 break;
642         case END_LABEL_STATIC:
643         case END_LABEL_BOX:
644         case END_LABEL_FILLED_BOX:
645         case END_LABEL_NO_LABEL:
646                 endlabeltype = static_cast<EndLabelType>(le);
647                 break;
648         default:
649                 LYXERR0("Unhandled value " << le);
650                 break;
651         }
652 }
653
654
655 void Layout::readMargin(Lexer & lex)
656 {
657         LexerKeyword marginTags[] = {
658                 { "dynamic",           MARGIN_DYNAMIC },
659                 { "first_dynamic",     MARGIN_FIRST_DYNAMIC },
660                 { "manual",            MARGIN_MANUAL },
661                 { "right_address_box", MARGIN_RIGHT_ADDRESS_BOX },
662                 { "static",            MARGIN_STATIC }
663         };
664
665         PushPopHelper pph(lex, marginTags);
666
667         int le = lex.lex();
668         switch (le) {
669         case Lexer::LEX_UNDEF:
670                 lex.printError("Unknown margin type tag `$$Token'");
671                 return;
672         case MARGIN_STATIC:
673         case MARGIN_MANUAL:
674         case MARGIN_DYNAMIC:
675         case MARGIN_FIRST_DYNAMIC:
676         case MARGIN_RIGHT_ADDRESS_BOX:
677                 margintype = static_cast<MarginType>(le);
678                 break;
679         default:
680                 LYXERR0("Unhandled value " << le);
681                 break;
682         }
683 }
684
685
686 void Layout::readLatexType(Lexer & lex)
687 {
688         LexerKeyword latexTypeTags[] = {
689                 { "bib_environment",  LATEX_BIB_ENVIRONMENT },
690                 { "command",          LATEX_COMMAND },
691                 { "environment",      LATEX_ENVIRONMENT },
692                 { "item_environment", LATEX_ITEM_ENVIRONMENT },
693                 { "list_environment", LATEX_LIST_ENVIRONMENT },
694                 { "paragraph",        LATEX_PARAGRAPH }
695         };
696
697         PushPopHelper pph(lex, latexTypeTags);
698         int le = lex.lex();
699         switch (le) {
700         case Lexer::LEX_UNDEF:
701                 lex.printError("Unknown latextype tag `$$Token'");
702                 return;
703         case LATEX_PARAGRAPH:
704         case LATEX_COMMAND:
705         case LATEX_ENVIRONMENT:
706         case LATEX_ITEM_ENVIRONMENT:
707         case LATEX_BIB_ENVIRONMENT:
708         case LATEX_LIST_ENVIRONMENT:
709                 latextype = static_cast<LatexType>(le);
710                 break;
711         default:
712                 LYXERR0("Unhandled value " << le);
713                 break;
714         }
715 }
716
717
718 void Layout::readSpacing(Lexer & lex)
719 {
720         enum {
721                 ST_SPACING_SINGLE = 1,
722                 ST_SPACING_ONEHALF,
723                 ST_SPACING_DOUBLE,
724                 ST_OTHER
725         };
726
727         LexerKeyword spacingTags[] = {
728                 {"double",  ST_SPACING_DOUBLE },
729                 {"onehalf", ST_SPACING_ONEHALF },
730                 {"other",   ST_OTHER },
731                 {"single",  ST_SPACING_SINGLE }
732         };
733
734         PushPopHelper pph(lex, spacingTags);
735         int le = lex.lex();
736         switch (le) {
737         case Lexer::LEX_UNDEF:
738                 lex.printError("Unknown spacing token `$$Token'");
739                 return;
740         default: break;
741         }
742         switch (le) {
743         case ST_SPACING_SINGLE:
744                 spacing.set(Spacing::Single);
745                 break;
746         case ST_SPACING_ONEHALF:
747                 spacing.set(Spacing::Onehalf);
748                 break;
749         case ST_SPACING_DOUBLE:
750                 spacing.set(Spacing::Double);
751                 break;
752         case ST_OTHER:
753                 lex.next();
754                 spacing.set(Spacing::Other, lex.getString());
755                 break;
756         }
757 }
758
759
760 docstring const & Layout::name() const
761 {
762         return name_;
763 }
764
765
766 void Layout::setName(docstring const & name)
767 {
768         name_ = name;
769 }
770
771
772 docstring const & Layout::obsoleted_by() const
773 {
774         return obsoleted_by_;
775 }
776
777
778 docstring const & Layout::depends_on() const
779 {
780         return depends_on_;
781 }
782
783
784 bool Layout::operator==(Layout const & rhs) const
785 {
786         // This is enough for the applications we actually make,
787         // at least at the moment. But we could check more.
788         return name() == rhs.name()
789                 && latexname() == rhs.latexname()
790                 && latextype == rhs.latextype;
791 }
792
793
794 } // namespace lyx