view maintainers_update_use_latex.cmake @ 0:973e7bc6d13c

Add some patches to use and test rathaxes with CMake
author Louis Opter <louis@lse.epitech.net>
date Sun, 01 Jan 2012 15:31:17 +0100
parents
children
line wrap: on
line source

# HG changeset patch
# Parent 13253d542625d2f6a8b7d73878f55e2bca521f34
maintainers: update the UseLatex.cmake script to 1.8.2

diff --git a/maintainers/CMakeScripts/UseLATEX.cmake b/maintainers/CMakeScripts/UseLATEX.cmake
--- a/maintainers/CMakeScripts/UseLATEX.cmake
+++ b/maintainers/CMakeScripts/UseLATEX.cmake
@@ -1,7 +1,7 @@
 # File: UseLATEX.cmake
 # CMAKE commands to actually use the LaTeX compiler
-# Version: 1.7.4
-# Author: Kenneth Moreland (kmorel at sandia dot gov)
+# Version: 1.8.2
+# Author: Kenneth Moreland <kmorel@sandia.gov>
 #
 # Copyright 2004 Sandia Corporation.
 # Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
@@ -19,7 +19,7 @@
 #                       [IMAGES] <image_files>
 #                       [CONFIGURE] <tex_files>
 #                       [DEPENDS] <tex_files>
-#                       [USE_INDEX] [USE_GLOSSARY]
+#                       [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]
 #                       [DEFAULT_PDF] [DEFAULT_SAFEPDF]
 #                       [MANGLE_TARGET_NAMES])
 #       Adds targets that compile <tex_file>.  The latex output is placed
@@ -47,8 +47,11 @@
 #                       on images.
 #               ps: Makes <name>.ps
 #               html: Makes <name>.html
-#               auxclean: Deletes <name>.aux.  This is sometimes necessary
-#                       if a LaTeX error occurs and writes a bad aux file.
+#               auxclean: Deletes <name>.aux and other auxiliary files.
+#                       This is sometimes necessary if a LaTeX error occurs
+#                       and writes a bad aux file.  Unlike the regular clean
+#                       target, it does not delete other input files, such as
+#                       converted images, to save time on the rebuild.
 #
 #       The dvi target is added to the ALL.  That is, it will be the target
 #       built by default.  If the DEFAULT_PDF argument is given, then the
@@ -63,6 +66,24 @@
 #
 # History:
 #
+# 1.8.2 Fix corner case when an argument name was also a variable containing
+#       the text of an argument.  In this case, the CMake IF was matching
+#       the argument text with the contents of the variable with the same
+#       argument name.
+#
+# 1.8.1 Fix problem where ps2pdf was not getting the appropriate arguments.
+#
+# 1.8.0 Add support for synctex.
+#
+# 1.7.7 Support calling xindy when making glossaries.
+#
+#       Improved make clean support.
+#
+# 1.7.6 Add support for the nomencl package (thanks to Myles English).
+#
+# 1.7.5 Fix issue with bibfiles being copied two different ways, which causes
+#       Problems with dependencies (thanks to Edwin van Leeuwen).
+#
 # 1.7.4 Added the DEFAULT_SAFEPDF option (thanks to Raymond Wan).
 #
 #       Added warnings when image directories are not found (and were
@@ -164,9 +185,9 @@
 MACRO(LATEX_LIST_CONTAINS var value)
   SET(${var})
   FOREACH (value2 ${ARGN})
-    IF (${value} STREQUAL ${value2})
+    IF ("not_a_var_${value}" STREQUAL "not_a_var_${value2}")
       SET(${var} TRUE)
-    ENDIF (${value} STREQUAL ${value2})
+    ENDIF ("not_a_var_${value}" STREQUAL "not_a_var_${value2}")
   ENDFOREACH (value2)
 ENDMACRO(LATEX_LIST_CONTAINS)
 
@@ -217,15 +238,13 @@
 # Macros that perform processing during a LaTeX build.
 #############################################################################
 MACRO(LATEX_MAKEGLOSSARIES)
