1# File: UseLATEX.cmake
2# CMAKE commands to actually use the LaTeX compiler
3# Version: 1.10.5
4# Author: Kenneth Moreland <kmorel@sandia.gov>
5#
6# Copyright 2004 Sandia Corporation.
7# Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8# license for use of this work by or on behalf of the
9# U.S. Government. Redistribution and use in source and binary forms, with
10# or without modification, are permitted provided that this Notice and any
11# statement of authorship are reproduced on all copies.
12#
13# The following function is defined:
14#
15# ADD_LATEX_DOCUMENT(<tex_file>
16#                    [BIBFILES <bib_files>]
17#                    [INPUTS <input_tex_files>]
18#                    [IMAGE_DIRS] <image_directories>
19#                    [IMAGES] <image_files>
20#                    [CONFIGURE] <tex_files>
21#                    [DEPENDS] <tex_files>
22#                    [MULTIBIB_NEWCITES] <suffix_list>
23#                    [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]
24#                    [DEFAULT_PDF] [DEFAULT_SAFEPDF] [DEFAULT_PS] [NO_DEFAULT]
25#                    [MANGLE_TARGET_NAMES])
26#       Adds targets that compile <tex_file>.  The latex output is placed
27#       in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is
28#       not set.  The latex program is picky about where files are located,
29#       so all input files are copied from the source directory to the
30#       output directory.  This includes the target tex file, any tex file
31#       listed with the INPUTS option, the bibliography files listed with
32#       the BIBFILES option, and any .cls, .bst, and .clo files found in
33#       the current source directory.  Images found in the IMAGE_DIRS
34#       directories or listed by IMAGES are also copied to the output
35#       directory and coverted to an appropriate format if necessary.  Any
36#       tex files also listed with the CONFIGURE option are also processed
37#       with the CMake CONFIGURE_FILE command (with the @ONLY flag).  Any
38#       file listed in CONFIGURE but not the target tex file or listed with
39#       INPUTS has no effect. DEPENDS can be used to specify generated files
40#       that are needed to compile the latex target.
41#
42#       The following targets are made:
43#               dvi: Makes <name>.dvi
44#               pdf: Makes <name>.pdf using pdflatex.
45#               safepdf: Makes <name>.pdf using ps2pdf.  If using the default
46#                       program arguments, this will ensure all fonts are
47#                       embedded and no lossy compression has been performed
48#                       on images.
49#               ps: Makes <name>.ps
50#               html: Makes <name>.html
51#               auxclean: Deletes <name>.aux and other auxiliary files.
52#                       This is sometimes necessary if a LaTeX error occurs
53#                       and writes a bad aux file.  Unlike the regular clean
54#                       target, it does not delete other input files, such as
55#                       converted images, to save time on the rebuild.
56#
57#       The dvi target is added to the ALL.  That is, it will be the target
58#       built by default.  If the DEFAULT_PDF argument is given, then the
59#       pdf target will be the default instead of dvi.  Likewise,
60#       DEFAULT_SAFEPDF sets the default target to safepdf.  If NO_DEFAULT
61#       is specified, then no target will be added to ALL, which is
62#       convenient when including LaTeX documentation with something else.
63#
64#       If the argument MANGLE_TARGET_NAMES is given, then each of the
65#       target names above will be mangled with the <tex_file> name.  This
66#       is to make the targets unique if ADD_LATEX_DOCUMENT is called for
67#       multiple documents.  If the argument USE_INDEX is given, then
68#       commands to build an index are made.  If the argument USE_GLOSSARY
69#       is given, then commands to build a glossary are made.  If the
70#       argument MULTIBIB_NEWCITES is given, then additional bibtex calls
71#       are added to the build to support the extra auxiliary files created
72#       with the \newcite command in the multibib package.
73#
74# History:
75#
76# 1.10.5 Fix for Window's convert check (thanks to Martin Baute).
77#
78# 1.10.4 Copy font files to binary directory for packages that come with
79#       their own fonts.
80#
81# 1.10.3 Check for Windows version of convert being used instead of
82#       ImageMagick's version (thanks to Martin Baute).
83#
84# 1.10.2 Use htlatex as a fallback when latex2html is not available (thanks
85#       to Tomasz Grzegurzko).
86#
87# 1.10.1 Make convert program mandatory only if actually used (thanks to
88#       Julien Schueller).
89#
90# 1.10.0 Added NO_DEFAULT and DEFAULT_PS options.
91#       Fixed issue with cleaning files for LaTeX documents originating in
92#       a subdirectory.
93#
94# 1.9.6 Fixed problem with LATEX_SMALL_IMAGES.
95#       Strengthened check to make sure the output directory does not contain
96#       the source files.
97#
98# 1.9.5 Add support for image types not directly supported by either latex
99#       or pdflatex.  (Thanks to Jorge Gerardo Pena Pastor for SVG support.)
100#
101# 1.9.4 Fix issues with filenames containing multiple periods.
102#
103# 1.9.3 Hide some variables that are now cached but should not show up in
104#       the ccmake list of variables.
105#
106# 1.9.2 Changed MACRO declarations to FUNCTION declarations.  The better
107#       FUNCTION scoping will hopefully avoid some common but subtle bugs.
108#       This implicitly increases the minimum CMake version to 4.6 (although
109#       I honestly only test it with the latest 4.8 version).
110#
111#       Since we are updating the minimum CMake version, I'm going to start
112#       using the builtin LIST commands that are now available.
113#
114#       Favor using pdftops from the Poppler package to convert from pdf to
115#       eps.  It does a much better job than ImageMagick or ghostscript.
116#
117# 1.9.1 Fixed typo that caused the LATEX_SMALL_IMAGES option to fail to
118#       activate.
119#
120# 1.9.0 Add support for the multibib package (thanks to Antonio LaTorre).
121#
122# 1.8.2 Fix corner case when an argument name was also a variable containing
123#       the text of an argument.  In this case, the CMake IF was matching
124#       the argument text with the contents of the variable with the same
125#       argument name.
126#
127# 1.8.1 Fix problem where ps2pdf was not getting the appropriate arguments.
128#
129# 1.8.0 Add support for synctex.
130#
131# 1.7.7 Support calling xindy when making glossaries.
132#
133#       Improved make clean support.
134#
135# 1.7.6 Add support for the nomencl package (thanks to Myles English).
136#
137# 1.7.5 Fix issue with bibfiles being copied two different ways, which causes
138#       Problems with dependencies (thanks to Edwin van Leeuwen).
139#
140# 1.7.4 Added the DEFAULT_SAFEPDF option (thanks to Raymond Wan).
141#
142#       Added warnings when image directories are not found (and were
143#       probably not given relative to the source directory).
144#
145# 1.7.3 Fix some issues with interactions between makeglossaries and bibtex
146#       (thanks to Mark de Wever).
147#
148# 1.7.2 Use ps2pdf to convert eps to pdf to get around the problem with
149#       ImageMagick dropping the bounding box (thanks to Lukasz Lis).
150#
151# 1.7.1 Fixed some dependency issues.
152#
153# 1.7.0 Added DEPENDS options (thanks to Theodore Papadopoulo).
154#
155# 1.6.1 Ported the makeglossaries command to CMake and embedded the port
156#       into UseLATEX.cmake.
157#
158# 1.6.0 Allow the use of the makeglossaries command.  Thanks to Oystein
159#       S. Haaland for the patch.
160#
161# 1.5.0 Allow any type of file in the INPUTS lists, not just tex file
162#       (suggested by Eric Noulard).  As a consequence, the ability to
163#       specify tex files without the .tex extension is removed.  The removed
164#       function is of dubious value anyway.
165#
166#       When copying input files, skip over any file that exists in the
167#       binary directory but does not exist in the source directory with the
168#       assumption that these files were added by some other mechanism.  I
169#       find this useful when creating large documents with multiple
170#       chapters that I want to build separately (for speed) as I work on
171#       them.  I use the same boilerplate as the starting point for all
172#       and just copy it with different configurations.  This was what the
173#       separate ADD_LATEX_DOCUMENT method was supposed to originally be for.
174#       Since its external use is pretty much deprecated, I removed that
175#       documentation.
176#
177# 1.4.1 Copy .sty files along with the other class and package files.
178#
179# 1.4.0 Added a MANGLE_TARGET_NAMES option that will mangle the target names.
180#
181#       Fixed problem with copying bib files that became apparent with
182#       CMake 2.4.
183#
184# 1.3.0 Added a LATEX_OUTPUT_PATH variable that allows you or the user to
185#       specify where the built latex documents to go.  This is especially
186#       handy if you want to do in-source builds.
187#
188#       Removed the ADD_LATEX_IMAGES macro and absorbed the functionality
189#       into ADD_LATEX_DOCUMENT.  The old interface was always kind of
190#       clunky anyway since you had to specify the image directory in both
191#       places.  It also made supporting LATEX_OUTPUT_PATH problematic.
192#
193#       Added support for jpeg files.
194#
195# 1.2.0 Changed the configuration options yet again.  Removed the NO_CONFIGURE
196#       Replaced it with a CONFIGURE option that lists input files for which
197#       configure should be run.
198#
199#       The pdf target no longer depends on the dvi target.  This allows you
200#       to build latex documents that require pdflatex.  Also added an option
201#       to make the pdf target the default one.
202#
203# 1.1.1 Added the NO_CONFIGURE option.  The @ character can be used when
204#       specifying table column separators.  If two or more are used, then
205#       will incorrectly substitute them.
206#
207# 1.1.0 Added ability include multiple bib files.  Added ability to do copy
208#       sub-tex files for multipart tex files.
209#
210# 1.0.0 If both ps and pdf type images exist, just copy the one that
211#       matches the current render mode.  Replaced a bunch of STRING
212#       commands with GET_FILENAME_COMPONENT commands that were made to do
213#       the desired function.
214#
215# 0.4.0 First version posted to CMake Wiki.
216#
217
218#############################################################################
219# Find the location of myself while originally executing.  If you do this
220# inside of a macro, it will recode where the macro was invoked.
221#############################################################################
222SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE}
223  CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE
224  )
225
226#############################################################################
227# Generic helper functions
228#############################################################################
229
230FUNCTION(LATEX_LIST_CONTAINS var value)
231  SET(input_list ${ARGN})
232  LIST(FIND input_list "${value}" index)
233  IF (index GREATER -1)
234    SET(${var} TRUE PARENT_SCOPE)
235  ELSE (index GREATER -1)
236    SET(${var} PARENT_SCOPE)
237  ENDIF (index GREATER -1)
238ENDFUNCTION(LATEX_LIST_CONTAINS)
239
240# Parse function arguments.  Variables containing the results are placed
241# in the global scope for historical reasons.
242FUNCTION(LATEX_PARSE_ARGUMENTS prefix arg_names option_names)
243  SET(DEFAULT_ARGS)
244  FOREACH(arg_name ${arg_names})
245    SET(${prefix}_${arg_name} CACHE INTERNAL "${prefix} argument" FORCE)
246  ENDFOREACH(arg_name)
247  FOREACH(option ${option_names})
248    SET(${prefix}_${option} CACHE INTERNAL "${prefix} option" FORCE)
249  ENDFOREACH(option)
250
251  SET(current_arg_name DEFAULT_ARGS)
252  SET(current_arg_list)
253  FOREACH(arg ${ARGN})
254    LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names})
255    LATEX_LIST_CONTAINS(is_option ${arg} ${option_names})
256    IF (is_arg_name)
257      SET(${prefix}_${current_arg_name} ${current_arg_list}
258        CACHE INTERNAL "${prefix} argument" FORCE)
259      SET(current_arg_name ${arg})
260      SET(current_arg_list)
261    ELSEIF (is_option)
262      SET(${prefix}_${arg} TRUE CACHE INTERNAL "${prefix} option" FORCE)
263    ELSE (is_arg_name)
264      SET(current_arg_list ${current_arg_list} ${arg})
265    ENDIF (is_arg_name)
266  ENDFOREACH(arg)
267  SET(${prefix}_${current_arg_name} ${current_arg_list}
268    CACHE INTERNAL "${prefix} argument" FORCE)
269ENDFUNCTION(LATEX_PARSE_ARGUMENTS)
270
271# Match the contents of a file to a regular expression.
272FUNCTION(LATEX_FILE_MATCH variable filename regexp default)
273  # The FILE STRINGS command would be a bit better, but I'm not totally sure
274  # the match will always be to a whole line, and I don't want to break things.
275  FILE(READ ${filename} file_contents)
276  STRING(REGEX MATCHALL "${regexp}"
277    match_result ${file_contents}
278    )
279  IF (match_result)
280    SET(${variable} "${match_result}" PARENT_SCOPE)
281  ELSE (match_result)
282    SET(${variable} "${default}" PARENT_SCOPE)
283  ENDIF (match_result)
284ENDFUNCTION(LATEX_FILE_MATCH)
285
286# A version of GET_FILENAME_COMPONENT that treats extensions after the last
287# period rather than the first.  To the best of my knowledge, all filenames
288# typically used by LaTeX, including image files, have small extensions
289# after the last dot.
290FUNCTION(LATEX_GET_FILENAME_COMPONENT varname filename type)
291  SET(result)
292  IF ("${type}" STREQUAL "NAME_WE")
293    GET_FILENAME_COMPONENT(name ${filename} NAME)
294    STRING(REGEX REPLACE "\\.[^.]*\$" "" result "${name}")
295  ELSEIF ("${type}" STREQUAL "EXT")
296    GET_FILENAME_COMPONENT(name ${filename} NAME)
297    STRING(REGEX MATCH "\\.[^.]*\$" result "${name}")
298  ELSE ("${type}" STREQUAL "NAME_WE")
299    GET_FILENAME_COMPONENT(result ${filename} ${type})
300  ENDIF ("${type}" STREQUAL "NAME_WE")
301  SET(${varname} "${result}" PARENT_SCOPE)
302ENDFUNCTION(LATEX_GET_FILENAME_COMPONENT)
303
304#############################################################################
305# Functions that perform processing during a LaTeX build.
306#############################################################################
307FUNCTION(LATEX_MAKEGLOSSARIES)
308  # This is really a bare bones port of the makeglossaries perl script into
309  # CMake scripting.
310  MESSAGE("**************************** In makeglossaries")
311  IF (NOT LATEX_TARGET)
312    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
313  ENDIF (NOT LATEX_TARGET)
314
315  SET(aux_file ${LATEX_TARGET}.aux)
316
317  IF (NOT EXISTS ${aux_file})
318    MESSAGE(SEND_ERROR "${aux_file} does not exist.  Run latex on your target file.")
319  ENDIF (NOT EXISTS ${aux_file})
320
321  LATEX_FILE_MATCH(newglossary_lines ${aux_file}
322    "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
323    "@newglossary{main}{glg}{gls}{glo}"
324    )
325
326  LATEX_FILE_MATCH(istfile_line ${aux_file}
327    "@istfilename[ \t]*{([^}]*)}"
328    "@istfilename{${LATEX_TARGET}.ist}"
329    )
330  STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1"
331    istfile ${istfile_line}
332    )
333
334  STRING(REGEX MATCH ".*\\.xdy" use_xindy "${istfile}")
335  IF (use_xindy)
336    MESSAGE("*************** Using xindy")
337    IF (NOT XINDY_COMPILER)
338      MESSAGE(SEND_ERROR "Need to define XINDY_COMPILER")
339    ENDIF (NOT XINDY_COMPILER)
340  ELSE (use_xindy)
341    MESSAGE("*************** Using makeindex")
342    IF (NOT MAKEINDEX_COMPILER)
343      MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
344    ENDIF (NOT MAKEINDEX_COMPILER)
345  ENDIF (use_xindy)
346
347  FOREACH(newglossary ${newglossary_lines})
348    STRING(REGEX REPLACE
349      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
350      "\\1" glossary_name ${newglossary}
351      )
352    STRING(REGEX REPLACE
353      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
354      "${LATEX_TARGET}.\\2" glossary_log ${newglossary}
355      )
356    STRING(REGEX REPLACE
357      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
358      "${LATEX_TARGET}.\\3" glossary_out ${newglossary}
359      )
360    STRING(REGEX REPLACE
361      "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
362      "${LATEX_TARGET}.\\4" glossary_in ${newglossary}
363      )
364
365    IF (use_xindy)
366      LATEX_FILE_MATCH(xdylanguage_line ${aux_file}
367        "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}"
368        "@xdylanguage{${glossary_name}}{english}"
369        )
370      STRING(REGEX REPLACE
371        "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}"
372        "\\1"
373        language
374        ${xdylanguage_line}
375        )
376      # What crazy person makes a LaTeX index generater that uses different
377      # identifiers for language than babel (or at least does not support
378      # the old ones)?
379      IF (${language} STREQUAL "frenchb")
380        SET(language "french")
381      ELSEIF (${language} MATCHES "^n?germanb?$")
382        SET(language "german")
383      ELSEIF (${language} STREQUAL "magyar")
384        SET(language "hungarian")
385      ELSEIF (${language} STREQUAL "lsorbian")
386        SET(language "lower-sorbian")
387      ELSEIF (${language} STREQUAL "norsk")
388        SET(language "norwegian")
389      ELSEIF (${language} STREQUAL "portuges")
390        SET(language "portuguese")
391      ELSEIF (${language} STREQUAL "russianb")
392        SET(language "russian")
393      ELSEIF (${language} STREQUAL "slovene")
394        SET(language "slovenian")
395      ELSEIF (${language} STREQUAL "ukraineb")
396        SET(language "ukrainian")
397      ELSEIF (${language} STREQUAL "usorbian")
398        SET(language "upper-sorbian")
399      ENDIF (${language} STREQUAL "frenchb")
400      IF (language)
401        SET(language_flags "-L ${language}")
402      ELSE (language)
403        SET(language_flags "")
404      ENDIF (language)
405
406      LATEX_FILE_MATCH(codepage_line ${aux_file}
407        "@gls@codepage[ \t]*{${glossary_name}}{([^}]*)}"
408        "@gls@codepage{${glossary_name}}{utf}"
409        )
410      STRING(REGEX REPLACE
411        "@gls@codepage[ \t]*{${glossary_name}}{([^}]*)}"
412        "\\1"
413        codepage
414        ${codepage_line}
415        )
416      IF (codepage)
417        SET(codepage_flags "-C ${codepage}")
418      ELSE (codepage)
419        # Ideally, we would check that the language is compatible with the
420        # default codepage, but I'm hoping that distributions will be smart
421        # enough to specify their own codepage.  I know, it's asking a lot.
422        SET(codepage_flags "")
423      ENDIF (codepage)
424
425      MESSAGE("${XINDY_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} ${language_flags} ${codepage_flags} -I xindy -M ${glossary_name} -t ${glossary_log} -o ${glossary_out} ${glossary_in}"
426        )
427      EXEC_PROGRAM(${XINDY_COMPILER}
428        ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
429          ${language_flags}
430          ${codepage_flags}
431          -I xindy
432          -M ${glossary_name}
433          -t ${glossary_log}
434          -o ${glossary_out}
435          ${glossary_in}
436        OUTPUT_VARIABLE xindy_output
437        )
438      MESSAGE("${xindy_output}")
439
440      # So, it is possible (perhaps common?) for aux files to specify a
441      # language and codepage that are incompatible with each other.  Check
442      # for that condition, and if it happens run again with the default
443      # codepage.
444      IF ("${xindy_output}" MATCHES "^Cannot locate xindy module for language (.+) in codepage (.+)\\.$")
445        MESSAGE("*************** Retrying xindy with default codepage.")
446        EXEC_PROGRAM(${XINDY_COMPILER}
447          ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
448            ${language_flags}
449            -I xindy
450            -M ${glossary_name}
451            -t ${glossary_log}
452            -o ${glossary_out}
453            ${glossary_in}
454          )
455      ENDIF ("${xindy_output}" MATCHES "^Cannot locate xindy module for language (.+) in codepage (.+)\\.$")
456
457    ELSE (use_xindy)
458      MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}")
459      EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
460        -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}
461        )
462    ENDIF (use_xindy)
463
464  ENDFOREACH(newglossary)
465ENDFUNCTION(LATEX_MAKEGLOSSARIES)
466
467FUNCTION(LATEX_MAKENOMENCLATURE)
468  MESSAGE("**************************** In makenomenclature")
469  IF (NOT LATEX_TARGET)
470    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
471  ENDIF (NOT LATEX_TARGET)
472
473  IF (NOT MAKEINDEX_COMPILER)
474    MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
475  ENDIF (NOT MAKEINDEX_COMPILER)
476
477  SET(nomencl_out ${LATEX_TARGET}.nls)
478  SET(nomencl_in ${LATEX_TARGET}.nlo)
479
480  EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKENOMENCLATURE_COMPILER_FLAGS}
481    ${nomencl_in} -s "nomencl.ist" -o ${nomencl_out}
482    )
483ENDFUNCTION(LATEX_MAKENOMENCLATURE)
484
485FUNCTION(LATEX_CORRECT_SYNCTEX)
486  MESSAGE("**************************** In correct SyncTeX")
487  IF (NOT LATEX_TARGET)
488    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
489  ENDIF (NOT LATEX_TARGET)
490
491  IF (NOT GZIP)
492    MESSAGE(SEND_ERROR "Need to define GZIP")
493  ENDIF (NOT GZIP)
494
495  IF (NOT LATEX_SOURCE_DIRECTORY)
496    MESSAGE(SEND_ERROR "Need to define LATEX_SOURCE_DIRECTORY")
497  ENDIF (NOT LATEX_SOURCE_DIRECTORY)
498
499  IF (NOT LATEX_BINARY_DIRECTORY)
500    MESSAGE(SEND_ERROR "Need to define LATEX_BINARY_DIRECTORY")
501  ENDIF (NOT LATEX_BINARY_DIRECTORY)
502
503  SET(synctex_file ${LATEX_BINARY_DIRECTORY}/${LATEX_TARGET}.synctex)
504  SET(synctex_file_gz ${synctex_file}.gz)
505
506  IF (EXISTS ${synctex_file_gz})
507
508    MESSAGE("Making backup of synctex file.")
509    CONFIGURE_FILE(${synctex_file_gz} ${synctex_file}.bak.gz COPYONLY)
510
511    MESSAGE("Uncompressing synctex file.")
512    EXEC_PROGRAM(${GZIP}
513      ARGS --decompress ${synctex_file_gz}
514      )
515
516    MESSAGE("Reading synctex file.")
517    FILE(READ ${synctex_file} synctex_data)
518
519    MESSAGE("Replacing relative with absolute paths.")
520    STRING(REGEX REPLACE
521      "(Input:[0-9]+:)([^/\n][^\n]*)"
522      "\\1${LATEX_SOURCE_DIRECTORY}/\\2"
523      synctex_data
524      "${synctex_data}"
525      )
526
527    MESSAGE("Writing synctex file.")
528    FILE(WRITE ${synctex_file} "${synctex_data}")
529
530    MESSAGE("Compressing synctex file.")
531    EXEC_PROGRAM(${GZIP}
532      ARGS ${synctex_file}
533      )
534
535  ELSE (EXISTS ${synctex_file_gz})
536
537    MESSAGE(SEND_ERROR "File ${synctex_file_gz} not found.  Perhaps synctex is not supported by your LaTeX compiler.")
538
539  ENDIF (EXISTS ${synctex_file_gz})
540
541ENDFUNCTION(LATEX_CORRECT_SYNCTEX)
542
543#############################################################################
544# Helper functions for establishing LaTeX build.
545#############################################################################
546
547FUNCTION(LATEX_NEEDIT VAR NAME)
548  IF (NOT ${VAR})
549    MESSAGE(SEND_ERROR "I need the ${NAME} command.")
550  ENDIF(NOT ${VAR})
551ENDFUNCTION(LATEX_NEEDIT)
552
553FUNCTION(LATEX_WANTIT VAR NAME)
554  IF (NOT ${VAR})
555    MESSAGE(STATUS "I could not find the ${NAME} command.")
556  ENDIF(NOT ${VAR})
557ENDFUNCTION(LATEX_WANTIT)
558
559FUNCTION(LATEX_SETUP_VARIABLES)
560  SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}"
561    CACHE PATH "If non empty, specifies the location to place LaTeX output."
562    )
563
564  FIND_PACKAGE(LATEX)
565
566  FIND_PROGRAM(XINDY_COMPILER
567    NAME xindy
568    PATHS ${MIKTEX_BINARY_PATH} /usr/bin
569    )
570
571  FIND_PACKAGE(UnixCommands)
572
573  FIND_PROGRAM(PDFTOPS_CONVERTER
574    NAMES pdftops
575    DOC "The pdf to ps converter program from the Poppler package."
576    )
577
578  MARK_AS_ADVANCED(CLEAR
579    LATEX_COMPILER
580    PDFLATEX_COMPILER
581    BIBTEX_COMPILER
582    MAKEINDEX_COMPILER
583    XINDY_COMPILER
584    DVIPS_CONVERTER
585    PS2PDF_CONVERTER
586    PDFTOPS_CONVERTER
587    LATEX2HTML_CONVERTER
588    )
589
590  LATEX_NEEDIT(LATEX_COMPILER latex)
591  LATEX_WANTIT(PDFLATEX_COMPILER pdflatex)
592  LATEX_NEEDIT(BIBTEX_COMPILER bibtex)
593  LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex)
594  LATEX_WANTIT(DVIPS_CONVERTER dvips)
595  LATEX_WANTIT(PS2PDF_CONVERTER ps2pdf)
596  LATEX_WANTIT(PDFTOPS_CONVERTER pdftops)
597  # MiKTeX calls latex2html htlatex
598  IF (NOT ${LATEX2HTML_CONVERTER})
599    FIND_PROGRAM(HTLATEX_CONVERTER
600      NAMES htlatex
601      PATHS ${MIKTEX_BINARY_PATH}
602            /usr/bin
603    )
604    IF (HTLATEX_CONVERTER)
605      SET(USING_HTLATEX TRUE CACHE INTERNAL "True when using MiKTeX htlatex instead of latex2html" FORCE)
606      SET(LATEX2HTML_CONVERTER ${HTLATEX_CONVERTER}
607        CACHE FILEPATH "htlatex taking the place of latex2html" FORCE)
608    ELSE (HTLATEX_CONVERTER)
609      SET(USING_HTLATEX FALSE CACHE INTERNAL "True when using MiKTeX htlatex instead of latex2html" FORCE)
610    ENDIF (HTLATEX_CONVERTER)
611  ENDIF (NOT ${LATEX2HTML_CONVERTER})
612  LATEX_WANTIT(LATEX2HTML_CONVERTER latex2html)
613
614  SET(LATEX_COMPILER_FLAGS "-interaction=nonstopmode"
615    CACHE STRING "Flags passed to latex.")
616  SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS}
617    CACHE STRING "Flags passed to pdflatex.")
618  SET(LATEX_SYNCTEX_FLAGS "-synctex=1"
619    CACHE STRING "latex/pdflatex flags used to create synctex file.")
620  SET(BIBTEX_COMPILER_FLAGS ""
621    CACHE STRING "Flags passed to bibtex.")
622  SET(MAKEINDEX_COMPILER_FLAGS ""
623    CACHE STRING "Flags passed to makeindex.")
624  SET(MAKEGLOSSARIES_COMPILER_FLAGS ""
625    CACHE STRING "Flags passed to makeglossaries.")
626  SET(MAKENOMENCLATURE_COMPILER_FLAGS ""
627    CACHE STRING "Flags passed to makenomenclature.")
628  SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter"
629    CACHE STRING "Flags passed to dvips.")
630  SET(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode"
631    CACHE STRING "Flags passed to ps2pdf.")
632  SET(PDFTOPS_CONVERTER_FLAGS -r 600
633    CACHE STRING "Flags passed to pdftops.")
634  SET(LATEX2HTML_CONVERTER_FLAGS ""
635    CACHE STRING "Flags passed to latex2html.")
636  MARK_AS_ADVANCED(
637    LATEX_COMPILER_FLAGS
638    PDFLATEX_COMPILER_FLAGS
639    LATEX_SYNCTEX_FLAGS
640    BIBTEX_COMPILER_FLAGS
641    MAKEINDEX_COMPILER_FLAGS
642    MAKEGLOSSARIES_COMPILER_FLAGS
643    MAKENOMENCLATURE_COMPILER_FLAGS
644    DVIPS_CONVERTER_FLAGS
645    PS2PDF_CONVERTER_FLAGS
646    PDFTOPS_CONVERTER_FLAGS
647    LATEX2HTML_CONVERTER_FLAGS
648    )
649  SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS)
650  SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS)
651  SEPARATE_ARGUMENTS(LATEX_SYNCTEX_FLAGS)
652  SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS)
653  SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS)
654  SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS)
655  SEPARATE_ARGUMENTS(MAKENOMENCLATURE_COMPILER_FLAGS)
656  SEPARATE_ARGUMENTS(DVIPS_CONVERTER_FLAGS)
657  SEPARATE_ARGUMENTS(PS2PDF_CONVERTER_FLAGS)
658  SEPARATE_ARGUMENTS(PDFTOPS_CONVERTER_FLAGS)
659  SEPARATE_ARGUMENTS(LATEX2HTML_CONVERTER_FLAGS)
660
661  FIND_PROGRAM(IMAGEMAGICK_CONVERT convert
662    DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)."
663    )
664
665  OPTION(LATEX_USE_SYNCTEX
666    "If on, have LaTeX generate a synctex file, which WYSIWYG editors can use to correlate output files like dvi and pdf with the lines of LaTeX source that generates them.  In addition to adding the LATEX_SYNCTEX_FLAGS to the command line, this option also adds build commands that \"corrects\" the resulting synctex file to point to the original LaTeX files rather than those generated by UseLATEX.cmake."
667    OFF
668    )
669
670  OPTION(LATEX_SMALL_IMAGES
671    "If on, the raster images will be converted to 1/6 the original size.  This is because papers usually require 600 dpi images whereas most monitors only require at most 96 dpi.  Thus, smaller images make smaller files for web distributation and can make it faster to read dvi files."
672    OFF)
673  IF (LATEX_SMALL_IMAGES)
674    SET(LATEX_RASTER_SCALE 16 PARENT_SCOPE)
675    SET(LATEX_OPPOSITE_RASTER_SCALE 100 PARENT_SCOPE)
676  ELSE (LATEX_SMALL_IMAGES)
677    SET(LATEX_RASTER_SCALE 100 PARENT_SCOPE)
678    SET(LATEX_OPPOSITE_RASTER_SCALE 16 PARENT_SCOPE)
679  ENDIF (LATEX_SMALL_IMAGES)
680
681  # Just holds extensions for known image types.  They should all be lower case.
682  # For historical reasons, these are all declared in the global scope.
683  SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps CACHE INTERNAL "")
684  SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS CACHE INTERNAL "")
685  SET(LATEX_DVI_IMAGE_EXTENSIONS
686    ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS}
687    ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}
688    CACHE INTERNAL ""
689    )
690
691  SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf CACHE INTERNAL "")
692  SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg CACHE INTERNAL "")
693  SET(LATEX_PDF_IMAGE_EXTENSIONS
694    ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS}
695    ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}
696    CACHE INTERNAL ""
697    )
698
699  SET(LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS .svg CACHE INTERNAL "")
700  SET(LATEX_OTHER_RASTER_IMAGE_EXTENSIONS .tif .tiff .gif CACHE INTERNAL "")
701  SET(LATEX_OTHER_IMAGE_EXTENSIONS
702    ${LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS}
703    ${LATEX_OTHER_RASTER_IMAGE_EXTENSIONS}
704    CACHE INTERNAL ""
705    )
706
707  SET(LATEX_VECTOR_IMAGE_EXTENSIONS
708    ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS}
709    ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS}
710    ${LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS}
711    CACHE INTERNAL ""
712    )
713  SET(LATEX_RASTER_IMAGE_EXTENSIONS
714    ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}
715    ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}
716    ${LATEX_OTHER_RASTER_IMAGE_EXTENSIONS}
717    CACHE INTERNAL ""
718    )
719  SET(LATEX_IMAGE_EXTENSIONS
720    ${LATEX_DVI_IMAGE_EXTENSIONS}
721    ${LATEX_PDF_IMAGE_EXTENSIONS}
722    ${LATEX_OTHER_IMAGE_EXTENSIONS}
723    CACHE INTERNAL ""
724    )
725ENDFUNCTION(LATEX_SETUP_VARIABLES)
726
727FUNCTION(LATEX_GET_OUTPUT_PATH var)
728  SET(latex_output_path)
729  IF (LATEX_OUTPUT_PATH)
730    GET_FILENAME_COMPONENT(
731      LATEX_OUTPUT_PATH_FULL "${LATEX_OUTPUT_PATH}" ABSOLUTE
732      )
733    IF ("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
734      MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.")
735    ELSE ("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
736      SET(latex_output_path "${LATEX_OUTPUT_PATH_FULL}")
737    ENDIF ("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
738  ELSE (LATEX_OUTPUT_PATH)
739    IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
740      MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.")
741    ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
742      SET(latex_output_path "${CMAKE_CURRENT_BINARY_DIR}")
743    ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
744  ENDIF (LATEX_OUTPUT_PATH)
745  SET(${var} ${latex_output_path} PARENT_SCOPE)
746ENDFUNCTION(LATEX_GET_OUTPUT_PATH)
747
748FUNCTION(LATEX_ADD_CONVERT_COMMAND
749    output_path
750    input_path
751    output_extension
752    input_extension
753    flags
754    )
755  SET (require_imagemagick_convert TRUE)
756  SET (convert_flags "")
757  IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
758    # ImageMagick has broken eps to pdf conversion
759    # use ps2pdf instead
760    IF (PS2PDF_CONVERTER)
761      SET (require_imagemagick_convert FALSE)
762      SET (converter ${PS2PDF_CONVERTER})
763      SET (convert_flags -dEPSCrop ${PS2PDF_CONVERTER_FLAGS})
764    ELSE (PS2PDF_CONVERTER)
765      MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.")
766    ENDIF (PS2PDF_CONVERTER)
767  ELSEIF (${input_extension} STREQUAL ".pdf" AND ${output_extension} STREQUAL ".eps")
768    # ImageMagick can also be sketchy on pdf to eps conversion.  Not good with
769    # color spaces and tends to unnecessarily rasterize.
770    # use pdftops instead
771    IF (PDFTOPS_CONVERTER)
772      SET (require_imagemagick_convert FALSE)
773      SET(converter ${PDFTOPS_CONVERTER})
774      SET(convert_flags -eps ${PDFTOPS_CONVERTER_FLAGS})
775    ELSE (PDFTOPS_CONVERTER)
776      MESSAGE(STATUS "Consider getting pdftops from Poppler to convert PDF images to EPS images.")
777      SET (convert_flags ${flags})
778    ENDIF (PDFTOPS_CONVERTER)
779  ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
780    SET (convert_flags ${flags})
781  ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
782
783  IF (require_imagemagick_convert)
784    IF (IMAGEMAGICK_CONVERT)
785      STRING(TOLOWER ${IMAGEMAGICK_CONVERT} IMAGEMAGICK_CONVERT_LOWERCASE)
786      IF (${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe")
787        MESSAGE(SEND_ERROR "IMAGEMAGICK_CONVERT set to Window's convert.exe for changing file systems rather than ImageMagick's convert for changing image formats.  Please make sure ImageMagick is installed (available at http://www.imagemagick.org) and its convert program is used for IMAGEMAGICK_CONVERT.  (It is helpful if ImageMagick's path is before the Windows system paths.)")
788      ELSE (${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe")
789        SET (converter ${IMAGEMAGICK_CONVERT})
790      ENDIF (${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe")
791    ELSE (IMAGEMAGICK_CONVERT)
792      MESSAGE(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.")
793    ENDIF (IMAGEMAGICK_CONVERT)
794  ENDIF (require_imagemagick_convert)
795
796  ADD_CUSTOM_COMMAND(OUTPUT ${output_path}
797    COMMAND ${converter}
798      ARGS ${convert_flags} ${input_path} ${output_path}
799    DEPENDS ${input_path}
800    )
801ENDFUNCTION(LATEX_ADD_CONVERT_COMMAND)
802
803# Makes custom commands to convert a file to a particular type.
804FUNCTION(LATEX_CONVERT_IMAGE
805    output_files_var
806    input_file
807    output_extension
808    convert_flags
809    output_extensions
810    other_files
811    )
812  SET(output_file_list)
813  SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR})
814  LATEX_GET_OUTPUT_PATH(output_dir)
815
816  LATEX_GET_FILENAME_COMPONENT(extension "${input_file}" EXT)
817
818  # Check input filename for potential problems with LaTeX.
819  LATEX_GET_FILENAME_COMPONENT(name "${input_file}" NAME_WE)
820  IF (name MATCHES ".*\\..*")
821    STRING(REPLACE "." "-" suggested_name "${name}")
822    SET(suggested_name "${suggested_name}${extension}")
823    MESSAGE(WARNING "Some LaTeX distributions have problems with image file names with multiple extensions.  Consider changing ${name}${extension} to something like ${suggested_name}.")
824  ENDIF (name MATCHES ".*\\..*")
825
826  STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file
827    "${input_file}")
828
829  LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions})
830  IF (is_type)
831    IF (convert_flags)
832      LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file}
833        ${input_dir}/${input_file} ${output_extension} ${extension}
834        "${convert_flags}")
835      SET(output_file_list ${output_file_list} ${output_dir}/${output_file})
836    ELSE (convert_flags)
837      # As a shortcut, we can just copy the file.
838      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file}
839        COMMAND ${CMAKE_COMMAND}
840        ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file}
841        DEPENDS ${input_dir}/${input_file}
842        )
843      SET(output_file_list ${output_file_list} ${output_dir}/${input_file})
844    ENDIF (convert_flags)
845  ELSE (is_type)
846    SET(do_convert TRUE)
847    # Check to see if there is another input file of the appropriate type.
848    FOREACH(valid_extension ${output_extensions})
849      STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file
850        "${input_file}")
851      LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files})
852      IF (has_native_file)
853        SET(do_convert FALSE)
854      ENDIF (has_native_file)
855    ENDFOREACH(valid_extension)
856
857    # If we still need to convert, do it.
858    IF (do_convert)
859      LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file}
860        ${input_dir}/${input_file} ${output_extension} ${extension}
861        "${convert_flags}")
862      SET(output_file_list ${output_file_list} ${output_dir}/${output_file})
863    ENDIF (do_convert)
864  ENDIF (is_type)
865
866  SET(${output_files_var} ${output_file_list} PARENT_SCOPE)
867ENDFUNCTION(LATEX_CONVERT_IMAGE)
868
869# Adds custom commands to process the given files for dvi and pdf builds.
870# Adds the output files to the given variables (does not replace).
871FUNCTION(LATEX_PROCESS_IMAGES dvi_outputs_var pdf_outputs_var)
872  LATEX_GET_OUTPUT_PATH(output_dir)
873  SET(dvi_outputs)
874  SET(pdf_outputs)
875  FOREACH(file ${ARGN})
876    IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
877      LATEX_GET_FILENAME_COMPONENT(extension "${file}" EXT)
878      SET(convert_flags)
879
880      # Check to see if we need to downsample the image.
881      LATEX_LIST_CONTAINS(is_raster "${extension}"
882        ${LATEX_RASTER_IMAGE_EXTENSIONS})
883      IF (LATEX_SMALL_IMAGES)
884        IF (is_raster)
885          SET(convert_flags -resize ${LATEX_RASTER_SCALE}%)
886        ENDIF (is_raster)
887      ENDIF (LATEX_SMALL_IMAGES)
888
889      # Make sure the output directory exists.
890      LATEX_GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH)
891      MAKE_DIRECTORY("${path}")
892
893      # Do conversions for dvi.
894      LATEX_CONVERT_IMAGE(output_files "${file}" .eps "${convert_flags}"
895        "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}")
896      SET(dvi_outputs ${dvi_outputs} ${output_files})
897
898      # Do conversions for pdf.
899      IF (is_raster)
900        LATEX_CONVERT_IMAGE(output_files "${file}" .png "${convert_flags}"
901          "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
902        SET(pdf_outputs ${pdf_outputs} ${output_files})
903      ELSE (is_raster)
904        LATEX_CONVERT_IMAGE(output_files "${file}" .pdf "${convert_flags}"
905          "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}")
906        SET(pdf_outputs ${pdf_outputs} ${output_files})
907      ENDIF (is_raster)
908    ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
909      MESSAGE(WARNING "Could not find file ${CMAKE_CURRENT_SOURCE_DIR}/${file}.  Are you sure you gave relative paths to IMAGES?")
910    ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}")
911  ENDFOREACH(file)
912
913  SET(${dvi_outputs_var} ${dvi_outputs} PARENT_SCOPE)
914  SET(${pdf_outputs_var} ${pdf_outputs} PARENT_SCOPE)
915ENDFUNCTION(LATEX_PROCESS_IMAGES)
916
917FUNCTION(ADD_LATEX_IMAGES)
918  MESSAGE(SEND_ERROR "The ADD_LATEX_IMAGES function is deprecated.  Image directories are specified with LATEX_ADD_DOCUMENT.")
919ENDFUNCTION(ADD_LATEX_IMAGES)
920
921FUNCTION(LATEX_COPY_GLOBBED_FILES pattern dest)
922  FILE(GLOB file_list ${pattern})
923  FOREACH(in_file ${file_list})
924    LATEX_GET_FILENAME_COMPONENT(out_file ${in_file} NAME)
925    CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY)
926  ENDFOREACH(in_file)
927ENDFUNCTION(LATEX_COPY_GLOBBED_FILES)
928
929FUNCTION(LATEX_COPY_INPUT_FILE file)
930  LATEX_GET_OUTPUT_PATH(output_dir)
931
932  IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
933    LATEX_GET_FILENAME_COMPONENT(path ${file} PATH)
934    FILE(MAKE_DIRECTORY ${output_dir}/${path})
935
936    LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE})
937    IF (use_config)
938      CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}
939        ${output_dir}/${file}
940        @ONLY
941        )
942      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file}
943        COMMAND ${CMAKE_COMMAND}
944        ARGS ${CMAKE_BINARY_DIR}
945        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
946        )
947    ELSE (use_config)
948      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file}
949        COMMAND ${CMAKE_COMMAND}
950        ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file}
951        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file}
952        )
953    ENDIF (use_config)
954  ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
955    IF (EXISTS ${output_dir}/${file})
956      # Special case: output exists but input does not.  Assume that it was
957      # created elsewhere and skip the input file copy.
958    ELSE (EXISTS ${output_dir}/${file})
959      MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}")
960    ENDIF (EXISTS ${output_dir}/${file})
961  ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file})
962ENDFUNCTION(LATEX_COPY_INPUT_FILE)
963
964#############################################################################
965# Commands provided by the UseLATEX.cmake "package"
966#############################################################################
967
968FUNCTION(LATEX_USAGE command message)
969  MESSAGE(SEND_ERROR
970    "${message}\nUsage: ${command}(<tex_file>\n           [BIBFILES <bib_file> <bib_file> ...]\n           [INPUTS <tex_file> <tex_file> ...]\n           [IMAGE_DIRS <directory1> <directory2> ...]\n           [IMAGES <image_file1> <image_file2>\n           [CONFIGURE <tex_file> <tex_file> ...]\n           [DEPENDS <tex_file> <tex_file> ...]\n           [MULTIBIB_NEWCITES] <suffix_list>\n           [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]\n           [DEFAULT_PDF] [DEFAULT_SAFEPDF] [DEFAULT_PS] [NO_DEFAULT]\n           [MANGLE_TARGET_NAMES])"
971    )
972ENDFUNCTION(LATEX_USAGE command message)
973
974# Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the
975# variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and
976# LATEX_INPUTS.
977FUNCTION(PARSE_ADD_LATEX_ARGUMENTS command)
978  LATEX_PARSE_ARGUMENTS(
979    LATEX
980    "BIBFILES;MULTIBIB_NEWCITES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS"
981    "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;USE_NOMENCL;DEFAULT_PDF;DEFAULT_SAFEPDF;DEFAULT_PS;NO_DEFAULT;MANGLE_TARGET_NAMES"
982    ${ARGN}
983    )
984
985  # The first argument is the target latex file.
986  IF (LATEX_DEFAULT_ARGS)
987    LIST(GET LATEX_DEFAULT_ARGS 0 latex_main_input)
988    LIST(REMOVE_AT LATEX_DEFAULT_ARGS 0)
989    LATEX_GET_FILENAME_COMPONENT(latex_target ${latex_main_input} NAME_WE)
990    SET(LATEX_MAIN_INPUT ${latex_main_input} CACHE INTERNAL "" FORCE)
991    SET(LATEX_TARGET ${latex_target} CACHE INTERNAL "" FORCE)
992  ELSE (LATEX_DEFAULT_ARGS)
993    LATEX_USAGE(${command} "No tex file target given to ${command}.")
994  ENDIF (LATEX_DEFAULT_ARGS)
995
996  IF (LATEX_DEFAULT_ARGS)
997    LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}")
998  ENDIF (LATEX_DEFAULT_ARGS)
999
1000  # Backward compatibility between 1.6.0 and 1.6.1.
1001  IF (LATEX_USE_GLOSSARIES)
1002    SET(LATEX_USE_GLOSSARY TRUE CACHE INTERNAL "" FORCE)
1003  ENDIF (LATEX_USE_GLOSSARIES)
1004ENDFUNCTION(PARSE_ADD_LATEX_ARGUMENTS)
1005
1006FUNCTION(ADD_LATEX_TARGETS_INTERNAL)
1007  IF (LATEX_USE_SYNCTEX)
1008    SET(synctex_flags ${LATEX_SYNCTEX_FLAGS})
1009  ELSE (LATEX_USE_SYNCTEX)
1010    SET(synctex_flags)
1011  ENDIF (LATEX_USE_SYNCTEX)
1012
1013  # The commands to run LaTeX.  They are repeated multiple times.
1014  SET(latex_build_command
1015    ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT}
1016    )
1017  SET(pdflatex_build_command
1018    ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT}
1019    )
1020
1021  # Set up target names.
1022  IF (LATEX_MANGLE_TARGET_NAMES)
1023    SET(dvi_target      ${LATEX_TARGET}_dvi)
1024    SET(pdf_target      ${LATEX_TARGET}_pdf)
1025    SET(ps_target       ${LATEX_TARGET}_ps)
1026    SET(safepdf_target  ${LATEX_TARGET}_safepdf)
1027    SET(html_target     ${LATEX_TARGET}_html)
1028    SET(auxclean_target ${LATEX_TARGET}_auxclean)
1029  ELSE (LATEX_MANGLE_TARGET_NAMES)
1030    SET(dvi_target      dvi)
1031    SET(pdf_target      pdf)
1032    SET(ps_target       ps)
1033    SET(safepdf_target  safepdf)
1034    SET(html_target     html)
1035    SET(auxclean_target auxclean)
1036  ENDIF (LATEX_MANGLE_TARGET_NAMES)
1037
1038  # Probably not all of these will be generated, but they could be.
1039  # Note that the aux file is added later.
1040  SET(auxiliary_clean_files
1041    ${output_dir}/${LATEX_TARGET}.aux
1042    ${output_dir}/${LATEX_TARGET}.bbl
1043    ${output_dir}/${LATEX_TARGET}.blg
1044    ${output_dir}/${LATEX_TARGET}-blx.bib
1045    ${output_dir}/${LATEX_TARGET}.glg
1046    ${output_dir}/${LATEX_TARGET}.glo
1047    ${output_dir}/${LATEX_TARGET}.gls
1048    ${output_dir}/${LATEX_TARGET}.idx
1049    ${output_dir}/${LATEX_TARGET}.ilg
1050    ${output_dir}/${LATEX_TARGET}.ind
1051    ${output_dir}/${LATEX_TARGET}.ist
1052    ${output_dir}/${LATEX_TARGET}.log
1053    ${output_dir}/${LATEX_TARGET}.out
1054    ${output_dir}/${LATEX_TARGET}.toc
1055    ${output_dir}/${LATEX_TARGET}.lof
1056    ${output_dir}/${LATEX_TARGET}.xdy
1057    ${output_dir}/${LATEX_TARGET}.synctex.gz
1058    ${output_dir}/${LATEX_TARGET}.synctex.bak.gz
1059    ${output_dir}/${LATEX_TARGET}.dvi
1060    ${output_dir}/${LATEX_TARGET}.ps
1061    ${output_dir}/${LATEX_TARGET}.pdf
1062    )
1063
1064  SET(image_list ${LATEX_IMAGES})
1065
1066  # For each directory in LATEX_IMAGE_DIRS, glob all the image files and
1067  # place them in LATEX_IMAGES.
1068  FOREACH(dir ${LATEX_IMAGE_DIRS})
1069    IF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
1070      MESSAGE(WARNING "Image directory ${CMAKE_CURRENT_SOURCE_DIR}/${dir} does not exist.  Are you sure you gave relative directories to IMAGE_DIRS?")
1071    ENDIF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
1072    FOREACH(extension ${LATEX_IMAGE_EXTENSIONS})
1073      FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension})
1074      FOREACH(file ${files})
1075        LATEX_GET_FILENAME_COMPONENT(filename ${file} NAME)
1076        SET(image_list ${image_list} ${dir}/${filename})
1077      ENDFOREACH(file)
1078    ENDFOREACH(extension)
1079  ENDFOREACH(dir)
1080
1081  LATEX_PROCESS_IMAGES(dvi_images pdf_images ${image_list})
1082
1083  SET(make_dvi_command
1084    ${CMAKE_COMMAND} -E chdir ${output_dir}
1085    ${latex_build_command})
1086  SET(make_pdf_command
1087    ${CMAKE_COMMAND} -E chdir ${output_dir}
1088    ${pdflatex_build_command}
1089    )
1090
1091  SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images})
1092  SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images})
1093  FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS})
1094    SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input})
1095    SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input})
1096    IF (${input} MATCHES "\\.tex$")
1097      # Dependent .tex files might have their own .aux files created.  Make
1098      # sure these get cleaned as well.  This might replicate the cleaning
1099      # of the main .aux file, which is OK.
1100      STRING(REGEX REPLACE "\\.tex$" "" input_we ${input})
1101      SET(auxiliary_clean_files ${auxiliary_clean_files}
1102        ${output_dir}/${input_we}.aux
1103        ${output_dir}/${input}.aux
1104        )
1105    ENDIF (${input} MATCHES "\\.tex$")
1106  ENDFOREACH(input)
1107
1108  IF (LATEX_USE_GLOSSARY)
1109    FOREACH(dummy 0 1)   # Repeat these commands twice.
1110      SET(make_dvi_command ${make_dvi_command}
1111        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1112        ${CMAKE_COMMAND}
1113        -D LATEX_BUILD_COMMAND=makeglossaries
1114        -D LATEX_TARGET=${LATEX_TARGET}
1115        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
1116        -D XINDY_COMPILER=${XINDY_COMPILER}
1117        -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
1118        -P ${LATEX_USE_LATEX_LOCATION}
1119        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1120        ${latex_build_command}
1121        )
1122      SET(make_pdf_command ${make_pdf_command}
1123        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1124        ${CMAKE_COMMAND}
1125        -D LATEX_BUILD_COMMAND=makeglossaries
1126        -D LATEX_TARGET=${LATEX_TARGET}
1127        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
1128        -D XINDY_COMPILER=${XINDY_COMPILER}
1129        -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
1130        -P ${LATEX_USE_LATEX_LOCATION}
1131        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1132        ${pdflatex_build_command}
1133        )
1134    ENDFOREACH(dummy)
1135  ENDIF (LATEX_USE_GLOSSARY)
1136
1137  IF (LATEX_USE_NOMENCL)
1138    FOREACH(dummy 0 1)   # Repeat these commands twice.
1139      SET(make_dvi_command ${make_dvi_command}
1140        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1141        ${CMAKE_COMMAND}
1142        -D LATEX_BUILD_COMMAND=makenomenclature
1143        -D LATEX_TARGET=${LATEX_TARGET}
1144        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
1145        -D MAKENOMENCLATURE_COMPILER_FLAGS=${MAKENOMENCLATURE_COMPILER_FLAGS}
1146        -P ${LATEX_USE_LATEX_LOCATION}
1147        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1148        ${latex_build_command}
1149        )
1150      SET(make_pdf_command ${make_pdf_command}
1151        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1152        ${CMAKE_COMMAND}
1153        -D LATEX_BUILD_COMMAND=makenomenclature
1154        -D LATEX_TARGET=${LATEX_TARGET}
1155        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
1156        -D MAKENOMENCLATURE_COMPILER_FLAGS=${MAKENOMENCLATURE_COMPILER_FLAGS}
1157        -P ${LATEX_USE_LATEX_LOCATION}
1158        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1159        ${pdflatex_build_command}
1160        )
1161    ENDFOREACH(dummy)
1162  ENDIF (LATEX_USE_NOMENCL)
1163
1164  IF (LATEX_BIBFILES)
1165    IF (LATEX_MULTIBIB_NEWCITES)
1166      FOREACH (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES})
1167        LATEX_GET_FILENAME_COMPONENT(multibib_target ${multibib_auxfile} NAME_WE)
1168        SET(make_dvi_command ${make_dvi_command}
1169          COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1170          ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${multibib_target})
1171        SET(make_pdf_command ${make_pdf_command}
1172          COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1173          ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${multibib_target})
1174        SET(auxiliary_clean_files ${auxiliary_clean_files}
1175          ${output_dir}/${multibib_target}.aux)
1176      ENDFOREACH (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES})
1177    ELSE (LATEX_MULTIBIB_NEWCITES)
1178      SET(make_dvi_command ${make_dvi_command}
1179        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1180        ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET})
1181      SET(make_pdf_command ${make_pdf_command}
1182        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1183        ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET})
1184    ENDIF (LATEX_MULTIBIB_NEWCITES)
1185
1186    FOREACH (bibfile ${LATEX_BIBFILES})
1187      SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile})
1188      SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile})
1189    ENDFOREACH (bibfile ${LATEX_BIBFILES})
1190  ELSE (LATEX_BIBFILES)
1191    IF (LATEX_MULTIBIB_NEWCITES)
1192      MESSAGE(WARNING "MULTIBIB_NEWCITES has no effect without BIBFILES option.")
1193    ENDIF (LATEX_MULTIBIB_NEWCITES)
1194  ENDIF (LATEX_BIBFILES)
1195
1196  IF (LATEX_USE_INDEX)
1197    SET(make_dvi_command ${make_dvi_command}
1198      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1199      ${latex_build_command}
1200      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1201      ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
1202    SET(make_pdf_command ${make_pdf_command}
1203      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1204      ${pdflatex_build_command}
1205      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1206      ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
1207  ENDIF (LATEX_USE_INDEX)
1208
1209  SET(make_dvi_command ${make_dvi_command}
1210    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1211    ${latex_build_command}
1212    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1213    ${latex_build_command})
1214  SET(make_pdf_command ${make_pdf_command}
1215    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1216    ${pdflatex_build_command}
1217    COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1218    ${pdflatex_build_command})
1219
1220  IF (LATEX_USE_SYNCTEX)
1221    IF (NOT GZIP)
1222      MESSAGE(SEND_ERROR "UseLATEX.cmake: USE_SYNTEX option requires gzip program.  Set GZIP variable.")
1223    ENDIF (NOT GZIP)
1224    SET(make_dvi_command ${make_dvi_command}
1225      COMMAND ${CMAKE_COMMAND}
1226      -D LATEX_BUILD_COMMAND=correct_synctex
1227      -D LATEX_TARGET=${LATEX_TARGET}
1228      -D GZIP=${GZIP}
1229      -D "LATEX_SOURCE_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR}"
1230      -D "LATEX_BINARY_DIRECTORY=${output_dir}"
1231      -P ${LATEX_USE_LATEX_LOCATION}
1232      )
1233    SET(make_pdf_command ${make_pdf_command}
1234      COMMAND ${CMAKE_COMMAND}
1235      -D LATEX_BUILD_COMMAND=correct_synctex
1236      -D LATEX_TARGET=${LATEX_TARGET}
1237      -D GZIP=${GZIP}
1238      -D "LATEX_SOURCE_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR}"
1239      -D "LATEX_BINARY_DIRECTORY=${output_dir}"
1240      -P ${LATEX_USE_LATEX_LOCATION}
1241      )
1242  ENDIF (LATEX_USE_SYNCTEX)
1243
1244  # Add commands and targets for building dvi outputs.
1245  ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi
1246    COMMAND ${make_dvi_command}
1247    DEPENDS ${make_dvi_depends}
1248    )
1249  IF (LATEX_NO_DEFAULT OR LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF OR DEFAULT_PS)
1250    ADD_CUSTOM_TARGET(${dvi_target}
1251      DEPENDS ${output_dir}/${LATEX_TARGET}.dvi)
1252  ELSE (LATEX_NO_DEFAULT OR LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF OR DEFAULT_PS)
1253    ADD_CUSTOM_TARGET(${dvi_target} ALL
1254      DEPENDS ${output_dir}/${LATEX_TARGET}.dvi)
1255  ENDIF (LATEX_NO_DEFAULT OR LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF OR DEFAULT_PS)
1256
1257  # Add commands and targets for building pdf outputs (with pdflatex).
1258  IF (PDFLATEX_COMPILER)
1259    ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf
1260      COMMAND ${make_pdf_command}
1261      DEPENDS ${make_pdf_depends}
1262      )
1263    IF (LATEX_DEFAULT_PDF)
1264      ADD_CUSTOM_TARGET(${pdf_target} ALL
1265        DEPENDS ${output_dir}/${LATEX_TARGET}.pdf)
1266    ELSE (LATEX_DEFAULT_PDF)
1267      ADD_CUSTOM_TARGET(${pdf_target}
1268        DEPENDS ${output_dir}/${LATEX_TARGET}.pdf)
1269    ENDIF (LATEX_DEFAULT_PDF)
1270  ENDIF (PDFLATEX_COMPILER)
1271
1272  IF (DVIPS_CONVERTER)
1273    ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.ps
1274      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1275        ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi
1276      DEPENDS ${output_dir}/${LATEX_TARGET}.dvi)
1277    IF (LATEX_DEFAULT_PS)
1278      ADD_CUSTOM_TARGET(${ps_target} ALL
1279        DEPENDS ${output_dir}/${LATEX_TARGET}.ps)
1280    ELSE (LATEX_DEFAULT_PS)
1281      ADD_CUSTOM_TARGET(${ps_target}
1282        DEPENDS ${output_dir}/${LATEX_TARGET}.ps)
1283    ENDIF (LATEX_DEFAULT_PS)
1284    IF (PS2PDF_CONVERTER)
1285      # Since both the pdf and safepdf targets have the same output, we
1286      # cannot properly do the dependencies for both.  When selecting safepdf,
1287      # simply force a recompile every time.
1288      IF (LATEX_DEFAULT_SAFEPDF)
1289        ADD_CUSTOM_TARGET(${safepdf_target} ALL
1290          ${CMAKE_COMMAND} -E chdir ${output_dir}
1291          ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf
1292          )
1293      ELSE (LATEX_DEFAULT_SAFEPDF)
1294        ADD_CUSTOM_TARGET(${safepdf_target}
1295          ${CMAKE_COMMAND} -E chdir ${output_dir}
1296          ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf
1297          )
1298      ENDIF (LATEX_DEFAULT_SAFEPDF)
1299      ADD_DEPENDENCIES(${safepdf_target} ${ps_target})
1300    ENDIF (PS2PDF_CONVERTER)
1301  ENDIF (DVIPS_CONVERTER)
1302
1303  IF (LATEX2HTML_CONVERTER)
1304    IF (USING_HTLATEX)
1305      # htlatex places the output in a different location
1306      SET (HTML_OUTPUT "${output_dir}/${LATEX_TARGET}.html")
1307    ELSE (USING_HTLATEX)
1308      SET (HTML_OUTPUT "${output_dir}/${LATEX_TARGET}/${LATEX_TARGET}.html")
1309    ENDIF (USING_HTLATEX)
1310    ADD_CUSTOM_COMMAND(OUTPUT ${HTML_OUTPUT}
1311      COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
1312        ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT}
1313      DEPENDS ${output_dir}/${LATEX_TARGET}.tex
1314      )
1315    ADD_CUSTOM_TARGET(${html_target}
1316      DEPENDS ${HTML_OUTPUT}
1317      )
1318    ADD_DEPENDENCIES(${html_target} ${dvi_target})
1319  ENDIF (LATEX2HTML_CONVERTER)
1320
1321  SET_DIRECTORY_PROPERTIES(.
1322    ADDITIONAL_MAKE_CLEAN_FILES "${auxiliary_clean_files}"
1323    )
1324
1325  ADD_CUSTOM_TARGET(${auxclean_target}
1326    COMMENT "Cleaning auxiliary LaTeX files."
1327    COMMAND ${CMAKE_COMMAND} -E remove ${auxiliary_clean_files}
1328    )
1329ENDFUNCTION(ADD_LATEX_TARGETS_INTERNAL)
1330
1331FUNCTION(ADD_LATEX_TARGETS)
1332  LATEX_GET_OUTPUT_PATH(output_dir)
1333  PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV})
1334
1335  ADD_LATEX_TARGETS_INTERNAL()
1336ENDFUNCTION(ADD_LATEX_TARGETS)
1337
1338FUNCTION(ADD_LATEX_DOCUMENT)
1339  LATEX_GET_OUTPUT_PATH(output_dir)
1340  IF (output_dir)
1341    PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV})
1342
1343    LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT})
1344
1345    FOREACH (bib_file ${LATEX_BIBFILES})
1346      LATEX_COPY_INPUT_FILE(${bib_file})
1347    ENDFOREACH (bib_file)
1348
1349    FOREACH (input ${LATEX_INPUTS})
1350      LATEX_COPY_INPUT_FILE(${input})
1351    ENDFOREACH(input)
1352
1353    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir})
1354    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir})
1355    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir})
1356    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir})
1357    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.ist ${output_dir})
1358    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.fd  ${output_dir})
1359
1360    ADD_LATEX_TARGETS_INTERNAL()
1361  ENDIF (output_dir)
1362ENDFUNCTION(ADD_LATEX_DOCUMENT)
1363
1364#############################################################################
1365# Actually do stuff
1366#############################################################################
1367
1368IF (LATEX_BUILD_COMMAND)
1369  SET(command_handled)
1370
1371  IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
1372    LATEX_MAKEGLOSSARIES()
1373    SET(command_handled TRUE)
1374  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
1375
1376  IF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature)
1377    LATEX_MAKENOMENCLATURE()
1378    SET(command_handled TRUE)
1379  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature)
1380
1381  IF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex)
1382    LATEX_CORRECT_SYNCTEX()
1383    SET(command_handled TRUE)
1384  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex)
1385
1386  IF (NOT command_handled)
1387    MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}")
1388  ENDIF (NOT command_handled)
1389
1390ELSE (LATEX_BUILD_COMMAND)
1391  # Must be part of the actual configure (included from CMakeLists.txt).
1392  LATEX_SETUP_VARIABLES()
1393ENDIF (LATEX_BUILD_COMMAND)
1394