]> git.lyx.org Git - lyx.git/blob - src/LaTeX.h
More requires --> required, for C++2a.
[lyx.git] / src / LaTeX.h
1 // -*- C++ -*-
2 /**
3  * \file LaTeX.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 Angus Leeming
9  * \author Dekel Tsur
10  *
11  * Full author contact details are available in file CREDITS.
12  */
13
14 #ifndef LATEX_H
15 #define LATEX_H
16
17 #include "OutputParams.h"
18
19 #include "support/docstring.h"
20 #include "support/FileName.h"
21 #include "support/signals.h"
22
23 #include <vector>
24 #include <set>
25
26
27 namespace lyx {
28
29 class DepTable;
30
31 ///
32 class TeXErrors {
33 private:
34         ///
35         class Error {
36         public:
37                 ///
38                 Error () : error_in_line(0) {}
39                 ///
40                 Error(int line, docstring const & desc, docstring const & text,
41                       std::string const & fname)
42                         : error_in_line(line),
43                           error_desc(desc),
44                           error_text(text),
45                           child_name(fname) {}
46                 /// what line in the TeX file the error occurred in
47                 int error_in_line;
48                 /// The kind of error
49                 docstring error_desc;
50                 /// The line/cmd that caused the error.
51                 docstring error_text;
52                 /// The name of the child where error occurred, empty otherwise.
53                 std::string child_name;
54         };
55 public:
56         ///
57         typedef std::vector<Error> Errors;
58         ///
59         Errors::const_iterator begin() const { return errors.begin(); }
60         ///
61         Errors::const_iterator end() const { return errors.end(); }
62         ///
63         Errors::const_iterator begin_ref() const { return undef_ref.begin(); }
64         ///
65         Errors::const_iterator end_ref() const { return undef_ref.end(); }
66         ///
67         void insertError(int line, docstring const & error_desc,
68                          docstring const & error_text,
69                          std::string const & child_name = empty_string());
70         ///
71         void clearErrors() { errors.clear(); }
72         ///
73         void insertRef(int line, docstring const & error_desc,
74                          docstring const & error_text,
75                          std::string const & child_name = empty_string());
76         ///
77         void clearRefs() { undef_ref.clear(); }
78 private:
79         ///
80         Errors errors;
81         /// For missing Citation and references
82         Errors undef_ref;
83 };
84
85
86 class AuxInfo {
87 public:
88         ///
89         AuxInfo() {}
90         ///
91         support::FileName aux_file;
92         ///
93         std::set<std::string> citations;
94         ///
95         std::set<std::string> databases;
96         ///
97         std::set<std::string> styles;
98 };
99
100
101 ///
102 bool operator==(AuxInfo const &, AuxInfo const &);
103 bool operator!=(AuxInfo const &, AuxInfo const &);
104
105
106 /**
107  * Class to run the LaTeX compiler and needed auxiliary programs.
108  * The main .tex file must be in the current directory. The current directory
109  * must not change as long as an object of this class lives.
110  * This is required by the LaTeX compiler, and we also make use of it by
111  * various support::makeAbsPath() calls.
112  */
113 class LaTeX {
114 public:
115         /** Return values from scanLogFile() and run() (to come)
116
117             This enum should be enlarged a bit so that one could
118             get more feedback from the LaTeX run.
119         */
120         enum log_status {
121                 ///
122                 NO_ERRORS = 0,
123                 ///
124                 NO_LOGFILE = 1,
125                 ///
126                 NO_OUTPUT = 2,
127                 ///
128                 UNDEF_REF = 4, // Reference '...' on page ... undefined.
129                 ///
130                 UNDEF_CIT = 8, // Citation '...' on page ... undefined.
131                 ///
132                 RERUN = 16, // Label(s) may have changed. Rerun to get...
133                 ///
134                 TEX_ERROR = 32,
135                 ///
136                 TEX_WARNING = 64,
137                 ///
138                 LATEX_ERROR = 128,
139                 ///
140                 LATEX_WARNING = 256,
141                 ///
142                 PACKAGE_WARNING = 512,
143                 ///
144                 NO_FILE = 1024,
145                 ///
146                 NO_CHANGE = 2048,
147                 ///
148                 TOO_MANY_ERRORS = 4096,
149                 ///
150                 ERROR_RERUN = 8192,
151                 ///
152                 BIBTEX_ERROR = 16384,
153                 ///
154                 NONZERO_ERROR = 32768, // the command exited with nonzero status
155                 ///
156                 INDEX_ERROR = 65536,
157                 ///
158                 ERRORS = TEX_ERROR + LATEX_ERROR + NONZERO_ERROR + BIBTEX_ERROR + INDEX_ERROR,
159                 ///
160                 WARNINGS = TEX_WARNING + LATEX_WARNING + PACKAGE_WARNING
161         };
162
163         /// This signal emits an informative message
164         signals2::signal<void(docstring)> message;
165
166
167         /**
168            cmd = the latex command, file = name of the (temporary) latex file,
169            path = name of the files original path,
170            clean_start = This forces a fresh run by deleting the files in the temp
171                          dir. We set this e.g. if there was an error on previous
172                          preview, which is good if the user installed a package
173                          or changed certain document settings (#9061).
174         */
175         LaTeX(std::string const & cmd, OutputParams const &,
176               support::FileName const & file,
177               std::string const & path = empty_string(),
178               std::string const & lpath = empty_string(),
179               bool allow_cancellation = false,
180               bool const clean_start = false);
181
182         /// runs LaTeX several times
183         int run(TeXErrors &);
184
185         ///
186         int getNumErrors() { return num_errors;}
187
188         ///
189         int scanLogFile(TeXErrors &);
190
191 private:
192         /// noncopyable
193         LaTeX(LaTeX const &);
194         void operator=(LaTeX const &);
195
196         /// use this for running LaTeX once
197         int startscript();
198
199         /// The dependency file.
200         support::FileName depfile;
201
202         ///
203         void deplog(DepTable & head);
204
205         /// returns exit code
206         int runMakeIndex(std::string const &, OutputParams const &,
207                           std::string const & = std::string());
208
209         /// returns exit code
210         int runMakeIndexNomencl(support::FileName const &, 
211                                  std::string const &, std::string const &);
212
213         ///
214         std::vector<AuxInfo> const scanAuxFiles(support::FileName const &,
215                                                 bool const only_childbibs = false);
216
217         ///
218         AuxInfo const scanAuxFile(support::FileName const &);
219
220         ///
221         void scanAuxFile(support::FileName const &, AuxInfo &);
222
223         ///
224         void updateBibtexDependencies(DepTable &,
225                                       std::vector<AuxInfo> const &);
226
227         ///
228         int scanBlgFile(DepTable & head, TeXErrors & terr);
229
230         ///
231         int scanIlgFile(TeXErrors & terr);
232
233         ///
234         bool runBibTeX(std::vector<AuxInfo> const &,
235                        OutputParams const &, int & exit_code);
236
237         ///
238         void removeAuxiliaryFiles() const;
239
240         ///
241         std::string cmd;
242
243         ///
244         support::FileName file;
245
246         /// The document directory path.
247         std::string path;
248
249         /// Extra path, possibly relative to the document directory path.
250         std::string lpath;
251
252         /// used by scanLogFile
253         int num_errors;
254
255         /// The name of the final output file.
256         support::FileName output_file;
257
258         ///
259         OutputParams runparams;
260
261         /// Do we use biber?
262         bool biber;
263         ///
264         std::vector <std::string> children;
265         ///
266         bool allow_cancel;
267 };
268
269
270 } // namespace lyx
271
272 #endif