+  # This is really a bare bones port of the makeglossaries perl script into
+  # CMake scripting.
   MESSAGE("**************************** In makeglossaries")
   IF (NOT LATEX_TARGET)
     MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
   ENDIF (NOT LATEX_TARGET)
 
-  IF (NOT MAKEINDEX_COMPILER)
-    MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
-  ENDIF (NOT MAKEINDEX_COMPILER)
-
   SET(aux_file ${LATEX_TARGET}.aux)
 
   IF (NOT EXISTS ${aux_file})
@@ -245,6 +264,19 @@
     istfile ${istfile_line}
     )
 
+  STRING(REGEX MATCH ".*\\.xdy" use_xindy "${istfile}")
+  IF (use_xindy)
+    MESSAGE("*************** Using xindy")
+    IF (NOT XINDY_COMPILER)
+      MESSAGE(SEND_ERROR "Need to define XINDY_COMPILER")
+    ENDIF (NOT XINDY_COMPILER)
+  ELSE (use_xindy)
+    MESSAGE("*************** Using makeindex")
+    IF (NOT MAKEINDEX_COMPILER)
+      MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
+    ENDIF (NOT MAKEINDEX_COMPILER)
+  ENDIF (use_xindy)
+
   FOREACH(newglossary ${newglossary_lines})
     STRING(REGEX REPLACE
       "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
@@ -262,13 +294,186 @@
       "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}"
       "${LATEX_TARGET}.\\4" glossary_in ${newglossary}
       )
-    MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}")
-    EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
-      -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}
-      )
+
+    IF (use_xindy)
+      LATEX_FILE_MATCH(xdylanguage_line ${aux_file}
+        "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}"
+        "@xdylanguage{${glossary_name}}{english}"
+        )
+      STRING(REGEX REPLACE
+        "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}"
+        "\\1"
+        language
+        ${xdylanguage_line}
+        )
+      # What crazy person makes a LaTeX index generater that uses different
+      # identifiers for language than babel (or at least does not support
+      # the old ones)?
+      IF (${language} STREQUAL "frenchb")
+        SET(language "french")
+      ELSEIF (${language} MATCHES "^n?germanb?$")
+        SET(language "german")
+      ELSEIF (${language} STREQUAL "magyar")
+        SET(language "hungarian")
+      ELSEIF (${language} STREQUAL "lsorbian")
+        SET(language "lower-sorbian")
+      ELSEIF (${language} STREQUAL "norsk")
+        SET(language "norwegian")
+      ELSEIF (${language} STREQUAL "portuges")
+        SET(language "portuguese")
+      ELSEIF (${language} STREQUAL "russianb")
+        SET(language "russian")
+      ELSEIF (${language} STREQUAL "slovene")
+        SET(language "slovenian")
+      ELSEIF (${language} STREQUAL "ukraineb")
+        SET(language "ukrainian")
+      ELSEIF (${language} STREQUAL "usorbian")
+        SET(language "upper-sorbian")
+      ENDIF (${language} STREQUAL "frenchb")
+      IF (language)
+        SET(language_flags "-L ${language}")
+      ELSE (language)
+        SET(language_flags "")
+      ENDIF (language)
+
+      LATEX_FILE_MATCH(codepage_line ${aux_file}
+        "@gls@codepage[ \t]*{${glossary_name}}{([^}]*)}"
+        "@gls@codepage{${glossary_name}}{utf}"
+        )
+      STRING(REGEX REPLACE
+        "@gls@codepage[ \t]*{${glossary_name}}{([^}]*)}"
+        "\\1"
+        codepage
+        ${codepage_line}
+        )
+      IF (codepage)
+        SET(codepage_flags "-C ${codepage}")
+      ELSE (codepage)
+        # Ideally, we would check that the language is compatible with the
+        # default codepage, but I'm hoping that distributions will be smart
+        # enough to specify their own codepage.  I know, it's asking a lot.
+        SET(codepage_flags "")
+      ENDIF (codepage)
+
+      MESSAGE("${XINDY_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} ${language_flags} ${codepage_flags} -I xindy -M ${glossary_name} -t ${glossary_log} -o ${glossary_out} ${glossary_in}"
+        )
+      EXEC_PROGRAM(${XINDY_COMPILER}
+        ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
+          ${language_flags}
+          ${codepage_flags}
+          -I xindy
+          -M ${glossary_name}
+          -t ${glossary_log}
+          -o ${glossary_out}
+          ${glossary_in}
+        OUTPUT_VARIABLE xindy_output
+        )
+      MESSAGE("${xindy_output}")
+
+      # So, it is possible (perhaps common?) for aux files to specify a
+      # language and codepage that are incompatible with each other.  Check
+      # for that condition, and if it happens run again with the default
+      # codepage.
+      IF ("${xindy_output}" MATCHES "^Cannot locate xindy module for language (.+) in codepage (.+)\\.$")
+        MESSAGE("*************** Retrying xindy with default codepage.")
+        EXEC_PROGRAM(${XINDY_COMPILER}
+          ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
+            ${language_flags}
+            -I xindy
+            -M ${glossary_name}
+            -t ${glossary_log}
+            -o ${glossary_out}
+            ${glossary_in}
+          )
+      ENDIF ("${xindy_output}" MATCHES "^Cannot locate xindy module for language (.+) in codepage (.+)\\.$")
+      #ENDIF ("${xindy_output}" MATCHES "Cannot locate xindy module for language (.+) in codepage (.+)\\.")
+      
+    ELSE (use_xindy)
+      MESSAGE("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}")
+      EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_FLAGS}
+        -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}
+        )
+    ENDIF (use_xindy)
+
   ENDFOREACH(newglossary)
 ENDMACRO(LATEX_MAKEGLOSSARIES)
 
