]> git.lyx.org Git - lyx.git/blob - src/OutputParams.h
InsetIndex: enable escaping for terms in the index
[lyx.git] / src / OutputParams.h
1 // -*- C++ -*-
2 /**
3  * \file OutputParams.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  *  \author Angus Leeming
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #ifndef OUTPUTPARAMS_H
13 #define OUTPUTPARAMS_H
14
15
16 #include "Changes.h"
17
18 #include <memory>
19 #include <set>
20
21
22 namespace lyx {
23
24
25 class Encoding;
26 class ExportData;
27 class Font;
28 class Language;
29 class InsetArgument;
30
31
32 enum class Flavor : int {
33         DviLuaTeX,
34         LaTeX,
35         LuaTeX,
36         PdfLaTeX,
37         XeTeX,
38         DocBook5,
39         Html,
40         Text,
41         LyX
42 };
43
44 enum class CtObject : int {
45         Normal,
46         Object,
47         DisplayObject,
48         UDisplayObject,
49         OmitObject
50 };
51
52
53 class OutputParams {
54 public:
55         enum MathFlavor {
56                 NotApplicable,
57                 MathAsMathML,
58                 MathAsHTML,
59                 MathAsImages,
60                 MathAsLaTeX
61         };
62
63         enum TableCell {
64                 NO,
65                 PLAIN,
66                 ALIGNED
67         };
68
69         enum Float {
70                 NONFLOAT,
71                 MAINFLOAT,
72                 SUBFLOAT
73         };
74
75         OutputParams(Encoding const *);
76         ~OutputParams();
77
78         /** The file that we export depends occasionally on what is to
79             compile the file.
80         */
81         Flavor flavor = Flavor::LaTeX;
82         /// is it some flavor of LaTeX?
83         bool isLaTeX() const;
84         /// does this flavour support full unicode?
85         bool isFullUnicode() const;
86         /// Do we use the bidi package (which does some reordering and stuff)?
87         bool useBidiPackage() const;
88
89         /// Same, but for math output, which only matter is XHTML output.
90         MathFlavor math_flavor = NotApplicable;
91
92         /** Are we to write a 'nice' LaTeX file or not.
93             This essentially seems to mean whether InsetInclude, InsetGraphics
94             and InsetExternal should add the absolute path to any external
95             files or not.
96             Non-nice LaTeX also includes additional safe line breaks in order to
97             increase the precision of forward/reverse search and error reporting.
98         */
99         bool nice = false;
100
101         /** Is this a real child (i.e., compiled as a child)?
102             This depends on wherefrom we export the buffer. Even children
103             that have a master can be compiled standalone.
104         */
105         mutable bool is_child = false;
106
107         /** moving_arg == true means that the environment in which the inset
108             is typeset is a moving argument. The inset should take care about
109             fragile commands by preceding the latex with \\protect.
110         */
111         bool moving_arg = false;
112
113         /** intitle == true means that the environment in which the
114             inset is typeset is part of a title (before a \\maketitle).
115             Footnotes in such environments have moving arguments.
116         */
117         bool intitle = false;
118
119         /** need_maketitle == true means that the last layout was a title layout
120          * this is to track when \maketitle needs to be output.
121         */
122         mutable bool need_maketitle = false;
123
124         /** have_maketitle == true means that \maketitle already has been output.
125         */
126         mutable bool have_maketitle = false;
127
128         /** inbranch == true means that the environment being typeset
129             is inside an active branch inset.
130         */
131         bool inbranch = false;
132
133         /** inulemcmd > 0 means that the environment in which the
134             inset is typeset is part of a ulem or soul command (e.g., \uline,
135             \uuline, \uwave, \sout or \xout). Insets that output latex commands
136             relying on local assignments (such as \cite) should enclose such
137             commands in \mbox{} in order to avoid breakage.
138         */
139         mutable int inulemcmd = 0;
140
141         /** the font at the point where the inset is
142          *
143          * Note from lasgouttes: I have doubts on the semantics of this
144          * variable. Until this is sorted out, here are some notes on the
145          * history of local_font.
146          *
147          * A research that excludes test and assignment [*] shows that
148          * this is only used to remember language, which is a different
149          * story (and not changed by this patch). The only exception being
150          * in InsetMathHull::getCtObject and InsetMathNest::latex to
151          * support change tracking in insets, but I am not 100% sure that
152          * this is required. And historically [**] local_font used to be
153          * local_lang; it may be good to return to this simpler variable
154          * later.
155          *
156          *  [*] git grep local_font src|grep -v 'local_font [!=]*='
157          *
158          * [**] before afed118a, which improved support for InsetLine;
159          * however, since 0e7ab29f, InsetLine does not depend on the
160          * current font anymore.
161         */
162         Font const * local_font = nullptr;
163
164         /** Document language lyx name
165          */
166         std::string document_language;
167
168         /// main font encoding of the document
169         std::string main_fontenc;
170
171         /** The master language. Non-null only for child documents.
172             Note that this is not the language of the top level master, but
173             of the direct parent for nested includes.
174          */
175         mutable Language const * master_language = nullptr;
176
177         /// Active characters
178         std::string active_chars;
179
180         /** Current stream encoding. Only used for LaTeX.
181             This must be set to the document encoding (via the constructor)
182             before output starts. Afterwards it must be kept up to date for
183             each single character (\sa Paragraph::latex).
184             This does also mean that you need to set it back if you use a
185             copy (e.g. in insets): \code
186             int InsetFoo::latex(..., OutputParams const & runparams_in) const
187             {
188                 OutputParams runparams(runparams_in);
189                 runparams.inComment = true;
190                 ...
191                 InsetBla::latex(..., runparams);
192                 ...
193                 runparams_in.encoding = runparams.encoding;
194             }
195             \endcode
196          */
197         mutable Encoding const * encoding;
198
199         /** free_spacing == true means that the inset is in a free-spacing
200             paragraph.
201         */
202         bool free_spacing = false;
203
204         /** This var is set by the return value from BufferParams::writeLaTeX
205         */
206         bool use_babel = false;
207
208         /** Do we use polyglossia (instead of babel)?
209         */
210         bool use_polyglossia = false;
211
212         /** Do we use hyperref?
213         */
214         bool use_hyperref = false;
215
216         /// Do we use the CJK package?
217         bool use_CJK = false;
218
219         /** Are we generating multiple indices?
220         */
221         bool use_indices = false;
222
223         /** Are we using japanese (pLaTeX)?
224         */
225         bool use_japanese = false;
226
227         /** Customized bibtex_command
228         */
229         std::string bibtex_command;
230
231         /** Customized index_command
232         */
233         std::string index_command;
234
235         /** Hyperref driver
236         */
237         std::string hyperref_driver;
238
239         /** Line length to use with plaintext or LaTeX export.
240         */
241         size_type linelen = 0;
242
243         /** The depth of the current paragraph, set for plaintext
244          *  export and used by InsetTabular
245          */
246         int depth = 0;
247
248         /** Export data filled in by the latex(), docbook(), etc. methods.
249             This is a hack: Make it possible to add stuff to constant
250             OutputParams instances.
251         */
252         std::shared_ptr<ExportData> exportdata;
253
254         /** Store labels, index entries, etc. (in \ref post_macro)
255          *  and output them later. This is used in particular to get
256          *  labels and index entries (and potentially other fragile commands)
257          *  outside of moving arguments (bug 2154)
258          */
259         bool postpone_fragile_stuff = false;
260
261         /** Stuff to be postponed and output after the current macro
262          *  (if \ref postpone_fragile_stuff is true). Used for labels and index
263          *  entries in commands with moving arguments (\\section, \\caption etc.)
264          */
265         mutable docstring post_macro;
266
267         /** Whether we in a command that is not \\long (i.e. cannot have multiple
268          *  paragraphs)
269          */
270         mutable bool isNonLong = false;
271
272         /** Whether we are entering a display math inset.
273          *  Needed to correctly strike out deleted math in change tracking.
274          */
275         mutable bool inDisplayMath = false;
276
277         /** Whether we are leaving a display math inset.
278          *  Needed to correctly track nested ulem commands in change tracking.
279          */
280         mutable bool wasDisplayMath = false;
281
282         /** Whether we are inside a comment inset. Insets that are including
283          *  external files like InsetGraphics, InsetInclude and InsetExternal
284          *  may only write the usual output and must not attempt to do
285          *  something with the included files (e.g. copying, converting)
286          *  if this flag is true, since they may not exist.
287          */
288         bool inComment = false;
289
290         /** Whether we are inside an include inset. 
291          */
292         bool inInclude = false;
293
294         /** Whether a btUnit (for multiple biblographies) is open.
295          */
296         mutable bool openbtUnit = false;
297
298         /** Process only the children's aux files with BibTeX.
299          *  This is necessary with chapterbib.
300          */
301         bool only_childbibs = false;
302
303         /** Whether we are in a table cell.
304          *  For newline, it matters whether its content is aligned or not.
305         */
306         TableCell inTableCell = NO;
307
308         /** Whether we are inside a float or subfloat.
309          *  Needed for subfloat detection on the command line.
310          */
311         Float inFloat = NONFLOAT;
312
313         /** Whether we are inside an index inset.
314          *  ERT needs to know this, due to the active chars.
315          */
316         bool inIndexEntry = false;
317
318         /** Whether we are inside an IPA inset.
319          *  Needed for proper IPA output.
320          */
321         bool inIPA = false;
322
323         /** Whether we are inside an inset that is logically deleted.
324          *  A value > 0 indicates a deleted inset.
325         */
326         int inDeletedInset = 0;
327
328         /** The change information of the outermost logically deleted inset.
329          *  changeOfDeletedInset shall only be evaluated if inDeletedInset > 0.
330         */
331         Change changeOfDeletedInset {Change::UNCHANGED};
332
333         /** What kind of change tracking object is this?
334          * Relevant for strikeout method in output
335          */
336         mutable CtObject ctObject = CtObject::Normal;
337
338         /** allow output of only part of the top-level paragraphs
339          *  par_begin: beginning paragraph
340          */
341         mutable pit_type par_begin = 0;
342
343         /** allow output of only part of the top-level paragraphs
344          *  par_end: par_end-1 is the ending paragraph
345          *  if par_begin=par_end, output all paragraphs
346          */
347         mutable pit_type par_end = 0;
348
349         /// Id of the last paragraph before an inset
350         mutable int lastid = -1;
351
352         /// Last position in the last paragraph before an inset
353         mutable pos_type lastpos = 0;
354
355         /// is this the last paragraph in the current buffer/inset?
356         bool isLastPar = false;
357
358
359         /** whether or not to do actual file copying and image conversion
360          *  This mode will be used to preview the source code
361          */
362         bool dryrun = false;
363
364         /// whether to display output errors or not
365         bool silent = false;
366
367         /// Should we output verbatim or escape LaTeX's special chars?
368         bool pass_thru = false;
369
370         /// Should we output verbatim specific chars?
371         docstring pass_thru_chars;
372
373         /// A specific newline macro
374         std::string newlinecmd;
375
376         /// Should we output captions?
377         bool html_disable_captions = false;
378
379         /// Are we already in a paragraph?
380         bool html_in_par = false;
381
382         /// Does the present context even permit paragraphs?
383         bool html_make_pars = true;
384
385         /// Are we already in a paragraph?
386         bool docbook_in_par = false;
387
388         /// Is this element's allowMultiPar useable or not?
389         bool docbook_consider_allow_multi_par = true;
390
391         /// Does the present context even permit paragraphs?
392         bool docbook_make_pars = true;
393
394         /// Are paragraphs mandatory in this context?
395         bool docbook_force_pars = false;
396
397         /// Anchors that should not be output (LyX-side identifier, not DocBook-side).
398         std::set<docstring> docbook_anchors_to_ignore;
399
400         /// Is the current context a float (such as a table or a figure)?
401         bool docbook_in_float = false;
402
403         /// Is the current context a listing?
404         bool docbook_in_listing = false;
405
406         /// Is the current context a table?
407         bool docbook_in_table = false;
408
409         /// Should the layouts that should/must go into <info> be generated?
410         bool docbook_generate_info = true;
411
412         /// Should wrappers be ignored? Mostly useful to avoid generation of <abstract>.
413         bool docbook_ignore_wrapper = false;
414
415         /// Some parameters are output before the rest of the paragraph, they should not be generated a second time.
416         std::set<InsetArgument const *> docbook_prepended_arguments = {};
417
418         /// Some parameters are output after the rest of the paragraph, they should not be generated a second time.
419         std::set<InsetArgument const *> docbook_appended_arguments = {};
420
421         /// Are we generating this material for inclusion in a TOC-like entity?
422         bool for_toc = false;
423
424         /// Are we generating this material for inclusion in a tooltip?
425         bool for_tooltip = false;
426
427         /// Are we generating this material for use by advanced search?
428         enum Search {
429                 NoSearch = 0,
430                 SearchWithDeleted = 1,
431                 SearchWithoutDeleted = 2,
432                 SearchQuick = 4,
433                 SearchNonOutput = 8
434         };
435                 
436         inline bool find_effective(void) const { return (for_search != OutputParams::NoSearch); }
437         inline bool find_with_non_output() const { return ((for_search & OutputParams::SearchNonOutput) != 0); }
438         inline bool find_with_deleted() const { return ((for_search & OutputParams::SearchWithDeleted) != 0); }
439         inline void find_set_feature(enum Search set_) { for_search = set_; }
440         inline void find_add_feature(enum Search add_) { for_search |= add_; }
441         inline void find_clean_features(void) { for_search = OutputParams::NoSearch; }
442
443         /// Are we generating this material for instant preview?
444         bool for_preview = false;
445
446         /// Include all children notwithstanding the use of \includeonly
447         bool includeall = false;
448
449         /// Explicit output folder, if any is desired
450         std::string export_folder;
451
452         /// A postponed \\noindent (after VSpace)
453         mutable bool need_noindent = false;
454 private:
455         int for_search = NoSearch;
456 };
457
458
459 } // namespace lyx
460
461 #endif // NOT OUTPUTPARAMS_H