+MACRO(LATEX_MAKENOMENCLATURE)
+  MESSAGE("**************************** In makenomenclature")
+  IF (NOT LATEX_TARGET)
+    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
+  ENDIF (NOT LATEX_TARGET)
+
+  IF (NOT MAKEINDEX_COMPILER)
+    MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER")
+  ENDIF (NOT MAKEINDEX_COMPILER)
+
+  SET(nomencl_out ${LATEX_TARGET}.nls)
+  SET(nomencl_in ${LATEX_TARGET}.nlo)
+
+  EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKENOMENCLATURE_COMPILER_FLAGS}
+    ${nomencl_in} -s "nomencl.ist" -o ${nomencl_out}
+    )
+ENDMACRO(LATEX_MAKENOMENCLATURE)
+
+MACRO(LATEX_CORRECT_SYNCTEX)
+  MESSAGE("**************************** In correct SyncTeX")
+  IF (NOT LATEX_TARGET)
+    MESSAGE(SEND_ERROR "Need to define LATEX_TARGET")
+  ENDIF (NOT LATEX_TARGET)
+
+  IF (NOT GZIP)
+    MESSAGE(SEND_ERROR "Need to define GZIP")
+  ENDIF (NOT GZIP)
+
+  IF (NOT LATEX_SOURCE_DIRECTORY)
+    MESSAGE(SEND_ERROR "Need to define LATEX_SOURCE_DIRECTORY")
+  ENDIF (NOT LATEX_SOURCE_DIRECTORY)
+
+  IF (NOT LATEX_BINARY_DIRECTORY)
+    MESSAGE(SEND_ERROR "Need to define LATEX_BINARY_DIRECTORY")
+  ENDIF (NOT LATEX_BINARY_DIRECTORY)
+
+  SET(synctex_file ${LATEX_BINARY_DIRECTORY}/${LATEX_TARGET}.synctex)
+  SET(synctex_file_gz ${synctex_file}.gz)
+
+  IF (EXISTS ${synctex_file_gz})
+
+    MESSAGE("Making backup of synctex file.")
+    CONFIGURE_FILE(${synctex_file_gz} ${synctex_file}.bak.gz COPYONLY)
+
+    MESSAGE("Uncompressing synctex file.")
+    EXEC_PROGRAM(${GZIP}
+      ARGS --decompress ${synctex_file_gz}
+      )
+
+    MESSAGE("Reading synctex file.")
+    FILE(READ ${synctex_file} synctex_data)
+
+    MESSAGE("Replacing relative with absolute paths.")
+    STRING(REGEX REPLACE
+      "(Input:[0-9]+:)([^/\n][^\n]*)"
+      "\\1${LATEX_SOURCE_DIRECTORY}/\\2"
+      synctex_data
+      "${synctex_data}"
+      )
+
+    MESSAGE("Writing synctex file.")
+    FILE(WRITE ${synctex_file} "${synctex_data}")
+
+    MESSAGE("Compressing synctex file.")
+    EXEC_PROGRAM(${GZIP}
+      ARGS ${synctex_file}
+      )
+
+  ELSE (EXISTS ${synctex_file_gz})
+
+    MESSAGE(SEND_ERROR "File ${synctex_file_gz} not found.  Perhaps synctex is not supported by your LaTeX compiler.")
+
+  ENDIF (EXISTS ${synctex_file_gz})
+
+ENDMACRO(LATEX_CORRECT_SYNCTEX)
+
 #############################################################################
 # Helper macros for establishing LaTeX build.
 #############################################################################
@@ -292,11 +497,19 @@
 
   FIND_PACKAGE(LATEX)
 
+  FIND_PROGRAM(XINDY_COMPILER
+    NAME xindy
+    PATHS ${MIKTEX_BINARY_PATH} /usr/bin
+    )
+
+  FIND_PACKAGE(UnixCommands)
+
   MARK_AS_ADVANCED(CLEAR
     LATEX_COMPILER
     PDFLATEX_COMPILER
     BIBTEX_COMPILER
     MAKEINDEX_COMPILER
+    XINDY_COMPILER
     DVIPS_CONVERTER
     PS2PDF_CONVERTER
     LATEX2HTML_CONVERTER
@@ -314,12 +527,16 @@
     CACHE STRING "Flags passed to latex.")
   SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS}
     CACHE STRING "Flags passed to pdflatex.")
+  SET(LATEX_SYNCTEX_FLAGS "-synctex=1"
+    CACHE STRING "latex/pdflatex flags used to create synctex file.")
   SET(BIBTEX_COMPILER_FLAGS ""
     CACHE STRING "Flags passed to bibtex.")
   SET(MAKEINDEX_COMPILER_FLAGS ""
     CACHE STRING "Flags passed to makeindex.")
   SET(MAKEGLOSSARIES_COMPILER_FLAGS ""
     CACHE STRING "Flags passed to makeglossaries.")
+  SET(MAKENOMENCLATURE_COMPILER_FLAGS ""
+    CACHE STRING "Flags passed to makenomenclature.")
   SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter"
     CACHE STRING "Flags passed to dvips.")
   SET(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode"
@@ -329,18 +546,22 @@
   MARK_AS_ADVANCED(
     LATEX_COMPILER_FLAGS
     PDFLATEX_COMPILER_FLAGS
+    LATEX_SYNCTEX_FLAGS
     BIBTEX_COMPILER_FLAGS
     MAKEINDEX_COMPILER_FLAGS
     MAKEGLOSSARIES_COMPILER_FLAGS
+    MAKENOMENCLATURE_COMPILER_FLAGS
     DVIPS_CONVERTER_FLAGS
     PS2PDF_CONVERTER_FLAGS
     LATEX2HTML_CONVERTER_FLAGS
     )
   SEPARATE_ARGUMENTS(LATEX_COMPILER_FLAGS)
   SEPARATE_ARGUMENTS(PDFLATEX_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(LATEX_SYNCTEX_FLAGS)
   SEPARATE_ARGUMENTS(BIBTEX_COMPILER_FLAGS)
   SEPARATE_ARGUMENTS(MAKEINDEX_COMPILER_FLAGS)
   SEPARATE_ARGUMENTS(MAKEGLOSSARIES_COMPILER_FLAGS)
+  SEPARATE_ARGUMENTS(MAKENOMENCLATURE_COMPILER_FLAGS)
   SEPARATE_ARGUMENTS(DVIPS_CONVERTER_FLAGS)
   SEPARATE_ARGUMENTS(PS2PDF_CONVERTER_FLAGS)
   SEPARATE_ARGUMENTS(LATEX2HTML_CONVERTER_FLAGS)
@@ -352,6 +573,11 @@
     MESSAGE(SEND_ERROR "Could not find convert program.  Please download ImageMagick from http://www.imagemagick.org and install.")
   ENDIF (NOT IMAGEMAGICK_CONVERT)
 
+  OPTION(LATEX_USE_SYNCTEX
+    "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."
+    OFF
+    )
+
   OPTION(LATEX_SMALL_IMAGES
     "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."
     OFF)
@@ -402,7 +628,7 @@
   IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf")
     IF (PS2PDF_CONVERTER)
       SET (converter ${PS2PDF_CONVERTER})
-      SET (convert_flags "-dEPSCrop ${flags}")
+      SET (convert_flags -dEPSCrop ${PS2PDF_CONVERTER_FLAGS})
     ELSE (PS2PDF_CONVERTER)
       MESSAGE(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.")
     ENDIF (PS2PDF_CONVERTER)
@@ -560,7 +786,7 @@
 
 MACRO(LATEX_USAGE command message)
   MESSAGE(SEND_ERROR
-    "${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           [USE_INDEX] [USE_GLOSSARY]\n           [DEFAULT_PDF] [DEFAULT_SAFEPDF]\n           [MANGLE_TARGET_NAMES])"
+    "${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           [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]\n           [DEFAULT_PDF] [DEFAULT_SAFEPDF]\n           [MANGLE_TARGET_NAMES])"
     )
 ENDMACRO(LATEX_USAGE command message)
 
@@ -571,7 +797,7 @@
   LATEX_PARSE_ARGUMENTS(
     LATEX
     "BIBFILES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS"
-    "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;DEFAULT_PDF;DEFAULT_SAFEPDF;MANGLE_TARGET_NAMES"
+    "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;USE_NOMENCL;DEFAULT_PDF;DEFAULT_SAFEPDF;MANGLE_TARGET_NAMES"
     ${ARGN}
     )
 
@@ -598,6 +824,20 @@
   LATEX_GET_OUTPUT_PATH(output_dir)
   PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV})
 
+  IF (LATEX_USE_SYNCTEX)
+    SET(synctex_flags ${LATEX_SYNCTEX_FLAGS})
+  ELSE (LATEX_USE_SYNCTEX)
+    SET(synctex_flags)
+  ENDIF (LATEX_USE_SYNCTEX)
+
+  # The commands to run LaTeX.  They are repeated multiple times.
+  SET(latex_build_command
+    ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT}
+    )
+  SET(pdflatex_build_command
+    ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT}
+    )
+
   # Set up target names.
   IF (LATEX_MANGLE_TARGET_NAMES)
     SET(dvi_target      ${LATEX_TARGET}_dvi)
@@ -615,6 +855,31 @@
     SET(auxclean_target auxclean)
   ENDIF (LATEX_MANGLE_TARGET_NAMES)
 
+  # Probably not all of these will be generated, but they could be.
+  # Note that the aux file is added later.
+  SET(auxiliary_clean_files
+    ${output_dir}/${LATEX_TARGET}.bbl
+    ${output_dir}/${LATEX_TARGET}.blg
+    ${output_dir}/${LATEX_TARGET}-blx.bib
+    ${output_dir}/${LATEX_TARGET}.glg
+    ${output_dir}/${LATEX_TARGET}.glo
+    ${output_dir}/${LATEX_TARGET}.gls
+    ${output_dir}/${LATEX_TARGET}.idx
+    ${output_dir}/${LATEX_TARGET}.ilg
+    ${output_dir}/${LATEX_TARGET}.ind
+    ${output_dir}/${LATEX_TARGET}.ist
+    ${output_dir}/${LATEX_TARGET}.log
+    ${output_dir}/${LATEX_TARGET}.out
+    ${output_dir}/${LATEX_TARGET}.toc
+    ${output_dir}/${LATEX_TARGET}.lof
+    ${output_dir}/${LATEX_TARGET}.xdy
+    ${output_dir}/${LATEX_TARGET}.synctex.gz
+    ${output_dir}/${LATEX_TARGET}.synctex.bak.gz
+    ${output_dir}/${LATEX_TARGET}.dvi
+    ${output_dir}/${LATEX_TARGET}.ps
+    ${output_dir}/${LATEX_TARGET}.pdf
+    )
+
   # For each directory in LATEX_IMAGE_DIRS, glob all the image files and
   # place them in LATEX_IMAGES.
   FOREACH(dir ${LATEX_IMAGE_DIRS})
@@ -636,16 +901,24 @@
 
   SET(make_dvi_command
     ${CMAKE_COMMAND} -E chdir ${output_dir}
-    ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT})
+    ${latex_build_command})
   SET(make_pdf_command
     ${CMAKE_COMMAND} -E chdir ${output_dir}
-    ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT})
+    ${pdflatex_build_command}
+    )
 
   SET(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images})
   SET(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images})
   FOREACH(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS})
     SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${input})
     SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${input})
+    IF (${input} MATCHES "\\.tex$")
+      STRING(REGEX REPLACE "\\.tex$" "" input_we ${input})
+      SET(auxiliary_clean_files ${auxiliary_clean_files}
+        ${output_dir}/${input_we}.aux
+        ${output_dir}/${input}.aux
+        )
+    ENDIF (${input} MATCHES "\\.tex$")
   ENDFOREACH(input)
 
   IF (LATEX_USE_GLOSSARY)
@@ -656,10 +929,11 @@
         -D LATEX_BUILD_COMMAND=makeglossaries
         -D LATEX_TARGET=${LATEX_TARGET}
         -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D XINDY_COMPILER=${XINDY_COMPILER}
         -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
         -P ${LATEX_USE_LATEX_LOCATION}
         COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-        ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}
+        ${latex_build_command}
         )
       SET(make_pdf_command ${make_pdf_command}
         COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
@@ -667,14 +941,42 @@
         -D LATEX_BUILD_COMMAND=makeglossaries
         -D LATEX_TARGET=${LATEX_TARGET}
         -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D XINDY_COMPILER=${XINDY_COMPILER}
         -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS}
         -P ${LATEX_USE_LATEX_LOCATION}
         COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-        ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}
+        ${pdflatex_build_command}
         )
     ENDFOREACH(dummy)
   ENDIF (LATEX_USE_GLOSSARY)
 
+  IF (LATEX_USE_NOMENCL)
+    FOREACH(dummy 0 1)   # Repeat these commands twice.
+      SET(make_dvi_command ${make_dvi_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${CMAKE_COMMAND}
+        -D LATEX_BUILD_COMMAND=makenomenclature
+        -D LATEX_TARGET=${LATEX_TARGET}
+        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D MAKENOMENCLATURE_COMPILER_FLAGS=${MAKENOMENCLATURE_COMPILER_FLAGS}
+        -P ${LATEX_USE_LATEX_LOCATION}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${latex_build_command}
+        )
+      SET(make_pdf_command ${make_pdf_command}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${CMAKE_COMMAND}
+        -D LATEX_BUILD_COMMAND=makenomenclature
+        -D LATEX_TARGET=${LATEX_TARGET}
+        -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER}
+        -D MAKENOMENCLATURE_COMPILER_FLAGS=${MAKENOMENCLATURE_COMPILER_FLAGS}
+        -P ${LATEX_USE_LATEX_LOCATION}
+        COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
+        ${pdflatex_build_command}
+        )
+    ENDFOREACH(dummy)
+  ENDIF (LATEX_USE_NOMENCL)
+
   IF (LATEX_BIBFILES)
     SET(make_dvi_command ${make_dvi_command}
       COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
@@ -691,26 +993,50 @@
   IF (LATEX_USE_INDEX)
     SET(make_dvi_command ${make_dvi_command}
       COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-      ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}
+      ${latex_build_command}
       COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
       ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
     SET(make_pdf_command ${make_pdf_command}
       COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-      ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}
+      ${pdflatex_build_command}
       COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
       ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx)
   ENDIF (LATEX_USE_INDEX)
 
   SET(make_dvi_command ${make_dvi_command}
     COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-    ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}
+    ${latex_build_command}
     COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-    ${LATEX_COMPILER} ${LATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT})
+    ${latex_build_command})
   SET(make_pdf_command ${make_pdf_command}
     COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-    ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT}
+    ${pdflatex_build_command}
     COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir}
-    ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${LATEX_MAIN_INPUT})
+    ${pdflatex_build_command})
+
+  IF (LATEX_USE_SYNCTEX)
+    IF (NOT GZIP)
+      MESSAGE(SEND_ERROR "UseLATEX.cmake: USE_SYNTEX option requires gzip program.  Set GZIP variable.")
+    ENDIF (NOT GZIP)
+    SET(make_dvi_command ${make_dvi_command}
+      COMMAND ${CMAKE_COMMAND}
+      -D LATEX_BUILD_COMMAND=correct_synctex
+      -D LATEX_TARGET=${LATEX_TARGET}
+      -D GZIP=${GZIP}
+      -D "LATEX_SOURCE_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR}"
+      -D "LATEX_BINARY_DIRECTORY=${output_dir}"
+      -P ${LATEX_USE_LATEX_LOCATION}
+      )
+    SET(make_pdf_command ${make_pdf_command}
+      COMMAND ${CMAKE_COMMAND}
+      -D LATEX_BUILD_COMMAND=correct_synctex
+      -D LATEX_TARGET=${LATEX_TARGET}
+      -D GZIP=${GZIP}
+      -D "LATEX_SOURCE_DIRECTORY=${CMAKE_CURRENT_SOURCE_DIR}"
+      -D "LATEX_BINARY_DIRECTORY=${output_dir}"
+      -P ${LATEX_USE_LATEX_LOCATION}
+      )
+  ENDIF (LATEX_USE_SYNCTEX)
 
   # Add commands and targets for building dvi outputs.
   ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi
@@ -774,8 +1100,13 @@
     ADD_DEPENDENCIES(${html_target} ${LATEX_MAIN_INPUT} ${LATEX_INPUTS})
   ENDIF (LATEX2HTML_CONVERTER)
 
+  SET_DIRECTORY_PROPERTIES(.
+    ADDITIONAL_MAKE_CLEAN_FILES "${auxiliary_clean_files}"
+    )
+
   ADD_CUSTOM_TARGET(${auxclean_target}
-    ${CMAKE_COMMAND} -E remove ${output_dir}/${LATEX_TARGET}.aux ${output_dir}/${LATEX_TARGET}.idx ${output_dir}/${LATEX_TARGET}.ind
+    COMMENT "Cleaning auxiliary LaTeX files."
+    COMMAND ${CMAKE_COMMAND} -E remove ${auxiliary_clean_files}
     )
 ENDMACRO(ADD_LATEX_TARGETS)
 
@@ -787,14 +1118,7 @@
     LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT})
 
     FOREACH (bib_file ${LATEX_BIBFILES})
-      CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${bib_file}
-        ${output_dir}/${bib_file}
-        COPYONLY)
-      ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${bib_file}
-        COMMAND ${CMAKE_COMMAND}
-        ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file} ${output_dir}/${bib_file}
-        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${bib_file}
-        )
+      LATEX_COPY_INPUT_FILE(${bib_file})
     ENDFOREACH (bib_file)
 
     FOREACH (input ${LATEX_INPUTS})
@@ -805,6 +1129,7 @@
     LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.bst ${output_dir})
     LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.clo ${output_dir})
     LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.sty ${output_dir})
+    LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.ist ${output_dir})
 
     ADD_LATEX_TARGETS(${ARGV})
   ENDIF (output_dir)
@@ -822,6 +1147,16 @@
     SET(command_handled TRUE)
   ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries)
 
+  IF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature)
+    LATEX_MAKENOMENCLATURE()
+    SET(command_handled TRUE)
+  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature)
+
+  IF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex)
+    LATEX_CORRECT_SYNCTEX()
+    SET(command_handled TRUE)
+  ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex)
+
   IF (NOT command_handled)
     MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}")
   ENDIF (NOT command_handled)