diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8181e4a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.swp +*~ + diff --git a/CMakeLists.txt b/CMakeLists.txt index 30780fe..234eec8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,13 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.4) +cmake_minimum_required(VERSION 2.8.4) -PROJECT(UseLATEX_DOC NONE) +project(UseLATEX_DOC NONE) -INCLUDE(UseLATEX.cmake) +include(UseLATEX.cmake) # Note that normally CMakeLists.txt would not be considered an # input to the document, but in this special case of documenting # UseLATEX.cmake the contents of this file is actually included # in the document. -ADD_LATEX_DOCUMENT(UseLATEX.tex +add_latex_document(UseLATEX.tex INPUTS CMakeLists.txt ) diff --git a/README b/README deleted file mode 100644 index 308cb43..0000000 --- a/README +++ /dev/null @@ -1,34 +0,0 @@ -Compiling LaTeX files into readable documents is actually a very involved -process. Although CMake comes with FindLATEX.cmake, it does nothing for -you other than find the commands associated with LaTeX. I like using CMake -to build my LaTeX documents, but creating targets to do it is actually a -pain. Thus, I've compiled a bunch of macros that help me create targets in -CMake into a file I call "UseLATEX.cmake". Here -are some of the things UseLATEX.cmake handles: - -* Runs LaTeX multiple times to resolve links. - -* Can run bibtex, makeindex, and makeglossaries to make bibliographies, - indexes, and/or glossaries. - -* Optionally runs configure on your latex files to replace @VARIABLE@ with - the equivalent CMake variable. - -* Automatically finds png, jpeg, eps, and pdf files and converts them to - formats latex and pdflatex understand. - -This repository contains the CMake macros in the UseLATEX.cmake file. To -get started, copy this file to your own LaTeX project and include it in -your build process. - -You will also find a LaTeX document, UseLATEX.tex, that contains all of the -documentation for UseLATEX.cmake. You will also find a CMake build file, -CMakeLists.txt, that uses UseLATEX.cmake to build UseLATEX.tex. It also -serves as a good example for using UseLATEX.cmake. - -You can find the latest information on UseLATEX.cmake on the CMake Wiki at -the following URL. - - http://www.cmake.org/Wiki/CMakeUserUseLATEX - - diff --git a/README.md b/README.md new file mode 100644 index 0000000..48e2a74 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +Compiling LaTeX files into readable documents is actually a very involved +process. Although CMake comes with FindLATEX.cmake, it does nothing for you +other than find the commands associated with LaTeX. I like using CMake to +build my LaTeX documents, but creating targets to do it is actually a pain. +Thus, I've compiled a bunch of macros that help me create targets in CMake +into a file I call [UseLATEX.cmake](UseLATEX.cmake). Here are some of the +things [UseLATEX.cmake](UseLATEX.cmake) handles: + + * Runs LaTeX multiple times to resolve links. + * Can run bibtex, makeindex, and makeglossaries to make bibliographies, + indexes, and/or glossaries. + * Optionally runs configure on your latex files to replace `@VARIABLE@` + with the equivalent CMake variable. + * Automatically finds png, jpeg, eps, and pdf files and converts them to + formats latex and pdflatex understand. + +## Download + +The files can be downloaded directly from the UseLATEX project page. If you +are viewing this from a web page, you can follow the following links. + + * Click here to get a copy of [UseLATEX.cmake](https://gitlab.kitware.com/kmorel/UseLATEX/raw/master/UseLATEX.cmake). + * Click here to get the documentation [UseLATEX.pdf](https://gitlab.kitware.com/kmorel/UseLATEX/raw/master/UseLATEX.pdf). + +## Repository + +This repository contains the CMake macros in the +[UseLATEX.cmake](UseLATEX.cmake) file. To get started, copy this file to +your own LaTeX project and include it in your build process. + +You will also find a LaTeX document, [UseLATEX.tex](UseLATEX.tex), that +contains all of the documentation for [UseLATEX.cmake](UseLATEX.cmake). You +will also find a CMake build file, [CMakeLists.txt](CMakeLists.txt), that +uses [UseLATEX.cmake](UseLATEX.cmake) to build +[UseLATEX.tex](UseLATEX.tex). It also serves as a good example for using +[UseLATEX.cmake](UseLATEX.cmake). + +There has been some requests to incorporate UseLATEX.cmake into the CMake +repository and distribution. Nobody thinks this is a bad idea, but it +hasn't yet happened mostly out of laziness. Keep bugging me to show +interest in moving UseLATEX.cmake. (See the author contact information at +the top of [UseLATEX.cmake](UseLATEX.cmake).) diff --git a/UseLATEX.cmake b/UseLATEX.cmake index 1134bf6..bb1fd9e 100644 --- a/UseLATEX.cmake +++ b/UseLATEX.cmake @@ -1,75 +1,295 @@ # File: UseLATEX.cmake # CMAKE commands to actually use the LaTeX compiler -# Version: 1.9.0 +# Version: 2.7.0 # Author: Kenneth Moreland # -# Copyright 2004 Sandia Corporation. +# Copyright 2004, 2015 Sandia Corporation. # Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive -# license for use of this work by or on behalf of the -# U.S. Government. Redistribution and use in source and binary forms, with -# or without modification, are permitted provided that this Notice and any -# statement of authorship are reproduced on all copies. +# license for use of this work by or on behalf of the U.S. Government. # -# The following MACROS are defined: +# This software is released under the BSD 3-Clause License. # -# ADD_LATEX_DOCUMENT( +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +# The following function is defined: +# +# add_latex_document( # [BIBFILES ] # [INPUTS ] -# [IMAGE_DIRS] -# [IMAGES] -# [CONFIGURE] -# [DEPENDS] -# [MULTIBIB_NEWCITES] -# [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL] -# [DEFAULT_PDF] [DEFAULT_SAFEPDF] -# [MANGLE_TARGET_NAMES]) +# [IMAGE_DIRS ] +# [IMAGES ] +# [CONFIGURE ] +# [DEPENDS ] +# [MULTIBIB_NEWCITES ] +# [USE_BIBLATEX] +# [USE_INDEX] +# [INDEX_NAMES ] +# [USE_GLOSSARY] [USE_NOMENCL] +# [FORCE_PDF] [FORCE_DVI] [FORCE_HTML] +# [TARGET_NAME ] +# [INCLUDE_DIRECTORIES ] +# [EXCLUDE_FROM_ALL] +# [EXCLUDE_FROM_DEFAULTS]) # Adds targets that compile . The latex output is placed # in LATEX_OUTPUT_PATH or CMAKE_CURRENT_BINARY_DIR if the former is # not set. The latex program is picky about where files are located, # so all input files are copied from the source directory to the # output directory. This includes the target tex file, any tex file # listed with the INPUTS option, the bibliography files listed with -# the BIBFILES option, and any .cls, .bst, and .clo files found in -# the current source directory. Images found in the IMAGE_DIRS -# directories or listed by IMAGES are also copied to the output -# directory and coverted to an appropriate format if necessary. Any -# tex files also listed with the CONFIGURE option are also processed -# with the CMake CONFIGURE_FILE command (with the @ONLY flag). Any -# file listed in CONFIGURE but not the target tex file or listed with -# INPUTS has no effect. DEPENDS can be used to specify generated files -# that are needed to compile the latex target. +# the BIBFILES option, and any .cls, .bst, .clo, .sty, .ist, and .fd +# files found in the current source directory. Images found in the +# IMAGE_DIRS directories or listed by IMAGES are also copied to the +# output directory and converted to an appropriate format if necessary. +# Any tex files also listed with the CONFIGURE option are also processed +# with the CMake CONFIGURE_FILE command (with the @ONLY flag). Any file +# listed in CONFIGURE but not the target tex file or listed with INPUTS +# has no effect. DEPENDS can be used to specify generated files that are +# needed to compile the latex target. # -# The following targets are made: -# dvi: Makes .dvi -# pdf: Makes .pdf using pdflatex. -# safepdf: Makes .pdf using ps2pdf. If using the default -# program arguments, this will ensure all fonts are -# embedded and no lossy compression has been performed -# on images. -# ps: Makes .ps -# html: Makes .html -# auxclean: Deletes .aux and other auxiliary files. +# The following targets are made. The name prefix is based off of the +# base name of the tex file unless TARGET_NAME is specified. If +# TARGET_NAME is specified, then that name is used for the targets. +# +# name_dvi: Makes .dvi +# name_pdf: Makes .pdf using pdflatex. +# name_safepdf: Makes .pdf using ps2pdf. If using the +# default program arguments, this will ensure all fonts +# are embedded and no lossy compression has been +# performed on images. +# name_ps: Makes .ps +# name_html: Makes .html +# name_auxclean: Deletes .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 -# pdf target will be the default instead of dvi. +# Unless the EXCLUDE_FROM_ALL option is given, one of these targets +# is added to the ALL target and built by default. Which target is +# determined by the LATEX_DEFAULT_BUILD CMake variable. See the +# documentation of that variable for more details. # -# If the argument MANGLE_TARGET_NAMES is given, then each of the -# target names above will be mangled with the name. This -# is to make the targets unique if ADD_LATEX_DOCUMENT is called for -# multiple documents. If the argument USE_INDEX is given, then -# commands to build an index are made. If the argument USE_GLOSSARY -# is given, then commands to build a glossary are made. If the -# argument MULTIBIB_NEWCITES is given, then additional bibtex calls -# are added to the build to support the extra auxiliary files created -# with the \newcite command in the multibib package. +# Unless the EXCLUDE_FROM_DEFAULTS option is given, all these targets +# are added as dependencies to targets named dvi, pdf, safepdf, ps, +# html, and auxclean, respectively. +# +# USE_BIBLATEX enables the use of biblatex/biber as an alternative to +# bibtex. Bibtex remains the default if USE_BIBLATEX is not +# specified. +# +# If the argument USE_INDEX is given, then commands to build an index +# are made. If the argument INDEX_NAMES is given, an index file is +# generated for each name in this list. See the LaTeX package multind +# for more information about how to generate multiple indices. +# +# If the argument USE_GLOSSARY is given, then commands to +# build a glossary are made. If the argument MULTIBIB_NEWCITES is +# given, then additional bibtex calls are added to the build to +# support the extra auxiliary files created with the \newcite command +# in the multibib package. +# +# INCLUDE_DIRECTORIES provides a list of directories in which LaTeX +# should look for input files. It accepts both files relative to the +# binary directory and absolute paths. # # History: # +# 2.7.0 Add INCLUDE_DIRECTORIES parameters. (Thanks to Eric Dönges.) +# +# 2.6.1 Fix issue with detecting long undefined reference warnings that +# LaTeX "helpfully" split across lines (and which fowled up our +# regex). +# +# 2.6.0 Skip image conversion targets that are not used when a force option +# is given. This helps prevent errors for missing conversion programs +# that are not needed. (Thanks to Martin Wetzel.) +# +# 2.5.0 Parse biber output for warnings. +# +# For regular bibtex, you get warnings about undefined references +# when you run latex. However, when using biber, biber itself prints +# out the said warning and latex sees nothing. Thus, when using biber +# the regular output is now suppressed and the log file is scanned +# for potential issues. +# +# 2.4.9 Use biblatex.cfg file if it exists and the USE_BIBLATEX option is ON. +# +# 2.4.8 Fix synctex issue with absolute paths not being converted. +# +# 2.4.7 Fix some issues with spaces in the path of the working directory where +# LaTeX is executed. +# +# 2.4.6 Fix parse issue with older versions of CMake. +# +# 2.4.5 Fix issues with files and paths containing spaces. +# +# 2.4.4 Improve error reporting message when LaTeX fails. +# +# When LaTeX fails, delete the output file, which is invalid. +# +# Add warnings for "missing characters." These usually mean that a +# non-ASCII character is in the document and will not be printed +# correctly. +# +# 2.4.3 Check for warnings from the natbib package. When using natbib, +# warnings for missing bibliography references look different. So +# far, natbib seems to be quiet unless something is important, so +# look for all natbib warnings. (We can change this later if +# necessary.) +# +# 2.4.2 Fix an issue where new versions of ImageMagick expect the order of +# options in command line execution of magick/convert. (See, for +# example, http://www.imagemagick.org/Usage/basics/#why.) +# +# 2.4.1 Add ability to dump LaTeX log file when using batch mode. Batch +# mode suppresses most output, often including error messages. To +# make sure critical error messages get displayed, show the full log +# on failures. +# +# 2.4.0 Remove "-r 600" from the default PDFTOPS_CONVERTER_FLAGS. The -r flag +# is available from the Poppler version of pdftops, but not the Xpdf +# version. +# +# Fix an issue with the flags for the different programs not being +# properly separated. +# +# Fix an issue on windows where the = character is not allowed for +# ps2pdf arguments. +# +# Change default arguments for latex and pdflatex commands. Makes the +# output more quiet and prints out the file/line where errors occur. +# (Thanks to Nikos Koukis.) +# +# After a LaTeX build, check the log file for warnings that are +# indicative of problems with the build. +# +# Remove support for latex2html. Instead, use the htlatex program. +# This is now part of TeX Live and most other distributions. It also +# behaves much more like the other LaTeX programs. Also fixed some +# nasty issues with the htlatex arguments. +# +# 2.3.2 Declare LaTeX input files as sources for targets so that they show +# up in IDEs like QtCreator. +# +# Fix issue where main tex files in subdirectories were creating +# invalid targets for building HTML. Just disable the HTML targets in +# this case. +# +# 2.3.1 Support use of magick command instead of convert command for +# ImageMagick 7. +# +# 2.3.0 Add USE_BIBLATEX option to support the biblatex package, which +# requires using the program biber as a replacement for bibtex +# (thanks to David Tracey). +# +# 2.2.1 Add STRINGS property to LATEX_DEFAULT_BUILD to make it easier to +# select the default build in the CMake GUI. +# +# 2.2.0 Add TARGET_NAME option. +# +# 2.1.1 Support for finding bmp, ppm, and other image files. +# +# 2.1.0 Fix an error where the pdf target and others were defined multiple +# times if UseLATEX.cmake was included multiple times. +# +# Added INDEX_NAMES option to support multiple indexes in a single +# document from the multind package (thanks to Dan Lipsa). +# +# 2.0.0 First major revision of UseLATEX.cmake updates to more recent features +# of CMake and some non-backward compatible changes. +# +# Changed all function and macro names to lower case. CMake's identifiers +# are case insensitive, but the convention moved from all upper case to +# all lower case somewhere around the release of CMake 2. (The original +# version of UseLATEX.cmake predates that.) +# +# Remove condition matching in if statements. They are no longer necessary +# and are even discouraged (because else clauses get confusing). +# +# Use "new" features available in CMake such as list and argument parsing. +# +# Remove some code that has been deprecated for a while. +# +# Mark variables for compiler and converter executables as advanced to +# match the more conventional CMake behavior. +# +# Changed how default builds are specified and add the ability to force +# a particular build. +# +# Made the base targets (pdf, dvi, etc.) global. add_latex_document +# always mangles its target names and these base targets depend on +# the targets with mangled names. +# +# 1.10.5 Fix for Window's convert check (thanks to Martin Baute). +# +# 1.10.4 Copy font files to binary directory for packages that come with +# their own fonts. +# +# 1.10.3 Check for Windows version of convert being used instead of +# ImageMagick's version (thanks to Martin Baute). +# +# 1.10.2 Use htlatex as a fallback when latex2html is not available (thanks +# to Tomasz Grzegurzko). +# +# 1.10.1 Make convert program mandatory only if actually used (thanks to +# Julien Schueller). +# +# 1.10.0 Added NO_DEFAULT and DEFAULT_PS options. +# Fixed issue with cleaning files for LaTeX documents originating in +# a subdirectory. +# +# 1.9.6 Fixed problem with LATEX_SMALL_IMAGES. +# Strengthened check to make sure the output directory does not contain +# the source files. +# +# 1.9.5 Add support for image types not directly supported by either latex +# or pdflatex. (Thanks to Jorge Gerardo Pena Pastor for SVG support.) +# +# 1.9.4 Fix issues with filenames containing multiple periods. +# +# 1.9.3 Hide some variables that are now cached but should not show up in +# the ccmake list of variables. +# +# 1.9.2 Changed MACRO declarations to FUNCTION declarations. The better +# FUNCTION scoping will hopefully avoid some common but subtle bugs. +# This implicitly increases the minimum CMake version to 4.6 (although +# I honestly only test it with the latest 4.8 version). +# +# Since we are updating the minimum CMake version, I'm going to start +# using the builtin LIST commands that are now available. +# +# Favor using pdftops from the Poppler package to convert from pdf to +# eps. It does a much better job than ImageMagick or ghostscript. +# +# 1.9.1 Fixed typo that caused the LATEX_SMALL_IMAGES option to fail to +# activate. +# # 1.9.0 Add support for the multibib package (thanks to Antonio LaTorre). # # 1.8.2 Fix corner case when an argument name was also a variable containing @@ -168,203 +388,253 @@ # 0.4.0 First version posted to CMake Wiki. # +if(__USE_LATEX_INCLUDED) + return() +endif() +set(__USE_LATEX_INCLUDED TRUE) + ############################################################################# # Find the location of myself while originally executing. If you do this # inside of a macro, it will recode where the macro was invoked. ############################################################################# -SET(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE} +set(LATEX_USE_LATEX_LOCATION ${CMAKE_CURRENT_LIST_FILE} CACHE INTERNAL "Location of UseLATEX.cmake file." FORCE ) ############################################################################# -# Generic helper macros +# Generic helper functions ############################################################################# -# Helpful list macros. -MACRO(LATEX_CAR var) - SET(${var} ${ARGV1}) -ENDMACRO(LATEX_CAR) -MACRO(LATEX_CDR var junk) - SET(${var} ${ARGN}) -ENDMACRO(LATEX_CDR) +include(CMakeParseArguments) -MACRO(LATEX_LIST_CONTAINS var value) - SET(${var}) - FOREACH (value2 ${ARGN}) - IF ("not_a_var_${value}" STREQUAL "not_a_var_${value2}") - SET(${var} TRUE) - ENDIF ("not_a_var_${value}" STREQUAL "not_a_var_${value2}") - ENDFOREACH (value2) -ENDMACRO(LATEX_LIST_CONTAINS) - -# Parse macro arguments. -MACRO(LATEX_PARSE_ARGUMENTS prefix arg_names option_names) - SET(DEFAULT_ARGS) - FOREACH(arg_name ${arg_names}) - SET(${prefix}_${arg_name}) - ENDFOREACH(arg_name) - FOREACH(option ${option_names}) - SET(${prefix}_${option}) - ENDFOREACH(option) - - SET(current_arg_name DEFAULT_ARGS) - SET(current_arg_list) - FOREACH(arg ${ARGN}) - LATEX_LIST_CONTAINS(is_arg_name ${arg} ${arg_names}) - IF (is_arg_name) - SET(${prefix}_${current_arg_name} ${current_arg_list}) - SET(current_arg_name ${arg}) - SET(current_arg_list) - ELSE (is_arg_name) - LATEX_LIST_CONTAINS(is_option ${arg} ${option_names}) - IF (is_option) - SET(${prefix}_${arg} TRUE) - ELSE (is_option) - SET(current_arg_list ${current_arg_list} ${arg}) - ENDIF (is_option) - ENDIF (is_arg_name) - ENDFOREACH(arg) - SET(${prefix}_${current_arg_name} ${current_arg_list}) -ENDMACRO(LATEX_PARSE_ARGUMENTS) +function(latex_list_contains var value) + set(input_list ${ARGN}) + list(FIND input_list "${value}" index) + if(index GREATER -1) + set(${var} TRUE PARENT_SCOPE) + else() + set(${var} PARENT_SCOPE) + endif() +endfunction(latex_list_contains) # Match the contents of a file to a regular expression. -MACRO(LATEX_FILE_MATCH variable filename regexp default) - # The FILE STRINGS command would be a bit better, but it's not supported on - # older versions of CMake. - FILE(READ ${filename} file_contents) - STRING(REGEX MATCHALL "${regexp}" - ${variable} ${file_contents} +function(latex_file_match variable filename regexp default) + # The FILE STRINGS command would be a bit better, but I'm not totally sure + # the match will always be to a whole line, and I don't want to break things. + file(READ ${filename} file_contents) + string(REGEX MATCHALL "${regexp}" + match_result ${file_contents} ) - IF (NOT ${variable}) - SET(${variable} "${default}") - ENDIF (NOT ${variable}) -ENDMACRO(LATEX_FILE_MATCH) + if(match_result) + set(${variable} "${match_result}" PARENT_SCOPE) + else() + set(${variable} "${default}" PARENT_SCOPE) + endif() +endfunction(latex_file_match) + +# A version of GET_FILENAME_COMPONENT that treats extensions after the last +# period rather than the first. To the best of my knowledge, all filenames +# typically used by LaTeX, including image files, have small extensions +# after the last dot. +function(latex_get_filename_component varname filename type) + set(result) + if("${type}" STREQUAL "NAME_WE") + get_filename_component(name ${filename} NAME) + string(REGEX REPLACE "\\.[^.]*\$" "" result "${name}") + elseif("${type}" STREQUAL "EXT") + get_filename_component(name ${filename} NAME) + string(REGEX MATCH "\\.[^.]*\$" result "${name}") + else() + get_filename_component(result ${filename} ${type}) + endif() + set(${varname} "${result}" PARENT_SCOPE) +endfunction(latex_get_filename_component) ############################################################################# -# Macros that perform processing during a LaTeX build. +# Functions that perform processing during a LaTeX build. ############################################################################# -MACRO(LATEX_MAKEGLOSSARIES) +function(latex_execute_latex) + if(NOT LATEX_WORKING_DIRECTORY) + message(SEND_ERROR "Need to define LATEX_WORKING_DIRECTORY") + endif() + + if(NOT LATEX_FULL_COMMAND) + message(SEND_ERROR "Need to define LATEX_FULL_COMMAND") + endif() + + if(NOT LATEX_OUTPUT_FILE) + message(SEND_ERROR "Need to define LATEX_OUTPUT_FILE") + endif() + + if(NOT LATEX_LOG_FILE) + message(SEND_ERROR "Need to define LATEX_LOG_FILE") + endif() + + set(full_command_original "${LATEX_FULL_COMMAND}") + + # Chose the native method for parsing command arguments. Newer versions of + # CMake allow you to just use NATIVE_COMMAND. + if (CMAKE_VERSION VERSION_GREATER 3.8) + set(separate_arguments_mode NATIVE_COMMAND) + else() + if (WIN32) + set(separate_arguments_mode WINDOWS_COMMAND) + else() + set(separate_arguments_mode UNIX_COMMAND) + endif() + endif() + + # Preps variables for use in execute_process. + # Even though we expect LATEX_WORKING_DIRECTORY to have a single "argument," + # we also want to make sure that we strip out any escape characters that can + # foul up the WORKING_DIRECTORY argument. + separate_arguments(LATEX_FULL_COMMAND UNIX_COMMAND "${LATEX_FULL_COMMAND}") + separate_arguments(LATEX_WORKING_DIRECTORY_SEP UNIX_COMMAND "${LATEX_WORKING_DIRECTORY}") + + execute_process( + COMMAND ${LATEX_FULL_COMMAND} + WORKING_DIRECTORY "${LATEX_WORKING_DIRECTORY_SEP}" + RESULT_VARIABLE execute_result + OUTPUT_VARIABLE ignore + ERROR_VARIABLE ignore + ) + + if(NOT ${execute_result} EQUAL 0) + # LaTeX tends to write a file when a failure happens. Delete that file so + # that LaTeX will run again. + file(REMOVE "${LATEX_WORKING_DIRECTORY}/${LATEX_OUTPUT_FILE}") + + message("\n\nLaTeX command failed") + message("${full_command_original}") + message("Log output:") + file(READ "${LATEX_WORKING_DIRECTORY}/${LATEX_LOG_FILE}" log_output) + message("${log_output}") + message(FATAL_ERROR "Executed LaTeX, but LaTeX returned an error.") + endif() +endfunction(latex_execute_latex) + +function(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) + message("**************************** In makeglossaries") + if(NOT LATEX_TARGET) + message(SEND_ERROR "Need to define LATEX_TARGET") + endif() - SET(aux_file ${LATEX_TARGET}.aux) + set(aux_file ${LATEX_TARGET}.aux) - IF (NOT EXISTS ${aux_file}) - MESSAGE(SEND_ERROR "${aux_file} does not exist. Run latex on your target file.") - ENDIF (NOT EXISTS ${aux_file}) + if(NOT EXISTS ${aux_file}) + message(SEND_ERROR "${aux_file} does not exist. Run latex on your target file.") + endif() - LATEX_FILE_MATCH(newglossary_lines ${aux_file} + latex_file_match(newglossary_lines ${aux_file} "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "@newglossary{main}{glg}{gls}{glo}" ) - LATEX_FILE_MATCH(istfile_line ${aux_file} + latex_file_match(istfile_line ${aux_file} "@istfilename[ \t]*{([^}]*)}" "@istfilename{${LATEX_TARGET}.ist}" ) - STRING(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1" + string(REGEX REPLACE "@istfilename[ \t]*{([^}]*)}" "\\1" 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) + 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() + else() + message("*************** Using makeindex") + if(NOT MAKEINDEX_COMPILER) + message(SEND_ERROR "Need to define MAKEINDEX_COMPILER") + endif() + endif() - FOREACH(newglossary ${newglossary_lines}) - STRING(REGEX REPLACE + foreach(newglossary ${newglossary_lines}) + string(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "\\1" glossary_name ${newglossary} ) - STRING(REGEX REPLACE + string(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\2" glossary_log ${newglossary} ) - STRING(REGEX REPLACE + string(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\3" glossary_out ${newglossary} ) - STRING(REGEX REPLACE + string(REGEX REPLACE "@newglossary[ \t]*{([^}]*)}{([^}]*)}{([^}]*)}{([^}]*)}" "${LATEX_TARGET}.\\4" glossary_in ${newglossary} ) - IF (use_xindy) - LATEX_FILE_MATCH(xdylanguage_line ${aux_file} + if(use_xindy) + latex_file_match(xdylanguage_line ${aux_file} "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}" "@xdylanguage{${glossary_name}}{english}" ) - STRING(REGEX REPLACE + string(REGEX REPLACE "@xdylanguage[ \t]*{${glossary_name}}{([^}]*)}" "\\1" language ${xdylanguage_line} ) - # What crazy person makes a LaTeX index generater that uses different + # What crazy person makes a LaTeX index generator 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) + 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() + if(language) + set(language_flags "-L ${language}") + else() + set(language_flags "") + endif() - LATEX_FILE_MATCH(codepage_line ${aux_file} + latex_file_match(codepage_line ${aux_file} "@gls@codepage[ \t]*{${glossary_name}}{([^}]*)}" "@gls@codepage{${glossary_name}}{utf}" ) - STRING(REGEX REPLACE + string(REGEX REPLACE "@gls@codepage[ \t]*{${glossary_name}}{([^}]*)}" "\\1" codepage ${codepage_line} ) - IF (codepage) - SET(codepage_flags "-C ${codepage}") - ELSE (codepage) + if(codepage) + set(codepage_flags "-C ${codepage}") + else() # 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) + set(codepage_flags "") + endif() - MESSAGE("${XINDY_COMPILER} ${MAKEGLOSSARIES_COMPILER_FLAGS} ${language_flags} ${codepage_flags} -I xindy -M ${glossary_name} -t ${glossary_log} -o ${glossary_out} ${glossary_in}" + message("${XINDY_COMPILER} ${MAKEGLOSSARIES_COMPILER_ARGS} ${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} + exec_program(${XINDY_COMPILER} + ARGS ${MAKEGLOSSARIES_COMPILER_ARGS} ${language_flags} ${codepage_flags} -I xindy @@ -374,16 +644,16 @@ MACRO(LATEX_MAKEGLOSSARIES) ${glossary_in} OUTPUT_VARIABLE xindy_output ) - MESSAGE("${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} + 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_ARGS} ${language_flags} -I xindy -M ${glossary_name} @@ -391,479 +661,907 @@ MACRO(LATEX_MAKEGLOSSARIES) -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} + endif() + + else() + message("${MAKEINDEX_COMPILER} ${MAKEGLOSSARIES_COMPILER_ARGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in}") + exec_program(${MAKEINDEX_COMPILER} ARGS ${MAKEGLOSSARIES_COMPILER_ARGS} -s ${istfile} -t ${glossary_log} -o ${glossary_out} ${glossary_in} ) - ENDIF (use_xindy) + endif() - ENDFOREACH(newglossary) -ENDMACRO(LATEX_MAKEGLOSSARIES) + endforeach(newglossary) +endfunction(latex_makeglossaries) -MACRO(LATEX_MAKENOMENCLATURE) - MESSAGE("**************************** In makenomenclature") - IF (NOT LATEX_TARGET) - MESSAGE(SEND_ERROR "Need to define LATEX_TARGET") - ENDIF (NOT LATEX_TARGET) +function(latex_makenomenclature) + message("**************************** In makenomenclature") + if(NOT LATEX_TARGET) + message(SEND_ERROR "Need to define LATEX_TARGET") + endif() - IF (NOT MAKEINDEX_COMPILER) - MESSAGE(SEND_ERROR "Need to define MAKEINDEX_COMPILER") - ENDIF (NOT MAKEINDEX_COMPILER) + if(NOT MAKEINDEX_COMPILER) + message(SEND_ERROR "Need to define MAKEINDEX_COMPILER") + endif() - SET(nomencl_out ${LATEX_TARGET}.nls) - SET(nomencl_in ${LATEX_TARGET}.nlo) + set(nomencl_out ${LATEX_TARGET}.nls) + set(nomencl_in ${LATEX_TARGET}.nlo) - EXEC_PROGRAM(${MAKEINDEX_COMPILER} ARGS ${MAKENOMENCLATURE_COMPILER_FLAGS} + exec_program(${MAKEINDEX_COMPILER} ARGS ${MAKENOMENCLATURE_COMPILER_ARGS} ${nomencl_in} -s "nomencl.ist" -o ${nomencl_out} ) -ENDMACRO(LATEX_MAKENOMENCLATURE) +endfunction(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) +function(latex_correct_synctex) + message("**************************** In correct SyncTeX") + if(NOT LATEX_TARGET) + message(SEND_ERROR "Need to define LATEX_TARGET") + endif() - IF (NOT GZIP) - MESSAGE(SEND_ERROR "Need to define GZIP") - ENDIF (NOT GZIP) + if(NOT GZIP) + message(SEND_ERROR "Need to define GZIP") + endif() - IF (NOT LATEX_SOURCE_DIRECTORY) - MESSAGE(SEND_ERROR "Need to define LATEX_SOURCE_DIRECTORY") - ENDIF (NOT LATEX_SOURCE_DIRECTORY) + if(NOT LATEX_SOURCE_DIRECTORY) + message(SEND_ERROR "Need to define LATEX_SOURCE_DIRECTORY") + endif() - IF (NOT LATEX_BINARY_DIRECTORY) - MESSAGE(SEND_ERROR "Need to define LATEX_BINARY_DIRECTORY") - ENDIF (NOT LATEX_BINARY_DIRECTORY) + if(NOT LATEX_BINARY_DIRECTORY) + message(SEND_ERROR "Need to define LATEX_BINARY_DIRECTORY") + endif() + message("${LATEX_BINARY_DIRECTORY}") + message("${LATEX_SOURCE_DIRECTORY}") - SET(synctex_file ${LATEX_BINARY_DIRECTORY}/${LATEX_TARGET}.synctex) - SET(synctex_file_gz ${synctex_file}.gz) + set(synctex_file ${LATEX_BINARY_DIRECTORY}/${LATEX_TARGET}.synctex) + set(synctex_file_gz ${synctex_file}.gz) - IF (EXISTS ${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("Making backup of synctex file.") + configure_file(${synctex_file_gz} ${synctex_file}.bak.gz COPYONLY) - MESSAGE("Uncompressing synctex file.") - EXEC_PROGRAM(${GZIP} + message("Uncompressing synctex file.") + exec_program(${GZIP} ARGS --decompress ${synctex_file_gz} ) - MESSAGE("Reading synctex file.") - FILE(READ ${synctex_file} synctex_data) + 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("Replacing output paths with input paths.") + foreach(extension tex cls bst clo sty ist fd) + # Relative paths + string(REGEX REPLACE + "(Input:[0-9]+:)([^/\n][^\n]\\.${extension}*)" + "\\1${LATEX_SOURCE_DIRECTORY}/\\2" + synctex_data + "${synctex_data}" + ) - MESSAGE("Writing synctex file.") - FILE(WRITE ${synctex_file} "${synctex_data}") + # Absolute paths + string(REGEX REPLACE + "(Input:[0-9]+:)${LATEX_BINARY_DIRECTORY}([^\n]*\\.${extension})" + "\\1${LATEX_SOURCE_DIRECTORY}\\2" + synctex_data + "${synctex_data}" + ) + endforeach(extension) - MESSAGE("Compressing synctex file.") - EXEC_PROGRAM(${GZIP} + 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}) + else() - MESSAGE(SEND_ERROR "File ${synctex_file_gz} not found. Perhaps synctex is not supported by your LaTeX compiler.") + message(SEND_ERROR "File ${synctex_file_gz} not found. Perhaps synctex is not supported by your LaTeX compiler.") - ENDIF (EXISTS ${synctex_file_gz}) + endif() -ENDMACRO(LATEX_CORRECT_SYNCTEX) +endfunction(latex_correct_synctex) + +function(latex_check_important_warnings) + # Check for biber warnings/errors if that was run + set(bib_log_file ${LATEX_TARGET}.blg) + if(EXISTS ${bib_log_file}) + file(READ ${bib_log_file} bib_log) + if(bib_log MATCHES "INFO - This is Biber") + message("\nChecking ${bib_log_file} for Biber warnings/errors.") + + string(REGEX MATCHALL + "[A-Z]+ - [^\n]*" + biber_messages + "${bib_log}") + + set(found_error) + foreach(message ${biber_messages}) + if(NOT message MATCHES "^INFO - ") + set(found_error TRUE) + message("${message}") + endif() + endforeach(message) + + if(found_error) + latex_get_filename_component(log_file_path ${bib_log_file} ABSOLUTE) + message("\nConsult ${log_file_path} for more information on Biber output.") + else() + message("No known important Biber output found.") + endif(found_error) + else() # Biber output not in log file + message("Skipping biber checks (biber not used)") + endif() + else() # No bib log file + message("Skipping bibliography checks (not run)") + endif() + + set(log_file ${LATEX_TARGET}.log) + + message("\nChecking ${log_file} for important warnings.") + if(NOT LATEX_TARGET) + message(SEND_ERROR "Need to define LATEX_TARGET") + endif() + + if(NOT EXISTS ${log_file}) + message("Could not find log file: ${log_file}") + return() + endif() + + set(found_error) + + file(READ ${log_file} log) + + # Check for declared LaTeX warnings + string(REGEX MATCHALL + "\nLaTeX Warning:[^\n]*" + latex_warnings + "${log}") + if(latex_warnings) + set(found_error TRUE) + message("\nFound declared LaTeX warnings.") + foreach(warning ${latex_warnings}) + string(STRIP "${warning}" warning_no_newline) + message("${warning_no_newline}") + endforeach(warning) + endif() + + # Check for natbib warnings + string(REGEX MATCHALL + "\nPackage natbib Warning:[^\n]*" + natbib_warnings + "${log}") + if(natbib_warnings) + set(found_error TRUE) + message("\nFound natbib package warnings.") + foreach(warning ${natbib_warnings}) + string(STRIP "${warning}" warning_no_newline) + message("${warning_no_newline}") + endforeach(warning) + endif() + + # Check for overfull + string(REGEX MATCHALL + "\nOverfull[^\n]*" + overfull_warnings + "${log}") + if(overfull_warnings) + set(found_error TRUE) + message("\nFound overfull warnings. These are indicative of layout errors.") + foreach(warning ${overfull_warnings}) + string(STRIP "${warning}" warning_no_newline) + message("${warning_no_newline}") + endforeach(warning) + endif() + + # Check for invalid characters + string(REGEX MATCHALL + "\nMissing character:[^\n]*" + invalid_character_warnings + "${log}") + if(invalid_character_warnings) + set(found_error TRUE) + message("\nFound invalid character warnings. These characters are likely not printed correctly.") + foreach(warning ${invalid_character_warnings}) + string(STRIP "${warning}" warning_no_newline) + message("${warning_no_newline}") + endforeach(warning) + endif() + + if(found_error) + latex_get_filename_component(log_file_path ${log_file} ABSOLUTE) + message("\nConsult ${log_file_path} for more information on LaTeX build.") + else() + message("No known important warnings found.") + endif(found_error) +endfunction(latex_check_important_warnings) ############################################################################# -# Helper macros for establishing LaTeX build. +# Helper functions for establishing LaTeX build. ############################################################################# -MACRO(LATEX_NEEDIT VAR NAME) - IF (NOT ${VAR}) - MESSAGE(SEND_ERROR "I need the ${NAME} command.") - ENDIF(NOT ${VAR}) -ENDMACRO(LATEX_NEEDIT) +function(latex_needit VAR NAME) + if(NOT ${VAR}) + message(SEND_ERROR "I need the ${NAME} command.") + endif() +endfunction(latex_needit) -MACRO(LATEX_WANTIT VAR NAME) - IF (NOT ${VAR}) - MESSAGE(STATUS "I could not find the ${NAME} command.") - ENDIF(NOT ${VAR}) -ENDMACRO(LATEX_WANTIT) +function(latex_wantit VAR NAME) + if(NOT ${VAR}) + message(STATUS "I could not find the ${NAME} command.") + endif() +endfunction(latex_wantit) -MACRO(LATEX_SETUP_VARIABLES) - SET(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}" +function(latex_setup_variables) + set(LATEX_OUTPUT_PATH "${LATEX_OUTPUT_PATH}" CACHE PATH "If non empty, specifies the location to place LaTeX output." ) - FIND_PACKAGE(LATEX) + find_package(LATEX) - FIND_PROGRAM(XINDY_COMPILER + find_program(XINDY_COMPILER NAME xindy PATHS ${MIKTEX_BINARY_PATH} /usr/bin ) - FIND_PACKAGE(UnixCommands) + find_package(UnixCommands) - MARK_AS_ADVANCED(CLEAR + find_program(PDFTOPS_CONVERTER + NAMES pdftops + DOC "The pdf to ps converter program from the Poppler package." + ) + + find_program(HTLATEX_COMPILER + NAMES htlatex + PATHS ${MIKTEX_BINARY_PATH} + /usr/bin + ) + + mark_as_advanced( LATEX_COMPILER PDFLATEX_COMPILER BIBTEX_COMPILER + BIBER_COMPILER MAKEINDEX_COMPILER XINDY_COMPILER DVIPS_CONVERTER PS2PDF_CONVERTER + PDFTOPS_CONVERTER LATEX2HTML_CONVERTER + HTLATEX_COMPILER ) - LATEX_NEEDIT(LATEX_COMPILER latex) - LATEX_WANTIT(PDFLATEX_COMPILER pdflatex) - LATEX_NEEDIT(BIBTEX_COMPILER bibtex) - LATEX_NEEDIT(MAKEINDEX_COMPILER makeindex) - LATEX_WANTIT(DVIPS_CONVERTER dvips) - LATEX_WANTIT(PS2PDF_CONVERTER ps2pdf) - LATEX_WANTIT(LATEX2HTML_CONVERTER latex2html) + latex_needit(LATEX_COMPILER latex) + latex_wantit(PDFLATEX_COMPILER pdflatex) + latex_wantit(HTLATEX_COMPILER htlatex) + latex_needit(BIBTEX_COMPILER bibtex) + latex_wantit(BIBER_COMPILER biber) + latex_needit(MAKEINDEX_COMPILER makeindex) + latex_wantit(DVIPS_CONVERTER dvips) + latex_wantit(PS2PDF_CONVERTER ps2pdf) + latex_wantit(PDFTOPS_CONVERTER pdftops) - SET(LATEX_COMPILER_FLAGS "-interaction=nonstopmode" + set(LATEX_COMPILER_FLAGS "-interaction=batchmode -file-line-error" CACHE STRING "Flags passed to latex.") - SET(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS} + set(PDFLATEX_COMPILER_FLAGS ${LATEX_COMPILER_FLAGS} CACHE STRING "Flags passed to pdflatex.") - SET(LATEX_SYNCTEX_FLAGS "-synctex=1" + set(HTLATEX_COMPILER_TEX4HT_FLAGS "html" + CACHE STRING "Options for the tex4ht.sty and *.4ht style files.") + set(HTLATEX_COMPILER_TEX4HT_POSTPROCESSOR_FLAGS "" + CACHE STRING "Options for the text4ht postprocessor.") + set(HTLATEX_COMPILER_T4HT_POSTPROCESSOR_FLAGS "" + CACHE STRING "Options for the t4ht postprocessor.") + set(HTLATEX_COMPILER_LATEX_FLAGS ${LATEX_COMPILER_FLAGS} + CACHE STRING "Flags passed from htlatex to the LaTeX compiler.") + set(LATEX_SYNCTEX_FLAGS "-synctex=1" CACHE STRING "latex/pdflatex flags used to create synctex file.") - SET(BIBTEX_COMPILER_FLAGS "" + set(BIBTEX_COMPILER_FLAGS "" CACHE STRING "Flags passed to bibtex.") - SET(MAKEINDEX_COMPILER_FLAGS "" + set(BIBER_COMPILER_FLAGS "" + CACHE STRING "Flags passed to biber.") + set(MAKEINDEX_COMPILER_FLAGS "" CACHE STRING "Flags passed to makeindex.") - SET(MAKEGLOSSARIES_COMPILER_FLAGS "" + set(MAKEGLOSSARIES_COMPILER_FLAGS "" CACHE STRING "Flags passed to makeglossaries.") - SET(MAKENOMENCLATURE_COMPILER_FLAGS "" + set(MAKENOMENCLATURE_COMPILER_FLAGS "" CACHE STRING "Flags passed to makenomenclature.") - SET(DVIPS_CONVERTER_FLAGS "-Ppdf -G0 -t letter" + 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" - CACHE STRING "Flags passed to ps2pdf.") - SET(LATEX2HTML_CONVERTER_FLAGS "" - CACHE STRING "Flags passed to latex2html.") - MARK_AS_ADVANCED( + if(NOT WIN32) + set(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct=100 -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true -dAutoFilterColorImages=false -dAutoFilterGrayImages=false -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode -dMonoImageFilter=/FlateEncode" + CACHE STRING "Flags passed to ps2pdf.") + else() + # Most windows ports of ghostscript utilities use .bat files for ps2pdf + # commands. bat scripts interpret "=" as a special character and separate + # those arguments. To get around this, the ghostscript utilities also + # support using "#" in place of "=". + set(PS2PDF_CONVERTER_FLAGS "-dMaxSubsetPct#100 -dCompatibilityLevel#1.3 -dSubsetFonts#true -dEmbedAllFonts#true -dAutoFilterColorImages#false -dAutoFilterGrayImages#false -dColorImageFilter#/FlateEncode -dGrayImageFilter#/FlateEncode -dMonoImageFilter#/FlateEncode" + CACHE STRING "Flags passed to ps2pdf.") + endif() + set(PDFTOPS_CONVERTER_FLAGS "" + CACHE STRING "Flags passed to pdftops.") + mark_as_advanced( LATEX_COMPILER_FLAGS PDFLATEX_COMPILER_FLAGS + HTLATEX_COMPILER_TEX4HT_FLAGS + HTLATEX_COMPILER_TEX4HT_POSTPROCESSOR_FLAGS + HTLATEX_COMPILER_T4HT_POSTPROCESSOR_FLAGS + HTLATEX_COMPILER_LATEX_FLAGS LATEX_SYNCTEX_FLAGS BIBTEX_COMPILER_FLAGS + BIBER_COMPILER_FLAGS MAKEINDEX_COMPILER_FLAGS MAKEGLOSSARIES_COMPILER_FLAGS MAKENOMENCLATURE_COMPILER_FLAGS DVIPS_CONVERTER_FLAGS PS2PDF_CONVERTER_FLAGS - LATEX2HTML_CONVERTER_FLAGS + PDFTOPS_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) - FIND_PROGRAM(IMAGEMAGICK_CONVERT convert + # Because it is easier to type, the flags variables are entered as + # space-separated strings much like you would in a shell. However, when + # using a CMake command to execute a program, it works better to hold the + # arguments in semicolon-separated lists (otherwise the whole string will + # be interpreted as a single argument). Use the separate_arguments to + # convert the space-separated strings to semicolon-separated lists. + separate_arguments(LATEX_COMPILER_FLAGS) + separate_arguments(PDFLATEX_COMPILER_FLAGS) + separate_arguments(HTLATEX_COMPILER_LATEX_FLAGS) + separate_arguments(LATEX_SYNCTEX_FLAGS) + separate_arguments(BIBTEX_COMPILER_FLAGS) + separate_arguments(BIBER_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(PDFTOPS_CONVERTER_FLAGS) + + # Not quite done. When you call separate_arguments on a cache variable, + # the result is written to a local variable. That local variable goes + # away when this function returns (which is before any of them are used). + # So, copy these variables with local scope to cache variables with + # global scope. + set(LATEX_COMPILER_ARGS "${LATEX_COMPILER_FLAGS}" CACHE INTERNAL "") + set(PDFLATEX_COMPILER_ARGS "${PDFLATEX_COMPILER_FLAGS}" CACHE INTERNAL "") + set(HTLATEX_COMPILER_ARGS "${HTLATEX_COMPILER_LATEX_FLAGS}" CACHE INTERNAL "") + set(LATEX_SYNCTEX_ARGS "${LATEX_SYNCTEX_FLAGS}" CACHE INTERNAL "") + set(BIBTEX_COMPILER_ARGS "${BIBTEX_COMPILER_FLAGS}" CACHE INTERNAL "") + set(BIBER_COMPILER_ARGS "${BIBER_COMPILER_FLAGS}" CACHE INTERNAL "") + set(MAKEINDEX_COMPILER_ARGS "${MAKEINDEX_COMPILER_FLAGS}" CACHE INTERNAL "") + set(MAKEGLOSSARIES_COMPILER_ARGS "${MAKEGLOSSARIES_COMPILER_FLAGS}" CACHE INTERNAL "") + set(MAKENOMENCLATURE_COMPILER_ARGS "${MAKENOMENCLATURE_COMPILER_FLAGS}" CACHE INTERNAL "") + set(DVIPS_CONVERTER_ARGS "${DVIPS_CONVERTER_FLAGS}" CACHE INTERNAL "") + set(PS2PDF_CONVERTER_ARGS "${PS2PDF_CONVERTER_FLAGS}" CACHE INTERNAL "") + set(PDFTOPS_CONVERTER_ARGS "${PDFTOPS_CONVERTER_FLAGS}" CACHE INTERNAL "") + + find_program(IMAGEMAGICK_CONVERT + NAMES magick convert DOC "The convert program that comes with ImageMagick (available at http://www.imagemagick.org)." ) - IF (NOT IMAGEMAGICK_CONVERT) - MESSAGE(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.") - ENDIF (NOT IMAGEMAGICK_CONVERT) + mark_as_advanced(IMAGEMAGICK_CONVERT) - OPTION(LATEX_USE_SYNCTEX + if(DEFINED ENV{LATEX_DEFAULT_BUILD}) + set(default_build $ENV{LATEX_DEFAULT_BUILD}) + else() + set(default_build pdf) + endif() + + set(LATEX_DEFAULT_BUILD "${default_build}" CACHE STRING + "Choose the default type of LaTeX build. Valid options are pdf, dvi, ps, safepdf, html" + ) + set_property(CACHE LATEX_DEFAULT_BUILD + PROPERTY STRINGS pdf dvi ps safepdf html + ) + + 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." + 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 distribution and can make it faster to read dvi files." OFF) - IF (LATEX_SMALL_IMAGES) - SET(LATEX_RASTER_SCALE 16) - SET(LATEX_OPPOSITE_RASTER_SCALE 100) - ELSE (LATEX_SMALL_IMAGES) - SET(LATEX_RASTER_SCALE 100) - SET(LATEX_OPPOSITE_RASTER_SCALE 16) - ENDIF (LATEX_SMALL_IMAGES) + if(LATEX_SMALL_IMAGES) + set(LATEX_RASTER_SCALE 16 PARENT_SCOPE) + set(LATEX_OPPOSITE_RASTER_SCALE 100 PARENT_SCOPE) + else() + set(LATEX_RASTER_SCALE 100 PARENT_SCOPE) + set(LATEX_OPPOSITE_RASTER_SCALE 16 PARENT_SCOPE) + endif() # Just holds extensions for known image types. They should all be lower case. - SET(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps) - SET(LATEX_DVI_RASTER_IMAGE_EXTENSIONS) - SET(LATEX_DVI_IMAGE_EXTENSIONS - ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS}) - SET(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf) - SET(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .png .jpeg .jpg) - SET(LATEX_PDF_IMAGE_EXTENSIONS - ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) - SET(LATEX_IMAGE_EXTENSIONS - ${LATEX_DVI_IMAGE_EXTENSIONS} ${LATEX_PDF_IMAGE_EXTENSIONS}) -ENDMACRO(LATEX_SETUP_VARIABLES) - -MACRO(LATEX_GET_OUTPUT_PATH var) - SET(${var}) - IF (LATEX_OUTPUT_PATH) - IF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") - MESSAGE(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.") - ELSE ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") - SET(${var} "${LATEX_OUTPUT_PATH}") - ENDIF ("${LATEX_OUTPUT_PATH}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") - ELSE (LATEX_OUTPUT_PATH) - IF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") - MESSAGE(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.") - ELSE ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") - SET(${var} "${CMAKE_CURRENT_BINARY_DIR}") - ENDIF ("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") - ENDIF (LATEX_OUTPUT_PATH) -ENDMACRO(LATEX_GET_OUTPUT_PATH) - -MACRO(LATEX_ADD_CONVERT_COMMAND output_path input_path output_extension - input_extension flags) - SET (converter ${IMAGEMAGICK_CONVERT}) - SET (convert_flags "") - # ImageMagick has broken eps to pdf conversion - # use ps2pdf instead - IF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") - IF (PS2PDF_CONVERTER) - SET (converter ${PS2PDF_CONVERTER}) - 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) - ELSE (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") - SET (convert_flags ${flags}) - ENDIF (${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") - - ADD_CUSTOM_COMMAND(OUTPUT ${output_path} - COMMAND ${converter} - ARGS ${convert_flags} ${input_path} ${output_path} - DEPENDS ${input_path} + # For historical reasons, these are all declared in the global scope. + set(LATEX_DVI_VECTOR_IMAGE_EXTENSIONS .eps CACHE INTERNAL "") + set(LATEX_DVI_RASTER_IMAGE_EXTENSIONS CACHE INTERNAL "") + set(LATEX_DVI_IMAGE_EXTENSIONS + ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} + ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} + CACHE INTERNAL "" ) -ENDMACRO(LATEX_ADD_CONVERT_COMMAND) + + set(LATEX_PDF_VECTOR_IMAGE_EXTENSIONS .pdf CACHE INTERNAL "") + set(LATEX_PDF_RASTER_IMAGE_EXTENSIONS .jpeg .jpg .png CACHE INTERNAL "") + set(LATEX_PDF_IMAGE_EXTENSIONS + ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} + ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS} + CACHE INTERNAL "" + ) + + set(LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS .ai .dot .svg CACHE INTERNAL "") + set(LATEX_OTHER_RASTER_IMAGE_EXTENSIONS + .bmp .bmp2 .bmp3 .dcm .dcx .ico .gif .pict .ppm .tif .tiff + CACHE INTERNAL "") + set(LATEX_OTHER_IMAGE_EXTENSIONS + ${LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS} + ${LATEX_OTHER_RASTER_IMAGE_EXTENSIONS} + CACHE INTERNAL "" + ) + + set(LATEX_VECTOR_IMAGE_EXTENSIONS + ${LATEX_DVI_VECTOR_IMAGE_EXTENSIONS} + ${LATEX_PDF_VECTOR_IMAGE_EXTENSIONS} + ${LATEX_OTHER_VECTOR_IMAGE_EXTENSIONS} + CACHE INTERNAL "" + ) + set(LATEX_RASTER_IMAGE_EXTENSIONS + ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} + ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS} + ${LATEX_OTHER_RASTER_IMAGE_EXTENSIONS} + CACHE INTERNAL "" + ) + set(LATEX_IMAGE_EXTENSIONS + ${LATEX_DVI_IMAGE_EXTENSIONS} + ${LATEX_PDF_IMAGE_EXTENSIONS} + ${LATEX_OTHER_IMAGE_EXTENSIONS} + CACHE INTERNAL "" + ) +endfunction(latex_setup_variables) + +function(latex_setup_targets) + if(NOT TARGET pdf) + add_custom_target(pdf) + endif() + if(NOT TARGET dvi) + add_custom_target(dvi) + endif() + if(NOT TARGET ps) + add_custom_target(ps) + endif() + if(NOT TARGET safepdf) + add_custom_target(safepdf) + endif() + if(NOT TARGET html) + add_custom_target(html) + endif() + if(NOT TARGET auxclean) + add_custom_target(auxclean) + endif() +endfunction(latex_setup_targets) + +function(latex_get_output_path var) + set(latex_output_path) + if(LATEX_OUTPUT_PATH) + get_filename_component( + LATEX_OUTPUT_PATH_FULL "${LATEX_OUTPUT_PATH}" ABSOLUTE + ) + if("${LATEX_OUTPUT_PATH_FULL}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") + message(SEND_ERROR "You cannot set LATEX_OUTPUT_PATH to the same directory that contains LaTeX input files.") + else() + set(latex_output_path "${LATEX_OUTPUT_PATH_FULL}") + endif() + else() + if("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}") + message(SEND_ERROR "LaTeX files must be built out of source or you must set LATEX_OUTPUT_PATH.") + else() + set(latex_output_path "${CMAKE_CURRENT_BINARY_DIR}") + endif() + endif() + set(${var} ${latex_output_path} PARENT_SCOPE) +endfunction(latex_get_output_path) + +function(latex_add_convert_command + output_path + input_path + output_extension + input_extension + flags + ) + set(require_imagemagick_convert TRUE) + set(convert_flags "") + if(${input_extension} STREQUAL ".eps" AND ${output_extension} STREQUAL ".pdf") + # ImageMagick has broken eps to pdf conversion + # use ps2pdf instead + if(PS2PDF_CONVERTER) + set(require_imagemagick_convert FALSE) + set(converter ${PS2PDF_CONVERTER}) + set(convert_flags -dEPSCrop ${PS2PDF_CONVERTER_ARGS}) + else() + message(SEND_ERROR "Using postscript files with pdflatex requires ps2pdf for conversion.") + endif() + elseif(${input_extension} STREQUAL ".pdf" AND ${output_extension} STREQUAL ".eps") + # ImageMagick can also be sketchy on pdf to eps conversion. Not good with + # color spaces and tends to unnecessarily rasterize. + # use pdftops instead + if(PDFTOPS_CONVERTER) + set(require_imagemagick_convert FALSE) + set(converter ${PDFTOPS_CONVERTER}) + set(convert_flags -eps ${PDFTOPS_CONVERTER_ARGS}) + else() + message(STATUS "Consider getting pdftops from Poppler to convert PDF images to EPS images.") + set(convert_flags ${flags}) + endif() + else() + set(convert_flags ${flags}) + endif() + + if(require_imagemagick_convert) + if(IMAGEMAGICK_CONVERT) + string(TOLOWER ${IMAGEMAGICK_CONVERT} IMAGEMAGICK_CONVERT_LOWERCASE) + if(${IMAGEMAGICK_CONVERT_LOWERCASE} MATCHES "system32[/\\\\]convert\\.exe") + 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). If you have a recent version of ImageMagick (7.0 or higher), use the magick program instead of convert for IMAGEMAGICK_CONVERT.") + else() + set(converter ${IMAGEMAGICK_CONVERT}) + # ImageMagick requires a special order of arguments where resize and + # arguments of that nature must be placed after the input image path. + add_custom_command(OUTPUT ${output_path} + COMMAND ${converter} + ARGS ${input_path} ${convert_flags} ${output_path} + DEPENDS ${input_path} + ) + endif() + else() + message(SEND_ERROR "Could not find convert program. Please download ImageMagick from http://www.imagemagick.org and install.") + endif() + else() # Not ImageMagick convert + add_custom_command(OUTPUT ${output_path} + COMMAND ${converter} + ARGS ${convert_flags} ${input_path} ${output_path} + DEPENDS ${input_path} + ) + endif() +endfunction(latex_add_convert_command) # Makes custom commands to convert a file to a particular type. -MACRO(LATEX_CONVERT_IMAGE output_files input_file output_extension convert_flags - output_extensions other_files) - SET(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) - LATEX_GET_OUTPUT_PATH(output_dir) +function(latex_convert_image + output_files_var + input_file + output_extension + convert_flags + output_extensions + other_files + ) + set(output_file_list) + set(input_dir ${CMAKE_CURRENT_SOURCE_DIR}) + latex_get_output_path(output_dir) - GET_FILENAME_COMPONENT(extension "${input_file}" EXT) + latex_get_filename_component(extension "${input_file}" EXT) - STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file + # Check input filename for potential problems with LaTeX. + latex_get_filename_component(name "${input_file}" NAME_WE) + set(suggested_name "${name}") + if(suggested_name MATCHES ".*\\..*") + string(REPLACE "." "-" suggested_name "${suggested_name}") + endif() + if(suggested_name MATCHES ".* .*") + string(REPLACE " " "-" suggested_name "${suggested_name}") + endif() + if(NOT suggested_name STREQUAL name) + message(WARNING "Some LaTeX distributions have problems with image file names with multiple extensions or spaces. Consider changing ${name}${extension} to something like ${suggested_name}${extension}.") + endif() + + string(REGEX REPLACE "\\.[^.]*\$" ${output_extension} output_file "${input_file}") - LATEX_LIST_CONTAINS(is_type ${extension} ${output_extensions}) - IF (is_type) - IF (convert_flags) - LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} + latex_list_contains(is_type ${extension} ${output_extensions}) + if(is_type) + if(convert_flags) + latex_add_convert_command(${output_dir}/${output_file} ${input_dir}/${input_file} ${output_extension} ${extension} "${convert_flags}") - SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) - ELSE (convert_flags) + set(output_file_list ${output_dir}/${output_file}) + else() # As a shortcut, we can just copy the file. - ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${input_file} + add_custom_command(OUTPUT ${output_dir}/${input_file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${input_dir}/${input_file} ${output_dir}/${input_file} DEPENDS ${input_dir}/${input_file} ) - SET(${output_files} ${${output_files}} ${output_dir}/${input_file}) - ENDIF (convert_flags) - ELSE (is_type) - SET(do_convert TRUE) + set(output_file_list ${output_dir}/${input_file}) + endif() + else() + set(do_convert TRUE) # Check to see if there is another input file of the appropriate type. - FOREACH(valid_extension ${output_extensions}) - STRING(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file + foreach(valid_extension ${output_extensions}) + string(REGEX REPLACE "\\.[^.]*\$" ${output_extension} try_file "${input_file}") - LATEX_LIST_CONTAINS(has_native_file "${try_file}" ${other_files}) - IF (has_native_file) - SET(do_convert FALSE) - ENDIF (has_native_file) - ENDFOREACH(valid_extension) + latex_list_contains(has_native_file "${try_file}" ${other_files}) + if(has_native_file) + set(do_convert FALSE) + endif() + endforeach(valid_extension) # If we still need to convert, do it. - IF (do_convert) - LATEX_ADD_CONVERT_COMMAND(${output_dir}/${output_file} + if(do_convert) + latex_add_convert_command(${output_dir}/${output_file} ${input_dir}/${input_file} ${output_extension} ${extension} "${convert_flags}") - SET(${output_files} ${${output_files}} ${output_dir}/${output_file}) - ENDIF (do_convert) - ENDIF (is_type) -ENDMACRO(LATEX_CONVERT_IMAGE) + set(output_file_list ${output_dir}/${output_file}) + endif() + endif() + + set(${output_files_var} ${output_file_list} PARENT_SCOPE) +endfunction(latex_convert_image) # Adds custom commands to process the given files for dvi and pdf builds. # Adds the output files to the given variables (does not replace). -MACRO(LATEX_PROCESS_IMAGES dvi_outputs pdf_outputs) - LATEX_GET_OUTPUT_PATH(output_dir) - FOREACH(file ${ARGN}) - IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") - GET_FILENAME_COMPONENT(extension "${file}" EXT) - SET(convert_flags) +function(latex_process_images dvi_outputs_var pdf_outputs_var) + latex_get_output_path(output_dir) + set(dvi_outputs) + set(pdf_outputs) + foreach(file ${ARGN}) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") + latex_get_filename_component(extension "${file}" EXT) + set(convert_flags) # Check to see if we need to downsample the image. - LATEX_LIST_CONTAINS(is_raster extension - ${LATEX_DVI_RASTER_IMAGE_EXTENSIONS} - ${LATEX_PDF_RASTER_IMAGE_EXTENSIONS}) - IF (LATEX_SMALL_IMAGES) - IF (is_raster) - SET(convert_flags -resize ${LATEX_RASTER_SCALE}%) - ENDIF (is_raster) - ENDIF (LATEX_SMALL_IMAGES) + latex_list_contains(is_raster "${extension}" + ${LATEX_RASTER_IMAGE_EXTENSIONS}) + if(LATEX_SMALL_IMAGES) + if(is_raster) + set(convert_flags -resize ${LATEX_RASTER_SCALE}%) + endif() + endif() # Make sure the output directory exists. - GET_FILENAME_COMPONENT(path "${output_dir}/${file}" PATH) - MAKE_DIRECTORY("${path}") + latex_get_filename_component(path "${output_dir}/${file}" PATH) + make_directory("${path}") # Do conversions for dvi. - LATEX_CONVERT_IMAGE(${dvi_outputs} "${file}" .eps "${convert_flags}" - "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}") + if(NOT LATEX_FORCE_PDF) + latex_convert_image(output_files "${file}" .eps "${convert_flags}" + "${LATEX_DVI_IMAGE_EXTENSIONS}" "${ARGN}") + list(APPEND dvi_outputs ${output_files}) + endif () # Do conversions for pdf. - IF (is_raster) - LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .png "${convert_flags}" - "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") - ELSE (is_raster) - LATEX_CONVERT_IMAGE(${pdf_outputs} "${file}" .pdf "${convert_flags}" - "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") - ENDIF (is_raster) - ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") - MESSAGE(WARNING "Could not find file ${CMAKE_CURRENT_SOURCE_DIR}/${file}. Are you sure you gave relative paths to IMAGES?") - ENDIF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${file}") - ENDFOREACH(file) -ENDMACRO(LATEX_PROCESS_IMAGES) + if(NOT LATEX_FORCE_DVI AND NOT LATEX_FORCE_HTML) + if(is_raster) + latex_convert_image(output_files "${file}" .png "${convert_flags}" + "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") + list(APPEND pdf_outputs ${output_files}) + else() + latex_convert_image(output_files "${file}" .pdf "${convert_flags}" + "${LATEX_PDF_IMAGE_EXTENSIONS}" "${ARGN}") + list(APPEND pdf_outputs ${output_files}) + endif() + endif() + else() + message(WARNING "Could not find file ${CMAKE_CURRENT_SOURCE_DIR}/${file}. Are you sure you gave relative paths to IMAGES?") + endif() + endforeach(file) -MACRO(ADD_LATEX_IMAGES) - MESSAGE("The ADD_LATEX_IMAGES macro is deprecated. Image directories are specified with LATEX_ADD_DOCUMENT.") -ENDMACRO(ADD_LATEX_IMAGES) + set(${dvi_outputs_var} ${dvi_outputs} PARENT_SCOPE) + set(${pdf_outputs_var} ${pdf_outputs} PARENT_SCOPE) +endfunction(latex_process_images) -MACRO(LATEX_COPY_GLOBBED_FILES pattern dest) - FILE(GLOB file_list ${pattern}) - FOREACH(in_file ${file_list}) - GET_FILENAME_COMPONENT(out_file ${in_file} NAME) - CONFIGURE_FILE(${in_file} ${dest}/${out_file} COPYONLY) - ENDFOREACH(in_file) -ENDMACRO(LATEX_COPY_GLOBBED_FILES) +function(latex_copy_globbed_files pattern dest) + file(GLOB file_list ${pattern}) + foreach(in_file ${file_list}) + latex_get_filename_component(out_file ${in_file} NAME) + configure_file(${in_file} ${dest}/${out_file} COPYONLY) + endforeach(in_file) +endfunction(latex_copy_globbed_files) -MACRO(LATEX_COPY_INPUT_FILE file) - LATEX_GET_OUTPUT_PATH(output_dir) +function(latex_copy_input_file file) + latex_get_output_path(output_dir) - IF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) - GET_FILENAME_COMPONENT(path ${file} PATH) - FILE(MAKE_DIRECTORY ${output_dir}/${path}) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) + latex_get_filename_component(path ${file} PATH) + file(MAKE_DIRECTORY ${output_dir}/${path}) - LATEX_LIST_CONTAINS(use_config ${file} ${LATEX_CONFIGURE}) - IF (use_config) - CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file} + latex_list_contains(use_config ${file} ${LATEX_CONFIGURE}) + if(use_config) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} @ONLY ) - ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} + add_custom_command(OUTPUT ${output_dir}/${file} COMMAND ${CMAKE_COMMAND} ARGS ${CMAKE_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} ) - ELSE (use_config) - ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${file} + else() + add_custom_command(OUTPUT ${output_dir}/${file} COMMAND ${CMAKE_COMMAND} ARGS -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${file} ${output_dir}/${file} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${file} ) - ENDIF (use_config) - ELSE (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) - IF (EXISTS ${output_dir}/${file}) + endif() + else() + if(EXISTS ${output_dir}/${file}) # Special case: output exists but input does not. Assume that it was # created elsewhere and skip the input file copy. - ELSE (EXISTS ${output_dir}/${file}) - MESSAGE("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}") - ENDIF (EXISTS ${output_dir}/${file}) - ENDIF (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${file}) -ENDMACRO(LATEX_COPY_INPUT_FILE) + else() + message("Could not find input file ${CMAKE_CURRENT_SOURCE_DIR}/${file}") + endif() + endif() +endfunction(latex_copy_input_file) ############################################################################# # Commands provided by the UseLATEX.cmake "package" ############################################################################# -MACRO(LATEX_USAGE command message) - MESSAGE(SEND_ERROR - "${message}\nUsage: ${command}(\n [BIBFILES ...]\n [INPUTS ...]\n [IMAGE_DIRS ...]\n [IMAGES \n [CONFIGURE ...]\n [DEPENDS ...]\n [MULTIBIB_NEWCITES] \n [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]\n [DEFAULT_PDF] [DEFAULT_SAFEPDF]\n [MANGLE_TARGET_NAMES])" +function(latex_usage command message) + message(SEND_ERROR + "${message}\n Usage: ${command}(\n [BIBFILES ...]\n [INPUTS ...]\n [IMAGE_DIRS ...]\n [IMAGES \n [CONFIGURE ...]\n [DEPENDS ...]\n [MULTIBIB_NEWCITES] \n [USE_BIBLATEX] [USE_INDEX] [USE_GLOSSARY] [USE_NOMENCL]\n [FORCE_PDF] [FORCE_DVI] [FORCE_HTML]\n [TARGET_NAME] \n [EXCLUDE_FROM_ALL]\n [EXCLUDE_FROM_DEFAULTS])" ) -ENDMACRO(LATEX_USAGE command message) +endfunction(latex_usage command message) -# Parses arguments to ADD_LATEX_DOCUMENT and ADD_LATEX_TARGETS and sets the +# Parses arguments to add_latex_document and ADD_LATEX_TARGETS and sets the # variables LATEX_TARGET, LATEX_IMAGE_DIR, LATEX_BIBFILES, LATEX_DEPENDS, and # LATEX_INPUTS. -MACRO(PARSE_ADD_LATEX_ARGUMENTS command) - LATEX_PARSE_ARGUMENTS( - LATEX - "BIBFILES;MULTIBIB_NEWCITES;INPUTS;IMAGE_DIRS;IMAGES;CONFIGURE;DEPENDS" - "USE_INDEX;USE_GLOSSARY;USE_GLOSSARIES;USE_NOMENCL;DEFAULT_PDF;DEFAULT_SAFEPDF;MANGLE_TARGET_NAMES" - ${ARGN} +function(parse_add_latex_arguments command latex_main_input) + set(options + USE_BIBLATEX + USE_INDEX + USE_GLOSSARY + USE_NOMENCL + FORCE_PDF + FORCE_DVI + FORCE_HTML + EXCLUDE_FROM_ALL + EXCLUDE_FROM_DEFAULTS + # Deprecated options + USE_GLOSSARIES + DEFAULT_PDF + DEFAULT_SAFEPDF + DEFAULT_PS + NO_DEFAULT + MANGLE_TARGET_NAMES ) + set(oneValueArgs + TARGET_NAME + ) + set(multiValueArgs + BIBFILES + MULTIBIB_NEWCITES + INPUTS + IMAGE_DIRS + IMAGES + CONFIGURE + DEPENDS + INDEX_NAMES + INCLUDE_DIRECTORIES + ) + cmake_parse_arguments( + LATEX "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - # The first argument is the target latex file. - IF (LATEX_DEFAULT_ARGS) - LATEX_CAR(LATEX_MAIN_INPUT ${LATEX_DEFAULT_ARGS}) - LATEX_CDR(LATEX_DEFAULT_ARGS ${LATEX_DEFAULT_ARGS}) - GET_FILENAME_COMPONENT(LATEX_TARGET ${LATEX_MAIN_INPUT} NAME_WE) - ELSE (LATEX_DEFAULT_ARGS) - LATEX_USAGE(${command} "No tex file target given to ${command}.") - ENDIF (LATEX_DEFAULT_ARGS) + # Handle invalid and deprecated arguments + if(LATEX_UNPARSED_ARGUMENTS) + latex_usage(${command} "Invalid or deprecated arguments: ${LATEX_UNPARSED_ARGUMENTS}") + endif() + if(LATEX_USE_GLOSSARIES) + latex_usage(${command} "USE_GLOSSARIES option removed in version 1.6.1. Use USE_GLOSSARY instead.") + endif() + if(LATEX_DEFAULT_PDF) + latex_usage(${command} "DEFAULT_PDF option removed in version 2.0. Use FORCE_PDF option or LATEX_DEFAULT_BUILD CMake variable instead.") + endif() + if(LATEX_DEFAULT_SAFEPDF) + latex_usage(${command} "DEFAULT_SAFEPDF option removed in version 2.0. Use LATEX_DEFAULT_BUILD CMake variable instead.") + endif() + if(LATEX_DEFAULT_DVI) + latex_usage(${command} "DEFAULT_DVI option removed in version 2.0. Use FORCE_DVI option or LATEX_DEFAULT_BUILD CMake variable instead.") + endif() + if(LATEX_NO_DEFAULT) + latex_usage(${command} "NO_DEFAULT option removed in version 2.0. Use EXCLUDE_FROM_ALL instead.") + endif() + if(LATEX_MANGLE_TARGET_NAMES) + latex_usage(${command} "MANGLE_TARGET_NAMES option removed in version 2.0. All LaTeX targets use mangled names now.") + endif() - IF (LATEX_DEFAULT_ARGS) - LATEX_USAGE(${command} "Invalid or depricated arguments: ${LATEX_DEFAULT_ARGS}") - ENDIF (LATEX_DEFAULT_ARGS) + # Capture the first argument, which is the main LaTeX input. + latex_get_filename_component(latex_target ${latex_main_input} NAME_WE) + set(LATEX_MAIN_INPUT ${latex_main_input} PARENT_SCOPE) + set(LATEX_TARGET ${latex_target} PARENT_SCOPE) - # Backward compatibility between 1.6.0 and 1.6.1. - IF (LATEX_USE_GLOSSARIES) - SET(LATEX_USE_GLOSSARY TRUE) - ENDIF (LATEX_USE_GLOSSARIES) -ENDMACRO(PARSE_ADD_LATEX_ARGUMENTS) + # Propagate the result variables to the caller + foreach(arg_name ${options} ${oneValueArgs} ${multiValueArgs}) + set(var_name LATEX_${arg_name}) + set(${var_name} ${${var_name}} PARENT_SCOPE) + endforeach(arg_name) +endfunction(parse_add_latex_arguments) -MACRO(ADD_LATEX_TARGETS) - LATEX_GET_OUTPUT_PATH(output_dir) - PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_TARGETS ${ARGV}) +function(add_latex_targets_internal) + latex_get_output_path(output_dir) - IF (LATEX_USE_SYNCTEX) - SET(synctex_flags ${LATEX_SYNCTEX_FLAGS}) - ELSE (LATEX_USE_SYNCTEX) - SET(synctex_flags) - ENDIF (LATEX_USE_SYNCTEX) + if(LATEX_USE_SYNCTEX) + set(synctex_flags ${LATEX_SYNCTEX_ARGS}) + else() + set(synctex_flags) + endif() # 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(latex_build_command + ${LATEX_COMPILER} ${LATEX_COMPILER_ARGS} ${synctex_flags} ${LATEX_MAIN_INPUT} ) - SET(pdflatex_build_command - ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_FLAGS} ${synctex_flags} ${LATEX_MAIN_INPUT} + if(LATEX_COMPILER_ARGS MATCHES ".*batchmode.*") + # Wrap command in script that dumps the log file on error. This makes sure + # errors can be seen. + set(latex_build_command + ${CMAKE_COMMAND} + -D LATEX_BUILD_COMMAND=execute_latex + -D LATEX_WORKING_DIRECTORY="${output_dir}" + -D LATEX_FULL_COMMAND="${latex_build_command}" + -D LATEX_OUTPUT_FILE="${LATEX_TARGET}.dvi" + -D LATEX_LOG_FILE="${LATEX_TARGET}.log" + -P "${LATEX_USE_LATEX_LOCATION}" + ) + endif() + set(pdflatex_build_command + ${PDFLATEX_COMPILER} ${PDFLATEX_COMPILER_ARGS} ${synctex_flags} ${LATEX_MAIN_INPUT} ) + if(PDFLATEX_COMPILER_ARGS MATCHES ".*batchmode.*") + # Wrap command in script that dumps the log file on error. This makes sure + # errors can be seen. + set(pdflatex_build_command + ${CMAKE_COMMAND} + -D LATEX_BUILD_COMMAND=execute_latex + -D LATEX_WORKING_DIRECTORY="${output_dir}" + -D LATEX_FULL_COMMAND="${pdflatex_build_command}" + -D LATEX_OUTPUT_FILE="${LATEX_TARGET}.pdf" + -D LATEX_LOG_FILE="${LATEX_TARGET}.log" + -P "${LATEX_USE_LATEX_LOCATION}" + ) + endif() + + if(LATEX_INCLUDE_DIRECTORIES) + # The include directories needs to start with the build directory so + # that the copied files can be found. It also needs to end with an + # empty directory so that the standard system directories are included + # after any specified. + set(LATEX_INCLUDE_DIRECTORIES . ${LATEX_INCLUDE_DIRECTORIES} "") + + # CMake separates items in a list with a semicolon. Lists of + # directories on most systems are separated by colons, so we can do a + # simple text replace. On Windows, directories are separated by + # semicolons, but we replace them with the $ generator + # expression to make sure CMake treats it as a single string. + if(CMAKE_HOST_WIN32) + string(REPLACE ";" "$" TEXINPUTS "${LATEX_INCLUDE_DIRECTORIES}") + else() + string(REPLACE ";" ":" TEXINPUTS "${LATEX_INCLUDE_DIRECTORIES}") + endif() + + # Set the TEXINPUTS environment variable + set(latex_build_command + ${CMAKE_COMMAND} -E env TEXINPUTS=${TEXINPUTS} ${latex_build_command}) + set(pdflatex_build_command + ${CMAKE_COMMAND} -E env TEXINPUTS=${TEXINPUTS} ${pdflatex_build_command}) + endif() + + if(NOT LATEX_TARGET_NAME) + # Use the main filename (minus the .tex) as the target name. Remove any + # spaces since CMake cannot have spaces in its target names. + string(REPLACE " " "_" LATEX_TARGET_NAME ${LATEX_TARGET}) + endif() + + # Some LaTeX commands may need to be modified (or may not work) if the main + # tex file is in a subdirectory. Make a flag for that. + get_filename_component(LATEX_MAIN_INPUT_SUBDIR ${LATEX_MAIN_INPUT} DIRECTORY) # Set up target names. - IF (LATEX_MANGLE_TARGET_NAMES) - SET(dvi_target ${LATEX_TARGET}_dvi) - SET(pdf_target ${LATEX_TARGET}_pdf) - SET(ps_target ${LATEX_TARGET}_ps) - SET(safepdf_target ${LATEX_TARGET}_safepdf) - SET(html_target ${LATEX_TARGET}_html) - SET(auxclean_target ${LATEX_TARGET}_auxclean) - ELSE (LATEX_MANGLE_TARGET_NAMES) - SET(dvi_target dvi) - SET(pdf_target pdf) - SET(ps_target ps) - SET(safepdf_target safepdf) - SET(html_target html) - SET(auxclean_target auxclean) - ENDIF (LATEX_MANGLE_TARGET_NAMES) + set(dvi_target ${LATEX_TARGET_NAME}_dvi) + set(pdf_target ${LATEX_TARGET_NAME}_pdf) + set(ps_target ${LATEX_TARGET_NAME}_ps) + set(safepdf_target ${LATEX_TARGET_NAME}_safepdf) + set(html_target ${LATEX_TARGET_NAME}_html) + set(auxclean_target ${LATEX_TARGET_NAME}_auxclean) # Probably not all of these will be generated, but they could be. # Note that the aux file is added later. - SET(auxiliary_clean_files + set(auxiliary_clean_files + ${output_dir}/${LATEX_TARGET}.aux ${output_dir}/${LATEX_TARGET}.bbl ${output_dir}/${LATEX_TARGET}.blg ${output_dir}/${LATEX_TARGET}-blx.bib @@ -886,307 +1584,491 @@ MACRO(ADD_LATEX_TARGETS) ${output_dir}/${LATEX_TARGET}.pdf ) + set(image_list ${LATEX_IMAGES}) + # For each directory in LATEX_IMAGE_DIRS, glob all the image files and # place them in LATEX_IMAGES. - FOREACH(dir ${LATEX_IMAGE_DIRS}) - FOREACH(extension ${LATEX_IMAGE_EXTENSIONS}) - IF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}) - MESSAGE(WARNING "Image directory ${CMAKE_CURRENT_SOURCE_DIR}/${dir} does not exist. Are you sure you gave relative directories to IMAGE_DIRS?") - ENDIF (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}) - FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension}) - FOREACH(file ${files}) - GET_FILENAME_COMPONENT(filename ${file} NAME) - SET(LATEX_IMAGES ${LATEX_IMAGES} ${dir}/${filename}) - ENDFOREACH(file) - ENDFOREACH(extension) - ENDFOREACH(dir) + foreach(dir ${LATEX_IMAGE_DIRS}) + if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}) + message(WARNING "Image directory ${CMAKE_CURRENT_SOURCE_DIR}/${dir} does not exist. Are you sure you gave relative directories to IMAGE_DIRS?") + endif() + foreach(extension ${LATEX_IMAGE_EXTENSIONS}) + file(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension}) + foreach(file ${files}) + latex_get_filename_component(filename ${file} NAME) + list(APPEND image_list ${dir}/${filename}) + endforeach(file) + endforeach(extension) + endforeach(dir) - SET(dvi_images) - SET(pdf_images) - LATEX_PROCESS_IMAGES(dvi_images pdf_images ${LATEX_IMAGES}) + latex_process_images(dvi_images pdf_images ${image_list}) - SET(make_dvi_command + set(make_dvi_command ${CMAKE_COMMAND} -E chdir ${output_dir} ${latex_build_command}) - SET(make_pdf_command + set(make_pdf_command ${CMAKE_COMMAND} -E chdir ${output_dir} ${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} + set(make_dvi_depends ${LATEX_DEPENDS} ${dvi_images}) + set(make_pdf_depends ${LATEX_DEPENDS} ${pdf_images}) + foreach(input ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) + list(APPEND make_dvi_depends ${output_dir}/${input}) + list(APPEND make_pdf_depends ${output_dir}/${input}) + if(${input} MATCHES "\\.tex$") + # Dependent .tex files might have their own .aux files created. Make + # sure these get cleaned as well. This might replicate the cleaning + # of the main .aux file, which is OK. + string(REGEX REPLACE "\\.tex$" "" input_we ${input}) + list(APPEND auxiliary_clean_files ${output_dir}/${input_we}.aux ${output_dir}/${input}.aux ) - ENDIF (${input} MATCHES "\\.tex$") - ENDFOREACH(input) + endif() + endforeach(input) - IF (LATEX_USE_GLOSSARY) - FOREACH(dummy 0 1) # Repeat these commands twice. - SET(make_dvi_command ${make_dvi_command} + set(all_latex_sources ${LATEX_MAIN_INPUT} ${LATEX_INPUTS} ${image_list}) + + if(LATEX_USE_GLOSSARY) + 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=makeglossaries -D LATEX_TARGET=${LATEX_TARGET} -D MAKEINDEX_COMPILER=${MAKEINDEX_COMPILER} -D XINDY_COMPILER=${XINDY_COMPILER} - -D MAKEGLOSSARIES_COMPILER_FLAGS=${MAKEGLOSSARIES_COMPILER_FLAGS} + -D MAKEGLOSSARIES_COMPILER_ARGS=${MAKEGLOSSARIES_COMPILER_ARGS} -P ${LATEX_USE_LATEX_LOCATION} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${latex_build_command} ) - SET(make_pdf_command ${make_pdf_command} + set(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${CMAKE_COMMAND} -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} + -D MAKEGLOSSARIES_COMPILER_ARGS=${MAKEGLOSSARIES_COMPILER_ARGS} -P ${LATEX_USE_LATEX_LOCATION} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${pdflatex_build_command} ) - ENDFOREACH(dummy) - ENDIF (LATEX_USE_GLOSSARY) + endforeach(dummy) + endif() - IF (LATEX_USE_NOMENCL) - FOREACH(dummy 0 1) # Repeat these commands twice. - SET(make_dvi_command ${make_dvi_command} + 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} + -D MAKENOMENCLATURE_COMPILER_ARGS=${MAKENOMENCLATURE_COMPILER_ARGS} -P ${LATEX_USE_LATEX_LOCATION} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${latex_build_command} ) - SET(make_pdf_command ${make_pdf_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} + -D MAKENOMENCLATURE_COMPILER_ARGS=${MAKENOMENCLATURE_COMPILER_ARGS} -P ${LATEX_USE_LATEX_LOCATION} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${pdflatex_build_command} ) - ENDFOREACH(dummy) - ENDIF (LATEX_USE_NOMENCL) + endforeach(dummy) + endif() - IF (LATEX_BIBFILES) - IF (LATEX_MULTIBIB_NEWCITES) - FOREACH (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES}) - GET_FILENAME_COMPONENT(multibib_target ${multibib_auxfile} NAME_WE) - SET(make_dvi_command ${make_dvi_command} + if(LATEX_BIBFILES) + set(suppress_bib_output) + if(LATEX_USE_BIBLATEX) + if(NOT BIBER_COMPILER) + message(SEND_ERROR "I need the biber command.") + endif() + set(bib_compiler ${BIBER_COMPILER}) + set(bib_compiler_flags ${BIBER_COMPILER_ARGS}) + + if(NOT BIBER_COMPILER_ARGS MATCHES ".*-q.*") + # Only suppress bib output if the quiet option is not specified. + set(suppress_bib_output TRUE) + endif() + + if(LATEX_USE_BIBLATEX_CONFIG) + list(APPEND auxiliary_clean_files ${output_dir}/biblatex.cfg) + list(APPEND make_dvi_depends ${output_dir}/biblatex.cfg) + list(APPEND make_pdf_depends ${output_dir}/biblatex.cfg) + endif() + else() + set(bib_compiler ${BIBTEX_COMPILER}) + set(bib_compiler_flags ${BIBTEX_COMPILER_ARGS}) + endif() + if(LATEX_MULTIBIB_NEWCITES) + # Suppressed bib output currently not supported for multibib + foreach (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES}) + latex_get_filename_component(multibib_target ${multibib_auxfile} NAME_WE) + set(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${multibib_target}) - SET(make_pdf_command ${make_pdf_command} + ${bib_compiler} ${bib_compiler_flags} ${multibib_target}) + set(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${multibib_target}) - SET(auxiliary_clean_files ${auxiliary_clean_files} + ${bib_compiler} ${bib_compiler_flags} ${multibib_target}) + set(auxiliary_clean_files ${auxiliary_clean_files} ${output_dir}/${multibib_target}.aux) - ENDFOREACH (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES}) - ELSE (LATEX_MULTIBIB_NEWCITES) - SET(make_dvi_command ${make_dvi_command} - COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) - SET(make_pdf_command ${make_pdf_command} - COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${BIBTEX_COMPILER} ${BIBTEX_COMPILER_FLAGS} ${LATEX_TARGET}) - ENDIF (LATEX_MULTIBIB_NEWCITES) + endforeach (multibib_auxfile ${LATEX_MULTIBIB_NEWCITES}) + else() + set(full_bib_command + ${bib_compiler} ${bib_compiler_flags} ${LATEX_TARGET}) + if(suppress_bib_output) + set(full_bib_command + ${CMAKE_COMMAND} + -D LATEX_BUILD_COMMAND=execute_latex + -D LATEX_WORKING_DIRECTORY="${output_dir}" + -D LATEX_FULL_COMMAND="${full_bib_command}" + -D LATEX_OUTPUT_FILE="${LATEX_TARGET}.bbl" + -D LATEX_LOG_FILE="${LATEX_TARGET}.blg" + -P "${LATEX_USE_LATEX_LOCATION}" + ) + endif() + set(make_dvi_command ${make_dvi_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${full_bib_command}) + set(make_pdf_command ${make_pdf_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${full_bib_command}) + endif() - FOREACH (bibfile ${LATEX_BIBFILES}) - SET(make_dvi_depends ${make_dvi_depends} ${output_dir}/${bibfile}) - SET(make_pdf_depends ${make_pdf_depends} ${output_dir}/${bibfile}) - ENDFOREACH (bibfile ${LATEX_BIBFILES}) - ELSE (LATEX_BIBFILES) - IF (LATEX_MULTIBIB_NEWCITES) - MESSAGE(WARNING "MULTIBIB_NEWCITES has no effect without BIBFILES option.") - ENDIF (LATEX_MULTIBIB_NEWCITES) - ENDIF (LATEX_BIBFILES) + foreach (bibfile ${LATEX_BIBFILES}) + list(APPEND make_dvi_depends ${output_dir}/${bibfile}) + list(APPEND make_pdf_depends ${output_dir}/${bibfile}) + endforeach (bibfile ${LATEX_BIBFILES}) + else() + if(LATEX_MULTIBIB_NEWCITES) + message(WARNING "MULTIBIB_NEWCITES has no effect without BIBFILES option.") + endif() + endif() - IF (LATEX_USE_INDEX) - SET(make_dvi_command ${make_dvi_command} - COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${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_build_command} - COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_FLAGS} ${LATEX_TARGET}.idx) - ENDIF (LATEX_USE_INDEX) + if(LATEX_USE_INDEX) + if(LATEX_INDEX_NAMES) + set(INDEX_NAMES ${LATEX_INDEX_NAMES}) + else() + set(INDEX_NAMES ${LATEX_TARGET}) + endif() + foreach(idx_name ${INDEX_NAMES}) + set(make_dvi_command ${make_dvi_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${latex_build_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_ARGS} ${idx_name}.idx) + set(make_pdf_command ${make_pdf_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${pdflatex_build_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${MAKEINDEX_COMPILER} ${MAKEINDEX_COMPILER_ARGS} ${idx_name}.idx) + set(auxiliary_clean_files ${auxiliary_clean_files} + ${output_dir}/${idx_name}.idx + ${output_dir}/${idx_name}.ilg + ${output_dir}/${idx_name}.ind) + endforeach() + else() + if(LATEX_INDEX_NAMES) + message(WARNING "INDEX_NAMES has no effect without USE_INDEX option.") + endif() + endif() - SET(make_dvi_command ${make_dvi_command} + set(make_dvi_command ${make_dvi_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${latex_build_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${latex_build_command}) - SET(make_pdf_command ${make_pdf_command} + set(make_pdf_command ${make_pdf_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${pdflatex_build_command} COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} ${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) + # Need to run one more time to remove biblatex' warning + # about page breaks that have changed. + if(LATEX_USE_BIBLATEX) + set(make_dvi_command ${make_dvi_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${latex_build_command}) + set(make_pdf_command ${make_pdf_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${pdflatex_build_command}) + endif() - # Add commands and targets for building dvi outputs. - ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi - COMMAND ${make_dvi_command} - DEPENDS ${make_dvi_depends} + if(LATEX_USE_SYNCTEX) + if(NOT GZIP) + message(SEND_ERROR "UseLATEX.cmake: USE_SYNTEX option requires gzip program. Set GZIP variable.") + endif() + 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() + + # Check LaTeX output for important warnings at end of build + set(make_dvi_command ${make_dvi_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${CMAKE_COMMAND} + -D LATEX_BUILD_COMMAND=check_important_warnings + -D LATEX_TARGET=${LATEX_TARGET} + -P ${LATEX_USE_LATEX_LOCATION} ) - IF (LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF) - ADD_CUSTOM_TARGET(${dvi_target} - DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) - ELSE (LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF) - ADD_CUSTOM_TARGET(${dvi_target} ALL - DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) - ENDIF (LATEX_DEFAULT_PDF OR LATEX_DEFAULT_SAFEPDF) + set(make_pdf_command ${make_pdf_command} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${CMAKE_COMMAND} + -D LATEX_BUILD_COMMAND=check_important_warnings + -D LATEX_TARGET=${LATEX_TARGET} + -P ${LATEX_USE_LATEX_LOCATION} + ) + + # Capture the default build. + string(TOLOWER "${LATEX_DEFAULT_BUILD}" default_build) + + if((NOT LATEX_FORCE_PDF) AND (NOT LATEX_FORCE_DVI) AND (NOT LATEX_FORCE_HTML)) + set(no_force TRUE) + endif() # Add commands and targets for building pdf outputs (with pdflatex). - IF (PDFLATEX_COMPILER) - ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf - COMMAND ${make_pdf_command} - DEPENDS ${make_pdf_depends} + if(LATEX_FORCE_PDF OR no_force) + if(LATEX_FORCE_PDF) + set(default_build pdf) + endif() + + if(PDFLATEX_COMPILER) + add_custom_command(OUTPUT ${output_dir}/${LATEX_TARGET}.pdf + COMMAND ${make_pdf_command} + DEPENDS ${make_pdf_depends} + ) + add_custom_target(${pdf_target} + DEPENDS ${output_dir}/${LATEX_TARGET}.pdf + SOURCES ${all_latex_sources} + ) + if(NOT LATEX_EXCLUDE_FROM_DEFAULTS) + add_dependencies(pdf ${pdf_target}) + endif() + endif() + endif() + + # Add commands and targets for building dvi outputs. + if(LATEX_FORCE_DVI OR LATEX_FORCE_HTML OR no_force) + if(LATEX_FORCE_DVI) + if((NOT default_build STREQUAL dvi) AND + (NOT default_build STREQUAL ps) AND + (NOT default_build STREQUAL safepdf)) + set(default_build dvi) + endif() + endif() + + add_custom_command(OUTPUT ${output_dir}/${LATEX_TARGET}.dvi + COMMAND ${make_dvi_command} + DEPENDS ${make_dvi_depends} ) - IF (LATEX_DEFAULT_PDF) - ADD_CUSTOM_TARGET(${pdf_target} ALL - DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) - ELSE (LATEX_DEFAULT_PDF) - ADD_CUSTOM_TARGET(${pdf_target} - DEPENDS ${output_dir}/${LATEX_TARGET}.pdf) - ENDIF (LATEX_DEFAULT_PDF) - ENDIF (PDFLATEX_COMPILER) - - IF (DVIPS_CONVERTER) - ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/${LATEX_TARGET}.ps - COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} - ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_FLAGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi - DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) - ADD_CUSTOM_TARGET(${ps_target} - DEPENDS ${output_dir}/${LATEX_TARGET}.ps) - IF (PS2PDF_CONVERTER) - # Since both the pdf and safepdf targets have the same output, we - # cannot properly do the dependencies for both. When selecting safepdf, - # simply force a recompile every time. - IF (LATEX_DEFAULT_SAFEPDF) - ADD_CUSTOM_TARGET(${safepdf_target} ALL - ${CMAKE_COMMAND} -E chdir ${output_dir} - ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf - ) - ELSE (LATEX_DEFAULT_SAFEPDF) - ADD_CUSTOM_TARGET(${safepdf_target} - ${CMAKE_COMMAND} -E chdir ${output_dir} - ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_FLAGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf - ) - ENDIF (LATEX_DEFAULT_SAFEPDF) - ADD_DEPENDENCIES(${safepdf_target} ${ps_target}) - ENDIF (PS2PDF_CONVERTER) - ENDIF (DVIPS_CONVERTER) - - IF (LATEX2HTML_CONVERTER) - ADD_CUSTOM_TARGET(${html_target} - ${CMAKE_COMMAND} -E chdir ${output_dir} - ${LATEX2HTML_CONVERTER} ${LATEX2HTML_CONVERTER_FLAGS} ${LATEX_MAIN_INPUT} + add_custom_target(${dvi_target} + DEPENDS ${output_dir}/${LATEX_TARGET}.dvi + SOURCES ${all_latex_sources} ) - ADD_DEPENDENCIES(${html_target} ${LATEX_MAIN_INPUT} ${LATEX_INPUTS}) - ENDIF (LATEX2HTML_CONVERTER) + if(NOT LATEX_EXCLUDE_FROM_DEFAULTS) + add_dependencies(dvi ${dvi_target}) + endif() - SET_DIRECTORY_PROPERTIES(. + if(DVIPS_CONVERTER) + add_custom_command(OUTPUT ${output_dir}/${LATEX_TARGET}.ps + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${DVIPS_CONVERTER} ${DVIPS_CONVERTER_ARGS} -o ${LATEX_TARGET}.ps ${LATEX_TARGET}.dvi + DEPENDS ${output_dir}/${LATEX_TARGET}.dvi) + add_custom_target(${ps_target} + DEPENDS ${output_dir}/${LATEX_TARGET}.ps + SOURCES ${all_latex_sources} + ) + if(NOT LATEX_EXCLUDE_FROM_DEFAULTS) + add_dependencies(ps ${ps_target}) + endif() + if(PS2PDF_CONVERTER) + # Since both the pdf and safepdf targets have the same output, we + # cannot properly do the dependencies for both. When selecting safepdf, + # simply force a recompile every time. + add_custom_target(${safepdf_target} + ${CMAKE_COMMAND} -E chdir ${output_dir} + ${PS2PDF_CONVERTER} ${PS2PDF_CONVERTER_ARGS} ${LATEX_TARGET}.ps ${LATEX_TARGET}.pdf + DEPENDS ${ps_target} + ) + if(NOT LATEX_EXCLUDE_FROM_DEFAULTS) + add_dependencies(safepdf ${safepdf_target}) + endif() + endif() + endif() + endif() + + if(LATEX_FORCE_HTML OR no_force) + if (LATEX_FORCE_HTML) + set(default_build html) + endif() + + if(HTLATEX_COMPILER AND LATEX_MAIN_INPUT_SUBDIR) + message(STATUS + "Disabling HTML build for ${LATEX_TARGET_NAME}.tex because the main file is in subdirectory ${LATEX_MAIN_INPUT_SUBDIR}" + ) + # The code below to run HTML assumes that LATEX_TARGET.tex is in the + # current directory. I have tried to specify that LATEX_TARGET.tex is + # in a subdirectory. That makes the build targets correct, but the + # HTML build still fails (at least for htlatex) because files are not + # generated where expected. I am getting around the problem by simply + # disabling HTML in this case. If someone really cares, they can fix + # this, but make sure it runs on many platforms and build programs. + elseif(HTLATEX_COMPILER) + # htlatex places the output in a different location + set(HTML_OUTPUT "${output_dir}/${LATEX_TARGET}.html") + add_custom_command(OUTPUT ${HTML_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E chdir ${output_dir} + ${HTLATEX_COMPILER} ${LATEX_MAIN_INPUT} + "${HTLATEX_COMPILER_TEX4HT_FLAGS}" + "${HTLATEX_COMPILER_TEX4HT_POSTPROCESSOR_FLAGS}" + "${HTLATEX_COMPILER_T4HT_POSTPROCESSOR_FLAGS}" + ${HTLATEX_COMPILER_ARGS} + DEPENDS + ${output_dir}/${LATEX_TARGET}.tex + ${output_dir}/${LATEX_TARGET}.dvi + VERBATIM + ) + add_custom_target(${html_target} + DEPENDS ${HTML_OUTPUT} ${dvi_target} + SOURCES ${all_latex_sources} + ) + if(NOT LATEX_EXCLUDE_FROM_DEFAULTS) + add_dependencies(html ${html_target}) + endif() + endif() + endif() + + # Set default targets. + if("${default_build}" STREQUAL "pdf") + add_custom_target(${LATEX_TARGET_NAME} DEPENDS ${pdf_target}) + elseif("${default_build}" STREQUAL "dvi") + add_custom_target(${LATEX_TARGET_NAME} DEPENDS ${dvi_target}) + elseif("${default_build}" STREQUAL "ps") + add_custom_target(${LATEX_TARGET_NAME} DEPENDS ${ps_target}) + elseif("${default_build}" STREQUAL "safepdf") + add_custom_target(${LATEX_TARGET_NAME} DEPENDS ${safepdf_target}) + elseif("${default_build}" STREQUAL "html") + add_custom_target(${LATEX_TARGET_NAME} DEPENDS ${html_target}) + else() + message(SEND_ERROR "LATEX_DEFAULT_BUILD set to an invalid value. See the documentation for that variable.") + endif() + + if(NOT LATEX_EXCLUDE_FROM_ALL) + add_custom_target(_${LATEX_TARGET_NAME} ALL DEPENDS ${LATEX_TARGET_NAME}) + endif() + + set_directory_properties(. ADDITIONAL_MAKE_CLEAN_FILES "${auxiliary_clean_files}" ) - ADD_CUSTOM_TARGET(${auxclean_target} + add_custom_target(${auxclean_target} COMMENT "Cleaning auxiliary LaTeX files." COMMAND ${CMAKE_COMMAND} -E remove ${auxiliary_clean_files} ) -ENDMACRO(ADD_LATEX_TARGETS) + add_dependencies(auxclean ${auxclean_target}) +endfunction(add_latex_targets_internal) -MACRO(ADD_LATEX_DOCUMENT) - LATEX_GET_OUTPUT_PATH(output_dir) - IF (output_dir) - PARSE_ADD_LATEX_ARGUMENTS(ADD_LATEX_DOCUMENT ${ARGV}) +function(add_latex_targets latex_main_input) + latex_get_output_path(output_dir) + parse_add_latex_arguments(ADD_LATEX_TARGETS ${latex_main_input} ${ARGN}) - LATEX_COPY_INPUT_FILE(${LATEX_MAIN_INPUT}) + add_latex_targets_internal() +endfunction(add_latex_targets) - FOREACH (bib_file ${LATEX_BIBFILES}) - LATEX_COPY_INPUT_FILE(${bib_file}) - ENDFOREACH (bib_file) +function(add_latex_document latex_main_input) + latex_get_output_path(output_dir) + if(output_dir) + parse_add_latex_arguments(add_latex_document ${latex_main_input} ${ARGN}) - FOREACH (input ${LATEX_INPUTS}) - LATEX_COPY_INPUT_FILE(${input}) - ENDFOREACH(input) + latex_copy_input_file(${LATEX_MAIN_INPUT}) - LATEX_COPY_GLOBBED_FILES(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir}) - 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}) + foreach (bib_file ${LATEX_BIBFILES}) + latex_copy_input_file(${bib_file}) + endforeach (bib_file) - ADD_LATEX_TARGETS(${ARGV}) - ENDIF (output_dir) -ENDMACRO(ADD_LATEX_DOCUMENT) + if (LATEX_USE_BIBLATEX AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/biblatex.cfg) + latex_copy_input_file(biblatex.cfg) + set(LATEX_USE_BIBLATEX_CONFIG TRUE) + endif() + + foreach (input ${LATEX_INPUTS}) + latex_copy_input_file(${input}) + endforeach(input) + + latex_copy_globbed_files(${CMAKE_CURRENT_SOURCE_DIR}/*.cls ${output_dir}) + 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}) + latex_copy_globbed_files(${CMAKE_CURRENT_SOURCE_DIR}/*.fd ${output_dir}) + + add_latex_targets_internal() + endif() +endfunction(add_latex_document) ############################################################################# # Actually do stuff ############################################################################# -IF (LATEX_BUILD_COMMAND) - SET(command_handled) +if(LATEX_BUILD_COMMAND) + set(command_handled) - IF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) - LATEX_MAKEGLOSSARIES() - SET(command_handled TRUE) - ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) + if("${LATEX_BUILD_COMMAND}" STREQUAL execute_latex) + latex_execute_latex() + set(command_handled TRUE) + endif() - IF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature) - LATEX_MAKENOMENCLATURE() - SET(command_handled TRUE) - ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature) + if("${LATEX_BUILD_COMMAND}" STREQUAL makeglossaries) + latex_makeglossaries() + set(command_handled TRUE) + endif() - IF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex) - LATEX_CORRECT_SYNCTEX() - SET(command_handled TRUE) - ENDIF ("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex) + if("${LATEX_BUILD_COMMAND}" STREQUAL makenomenclature) + latex_makenomenclature() + set(command_handled TRUE) + endif() - IF (NOT command_handled) - MESSAGE(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}") - ENDIF (NOT command_handled) + if("${LATEX_BUILD_COMMAND}" STREQUAL correct_synctex) + latex_correct_synctex() + set(command_handled TRUE) + endif() -ELSE (LATEX_BUILD_COMMAND) + if("${LATEX_BUILD_COMMAND}" STREQUAL check_important_warnings) + latex_check_important_warnings() + set(command_handled TRUE) + endif() + + if(NOT command_handled) + message(SEND_ERROR "Unknown command: ${LATEX_BUILD_COMMAND}") + endif() + +else() # Must be part of the actual configure (included from CMakeLists.txt). - LATEX_SETUP_VARIABLES() -ENDIF (LATEX_BUILD_COMMAND) + latex_setup_variables() + latex_setup_targets() +endif() diff --git a/UseLATEX.pdf b/UseLATEX.pdf new file mode 100644 index 0000000..c9aeecd Binary files /dev/null and b/UseLATEX.pdf differ diff --git a/UseLATEX.tex b/UseLATEX.tex index 85412fe..0cb1a7c 100644 --- a/UseLATEX.tex +++ b/UseLATEX.tex @@ -2,7 +2,7 @@ \documentclass{article} -\newcommand{\UseLATEXVersion}{1.9.0} +\newcommand{\UseLATEXVersion}{2.7.0} \newcommand{\SANDNumber}{SAND 2008-2743P} % This wonderful package allows hyphenation in tt fonts and hyphenation of @@ -11,6 +11,7 @@ \usepackage{fancyvrb} \usepackage{color} +\usepackage{hologo} \usepackage{xspace} \usepackage{hyperref} @@ -32,12 +33,15 @@ \newcommand*{\latex}{\LaTeX\xspace} \newcommand*{\bibtex}{\textsc{Bib}\TeX\xspace} \newcommand*{\miktex}{Mik\TeX\xspace} +\newcommand*{\mactex}{Mac\TeX\xspace} \ifdefined\synctex \renewcommand*{\synctex}{SyncTeX\xspace} \else \newcommand*{\synctex}{SyncTeX\xspace} \fi -\newcommand*{\ald}{\textcmake{ADD\_LATEX\_DOCUMENT}\xspace} +\newcommand*{\xelatex}{\Hologo{XeLaTeX}\xspace} +\newcommand*{\lualatex}{\Hologo{LuaLaTeX}\xspace} +\newcommand*{\ald}{\textcmake{add\_latex\_document}\xspace} % Environments for listing CMake and other types of code. \definecolor{listingframecolor}{cmyk}{0,0,0,0.25} @@ -75,14 +79,17 @@ ``\UseLATEX.'' Here are some of the things \UseLATEX handles: \begin{itemize} - \item Runs \latex multiple times to resolve links. + \item Runs \latex multiple times to resolve links. \item Can run \textprog{bibtex}, \textprog{makeindex}, and \textprog{makeglossaries} to make bibliographies, indexes, and/or glossaries. \item Optionally runs configure on your \latex files to replace \textcmake{@\textvar{VARIABLE}@} with the equivalent CMake variable. - \item Automatically finds png, jpeg, eps, and pdf files and converts them - to formats \textprog{latex} and \textprog{pdflatex} understand. + \item Automatically finds png, jpeg, eps, pdf, svg, tiff, gif, bmp, and + other image files and converts them to formats \textprog{latex} and + \textprog{pdflatex} understand. + \item Reduces \latex's overly verbose output and searches for messages + that are more likely to require attention. \end{itemize} %----------------------------------------------------------------------------- @@ -107,17 +114,17 @@ simple \textfile{CMakeLists.txt}. \begin{CodeListing} -PROJECT(MyDoc NONE) +project(MyDoc NONE) -INCLUDE(UseLATEX.cmake) -ADD_LATEX_DOCUMENT(MyDoc.tex) +include(UseLATEX.cmake) +add_latex_document(MyDoc.tex) \end{CodeListing} The \ald adds the following targets to create a readable document from \textfile{MyDoc.tex}: \begin{description} - \item[\textmaketarget{dvi}] Creates \textfile{MyDoc.dvi}. + \item[\textmaketarget{dvi}] Creates \textfile{MyDoc.dvi}. \item[\textmaketarget{pdf}] Creates \textfile{MyDoc.pdf} using \textprog{pdflatex}. Requires the \textcmakevar{PDFLATEX\_COMPILER} CMake variable to be set. @@ -128,7 +135,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex) pdfs are created this way. Requires the \textcmakevar{PS2PDF\_CONVERTER} CMake variable to be set. \item[\textmaketarget{html}] Creates html pages. Requires the - \textcmakevar{LATEX2HTML\_CONVERTER} CMake variable to be set. + \textcmakevar{HTLATEX\_COMPILER} CMake variable to be set. \item[\textmaketarget{clean}] To CMake's default \textmaketarget{clean} target, the numerous files that \latex often generates are added. \item[\textmaketarget{auxclean}] Deletes the auxiliary files from @@ -158,7 +165,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex) the \ald command. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex BIBFILES MyDoc.bib) +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib) \end{CodeListing} This will automatically add targets to build your bib file and link it @@ -186,7 +193,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex BIBFILES MyDoc.bib) macro to point to them. \UseLATEX will take care of the rest. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS images ) @@ -194,10 +201,10 @@ ADD_LATEX_DOCUMENT(MyDoc.tex If you want to break up your image files in several different directories, you can do that, too. Simply provide multiple directories - after the \textcmake{IMAGE\_DIRS} command. + after the \textcmake{IMAGE\_DIRS} option. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS icons figures ) @@ -207,38 +214,50 @@ ADD_LATEX_DOCUMENT(MyDoc.tex \textcmake{IMAGES} option. \begin{CodeListing} -SET(MyDocImages +set(MyDocImages logo.eps icons/next.png icons/previous.png figures/flowchart.eps figures/team.jpeg ) -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex IMAGES ${MyDocImages} ) \end{CodeListing} %$ + For every image file specified and found with the \textcmake{IMAGE\_DIRS} and \textcmake{IMAGES} options, \UseLATEX adds makefile targets to use ImageMagick's \textprog{magick} or \textprog{convert} to convert the file types to those appropriate for the build.\footnote{The \textprog{convert} program was essentially renamed \textprog{magick} in ImageMagick 7.0. Most, but not all, recent installations provide both. \UseLATEX looks for both just in case.} + If you do not have ImageMagick, you can get it for free from \href{http://www.imagemagick.org}{http://www.imagemagick.org}. + CMake will also give you a \textcmakevar{LATEX\_SMALL\_IMAGES} option that, when on, will downsample raster images. + This can help speed up building and viewing documents. + It will also make the output image sizes smaller. + + \UseLATEX will occasionally use a conversion program other than + ImageMagick's \textprog{magick}. For example, \textprog{ps2pdf} will be + used when converting eps to pdf to get around a problem where ImageMagick + drops the bounding box information. When available, the + \textprog{pdftops} from the Poppler utilities will be used to convert pdf + to eps because it better preserves vector graphics and color spaces. At + any rate, you do not need to worry about setting the appropriate image + conversion program. \UseLATEX will automatically select the best one and + issue errors or warnings if there is a problem. + + The \textcmake{IMAGE\_DIRS} option tries to identify image files by their + extensions. The current list of image extensions \UseLATEX checks for is: + .bmp, .bmp2, .bmp3, .dcm, .dcx, .ico, .gif, .jpeg, .jpg, .eps, .pdf, + .pict, .png, .ppm, .tif, and .tiff. If you are trying to use an image + format that is supported by ImageMagick but is not recognized by + \UseLATEX, you can specify the files directly with the \textcmake{IMAGES} + option instead. \UseLATEX will assume that any file specified with the + \textcmake{IMAGES} option is an image file regardless of its extension. + Both the \textcmake{IMAGE\_DIRS} and \textcmake{IMAGES} can be used together. The combined set of image files will be processed. If you wish to provide a separate eps file and pdf or png file, that is OK, too. \UseLATEX will handle that by copying over the correct file instead of converting. - Once you establish the images directory, CMake will automatically find - all files with known image extensions (currently eps, pdf, png, jpeg, and - jpg) in it and add makefile targets to use ImageMagick's - \textprog{convert} to convert the file times to those appropriate for the - build. (One exception is that \textprog{ps2pdf} will be used when - converting eps to pdf to get around a problem where ImageMagick drops the - bounding box information.) If you do not have ImageMagick, you can get - it for free from - \href{http://www.imagemagick.org}{http://www.imagemagick.org}. CMake will - also give you a \textcmakevar{LATEX\_SMALL\_IMAGES} option that, when on, - will downsample raster images. This can help speed up building and - viewing documents. It will also make the output image sizes smaller. - Depending on what program is launched to build your \latex file (either \textprog{latex} or \textprog{pdflatex}, and \UseLATEX supports both), a particular format for your image is required. As stated, \UseLATEX @@ -254,33 +273,86 @@ ADD_LATEX_DOCUMENT(MyDoc.tex \$\{CMAKE\_CURRENT\_SOURCE\_DIR\}/images} will fail. Use \textcmake{IMAGE\_DIRS images} instead. - \subsection{Create a PDF by Default} - \label{sec:CreateAPDFByDefault} + \subsection{Selecting a Default Build} + \label{sec:SelectingADefaultBuild} - By default, when you use \ald and then run make with no arguments, the - dvi file will be created. You have to specifically build the pdf target - to use \textprog{pdflatex} to create a pdf file. However, oftentimes we - want the pdf to be generated by default. To do that, simply use the - \textcmake{DEFAULT\_PDF} option to \ald: + By default, when you use \ald and then run make with no arguments, + \textprog{pdflatex} is used to create a pdf file. You can of course + always specify a target described at the top of + Section~\ref{sec:BasicUsage} to build a different document + format. However, for convenience you can change the default build. + + \UseLATEX defines the CMake variable \textcmakevar{LATEX\_DEFAULT\_BUILD} + that controls which build is performed by default. Valid values for this + variable are \textcmake{pdf}, \textcmake{dvi}, \textcmake{ps}, + \textcmake{safepdf}, and \textcmake{html}. This variable is usually + initialized to \textcmake{pdf}, but you can override this behavior by + setting the \textcmakevar{LATEX\_DEFAULT\_BUILD} environment variable + before the first configuration. Thus, if you have a preference for a + particular default build, you can set your system environment to use it + by default for all \UseLATEX builds. + + \subsection{Force a Type of Build} + \label{sec:ForceATypeOfBuild} + + \UseLATEX does its best to make \latex builds as portable as possible, + but there might be a number of technical reasons why a particular + document can only be built using one type of system. If that is the case, + it is best if the configuration only supports one type of build. + + \ald has several options to force the document generation to a particular + type of build. If you give the option \textcmake{FORCE\_PDF}, only the + pdf targets that use the \textprog{pdflatex} command are created. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS images - DEFAULT_PDF + FORCE_PDF ) \end{CodeListing} - If you still want to use the \textprog{latex} program to compile your - documents but by default want to create pdf files (that is, build the - safepdf target by default), then use the \textcmake{DEFAULT\_SAFEPDF} - option to \ald: + Likewise, the \textcmake{FORCE\_DVI} option restricts \ald to targets that + use the \textprog{latex} command. In addition to building dvi files, + \textcmake{FORCE\_DVI} also allows ps generation from the dvi files and + ``safe'' pdf generation from the ps files. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS images - DEFAULT_SAFEPDF + FORCE_PS + ) + \end{CodeListing} + + Finally, the \textcmake{FORCE\_HTML} option will restrict targets that are + used for html generation. + + \begin{CodeListing} +add_latex_document(MyDoc.tex + BIBFILES MyDoc.bib + IMAGE_DIRS images + FORCE_HTML + ) + \end{CodeListing} + + The behavior is undefined if more than one force option is given. + + \subsection{Create Nothing by Default} + \label{sec:CreateNothingByDefault} + + Sometimes it is desirable to disable the building of your \latex document + by default (that is, not build it with the \textmaketarget{all} target). + This is convenient when including \latex documentation with some other + source to build such as when you are documenting a library. To remove + all targets from the default, simply add the + \textcmake{EXCLUDE\_FROM\_ALL} option to \ald. + + \begin{CodeListing} +add_latex_document(MyDoc.tex + BIBFILES MyDoc.bib + IMAGE_DIRS images + EXCLUDE_FROM_ALL ) \end{CodeListing} @@ -335,18 +407,51 @@ ADD_LATEX_DOCUMENT(MyDoc.tex You can make an index in a \latex document by using the \textlatexpackage{makeidx} package. However, this package requires you to - run the \textprog{makeindex} command. Simply add the + run the \textprog{makeindex} program. Simply add the \textcmake{USE\_INDEX} option anywhere in the \ald arguments, and \textprog{makeindex} will automatically be added to the build. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS images USE_INDEX ) \end{CodeListing} + \subsection{Making Multiple Indexes} + \label{sec:MakingMultipleIndexes} + + The \textlatexpackage{multind} package allows you to create multiple + indexes in a single \latex document. For example, when documenting a + software library you might want to have a general index of terms and a + second index of function names. + + The way the \textlatexpackage{multind} package works is that it creates a + separate index file for each of the indexes being created, and the + \textprog{makeindex} program must be run independently on each of them. + To get \UseLATEX to run \textprog{makeindex} on all of the required index + file, list all of the indexes created with the \textcmake{INDEX\_NAMES} + option of \ald. For example, in a \latex document that declares two + indexes like the following + + \begin{CodeListing} +\usepackage{multind} +\makeindex{general} +\makeindex{functions} + \end{CodeListing} + + you would name the indexes in \ald like the following. + + \begin{CodeListing} +add_latex_document(MyDoc.tex + BIBFILES MyDoc.bib + IMAGE_DIRS images + USE_INDEX + INDEX_NAMES general functions + ) + \end{CodeListing} + \subsection{Making a Glossary} \label{sec:MakingAGlossary} @@ -363,7 +468,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex handled for you. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS images USE_GLOSSARY @@ -386,7 +491,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex build the nomenclature. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES MyDoc.bib IMAGE_DIRS images USE_NOMENCL @@ -447,12 +552,34 @@ ADD_LATEX_DOCUMENT(MyDoc.tex arguments, respectively. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex BIBFILES own.bib submitted.bib techreports.bib theses.bib MULTIBIB_NEWCITES own submitted internal ) \end{CodeListing} + \subsection{\textlatexpackage{biblatex} Support} + \label{sec:biblatexSupport} + + The \textlatexpackage{biblatex} package provides an alternate mechanism + for building bibliographies that has many options not available to the + standard bibliography commands. The package (typically) requires an + external program named \textprog{biber}, which is an alternative to the + standard \textprog{bibtex} command. + + Thus, to support the \textlatexpackage{biblatex} package, the build + system must run \textprog{biber} instead of \textprog{bibtex}. This is + done simply with \UseLATEX by adding the \textcmake{USE\_BIBLATEX} option + to \ald. + + \begin{CodeListing} +add_latex_document(MyDoc.tex + BIBFILES MyDoc.bib + USE_BIBLATEX + ) + \end{CodeListing} + + %----------------------------------------------------------------------------- \section{Advanced Configurations} @@ -475,7 +602,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex target tex file. Build dependencies to these files is also established. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex INPUTS Chapter1.tex Chapter2.tex Chapter3.tex Chapter4.tex BIBFILES MyDoc.bib IMAGE_DIRS images @@ -498,7 +625,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex \textcmake{CONFIGURE} argument to \ald. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex INPUTS Chapter1.tex Chapter2.tex Chapter3.tex Chapter4.tex CONFIGURE MyDoc.tex BIBFILES MyDoc.bib @@ -518,7 +645,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex \textcmake{INPUTS} argument. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex INPUTS Ch1Config.tex Ch1.tex Ch2Config.tex Ch2.tex Ch3Config Ch3.tex CONFIGURE Ch1Config.tex Ch2Config.tex Ch3Config.tex @@ -544,36 +671,64 @@ ADD_LATEX_DOCUMENT(MyDoc.tex The most common use for \UseLATEX is to build a single document, such as a paper you are working on. However, some use cases involve building - several documents at one time. To do this, you must call \ald multiple - times. However, if you do this, the dvi, pdf, etc. targets will be - generated multiple times, and that is illegal in the current version of - CMake.\footnote{CMake version 2.4 as of this writing.} To get around - this, you need to mangle the names of the targets that \ald creates. To - do this, use the \textcmake{MANGLE\_TARGET\_NAMES} option. + several documents at one time. + + Multiple \latex documents in the same CMake project can be created by + simply calling \ald multiple times. Each call to \ald will create its own + set of unique targets that will be added as dependencies of + \textmaketarget{dvi}, \textmaketarget{pdf}, \textmaketarget{ps}, + \textmaketarget{safepdf} and \textmaketarget{html}. + + Consider the following code. \begin{CodeListing} -ADD_LATEX_DOCUMENT(MyDoc1.tex MANGLE_TARGET_NAMES) -ADD_LATEX_DOCUMENT(MyDoc2.tex MANGLE_TARGET_NAMES) +add_latex_document(MyDoc1.tex) +add_latex_document(MyDoc2.tex) \end{CodeListing} In the example above, the first call to \ald will create targets named \textmaketarget{MyDoc1\_dvi}, \textmaketarget{MyDoc1\_pdf}, \textmaketarget{MyDoc1\_ps}, etc. whereas the second call will create - targets named \textmaketarget{MyDoc2\_*}. + targets named \textmaketarget{MyDoc2\_*}. Calling \textmaketarget{dvi}, + \textmaketarget{pdf}, etc. will execute the respective targets for the + two documents. - If you still want the simple, short targets to build all of the - documents, you can add them yourself with custom targets that depend on - the targets created by \ald + The \textcmake{EXCLUDE\_FROM\_DEFAULTS} option suppresses these links to the + document's targets. \begin{CodeListing} -ADD_CUSTOM_TARGET(dvi) -ADD_DEPENDENCIES(MyDoc1_dvi MyDoc2_dvi) -ADD_CUSTOM_TARGET(pdf) -ADD_DEPENDENCIES(MyDoc1_pdf MyDoc2_pdf) -ADD_CUSTOM_TARGET(ps) -ADD_DEPENDENCIES(MyDoc1_ps MyDoc2_ps) +add_latex_document(MyDoc1.tex) +add_latex_document(MyDoc2.tex) +add_latex_document(MyDoc3.tex EXCLUDE_FROM_DEFAULTS) \end{CodeListing} + In this augmented example, MyDoc1 and MyDoc2 are built when targets such + as \textmaketarget{dvi} and \textmaketarget{pdf} are called, but MyDoc3 + is not. Note, however, that in this example MyDoc3 is still built as part + of the \textmaketarget{all} target that CMake sets as the default build + target. Use \textcmake{EXCLUDE\_FROM\_ALL} to remove a document from the + default \textmaketarget{all} build. \textcmake{EXCLUDE\_FROM\_ALL} and + \textcmake{EXCLUDE\_FROM\_DEFAULTS} can be used together or + independently. + + An issue that can come up in larger builds with multiple \latex documents + is a name collision. If two subdirectories each have a \latex document + with the same \textfile{.tex} file in it, then the respective calls to + \ald will create the same target names, which CMake does not allow. One + way around this problem is to rename the files to be unique (so that \ald + will create unique target names). But a more convenient way is to use the + \textcmake{TARGET\_NAME} option to change the target names. For example, + consider the following use of \textcmake{TARGET\_NAME}. + + \begin{CodeListing} +add_latex_document(doc.tex TARGET_NAME MyDoc1) + \end{CodeListing} + + This will change the behavior of \ald to create targets named + \textmaketarget{MyDoc1\_dvi}, \textmaketarget{MyDoc1\_pdf}, + \textmaketarget{MyDoc1\_ps}, etc. instead of \textmaketarget{doc\_dvi}, + \textmaketarget{doc\_pdf}, \textmaketarget{doc\_ps}, etc. + \subsection{Identifying Dependent Files} \label{sec:IdentifyingDependentFiles} @@ -581,23 +736,47 @@ ADD_DEPENDENCIES(MyDoc1_ps MyDoc2_ps) creating input files. Input \latex files might be auto-generated by any number of other mechanisms. - If this is the case, simply add the appropriate CMake commands to - generate the input files, and then add that file to the DEPENDS option of - \ald. To help you build the CMake commands to place the generated files - in the correct place, you can use the LATEX\_GET\_OUTPUT\_PATH convenience - function to get the output path. + If this is the case, simply add the appropriate CMake commands to generate the input files, and then add that file to the \textcmake{DEPENDS} option of \ald. + To help you build the CMake commands to place the generated files in the correct place, you can use the LATEX\_GET\_OUTPUT\_PATH convenience function to get the output path. \begin{CodeListing} -LATEX_GET_OUTPUT_PATH(output_dir) +latex_get_output_path(output_dir) -ADD_CUSTOM_COMMAND(OUTPUT ${output_dir}/generated_file.tex +add_custom_command(OUTPUT ${output_dir}/generated_file.tex COMMAND tex_file_generate_exe ARGS ${output_dir}/generated_file.tex ) -ADD_LATEX_DOCUMENT(MyDoc.tex DEPENDS generated_file.tex) +add_latex_document(MyDoc.tex DEPENDS generated_file.tex) \end{CodeListing} + \subsection{Adding Include Directories} + \label{sec:AddingIncludeDirectories} + + It is usually best practice to collect \latex input files in a single directory with a logical set of subdirectories, which can be referenced within the \latex document using relative paths. + However, it is sometimes convenient to search for files in directories other than the build directory. + + For example, let us say that we have two reports that you want to combine into a single combined report. + For any number of technical reasons, it could be desirable to place the two original reports untouched in subdirectories and have the tex file for the combine report in the main directory and including the sub-reports. + However, if those sub-reports are including files that are relative to their respective subdirectories, for example including images for figures, then \latex will produce an error because it will be looking for those files in the main directory. + + We can get around this problem by using the \textcmake{INCLUDE\_DIRECTORIES} option to \ald. + Simply add the subdirectories to the \textcmake{INCLUDE\_DIRECTORIES} list and \latex will look for included files locally in those directories. + Here is an example of how that might look to include image files. + + \begin{CodeListing} +add_latex_document(UberReport.tex + INPUTS report1/Report1.tex report2/Report2.tex + IMAGE_DIRS report1/images report2/images + INCLUDE_DIRECTORIES report1 report2 + ) + \end{CodeListing} + + Note that the \textcmake{INCLUDE\_DIRECTORIES} option should be used with care. + If a file with the same name exists in multiple included directories, \latex might not pick up the file you are expecting. + (\latex will first look in the build directory, then the directories listed in \textcmake{INCLUDE\_DIRECTORIES} in the order given, and then system directories.) + Thus, in the previous example if both reports had image files with the same name, the second report will likely include images from the first report. + %----------------------------------------------------------------------------- \section{Frequently Asked Questions} @@ -620,7 +799,7 @@ ADD_LATEX_DOCUMENT(MyDoc.tex DEPENDS generated_file.tex) you must use the CMake from \href{http://www.cmake.org/HTML/Download.html}{http://www.cmake.org/HTML/Download.html}, the ImageMagick port from - \href{http://www.imagemagick.org/script/index.php}{http://www.imagemagick.org/script/index.php}, + \href{http://www.imagemagick.org/script/binary-releases.php#windows}{http://www.imagemagick.org/script/binary-releases.php\#windows}, and a native build tool like MSVC or the GNU make port at \href{http://unxutils.sourceforge.net/}{http://unxutils.sourceforge.net/}. \emph{Do not use the ``native'' CMake program with any cygwin programs or @@ -656,6 +835,24 @@ ADD_LATEX_DOCUMENT(MyDoc.tex DEPENDS generated_file.tex) (\href{http://finkcommander.sourceforge.net/}{http://finkcommander.sourceforge.net/}) is a similar although less active project. + \subsection{How do I process with \xelatex?} + \label{sec:How_do_I_process_with_XeLaTeX} + + \UseLATEX was not designed with \xelatex in mind, but the + interface of that program is similar enough to \latex that you should be + able to use it. Simply change the \textcmakevar{PDFLATEX\_COMPILER} CMake + variable to the \textprog{xelatex} program and build the + \textmaketarget{pdf} target. + + \subsection{How do I process with \lualatex?} + \label{sec:How_do_I_process_with_LuaLaTeX} + + \UseLATEX was not designed with \lualatex in mind, but the + interface of that program is similar enough to \latex that you should be + able to use it. Simply change the \textcmakevar{PDFLATEX\_COMPILER} CMake + variable to the \textprog{lualatex} program and build the + \textmaketarget{pdf} target. + \subsection{Why does \UseLATEX have to copy my tex files?} \label{sec:Why_does_UseLATEX_have_to_copy_my_tex_files} @@ -723,26 +920,9 @@ CMake Error at UseLATEX.cmake:377 (MESSAGE): version of ImageMagick (as specified in Section~\ref{sec:How_do_I_process_latex_files_on_Windows}), there are several other problems that users can run into the created build files attempt to - run the \textprog{convert} program. + run the \textprog{magick} or \textprog{convert} program. - A common error seen is - - \begin{CodeListing} -Invalid Parameter - filename - \end{CodeListing} - - This is probably because CMake has found the wrong \textprog{convert} - program. Windows is installed with a program named \textprog{convert} in - \textfile{\%SYSTEMROOT\%$\backslash$system32}. This \textprog{convert} - program is used to change the filesystem type on a hard drive. Since the - windows \textfile{convert} is in a system binary directory, it is usually - found in the path before the installed ImageMagick \textfile{convert} - program. (Don't get me started about the logic behind this.) Make sure - that the \textcmakevar{IMAGEMAGICK\_CONVERT} CMake variable is pointing - to the correct \textprog{convert} program. - - Another common error is that \textprog{convert} not finding a file that - is clearly there. + A common error is that \textprog{magick} or \textprog{convert} not finding a file that is clearly there. \begin{CodeListing} convert: unable to open image `filename' @@ -756,7 +936,7 @@ convert: unable to open image `filename' separated by the colon. Switch to the non-cygwin port of ImageMagick to fix this. - If you are using nmake, you may also see the following error: + If you are using nmake, you may also see the following error: \begin{CodeListing} convert.exe: unable to open image `C:': Permission denied. @@ -768,6 +948,21 @@ convert.exe: unable to open image `C:': Permission denied. (such as make or MSVC's IDE or a unix port of make). If anyone finds away around this problem, please contribute back. + Another possible error seen is + + \begin{CodeListing} +Invalid Parameter - filename + \end{CodeListing} + + This is probably because CMake has found the wrong \textprog{convert} program. + Windows is installed with a program named \textprog{convert} in \textfile{\%SYSTEMROOT\%$\backslash$system32}. + This \textprog{convert} program is used to change the filesystem type on a hard drive. + Since the windows \textfile{convert} is in a system binary directory, it is usually found in the path before the installed ImageMagick \textfile{convert} program. + (Don't get me started about the logic behind this.) + Make sure that the \textcmakevar{IMAGEMAGICK\_CONVERT} CMake variable is pointing to the correct \textprog{convert} program. + Or better yet, make sure you have ImageMagick 7.0 or higher and use the \textprog{magick} program instead of \textprog{convert}. + Recent versions of \UseLATEX should give a specific warning about this with instructions on how to fix it. + \subsection{How do I automate plot generation with command line programs?} \label{How_do_I_automate_plot_generation_with_command_line_programs} @@ -797,54 +992,54 @@ convert.exe: unable to open image `C:': Permission denied. \begin{CodeListing} # Set GRI executable -SET(GRI_COMPILE "/usr/bin/gri") +set(GRI_COMPILE "/usr/bin/gri") # Set the location of data files -SET(DATA_DIR data) +set(DATA_DIR data) # Set the location of the directory for image files -SET(IMAGE_DIR graphics) +set(IMAGE_DIR graphics) # Get a list of gri files -FILE(GLOB_RECURSE GRI_FILES "*.gri") +file(GLOB_RECURSE GRI_FILES "*.gri") -FOREACH(file ${GRI_FILES}) - GET_FILENAME_COMPONENT(basename "${file}" NAME_WE) +foreach(file ${GRI_FILES}) + get_filename_component(basename "${file}" NAME_WE) # Replace stings in gri file so data files can be found - FILE(READ + file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_DIR}/${basename}.gri file_contents ) - STRING(REPLACE "${DATA_DIR}" "${IMAGE_DIR}/${DATA_DIR}" + string(REPLACE "${DATA_DIR}" "${IMAGE_DIR}/${DATA_DIR}" changed_file_contents ${file_contents} ) - FILE(WRITE + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${basename}.gri ${changed_file_contents} ) - - # Command to run gri - IF(GRI_COMPILE) - ADD_CUSTOM_COMMAND( + + # Command to run gri + if(GRI_COMPILE) + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${basename}.eps DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${basename}.gri ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${DATA_DIR} COMMAND - ${GRI_COMPILE} + ${GRI_COMPILE} ARGS -output ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${basename}.eps ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${basename}.gri ) - ENDIF(GRI_COMPILE) - # Make a list of all gri files (for ADD_LATEX_DOCUMENT depend) - SET(ALL_GRI_FILES ${ALL_GRI_FILES} + endif() + # Make a list of all gri files (for ADD_LATEX_DOCUMENT depend) + set(ALL_GRI_FILES ${ALL_GRI_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${basename}.eps ) -ENDFOREACH(file) +endforeach(file) # Copy over all data files needed to generate gri graphs -ADD_CUSTOM_COMMAND( +add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${DATA_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${IMAGE_DIR}/${DATA_DIR} COMMAND ${CMAKE_COMMAND} -E copy_directory @@ -852,7 +1047,7 @@ ADD_CUSTOM_COMMAND( ${CMAKE_CURRENT_BINARY_DIR}/${IMAGE_DIR}/${DATA_DIR} ) -ADD_LATEX_DOCUMENT(MyDoc.tex +add_latex_document(MyDoc.tex IMAGE_DIRS ${IMAGE_DIR} DEPENDS ${ALL_GRI_FILES} ) @@ -892,11 +1087,11 @@ ADD_LATEX_DOCUMENT(MyDoc.tex \textfile{CMakeLists.txt} file. For example: \begin{CodeListing} -SET(LATEX_COMPILER_FLAGS +set(LATEX_COMPILER_FLAGS "-interaction=nonstopmode --enable-write18" CACHE STRING "Flags passed to latex." ) -INCLUDE(UseLATEX.cmake) +include(UseLATEX.cmake) \end{CodeListing} The disadvantage of this latter approach is the reduction of portability. @@ -904,33 +1099,234 @@ INCLUDE(UseLATEX.cmake) does not support the \textcmake{--enable-write18} flag (for which there are many). + \subsection{Why is \UseLATEX complaining about image file names?} + \label{sec:Why_is_UseLATEX_complaining_about_image_file_names} + + If you have an image file with a filename that contains multiple periods, + for example \textfile{my.image.pdf}, \UseLATEX will issue a warning like + the following. + + \begin{CodeListing} +Some LaTeX distributions have problems with image file names +with multiple extensions or spaces. Consider changing +my.image.pdf to something like my-image.pdf. + \end{CodeListing} + + This is because, just as the warning reports, some versions of \latex + have problems with including image filenames with multiple extensions. + For example, if you tried to include \textfile{my.image.pdf} with a + command like + \begin{CodeListing} +\includegraphics{my.image} + \end{CodeListing} + then some versions of \latex will respond that the image extension + \textfile{.image} is not recognized or that the file \textfile{my.image} + is not found because it fails to look for files with valid extensions. + + Although it is inadvisable (per Section~\ref{sec:IncoporatingImages}), + you might try to get around the problem by specifying the extension like + this. + \begin{CodeListing} +\includegraphics{my.image.pdf} + \end{CodeListing} + This might work, or it might just make \latex complain that it does not + recognize images with extension \textfile{.image.pdf}. + + In the end, the best solution is to simply use filenames that will not + trouble \latex. Even though some \latex distributions (like \mactex) + seem to handle this extension ambiguity correctly, others clearly do + not. Thus, even if your \latex distribution handles these image + filenames correctly, it is still a bad idea in case you need to change + distributions or build on other computers. Your best course of action is + to simply heed the warning and rename your files. + + \subsection{Why are there no \textcmake{FORCE\_PS} or \textcmake{FORCE\_SAFEPDF} options?} + \label{sec:Why_are_there_no_FORCE_PS_or_FORCE_SAFEPDF_options} + + Because you should just use the \textcmake{FORCE\_DVI} option instead. + + Both the \textmaketarget{ps} and \textmaketarget{safepdf} targets are + built by first creating a \textfile{.dvi} file using the standard + \textprog{latex} program. The \textfile{.dvi} file is then converted to + \textfile{.ps} and subsequently to a \textfile{.pdf} file. Thus, you can + just enable the \textcmake{FORCE\_DVI} option to force \UseLATEX on this + build path. + + The force options are really disabling compile paths that do not work for + your document. For example, \textprog{pdflatex} does not support all + postscript packages, so that program can fail for some documents. The + \textcmake{FORCE\_DVI} ensures that the document can only be built in + ways that support the postscript features. + + \subsection{Why is my image file not being automatically converted?} + \label{sec:Why_is_my_image_file_not_being_automatically_converted} + + \UseLATEX has the ability to find image files and automatically convert + them to a format \latex understands. Usually this conversion happens with + the ImageMagick \textprog{magick} program. + + Users occasionally report that image formats that should be supported + because ImageMagick can convert them are ignored by \UseLATEX. This can + happen even when the \textcmake{IMAGE\_DIRS} option points to the + directory containing the image files. + + The problem here is that \UseLATEX only considers files in + \textcmake{IMAGE\_DIRS} directories that it identifies as a bona fide + image. This prevents \UseLATEX from picking up another type of file, such + as a README text file, and erroneously trying to do image conversion on + it. + + \UseLATEX checks for image files by looking for a known set of image + extensions. This extension list is maintained separately from + ImageMagick's extension list and is generally a small subset of all the + potential formats ImageMagick supports. Consequently, it is possible for + \UseLATEX to ignore an image file that could be converted. + + You can work around this problem by specifying images independently with + the \textcmake{IMAGES} option. \UseLATEX will assume any image specified + under the \textcmake{IMAGES} option is in fact an image that can be + converted with ImageMagick regardless of the extension. See + Section~\ref{sec:IncoporatingImages} for more details. + + If there is a file extension that you think should be added to the list + of image extensions to check, send a note to the \UseLATEX maintainers. + + \subsection{Why is the \textcmake{MANGLE\_TARGET\_NAMES} option deprecated?} + \label{sec:Why_is_the_MANGLE_TARGET_NAMES_option_deprecated} + + The original concept for \UseLATEX was part of a build system for a + single document. As such, \ald created generically named targets (like + \textmaketarget{dvi} and \textmaketarget{pdf}). This became problematic + when \UseLATEX was used in larger projects that built multiple targets. + The multiple documents would each try to create their own + \textmaketarget{dvi}, \textmaketarget{pdf}, etc. targets, and this would + create CMake errors when they conflicted with each other. + + To solve this problem, in 2006 the \textcmake{MANGLE\_TARGET\_NAMES} was + added to \ald. When this option was given, \ald would create ``mangled'' + targets that are unique to the name of the document so that they would + not conflict with each other. + + This option solved the problem for projects building multiple documents, + but a couple of undesirable elements were later discovered. The first was + that \latex documents built with the \textcmake{MANGLE\_TARGET\_NAMES} + option were never built by default. To build the document, the user had + to specifically request the target, which had an unwieldy name, to be + built or to explicitly set up dependencies to those targets. The second + and more serious issue was that if a project incorporated one or more + sub-projects (not uncommon) and more than one of these projects used + \UseLATEX, you were likely to get conflicting targets again. + + Consequently, in 2015 a change was made to \ald to mangle all targets. + The \UseLATEX package establishes a single set of default target names + (\textmaketarget{dvi}, \textmaketarget{pdf}, etc.), and \ald sets up + dependencies from these default targets to the mangled target names. + Thus, when \UseLATEX is used for a single document, the same simple + targets work fine. When multiple documents are added, the default targets + are automatically set up for all documents without conflicts. See + Section~\ref{sec:BuldingMultipleLatexDocuments} for more details on + building multiple \latex documents in a project. + + So, \textcmake{MANGLE\_TARGET\_NAMES} is deprecated because it is + redundant. All targets are mangled. The only difference is that \ald + establishes dependencies to the default target names. If these dependency + targets are not desired, use the \textcmake{EXCLUDE\_FROM\_DEFAULTS} + option. (Once again, see Section~\ref{sec:BuldingMultipleLatexDocuments} + for more details.) + + \subsection{What is the point of the default \latex arguments?} + \label{sec:What_is_the_point_of_the_default_latex_arguments} + + The \latex commands (e.g. \textprog{latex} and \textprog{pdflatex}) were originally designed to be run interactively. + The \textfile{tex} file is fed to the interpreter and verbose responses are generated. + When an error is encountered, \latex stops and provides a prompt to type commands to resolve the problem. + This interactive mode of building a \latex file is problematic when attempting to automate it in a batch or build system. + Thus, the \textcmakevar{LATEX\_COMPILER\_FLAGS} and \textcmakevar{PDFLATEX\_COMPILER\_FLAGS}, which contain the command line flags passed to the \latex program, are initialized to modify the behavior to work better in a build system. + + The first flag added is \mbox{\textcmake{-interaction=batchmode}}. + This flag does two major things. + The first thing this flag does is hide most of the \latex output. + A typical \latex build contains extremely verbose status messages that provide all sorts of useless information. + Any important information (like a syntax error) is easily lost. + Instead, you have to consult the \textfile{.log} file to see the full output. + Because important warnings can be hidden along with the unimportant, \UseLATEX performs several greps of the log file after the build to look for the most important warnings encountered with \latex. + + The second thing the \mbox{\textcmake{-interaction=batchmode}} flag does is to change the behavior of \latex when an error occurs. + Rather than enter an interactive prompt, the \latex program simply quits. + This is how pretty much every build system expects a compiler to behave. + + The second flag added is \mbox{\textcmake{-file-line-error}}. + For some odd reason the default behavior of \latex is to simply print out a message and leave it you to trace the location of the error. + Instead, this flag instructs \latex to prepend the filename and line number to every error to simplify finding the error. + + \subsection{Why do the \textprog{ps2pdf} arguments have the \textcmake{\#} character in them?} + \label{sec:Why_do_the_ps2pdf_arguments_have_the_hash_character_in_them} + + When calling the \textprog{ps2pdf} program, it is typical to use several arguments that are passed to the underlying ghostscript system. + These arguments often take the form of an option followed by an equal (\textcmake{=}) character and then the value for that option. + For example, arguments like \mbox{\textcmake{-dCompatibilityLevel=1.3}}, \mbox{\textcmake{-dEmbedAllFonts=true}}, and \mbox{\textcmake{-dColorImageFilter=/FlateEncode}} are common. + This is a standard convention for command line arguments in systems using Unix-like shells. + + In truth, the \textprog{ps2pdf} program and its variants are actually shell scripts that provide a simplified interface for calling the \textprog{gs} ghostscript program. + On Unix-like systems they are naturally enough implemented as shell scripts. + However, the standard Windows port instead uses \textprog{bat} scripts, which are native to that system. + Unfortunately, the interpreter for \textprog{bat} scripts treats the \textcmake{=} character as special. + Ultimately it will split the arguments on the \textcmake{=} character, and that will lead to strange errors from \textprog{ps2pdf}. + For example, on Windows the \mbox{\textcmake{-dCompatibilityLevel=1.3}} argument will be split into the arguments \mbox{\textcmake{-dCompatibilityLevel}} and \mbox{\textcmake{1.3}}. + \textprog{ps2pdf} will think \mbox{\textcmake{1.3}} is referring to the input file name and give an obtuse error about the file not being found. + + The workaround is that \textprog{gs} (and therefore all its derived scripts like \textprog{ps2pdf}) support using the \textcmake{\#} character in lieu of \textcmake{=}. + Thus, on Windows machines, \UseLATEX defaults to an alternate set of arguments for \textprog{ps2pdf} that use \textcmake{\#} in them. + + An issue you might encounter is that the \textcmake{\#} character is also frequently treated as special by script and build interpreter. + It is most often used to define a comment. + For this reason the \textcmake{\#} variant is only used on Windows where it is most likely to be needed. + The build systems I have tried seem pretty resilient to using \textcmake{\#} in commands. + If you have issues running \textprog{ps2pdf} with either character, you can attempt to resolve the problem by switching back and forth. + If you do notice a problem, please let us know so that we can fix it for other users. + %----------------------------------------------------------------------------- - + \section{Acknowledgments} Thanks to all of the following contributors. \begin{description} + \item[Matthias Bach] Instructions for using \lualatex. + \item[Martin Baute] Check for Windows version of convert being used + instead of ImageMagick's version. + \item[Izaak Beekman] + Help in fixing the order of arguments for \textcmakevar{LATEX\_SMALL\_IMAGES} with Imagemagick 7.0. \item[Arnout Boelens] Example of using gri in conjunction with \latex. \item[Mark de Wever] Fixes for interactions between the \textprog{makeglossaries} and \bibtex commands. + \item[Eric D\"{o}nges] Support for include directories. \item[Alin Elena] Suggestions on removing dependence on makeglossaries command. - \item[Myles English] Support for the \textlatexpackage{nomencl} package. + \item[Myles English] Support for the \textlatexpackage{nomencl} package. + \item[Tomasz Grzegurzko] Support for htlatex. \item[\O{}ystein S. Haaland] Support for making glossaries. \item[Sven Klomp] Help with \synctex support. + \item[Nikos Koukis] + Suggestions for default \textprog{latex} options. \item[Thimo Langbehn] Support for pstricks with the \textcmake{--enable-write18} option. \item[Antonio LaTorre] Support for the \textlatexpackage{multibib} package. \item[Edwin van Leeuwen] Fix for a bug when copying \bibtex files. + \item[Dan Lipsa] Support for the \textlatexpackage{multind} package. \item[Lukasz Lis] Workaround for problem with ImageMagick dropping the BoundingBox of eps files by using the \textprog{ps2pdf} program instead. \item[Eric Noulard] Support for any file extension on \latex input files. \item[Theodore Papadopoulo] \textcmake{DEPENDS} parameter for \ald and help in identifying some dependency issues. + \item[Jorge Gerardo Pe\~{n}a Pastor] Support for SVG files. + \item[Julien Schueller] Check for existence of Imagemagick convert only + when used. + \item[David Tracey] Support for using \textprog{biber} command with the + \textcmake{USE\_BIBLATEX} option. \item[Raymod Wan] \textcmake{DEFAULT\_SAFEPDF} option. \end{description} diff --git a/scripts/release-version.sh b/scripts/release-version.sh new file mode 100755 index 0000000..6c0a13a --- /dev/null +++ b/scripts/release-version.sh @@ -0,0 +1,183 @@ +#!/bin/bash +# +# Checks to make sure that the version number is consistent across all +# files, then issues the git commands to tag the version. + +# A simple function to ask the user if they want to continue. +function ask_keep_going { + read -ep "Are you sure you want to continue? [y/N] " keep_going + if [ "$keep_going" != "y" -a "$keep_going" != "Y" ] + then + echo "Aborting" + exit 1 + fi + echo +} + +# Run in repo base directory +cd `dirname $0`/.. + +echo "Fetching origin..." +git fetch origin +echo + +# Extract the version number from UseLATEX.cmake +version_line=`head -n 3 UseLATEX.cmake | tail -n 1` + +version=`echo $version_line | sed -n 's/# Version: \([0-9]*\.[0-9]*\.[0-9]*\)/\1/p'` + +if [ -z $version ] +then + echo "Could not extract version number from UseLATEX.cmake." + echo "The third line should be of the form '# Version: X.X.X'." + exit 1 +fi + +echo "Found version $version in UseLATEX.cmake" +echo + +echo -n "Checking for $version in UseLATEX.tex..." +if fgrep -q '\newcommand{\UseLATEXVersion}{'$version'}' UseLATEX.tex +then + echo "OK" +else + echo "FAIL" + echo + echo "Could not find $version in UseLATEX.tex." + echo "There should be a line in UseLATEX.tex like the following:" + echo ' \newcommand{\UseLATEXVersion}{'$version'}' + echo "Add it." + exit 1 +fi + +echo -n "Checking for $version in UseLATEX.pdf..." +if pdftotext UseLATEX.pdf - | grep -q 'Version *'$version +then + echo "OK" +else + echo "FAIL" + echo + echo "Could not find $version in UseLATEX.pdf (using pdftotext)." + echo "Rebuild the pdf documentation and copy it to the working repo." + exit 1 +fi + +git_version_tag="Version$version" +echo -n "Checking for git tag $git_version_tag..." +if git rev-list $git_version_tag.. > /dev/null 2>&1 +then + echo "FAIL" + echo + echo "Version tag $git_version_tag already exists in git repository." + echo "Either change the version in UseLATEX.cmake or remove the version" + echo "tag (with 'git tag -d $git_version_tag')." + exit 1 +else + echo "OK" +fi + +echo -n "Checking for tabs in UseLATEX.cmake..." +if fgrep -q "$(printf '\t')" UseLATEX.cmake +then + echo "FAIL" + echo + echo "Tab characters were found in UseLATEX.cmake. For consistent style" + echo "replace all tab characters with spaces to the desired column." + exit 1 +else + echo "OK" +fi + +echo -n "Extracting notes for $version..." +version_notes=`sed -n "/# $version/,/# [0-9]/{ +s/^# $version *// +/^# [0-9]/d +s/^# *// +p +}" UseLATEX.cmake` +if [ \( $? -eq 0 \) -a \( -n "$version_notes" \) ] +then + echo "OK" +else + echo "FAIL" + echo + echo "Could not find the notes for this release in the History list." + echo "Make sure an item has been added to the release history." + ask_keep_going +fi +version_notes=" +$version_notes" + +echo -n "Checking that the working directory is clean..." +if [ -z "`git status --porcelain`" ] +then + echo "OK" +else + echo "FAIL" + echo + echo "There are uncommitted changes to your repository. Make sure that the" + echo "working directory is clean before running this script." + exit 1 +fi + +echo -n "Checking that we are on the master branch..." +if [ "`git rev-parse --abbrev-ref HEAD`" = "master" ] +then + echo "OK" +else + echo "FAIL" + echo + echo "Not currently on the master branch." + ask_keep_going +fi + +echo -n "Checking that we are up to date on master..." +if git merge-base --is-ancestor origin/master HEAD +then + echo "OK" +else + echo "FAIL" + echo + echo "The local repository does not have the latest version from the" + echo "central repository. This is OK if you are retroactively tagging" + echo "a version but might be in error if you are tagging new changes." + ask_keep_going +fi + +echo -n "Checking that master is up to date on origin..." +if git merge-base --is-ancestor HEAD origin/master +then + echo "OK" +else + echo "FAIL" + echo + echo "Your latest changes do not appear to be in the central repository." + echo "It is recommended to update the remote repository before tagging" + echo "a version." + ask_keep_going +fi + +# We are finished with all the checks. Do the tag. +echo -n "Tagging with $git_version_tag..." +if git tag --annotate --edit --message="UseLATEX.cmake Release $version +$version_notes + +# Write a message for tag: +# $git_version_tag +# Lines starting with '#' will be ignored. +" $git_version_tag +then + echo "OK" +else + echo "FAIL" + echo + echo "Could not tag repository for some reason." + exit 1 +fi + +echo +echo "Finished tagging to version $version." +echo "To push the tags to the remote repository, execute" +echo +echo " git push --tags" +echo diff --git a/tests/Bibliography/CMakeLists.txt b/tests/Bibliography/CMakeLists.txt new file mode 100644 index 0000000..6d8cb4e --- /dev/null +++ b/tests/Bibliography/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(Bibliography NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(DocWithBib.tex + BIBFILES References.bib + ) + +add_latex_document(DocWithBibLatex.tex + BIBFILES References.bib + USE_BIBLATEX + ) diff --git a/tests/Bibliography/DocWithBib.tex b/tests/Bibliography/DocWithBib.tex new file mode 100644 index 0000000..3190b32 --- /dev/null +++ b/tests/Bibliography/DocWithBib.tex @@ -0,0 +1,10 @@ +\documentclass{article} + +\begin{document} + +This document tests citations such as these \cite{Moreland2008}. + +\bibliographystyle{plain} +\bibliography{References} + +\end{document} diff --git a/tests/Bibliography/DocWithBibLatex.tex b/tests/Bibliography/DocWithBibLatex.tex new file mode 100644 index 0000000..00e05bd --- /dev/null +++ b/tests/Bibliography/DocWithBibLatex.tex @@ -0,0 +1,14 @@ +\documentclass{article} + +\usepackage[backend=biber]{biblatex} + +\addbibresource{References.bib} + +\begin{document} + +This document tests citations through the biblatex package such as these +\cite{Moreland2008}. + +\printbibliography + +\end{document} diff --git a/tests/Bibliography/README b/tests/Bibliography/README new file mode 100644 index 0000000..65cf83f --- /dev/null +++ b/tests/Bibliography/README @@ -0,0 +1,4 @@ +This test exercises the ability to build documents with bibliographies +built from bib files. There are two documents. The first builds the +bibliography with the typical bibtex program. The second uses the +biblatex package and builds the bibliography with biber. diff --git a/tests/Bibliography/References.bib b/tests/Bibliography/References.bib new file mode 100644 index 0000000..8cf935e --- /dev/null +++ b/tests/Bibliography/References.bib @@ -0,0 +1,7 @@ +@techreport{Moreland2008, + Author = {Kenneth Moreland}, + Title = {{UseLATEX.cmake}: {\LaTeX} Document Building Made Easy}, + Institution = {Sandia National Laboratories}, + Number = {SAND 2008-2743P}, + Year = {2008} +} diff --git a/tests/DefaultTargets/CMakeLists.txt b/tests/DefaultTargets/CMakeLists.txt new file mode 100644 index 0000000..0362314 --- /dev/null +++ b/tests/DefaultTargets/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(DefaultTargets NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(DefaultDvi.tex IMAGE_DIRS images FORCE_DVI) +add_latex_document(DefaultPdf.tex IMAGE_DIRS images FORCE_PDF) +add_latex_document(DefaultHtml.tex IMAGE_DIRS images FORCE_HTML) +add_latex_document(NoDefault.tex IMAGE_DIRS images EXCLUDE_FROM_ALL) diff --git a/tests/DefaultTargets/DefaultDvi.tex b/tests/DefaultTargets/DefaultDvi.tex new file mode 100644 index 0000000..52f692f --- /dev/null +++ b/tests/DefaultTargets/DefaultDvi.tex @@ -0,0 +1,15 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +\Large +\noindent +This document builds \textbf{\Huge dvi} by default. + +\includegraphics[width=2in]{images/Circles_pdf} +\includegraphics[width=2in]{images/Circles_eps} +\includegraphics[width=2in]{images/Cool2WarmBar} + +\end{document} diff --git a/tests/DefaultTargets/DefaultHtml.tex b/tests/DefaultTargets/DefaultHtml.tex new file mode 100644 index 0000000..2457da7 --- /dev/null +++ b/tests/DefaultTargets/DefaultHtml.tex @@ -0,0 +1,15 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +\Large +\noindent +This document builds \textbf{\Huge html} by default. + +\includegraphics[width=2in]{images/Circles_pdf} +\includegraphics[width=2in]{images/Circles_eps} +\includegraphics[width=2in]{images/Cool2WarmBar} + +\end{document} diff --git a/tests/DefaultTargets/DefaultPdf.tex b/tests/DefaultTargets/DefaultPdf.tex new file mode 100644 index 0000000..0836e77 --- /dev/null +++ b/tests/DefaultTargets/DefaultPdf.tex @@ -0,0 +1,15 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +\Large +\noindent +This document builds \textbf{\Huge pdf} by default. + +\includegraphics[width=2in]{images/Circles_pdf} +\includegraphics[width=2in]{images/Circles_eps} +\includegraphics[width=2in]{images/Cool2WarmBar} + +\end{document} diff --git a/tests/DefaultTargets/NoDefault.tex b/tests/DefaultTargets/NoDefault.tex new file mode 100644 index 0000000..1c6a789 --- /dev/null +++ b/tests/DefaultTargets/NoDefault.tex @@ -0,0 +1,15 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +\Large +\noindent +This document should \emph{\Huge not} be built by default. + +\includegraphics[width=2in]{images/Circles_pdf} +\includegraphics[width=2in]{images/Circles_eps} +\includegraphics[width=2in]{images/Cool2WarmBar} + +\end{document} diff --git a/tests/DefaultTargets/README b/tests/DefaultTargets/README new file mode 100644 index 0000000..84cfb2c --- /dev/null +++ b/tests/DefaultTargets/README @@ -0,0 +1,18 @@ +This test checks to make sure that the appropriate targets are being made +by default for LaTeX documents with forced builds. + +The following documents exist and the default targets (made with no +arguments to make) should create the following files (in addition to the +standard auxileary files). This is assuming LATEX_DEFAULT_BUILD is not set +to Ps or SafePdf. + +NoDefault.tex: -nothing- +DefaultDvi.tex: DefaultDvi.dvi +DefaultPdf.tex: DefaultPdf.pdf +DefaultHtml.tex: DefaultHtml.html DefaultHtml.dvi + +Looking at the transpose, here are the files expected per extention. + +*.dvi: DefaultDvi.dvi DefaultHtml.dvi +*.pdf: DefaultPdf.pdf +*.html: DefaultHtml.html diff --git a/tests/DefaultTargets/images/Circles_eps.eps b/tests/DefaultTargets/images/Circles_eps.eps new file mode 100644 index 0000000..18288e3 Binary files /dev/null and b/tests/DefaultTargets/images/Circles_eps.eps differ diff --git a/tests/DefaultTargets/images/Circles_pdf.pdf b/tests/DefaultTargets/images/Circles_pdf.pdf new file mode 100644 index 0000000..e2a6d77 --- /dev/null +++ b/tests/DefaultTargets/images/Circles_pdf.pdf @@ -0,0 +1,214 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CC (Macintosh) + 2016-11-17T17:11:40-07:00 + 2016-11-17T17:11:40-07:00 + 2016-11-17T17:11:40-07:00 + + + + 256 + 156 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAnAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYqk3mPzj 5a8uQerrF/HbEiscJPKV/wDVjWrn50pleTNGHMufoey9RqjWKBl59B7zyeU+Yf8AnJBQXi8v6Xy7 LdXrUH/ImM/8b/RmBk7Q/mj5vaaL2F655/CP/FH9Tz/Vvzf/ADD1IsH1eS1jPSO0CwU+TIA/3tmJ LV5JdXptN7M6HFyxiR/per79vsYzeazq96Sby+uLkmtTNK8la9ftE5SZk8y7fFpcWP6Ixj7gAg8i 3q1veXds3K3nkhbxjZkPh2IwgkcmE8UZ/UAfeyDTPzL8+6aQbXXLogdEmf11/wCBm9QZbHUZByJd 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 + + + + 1 + False + False + + 5.027778 + 3.027778 + Inches + + + + Cyan + Magenta + Yellow + + + + + + Default Swatch Group + 0 + + + + application/pdf + + + Circles2 + + + proof:pdf + uuid:44a88084-8eab-bd43-b939-f3e88122727b + uuid:0e8fa934-0ba8-354d-b29c-89df65e519a9 + Adobe PDF library 11.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 362.0 218.0]/Type/Page>> endobj 8 0 obj <>stream +HQK +1 ݿS-*\xaf#Zo $=RC:aюzksq'4Iu:_ UH_V ̰i,Mx:'9Ez-?|nq+[iH`/L endstream endobj 11 0 obj <>stream +8;Z]_YmCCQ$q/M.p0T/YA/u7N8V5kR"b.u)N9_p^5EF3/Yc@jE*^BRTGP\rUAN.KO,aqeHW\sj*Ye-h~> endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 17.1.0 %%For: (kmorel) () %%Title: (Circles.svg) %%CreationDate: 11/17/16 5:11 PM %%Canvassize: 16383 %%BoundingBox: 52 36 414 254 %%HiResBoundingBox: 52 36 414 254 %%DocumentProcessColors: Cyan Magenta Yellow %AI5_FileFormat 13.0 %AI12_BuildNumber: 273 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 52 36 414 254 %AI3_TemplateBox: 233.5 144.5 233.5 144.5 %AI3_TileBox: -145 -143 589 433 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -303 529 1 1076 758 26 0 0 78 133 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream +%%BoundingBox: 52 36 414 254 %%HiResBoundingBox: 52 36 414 254 %AI7_Thumbnail: 128 80 8 %%BeginData: 19966 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1EFFCAC3C3B6B5B0B5FCB5FCB5B0B5B5C3C3CACAFD21FFA97F55 %552B2B092B092B092B2B555585A9FD38FFCAC3B5B5FCFCFCB0FCB0FCB0FC %B0FCB0FD05FCB5B5C3CAFD1AFFA95B550909F9F9F909F909F909F909F909 %F9F9F90909555BFD33FFC3B5B5FCFCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCFCFCB5B5C3CAFD15FF7F55F909F909F92B0909F92B0909F92B09 %09F92B0909F909F90909557FFD2DFFCB9AB5FCFC8CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CFCFCB59ACAFD10FFA95B03F9F90903 %09F9090309F9090309F9090309F9090309F9090309F90903F9095BA9FD29 %FFC3B0B0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB0B0C3CAFD0DFF552BF92B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B0909F92B5BFD26FFC3B5FCFCFCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB5C3FD0AFF7F0909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909097FFD23FFBCFCFCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCFCB5FD07FFA955F909F92B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F909F955A9FD1FFFCA8CFCFCB08C %B0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FC %B08CB0FCB08CB0FCFC8CC4FD04FF7F090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F92B %7FFD1DFFC3FCB0B0B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCC3FFFF5B09F92B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092BF9095BFD1BFFBCFCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCBC3109F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F90955FD %19FFBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB52309F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F90931FD17FFBCFCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB02309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F90903F92BFD15FFBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB523 %09092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B090955FD13FFBC %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFC2309F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F9F955FD11FFC4FCB0FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCFC46090909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B09097FFD0FFFCA8CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CFC6909F909F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F909A9FD0EFFB5B0B0B5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5B02B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092BF931FD0DFFBCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FC4DF909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F95BFD0BFFCAB0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FC94F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B %0909F92B0909F9A9FD0AFFB68CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %FCB024090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9F92AFD09FFCAFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB56A09092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B09097FFD08FFB5FCFCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB08C2BF909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F931FD07FFC3B0FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FC70092B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B %0909F92B0909F92B0909F92B0909F92B0909F9A9FD06FFB58CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB0FCB003090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9F92AFD05FFCAFC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB56A09092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %09A9FD04FFBCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC4EF909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F95BFD04FFB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB503090909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B09092BFFFFFFCA8CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CFC6A090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9097FFFFFBCB0FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC4E092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2BF97FFFFFB5FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB00309F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F9092BFFFFB0B0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB58D2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B092BA9C3B0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FC6AF909F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9A9C3FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB44709092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B09097FBCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC4EF909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F955BCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB52409F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F90931B5FC8CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCFC8C2BF9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F909032B %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB50909092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B09FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFC8D2B %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909B5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FC93F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F98CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB08D09F909F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F909B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC93092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B09FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %8D09F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909B5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB50909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09B0FC8CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCFC8C2BF9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F909032BBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB52A09092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B090931BCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FC4EF909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F95BC3FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCFC47090909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09095BC3B0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FC6AF909F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9A9FFB0B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB58D2B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092BA9FFB6FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB00309F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F9092BFFFFBCFCFCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FC4E092B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F97FFF %FFCA8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CFC6A090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9097FFFFFFFB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B090909FD04FFBCFCFCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FC4DF909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F95BFD04FFCAFCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB56A09F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F909A9FD05 %FFB58CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0FCB024090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9F92AFD06FFC3B0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC71092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092BF9A9FD07FFB0B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B08C2BF909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F92BFD08FFCAFCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB56A09F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F9097FFD09FFB58CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB0FCB024090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9F92AFD0AFFCAB0FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FC94092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B0909F9A9FD0BFFBCFCFCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FC4DF909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F95BFD0DFFB5B0FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB58D2B092B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B %0909F92B0909F92B092BF931FD0EFFCA8CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CFC6909F909F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F90985FD0FFFC4FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB44609092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B09097FFD11FFBDFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFC2309 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F90955FD13FF %BCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB524090909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B090931FD14FFCAB6FCB08CB0FCB08C %B0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FC %B08CB0FCB08CB0FCB08CB0FCB02409F9090309F9090309F9090309F90903 %09F9090309F9090309F9090309F9090309F9090309F9090309F9090309F9 %090309F90903F92BFD17FFBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB52409092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B090955FD19FFBCFC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCBC31F9F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F9F931FD1BFFC3FCB0FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB0 %FCBDFFFF5509F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B092BF9095BFD1DFFC38CFCFC %B08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08C %B0FCB08CB0FCB08CB0FCFC8CC3FD04FF7F090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9097FFD20FFB6FCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCFCB5FD07FFA955F909092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B0909F955A9FD22FFC3B5FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFCFCB5C3FD0AFF7F09F9F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F9F90985FD26FFC3FCFCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCFCFCBDCAFD0DFF552BF9090909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B5BFD2AFF9A %B5FCFC8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CFCFC %B09ACAFD10FFA95503F9F9090309F9090309F9090309F9090309F9090309 %F9090309F90903F9095BA9FD2DFFC3B5B5FCB0FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB0FCB5B5C3CAFD15FF7F31F909F909F92B092B092B09 %2B092B092B092B092BF92BF90909557FFD32FFCAC3B5B5FD05FCB0FCFCFC %B0FCFCFCB0FCFCFCB5B5C3C4FD1AFFA955310909F909F909F909F909F909 %F909F909F90909555BA9FD38FFCAC3BDB6B5B0B5B0B5FCFD04B5BDC3CACA %FD21FF857F55552B2B092B092B092B2B55557FA9FD42FFCACBCACACAFD2D %FFA9A9A9AFA9A9A9FD22FFFF %%EndData endstream endobj 19 0 obj <>stream +HWyo:/Ţ hQ%iz7ay]AKZ(ʉwHV6:c {Fo>v#1NB7oN$%Jcdy*I~n?7TLǚ Tnͅ5t@n#c4$^4e4z"#O{y6r.=ِ[%ދ0X i.dzN$Fd +C9 02N9Q;ھn^xt'l}G +ߚsR\}4<k~)3|=(`HDޥOk:O88Xk;NCuS!v= / )_.?F"R(e9gq*?Lu "^}DN )OAy,/Jh|-nfÖF mBT7wa4HC`+ɦ,>.tgE6 +/~ ;=toc/%ܨ _@*\Rj]qt":ȩҍiΫ~ϒ#y aHkƥπu&E[hLuXol=Ber`+ +#n'1+sV+& 9bD."PcOxEе$!ĥ֟[$٥?Q34 + |쏜[QsQWYzA6T-:U;MM^- `f9JXr$r>U>("]eL\!bPV=QM$n>[G)r'zAI1CN0Mp{%o>6}d\}=@GdNшVBK ]5 3°a|ςXvږmlϳa蹁k(mN:Au5ckNПr%< ~ {XB?Fqw tVc/8heN  L/i}%4dUAR{{ph> V+L qxk+iϐdD.痰>|sRI(ŷZ+%@T8I\FG}L_j6;(Ǣ ³RV r1|.Vh>zM3ap"З =T~6~}\w4ǶR'[+L8'wFw*ޥE_8y!v.S)=u웎y].H*Mo_4~2H9 ^l )͜Q6SX_m2EjEa{i;.;ر|i;obD(V]IX+ÍD&CYy*̩",>?G'G$lN:sMXS,tYV^bolL +ugE!D?r! Y:[| NbzR6aHUF~;pERLy1>nYƞ >xyxV]h؍r'kƩC?È".nש??)#&}6gæcw~.*L }\2H=@Ln TDҔEbAeUB +z$P,N4\Јes4_w|Yl![ xtZ: +]V{V9Ի Id߈v[XN\e*Ԏ3*dZi.B @kyA$fdJ@$YRnYTg:H5DFL6To{>h$Nm?\)Jٷe ;(! yQvq?P #VXw<^m=E? +?֖&EsMD'XPM9%!S^ o8˦ޞF6<Ed Xr})MHqNһrK֤gEe䣄nDwNG`$6n9EnerjFQ&$=҇4ț~*F.f l٣ AqqSCe 7f 3URܕK]]&brvƛE__/o"WEl뺷2 vz pIZ6\#]SreޛNԆlT{,Uu꘭u&[Z]q^κ}瀛ּKV3Sv5bwV +8di $] h4ʭ +}"8uJJ&DJIa>\;iP=%W})V`gSm~Hb5KpoͬʥH/h N^04Oi*2{+_q[aW.W^J~azQj +UVY46NMI?9sW{Og*X]tM ,REϩj=IZu.%&`MRٶ +KjccE~eH>,[\җcq(tAcad%|5LL ]sQa-68q G7&/77cmG\t.U\GbFQ 㝇yH-HEH!G&*};KӐ̥xrFU& $57M$ILB"ZdM` 9XbŘu~%y0I3q,SvI ٪ +*ʜ4K/CNiQ4-b ^F34잭˓s@#/882-Ȋ$0"̡P 4 k8 6SU@]<"u)lR1`@<~8a.\0,`[R^% [񒣋V!,[঩f0tˡ10yX`d=I5 }cu`m +0QWS€ 9Xu0@ ݝ|b*1IO=`y/ } <;>x,%̀,?XBNXJV[/XQ_T(Cb9TwVb!*]{BU( $"_ C(6IAxئcgJe@t-&0pH +xH$5=R5](SJK KLaG6F_ +Sm~nϙb$=ksۉBSl K< e I#PTOU¿^ D ,qӮ'I3`h@OM +#f` |dP19(SK>TZ3 LBcf@| aq|dK += )}XI1_o%J;rd8X—M> K[)Rz)Ȫ[J,Xj%nGi4̼X7b2gKvgPs6a7\6$M-w5Ï{#Fӧd.޵d8W<ޖ%w[G +3PmdGPeh.JEUb$WeLhH2L p2sYM p䘍,ܥ%-"~;0s {5(XMrO W]cae 5n~QQL-svi3$cݵ?.73WؚfIgpELVO +^{aɰ5-7G0/NlJfXl*IΆ,?o)Ȓ})`*~cDPPB$r0_"-O]Td37z)rC+پ +&Q:z ~6ۄ +M4R?~+8]4zص| Kk3CzKW%c؆7c(J//ZNlt1i>m~w'ʥwS֏ok/nlDNpoZت]vKõׅqaᠰ3ӏI +;W_U\:mݪZWiݬ5ǻ?zds_c^x:m^.CP>ǽ։Ry7<+Ws^ع/6wm8b^5ogGQfzank̵k! 8=x3th5w*|V7N@Œ<[=ƥEuG՛˥ j'|vso*<7ae>=/ pdN=NG1/ޚDiF/ulZD_oO6N;_?$>R)F1 +7[({7Fl2jG$DH5Z?]k^-dO{}v2i,tc~llp܊+MQ(Il1_݀Z.]lԼ:f֫t!U +?+*KjW]Rs)ͮvK333́h >墁ݎB ڐ塮2ssh)+~ 2h>; "01Vj+Gtx,Kª@/:E]wVKtJO4N<7O|-NZAkƳz ^B +jL ז+2hyDлY +ʰf͑}Cms V#ZuA史 +>//4[ˏdZ՞)(`(kh fsP)x(}ptlrЧKy s6:$zc*jv@a{#8{V6.534M "2Ĺ/jP]\;C$CX.݌ Mo&s +"7oCeX18ARcXS*l&7W!48 prx{L ++E.*N@:B)%LK%Zq@b¼$[!UZZȠNr +7O!&^ DnGd\@db3Crԅt}''cyk7 Q6^S%1NZic!N5 3Az7u/4w~98S*ݎ#-O+|_0K;?Lj7K)O\Wϴ9 ZĞG):_WcWHuKȹGPm9+Ԉ] Az|}S-b*HSy&-a=n2:ZO'09pZNAFˬv 5dʤ׬n5f9- b6+7'_hghH!_B\=^OhMD!"+Ky?o/!{r}VwVW#lbdut3x\v܇GػvȠ~,LP0TXε(@}'4b0@d`F0x){O,N4p"(`4-Ix)RA@T`3:hAa"|mdՕx?ΓAQLٺ1T)iڥxҺ'? JOsHr781Th +oֵ^_{ՆX+h7zbˢL#)w=ps,x,1(vO7<&[M[ZZ゗+¼LH+9:?ұ<@}s- *J2˗͍R_IP)|)UFCPk:4ЬUO`ZPO[cz='tB5U%+ܞjbvPbWt7+ŇZVlư0ׂ.sǬrg־59aiH-{E.vGsb fjC\Ū۠5uS2wJ,7^w˨W&2w^ō I]i~`D$h:rR|U \?6 ee[>48y"0-rD7')Yķ3ΜzS xQ3Qn+d;Ӣ0l'M]*XWIǠQbnRM&Lf<sqa*,\_A IwF MƝ߹g]U(/g_ktlyrٛgYs|Kz1(w+>1,b7QkXfK%|Л Z.)^`ph,^j%C١|L+1l"U(:kcqƒ&k +/TZ8#Mc֢1Ŋ, "8&ԶG0nܐG>3v5S$`R@7AdT&Q홗 L$Maw_s AvQI{](fª;^On5]̏Wm{y۽lH$^%b2ŧ `8)X/`X)S keoqʒ^R6"In\qOݲbaKn6l`'rRZ[Evs uQ8" oǫY3&+Cƙ6`eQT9NӰ LF`tT0q*y٩d +t)M6)vX!k1}uS/lG`MicƠ2+ 5q^W1~vҾ9u8^y!;oƪ'bt$}ꨣhY|Y!rTQ.zy>Nɧ ,"2AbѧZ |ƒtyd4O1k> {gY˾x0?'hC~0D;^tHM:g|tSkhBaeUo}V&EPNbV^Ԍ !\ k$z3 g)x3FW @Cv:J>Z ՘=v8ءkkι]w*>Vb', Qx.U&]kauU$co7;(gJɡ"Bk8b;n?IJBn%.~9W/迮{*A\f)c%P]Xqدg|۲/P[oPڃVX49h+wî(B0".3p쪆y6 +7ۚ 7?\hqe6D, =Q=MbcW ,>Ő&&ZU$Ȇ\(0IW>Zpa.0yE`6eyX ӘJLVx?w.B% ()CH&CŎJЖ1"ئ\=e;鰾^UTf +DC[ ^fZjrGZ0F9ZB*wpC+ZMFzy=y_;J k-a)$і'bȢ/XIXd) ]>;# O2ej 8D^bBz%./lf4,ЯD2ރѤX\޼WQ.WN=WOe|_#Wawe-.DX[,02v7Ӎ={ؐu^~];_ܽ׃HuǨsC,|;7ƹU*/OnsmzF !h}{Ӣvz;x3nuvꪼAJp9%}!nn1i5zJ9}ܦ2^jF{lE;=wh;t~N8/U4vϳGtbk2vAr:jf3Jn*X^Ol9Ebz>9Di,|yl*YwlfHqœ\YwLD1,q+j2?Z.z}SPt*% R2T᳗u3o +!aȃ{5 < xѦZ{B)Īߔ߶iu:EAnk:UB4KOzAxG`0.!9lN[Qp8;L~hBxQ.hCNns0cuslkL6욧2?˪6|($uk\@*x=h25fRZB +Y/&_ûfyI Ȏ=t;=R~Q9Vy!E45 mgcri(Xz5: $1wRT *Ta0•ž'{_6Ĥp ь,8,td>PZp:2gw%*9E#IFTCTT;Jg%$k{뱏k&JGuR+wRr3qԩF+GЭ!9VA g@ry&$VPӺ4-|v:d]rӱ3g컞,YV@ӢGiGoų+tC:}^YsuVZ&Q}VOx@'*shy +N ьYώc>HlՑǹfYJHTX̤z9Wa!T`dV,9L.Yrs`1 [I@ 5ޱߺƣcA &Ф[TOT1`B[pQ'{-eеLȩd2{ޣ} ^X-֛luފ$C2X;ωWW6@YwP-Ph= ѩ1`g)Șf ;`+!YwN YE9+[1:]*d,11+5A0r%FsfaF-d̶"GhKKŕBrG4yĶ^лܔ ;OmIwE'JiKm2:Q\;J!'v3[hwLƫEʔa*1YI7jYi|l|}p$H_xt;j0lvrq!2#G "c8{A:C+cB} ^lJ{beI-4ߕLCa޽e+)ݚR+Y5vuޔ9Ks s*BG7l4wBSt7Ӭ>̺8>Y8:`bh8MxhnOjyvqZb v彽PN_}>4|E4W}h&val~ji_ c Dіlߺtr_J $Q#rqKT (#3 +e-(x=}rȹpn!ۯ^ۃ*L +rşB|_Yw {W=ްx 1S=JJ*ɐl@OKm9X{kL8ɐ?]tw=٨G.Ne.1["Χ%&/66|_~MK<]WtXyrDw2ʓٓ =x0-p#$q~:mBݝ>r&KU̥L>qҋ_~*O MX^ c=uK켈B/Ǡ(<\|{ tRVܠ.%g&2vZ {+ *[ +n A/U`.ըEy0 1u|E&AC^\nJ& }}ܴAV+"r\"ȆHђezRTU)%10Yh{N0o[^4ndb̈K֝3ecFfJWfuY|EMvN. !ǐ>a^.%bo3"XĠH ՁC7rddTF⬥9=G|W׌^ʀc^&Nf1*Z֙d1'pvU(M%F)QϞ^rw2۰H:1Jƪ_ +r-P +N<aVgrR.+ix@Jd^GWӂJk6ϩxEkrxeAvyUn:"R&O |@gG[.-+m*.i;e#g+Q^D5ŋ('++լ]Dwj o_=]C%YUR}K;IVzvRtrzځ& [j-iU;-Ux,WNI>stream +HWZJ}<K Ԡ삌0,WFF;!n iOUN-EAw'I%Og[T ٴ$''bSzSNJs-[=JZuQfBDe$99b~R명xk}LIx/Lv)q%]H\2jtT3z:B"z\ w2e[uVWɭ#?(pˊBgjAʅđ'\I<*{0 "-o[QeyrA +( + 8`{F bW2 60ϵ\:wJmp24qv3L +T2ֶKήP-I{Ž", cSo"de6FV+m +5<.]"6{˃yBuc'0FMe1A-(ه-ݢ$+6 {`ce~g& x<~rS'rf@1Saҭvx~r.s_rW;i~2W:(>I}zgI%>.1ԅ(߆+?HqcUqeH??IrYd3$/z-{H`L]y%xmFԟ>0?hkTWU(Yk4ևF3Aۨ ꧿ +XP6fS{)zeÊ0F9$Hq*cG H +"+ XVQk4+EYvU_UaIвv?ݜn.I]B(ڨQJJ^#J]p +^Fy?'?[E }.,Rn.!S˓ٝSg dY{^Y)QWoQ4ʋY:OgsY6B]Mj㆘0̛%x8Ww_X,W>ܣ +Qlw$/ȭ¹ RuI܋-cǸZB컂- GbGLRK瘽Nq +{qӞiT%1.ftobÊg{[ *A4dAD?,:$1S.n/ ʃUTr ۶&k.b }ܜy~>-= Wϙ,kѴ:;,5W5+%`q9uiIJ{Rnw{Oy\YbX{ 05Vx`{Wc81rFNK=o + _mM}(?CY0aMU!_ w|{zb] +1^;jkx`@-~c/:/RAPV,4m٣ +ya"Ϳw/dl;zCOM<~MQ+/;e#}(n2RڤÎTOHiEgϚ$7C>RiX߯]'?185\#C>4O;ĝc׮#Oa +zQ:VZs咙' B1ԑ \,yKXNM&܋}>I0MXm75F\$iFxԁd;d9F!|̝冖5n`,shch"|B溢LÎkT] H.Ε?]"ēu`e@ -1*grneYn%]h=M1wnӠb R>@ ' 1+"& ;f; HDChPV94l j +5r> kXcvD(ĐkE3pUbiݪq#-"aJ\(=ֻfEe22ɺ_ʲ~|0BrP..C|Xl77$#%*BVIUXb/0 +n:{@8 +f]\*_C*2 +5yؿl+ܗX& At|כa +dP%\@S(iw0,u| +fesi+4NqLommH\tIcHؙB$4}IVPmXh1 ˃3tRMh] [x}yb܋V`{8X6P8{!zE8anC-oC &`&TFnc%36K e-`^ac^e ǃeJLmx |Im1J-=;]5Vx67!5}mq0\qq1ȅՒ[䭘x§&UF6&DVGiCӚ?0!o1bwT"|1IȀl+X6(H2/ q0~r7[|qJ7]Q;$c?uW\vC{p%~E* )a*qJ^tJDpډ Q@w/s#a,5G|\,~=~ 0f?móդ[{Љ4L_ZM9Ĝ'1ʤ2;h#{,b"Յz0"Xʝ0]j49{! `nFy穈9 xMvsӲa6+me$}hϢ'2c1q8-VZer}^ROSa_B_I$p7^ā{Km?չ*E@ȈƈKl1FkbF#{F9ļgZkS[ė"TLu2] U}ƅ+'$eCL*ctQ53xjh=Cvl =nzQ]NſF]݉wa*oktBց%AemMzQ/CzQ]/CLYxJ["_pft& :/ou%שׁR#P蒔@0QIZ}Їŗb%oX(v8@|}z=LdςEBKfѶ0 +sw䜌k|"eڋ/U&*<#^P1#(#v1V {&NqRhmiwGg$k;k & +eWB<ź% RLZWoo$(.S]]v4Sm%So= `( CHEHm4a \&/=[ۢ6ˀ;y(bݝ.$>)|/-ގ s zxpM;͋;p/tgCe1$砪d1ʜ+oWUQXzLFp:6qy9"z;oK^7˳oz3zS?@0S;9B߰h>T g>iզ~ ݻ%m2}\!(2hqP+ʳ-+mfv<00 }5eFOrSϷ{ s@o8e|iweo=[\}r%u$%3ۚNT#tK#>e߁ BrFE*xT3i`]ڱn&go:|:͠D\-9"j>rW&pt'&`PԃQYl"X(a6`3d'+MdS.Nƭ +P0,vjQJe&OdhD1MoR^U1i3l^RXLd41((^oQ[>)V.#E+8)4 19mw.4weH0+h +D\e PD$Hή4J:& e./ t&ݣc0Zզ6^FZJM4!՜Ѝau[8!2,*WT˩>=W+C-54(ޞъ&_Ca.uBr+IR۫3FuTyį~Cʽ +$WV5v)?gz<# -1D&\gO&~|R9o*[da_m;|5Y PhvH^~u:+ʯ%7B^,v%_k`ZX/2~_\bW/M E^_㳅OjBW@ɻ[n6vA<‰ i)V +ۥ# T]68f=y9R\kN|NlǾk fwN?t6p ~rC\,I-M&7yf!.Mh^8C1=7`~QM-R-@ _(s9{ԨH渣x+]#5_.0虈zW e}z"`x_u,IA~e 9j)O{\xJVc~9'V9PǍgA &\#lېU*f `'e(b(`l`)R0D).+6+~)Zq2~ֲSi`~Z_G{u_8(2: RcCV9\p^}{CO6tp}E󁝝QUQP+;'䟟zR0z*pMI-6@בgas$ߪ;qtcnud zcn\sZUeΝg8Am[es9iT-kJ\J3Q:9)4VWtY7e OO˪v*hGyla3΂aͽ@,co1lV$Ą0NDCdH';</ Ģw~uRw *D" ŗ5ٵaA%G%{Bk+w %n08bO 6I"GoeM1`eǿa%ل gc?ӻJ-X,"e@2;+)*RYL +ey;X3 $;VI; qI9H~mR t$!1 AJMVt)K( #F +їxcMaͻJ &6cU# |c'j$YSXH& @Ѓj 1O!ʣL0.@AapN<TA=_&hpvo@}a&NWƄjС maŮ E5\ L52-5`N?][6&g6BQڊ >dN{{`" c c,wj߫[)> lL&˾L>Nc!0.UCp|%\\`-96y$6nmucڒ-Goeɀ2Ȩ5)y-m/}v֛:Ys +~TւWУMe` lx8O # 9@szKgaih\AZ# S0Ud䋝c]B#@Ґ +UҊ(({缪ivTCf,uM-p@Pol. wIU-?eRet/`22 ᥆P<H]Kߊ7TҖ|dU vYY&juX^~'"(OŽ lldWB `=&QvD.lPQ6=P,Ywd }7ـ-:7:zLpkdK;j̟sW$WnxNC̀ Ak諂?'aRjѬ[wSr|Yz÷/jzKV8ijGUj(,<#R@vPb0PM7!" Ҩ nx37?|6&lMdLPUɦ&_'z.cR uSEIfh!T v\1L'9Y%Kb,d"RH JxKw`PLkjd&Mm\.xƐL7)+ +w* +|mh&>lu/(ȴn} ɭA =aۖL%@(_KDz1y|=I+]L[ǷVl~a"Qƣ|ChR%*h-T;)Qxjĵ2֪@k4b5QF ~Q.5,ĕ=Kժ˒M01v +Y!rN6P\1Tfp]]ܷ9n!@R߅kj, &F{*pĈ 㻄$ +4>5bxmrq-Xm{GhE$|@H +m~  Q!;xOS=`=^0@#kIҭĕ [F- Pb"( +s?ouw6qxN뫪uѬ)d? &!vXeΚSb`7IUAp3/i\3N)?){Nr5j$cr<31eמᎯi&9I@v=j/!lJ@cË;]]eynPǑ)%!c6kH9*.#%qh'Q0;F:64tU˥Kg@4K\Ϯϖp5QZ%_^u̞!+`̳,TCahHe4o?O.t!c5@b  ,d bPp\-mt\Iz!n٢ +j *N2eeWVg)Yt|`Ԕ26l܏8A09UnrrwbqT9jw #LHg +CsEX +Q5Fpn{ m$`N$'d.4di[qK >ʲ_Nf-, ¹'Y`tCpyHRX< a]4 +5 B'6,*,b_SMe Ie5Zrb9:b-IYsN/xXk装Nzm#f|PD_Q&+\mV-[Qg1Ǖϳ+U 2\D$.҉f#7,)oψ^+ xggCMAolT' 7(bs)!Չ+R7f{dw6=BrQ,usԀQeP2|e'lY,SЫGӅAȚlHȄܖ=5l@_epp0"P Ԝ%uxBRRQtbwnl%+ boF~laz,.'B„PJ2`.v: Es+d3/AH>B,zB#q)>[ *eQWX:T- #æbG倜) ^C}yf6.H p2.c}N6N'WN6N% Lv:A^NBvJ).pS(kgYqmq0^>xlxbO@n۩tQ*}e]0>gj 7*37nӪ͘-[3f',vJۃgV!طַd0 ’'NOdnx"MEF[#ԡCC"7C;$ 2lZ ᒐ1̪K\{en5,y87͂s/ mSM8?Oр]AWƸCQ-g,,\{,_)C|W c_ʙR&a`M3g&%8a֥<';dq: ގŢrgH #ોzx>y z@Aa=t40J-xlpaa=q<7kp/Ct0ycL)wai@qUZxiȧd +X(RӔ2+c +t\~{̑>O^r48.'9E0Z+BH&Yk[Q䠈&` { zNi$q +AT]XZ,4>IA{bjUG]sC_NB+&ctL?f'Vq%{E? J tȯp^a-FǼ !8iyw.J :`YzO|߯|&яzջ&BQ-.Lbu{TJB}x4LTzR71%ĵ +ÕEeN` a#Hm,ڙA(DN5̀^-b( ϣw,S\NE !"pPD:P֣<"5`=:8/ ~ygE#)QkC)c.>_ǬBd]! p̀_1ӾK!2e)[A^9tG_+Ϧ^F/p^ ~+ e_ޕuAP+}yuxJtXjqlh[&vIb).}R0wwSW'ͻCi/:ޣ0a~:Q,#)ʖKxoetT endstream endobj 6 0 obj [5 0 R] endobj 21 0 obj <> endobj xref 0 22 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000015183 00000 n +0000000000 00000 f +0000016591 00000 n +0000062202 00000 n +0000015234 00000 n +0000015556 00000 n +0000016890 00000 n +0000016777 00000 n +0000015777 00000 n +0000016030 00000 n +0000016078 00000 n +0000016661 00000 n +0000016692 00000 n +0000016963 00000 n +0000017146 00000 n +0000018191 00000 n +0000038336 00000 n +0000051296 00000 n +0000062225 00000 n +trailer <<4FC2DE12E22C4B5188B88322691C6F62>]>> startxref 62411 %%EOF \ No newline at end of file diff --git a/tests/DefaultTargets/images/Cool2WarmBar.png b/tests/DefaultTargets/images/Cool2WarmBar.png new file mode 100644 index 0000000..8396b38 Binary files /dev/null and b/tests/DefaultTargets/images/Cool2WarmBar.png differ diff --git a/tests/File Name Spaces/CMakeLists.txt b/tests/File Name Spaces/CMakeLists.txt new file mode 100644 index 0000000..1eb72f8 --- /dev/null +++ b/tests/File Name Spaces/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(FileNameSpaces NONE) + +include(../../UseLATEX.cmake) + +add_latex_document("My Document.tex" + ) diff --git a/tests/File Name Spaces/My Document.tex b/tests/File Name Spaces/My Document.tex new file mode 100644 index 0000000..752ca0a --- /dev/null +++ b/tests/File Name Spaces/My Document.tex @@ -0,0 +1,9 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +This is some text. + +\end{document} diff --git a/tests/File Name Spaces/README b/tests/File Name Spaces/README new file mode 100644 index 0000000..66dc07f --- /dev/null +++ b/tests/File Name Spaces/README @@ -0,0 +1,4 @@ +This test checks to make sure there are no problems with compiling a LaTeX +file in a directory with spaces in the name or a file with spaces in the +name. LaTeX itself is pretty intolerant about including files with spaces +in the name, but our CMake code should not be. diff --git a/tests/FindWarnings/CMakeLists.txt b/tests/FindWarnings/CMakeLists.txt new file mode 100644 index 0000000..4bceb3a --- /dev/null +++ b/tests/FindWarnings/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(FindWarnings NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(UndefinedReference.tex) + +add_latex_document(UndefinedReferenceLong.tex) + +add_latex_document(Natbib.tex) + +add_latex_document(Overfull.tex) + +add_latex_document(DuplicateLabel.tex) diff --git a/tests/FindWarnings/DuplicateLabel.tex b/tests/FindWarnings/DuplicateLabel.tex new file mode 100644 index 0000000..e95b076 --- /dev/null +++ b/tests/FindWarnings/DuplicateLabel.tex @@ -0,0 +1,9 @@ +\documentclass{article} + +\begin{document} + +Define the label once. \label{DefinedTwice} + +Define the label again. \label{DefinedTwice} + +\end{document} diff --git a/tests/FindWarnings/Natbib.tex b/tests/FindWarnings/Natbib.tex new file mode 100644 index 0000000..229dca7 --- /dev/null +++ b/tests/FindWarnings/Natbib.tex @@ -0,0 +1,9 @@ +\documentclass{article} + +\usepackage{natbib} + +\begin{document} + +This is an undefined citation: \cite{NoSuchCite}. + +\end{document} diff --git a/tests/FindWarnings/Overfull.tex b/tests/FindWarnings/Overfull.tex new file mode 100644 index 0000000..add4c3c --- /dev/null +++ b/tests/FindWarnings/Overfull.tex @@ -0,0 +1,7 @@ +\documentclass{article} + +\begin{document} + +This is an overfull box: \framebox[14in]{Box too big.} + +\end{document} diff --git a/tests/FindWarnings/README b/tests/FindWarnings/README new file mode 100644 index 0000000..e79a5b8 --- /dev/null +++ b/tests/FindWarnings/README @@ -0,0 +1,4 @@ +This test exercises the ability for UseLATEX.cmake to make sure that +important warnings from LaTeX are printed (whereas unimportant are +suppressed). Each of the documents should compile successfully, but they +all have a warning that should be reported clearly in the build. diff --git a/tests/FindWarnings/UndefinedReference.tex b/tests/FindWarnings/UndefinedReference.tex new file mode 100644 index 0000000..c6c2b68 --- /dev/null +++ b/tests/FindWarnings/UndefinedReference.tex @@ -0,0 +1,7 @@ +\documentclass{article} + +\begin{document} + +This is an undefined reference: \ref{sec:DoesNotExist}. + +\end{document} diff --git a/tests/FindWarnings/UndefinedReferenceLong.tex b/tests/FindWarnings/UndefinedReferenceLong.tex new file mode 100644 index 0000000..c86d85c --- /dev/null +++ b/tests/FindWarnings/UndefinedReferenceLong.tex @@ -0,0 +1,7 @@ +\documentclass{article} + +\begin{document} + +This is an undefined reference: \ref{sec:AVeryLongReferenceNameThatCausesTheWarningLineToBreakAcrossLines}. + +\end{document} diff --git a/tests/ImageTypes/CMakeLists.txt b/tests/ImageTypes/CMakeLists.txt new file mode 100644 index 0000000..15bddc6 --- /dev/null +++ b/tests/ImageTypes/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(ImageTypes NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(ImageTypes.tex + IMAGE_DIRS images + ) diff --git a/tests/ImageTypes/ImageTypes.tex b/tests/ImageTypes/ImageTypes.tex new file mode 100644 index 0000000..5250df1 --- /dev/null +++ b/tests/ImageTypes/ImageTypes.tex @@ -0,0 +1,29 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +\fbox{\includegraphics[width=2in]{images/Circles_svg}} +SVG + +\fbox{\includegraphics[width=2in]{images/Circles_pdf}} +PDF + +\fbox{\includegraphics[width=2in]{images/Circles_eps}} +EPS + +\fbox{\includegraphics[width=2in]{images/RainbowBar}} +TIFF + +\fbox{\includegraphics[width=2in]{images/Cool2WarmBar}} +GIF + +\fbox{\includegraphics[width=2in]{images/Blue2TanBar}} +BMP + +\fbox{\includegraphics[width=2in]{images/Green2RedDivBar}} +PPM + + +\end{document} diff --git a/tests/ImageTypes/README b/tests/ImageTypes/README new file mode 100644 index 0000000..c06307f --- /dev/null +++ b/tests/ImageTypes/README @@ -0,0 +1,5 @@ +This test exercises the ability to convert images of various types to those +that LaTeX understands. In particular, the more obscure image types should +be placed here to make sure the conversion does not regress. + +It is also good to check that the LATEX_SMALL_IMAGES feature is working. diff --git a/tests/ImageTypes/images/Blue2TanBar.bmp b/tests/ImageTypes/images/Blue2TanBar.bmp new file mode 100644 index 0000000..e4166a4 Binary files /dev/null and b/tests/ImageTypes/images/Blue2TanBar.bmp differ diff --git a/tests/ImageTypes/images/Circles_eps.eps b/tests/ImageTypes/images/Circles_eps.eps new file mode 100644 index 0000000..18288e3 Binary files /dev/null and b/tests/ImageTypes/images/Circles_eps.eps differ diff --git a/tests/ImageTypes/images/Circles_pdf.pdf b/tests/ImageTypes/images/Circles_pdf.pdf new file mode 100644 index 0000000..e2a6d77 --- /dev/null +++ b/tests/ImageTypes/images/Circles_pdf.pdf @@ -0,0 +1,214 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CC (Macintosh) + 2016-11-17T17:11:40-07:00 + 2016-11-17T17:11:40-07:00 + 2016-11-17T17:11:40-07:00 + + + + 256 + 156 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAnAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYqk3mPzj 5a8uQerrF/HbEiscJPKV/wDVjWrn50pleTNGHMufoey9RqjWKBl59B7zyeU+Yf8AnJBQXi8v6Xy7 LdXrUH/ImM/8b/RmBk7Q/mj5vaaL2F655/CP/FH9Tz/Vvzf/ADD1IsH1eS1jPSO0CwU+TIA/3tmJ LV5JdXptN7M6HFyxiR/per79vsYzeazq96Sby+uLkmtTNK8la9ftE5SZk8y7fFpcWP6Ixj7gAg8i 3q1veXds3K3nkhbxjZkPh2IwgkcmE8UZ/UAfeyDTPzL8+6aQbXXLogdEmf11/wCBm9QZbHUZByJd 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 + + + + 1 + False + False + + 5.027778 + 3.027778 + Inches + + + + Cyan + Magenta + Yellow + + + + + + Default Swatch Group + 0 + + + + application/pdf + + + Circles2 + + + proof:pdf + uuid:44a88084-8eab-bd43-b939-f3e88122727b + uuid:0e8fa934-0ba8-354d-b29c-89df65e519a9 + Adobe PDF library 11.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 362.0 218.0]/Type/Page>> endobj 8 0 obj <>stream +HQK +1 ݿS-*\xaf#Zo $=RC:aюzksq'4Iu:_ UH_V ̰i,Mx:'9Ez-?|nq+[iH`/L endstream endobj 11 0 obj <>stream +8;Z]_YmCCQ$q/M.p0T/YA/u7N8V5kR"b.u)N9_p^5EF3/Yc@jE*^BRTGP\rUAN.KO,aqeHW\sj*Ye-h~> endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 5 0 obj <> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 17.1.0 %%For: (kmorel) () %%Title: (Circles.svg) %%CreationDate: 11/17/16 5:11 PM %%Canvassize: 16383 %%BoundingBox: 52 36 414 254 %%HiResBoundingBox: 52 36 414 254 %%DocumentProcessColors: Cyan Magenta Yellow %AI5_FileFormat 13.0 %AI12_BuildNumber: 273 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 52 36 414 254 %AI3_TemplateBox: 233.5 144.5 233.5 144.5 %AI3_TileBox: -145 -143 589 433 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -303 529 1 1076 758 26 0 0 78 133 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 18 0 obj <>stream +%%BoundingBox: 52 36 414 254 %%HiResBoundingBox: 52 36 414 254 %AI7_Thumbnail: 128 80 8 %%BeginData: 19966 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1EFFCAC3C3B6B5B0B5FCB5FCB5B0B5B5C3C3CACAFD21FFA97F55 %552B2B092B092B092B2B555585A9FD38FFCAC3B5B5FCFCFCB0FCB0FCB0FC %B0FCB0FD05FCB5B5C3CAFD1AFFA95B550909F9F9F909F909F909F909F909 %F9F9F90909555BFD33FFC3B5B5FCFCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCFCFCB5B5C3CAFD15FF7F55F909F909F92B0909F92B0909F92B09 %09F92B0909F909F90909557FFD2DFFCB9AB5FCFC8CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CFCFCB59ACAFD10FFA95B03F9F90903 %09F9090309F9090309F9090309F9090309F9090309F90903F9095BA9FD29 %FFC3B0B0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB0B0C3CAFD0DFF552BF92B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B0909F92B5BFD26FFC3B5FCFCFCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB5C3FD0AFF7F0909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909097FFD23FFBCFCFCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCFCB5FD07FFA955F909F92B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F909F955A9FD1FFFCA8CFCFCB08C %B0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FC %B08CB0FCB08CB0FCFC8CC4FD04FF7F090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F92B %7FFD1DFFC3FCB0B0B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCC3FFFF5B09F92B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092BF9095BFD1BFFBCFCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCBC3109F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F90955FD %19FFBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB52309F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F90931FD17FFBCFCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB02309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F90903F92BFD15FFBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB523 %09092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B090955FD13FFBC %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFC2309F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F9F955FD11FFC4FCB0FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCFC46090909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B09097FFD0FFFCA8CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CFC6909F909F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F909A9FD0EFFB5B0B0B5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5B02B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092BF931FD0DFFBCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FC4DF909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F95BFD0BFFCAB0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FC94F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B %0909F92B0909F9A9FD0AFFB68CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %FCB024090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9F92AFD09FFCAFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB56A09092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B09097FFD08FFB5FCFCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB08C2BF909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F931FD07FFC3B0FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FC70092B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B %0909F92B0909F92B0909F92B0909F92B0909F9A9FD06FFB58CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB0FCB003090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9F92AFD05FFCAFC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB56A09092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %09A9FD04FFBCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC4EF909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F95BFD04FFB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB503090909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B09092BFFFFFFCA8CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CFC6A090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9097FFFFFBCB0FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC4E092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2BF97FFFFFB5FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB00309F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F9092BFFFFB0B0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB58D2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B092BA9C3B0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FC6AF909F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9A9C3FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB44709092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B09097FBCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC4EF909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F955BCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB52409F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F90931B5FC8CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCFC8C2BF9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F909032B %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB50909092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B09FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFC8D2B %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909B5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FC93F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F98CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB08D09F909F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F909B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC93092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B09FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %8D09F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909B5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB50909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09B0FC8CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCFC8C2BF9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F909032BBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB52A09092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B090931BCFCFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FC4EF909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F95BC3FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCFC47090909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09095BC3B0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FC6AF909F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9A9FFB0B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB58D2B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092BA9FFB6FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB00309F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F9092BFFFFBCFCFCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FC4E092B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F97FFF %FFCA8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CFC6A090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9097FFFFFFFB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B090909FD04FFBCFCFCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FC4DF909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F95BFD04FFCAFCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB56A09F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F909A9FD05 %FFB58CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0FCB024090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9F92AFD06FFC3B0FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC71092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092BF9A9FD07FFB0B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B08C2BF909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F92BFD08FFCAFCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB56A09F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F9 %2B0909F92B0909F92B0909F9097FFD09FFB58CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB0FCB024090309F9090309F9090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9F92AFD0AFFCAB0FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FC94092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B0909F9A9FD0BFFBCFCFCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FC4DF909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F909F909F909F95BFD0DFFB5B0FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB58D2B092B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B %0909F92B0909F92B092BF931FD0EFFCA8CB0FCB08CB0FCB08CB0FCB08CB0 %FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB0 %8CB0FCB08CFC6909F909F9090309F9090309F9090309F9090309F9090309 %F9090309F9090309F9090309F9090309F9090309F9090309F9090309F909 %0309F9090309F90985FD0FFFC4FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB44609092B092B092B092B092B092B092B092B092B092B092B092B09 %2B092B092B092B092B092B092B092B092B092B092B092B092B092B092B09 %2B09097FFD11FFBDFCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFC2309 %F909F909F909F909F909F909F909F909F909F909F909F909F909F909F909 %F909F909F909F909F909F909F909F909F909F909F909F909F90955FD13FF %BCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB524090909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B09 %09F92B0909F92B0909F92B0909F92B090931FD14FFCAB6FCB08CB0FCB08C %B0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FC %B08CB0FCB08CB0FCB08CB0FCB02409F9090309F9090309F9090309F90903 %09F9090309F9090309F9090309F9090309F9090309F9090309F9090309F9 %090309F90903F92BFD17FFBCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB52409092B092B092B092B092B092B092B092B092B092B092B092B092B %092B092B092B092B092B092B092B092B092B092B092B090955FD19FFBCFC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FC %B0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCBC31F9F909F909F909F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F909F909F909F9F931FD1BFFC3FCB0FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB0 %FCBDFFFF5509F92B0909F92B0909F92B0909F92B0909F92B0909F92B0909 %F92B0909F92B0909F92B0909F92B0909F92B092BF9095BFD1DFFC38CFCFC %B08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08C %B0FCB08CB0FCB08CB0FCFC8CC3FD04FF7F090309F9090309F9090309F909 %0309F9090309F9090309F9090309F9090309F9090309F9090309F9090309 %F9097FFD20FFB6FCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5 %FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCFCB5FD07FFA955F909092B092B %092B092B092B092B092B092B092B092B092B092B092B092B092B092B092B %092B0909F955A9FD22FFC3B5FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0 %FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCB0FCFCFCB5C3FD0AFF7F09F9F909F9 %09F909F909F909F909F909F909F909F909F909F909F909F909F909F909F9 %09F9F90985FD26FFC3FCFCFCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB5FCB5FCFCFCBDCAFD0DFF552BF9090909F92B0909F9 %2B0909F92B0909F92B0909F92B0909F92B0909F92B0909F92B5BFD2AFF9A %B5FCFC8CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CB0FCB08CFCFC %B09ACAFD10FFA95503F9F9090309F9090309F9090309F9090309F9090309 %F9090309F90903F9095BA9FD2DFFC3B5B5FCB0FCB5FCB5FCB5FCB5FCB5FC %B5FCB5FCB5FCB5FCB0FCB5B5C3CAFD15FF7F31F909F909F92B092B092B09 %2B092B092B092B092BF92BF90909557FFD32FFCAC3B5B5FD05FCB0FCFCFC %B0FCFCFCB0FCFCFCB5B5C3C4FD1AFFA955310909F909F909F909F909F909 %F909F909F90909555BA9FD38FFCAC3BDB6B5B0B5B0B5FCFD04B5BDC3CACA %FD21FF857F55552B2B092B092B092B2B55557FA9FD42FFCACBCACACAFD2D %FFA9A9A9AFA9A9A9FD22FFFF %%EndData endstream endobj 19 0 obj <>stream +HWyo:/Ţ hQ%iz7ay]AKZ(ʉwHV6:c {Fo>v#1NB7oN$%Jcdy*I~n?7TLǚ Tnͅ5t@n#c4$^4e4z"#O{y6r.=ِ[%ދ0X i.dzN$Fd +C9 02N9Q;ھn^xt'l}G +ߚsR\}4<k~)3|=(`HDޥOk:O88Xk;NCuS!v= / )_.?F"R(e9gq*?Lu "^}DN )OAy,/Jh|-nfÖF mBT7wa4HC`+ɦ,>.tgE6 +/~ ;=toc/%ܨ _@*\Rj]qt":ȩҍiΫ~ϒ#y aHkƥπu&E[hLuXol=Ber`+ +#n'1+sV+& 9bD."PcOxEе$!ĥ֟[$٥?Q34 + |쏜[QsQWYzA6T-:U;MM^- `f9JXr$r>U>("]eL\!bPV=QM$n>[G)r'zAI1CN0Mp{%o>6}d\}=@GdNшVBK ]5 3°a|ςXvږmlϳa蹁k(mN:Au5ckNПr%< ~ {XB?Fqw tVc/8heN  L/i}%4dUAR{{ph> V+L qxk+iϐdD.痰>|sRI(ŷZ+%@T8I\FG}L_j6;(Ǣ ³RV r1|.Vh>zM3ap"З =T~6~}\w4ǶR'[+L8'wFw*ޥE_8y!v.S)=u웎y].H*Mo_4~2H9 ^l )͜Q6SX_m2EjEa{i;.;ر|i;obD(V]IX+ÍD&CYy*̩",>?G'G$lN:sMXS,tYV^bolL +ugE!D?r! Y:[| NbzR6aHUF~;pERLy1>nYƞ >xyxV]h؍r'kƩC?È".nש??)#&}6gæcw~.*L }\2H=@Ln TDҔEbAeUB +z$P,N4\Јes4_w|Yl![ xtZ: +]V{V9Ի Id߈v[XN\e*Ԏ3*dZi.B @kyA$fdJ@$YRnYTg:H5DFL6To{>h$Nm?\)Jٷe ;(! yQvq?P #VXw<^m=E? +?֖&EsMD'XPM9%!S^ o8˦ޞF6<Ed Xr})MHqNһrK֤gEe䣄nDwNG`$6n9EnerjFQ&$=҇4ț~*F.f l٣ AqqSCe 7f 3URܕK]]&brvƛE__/o"WEl뺷2 vz pIZ6\#]SreޛNԆlT{,Uu꘭u&[Z]q^κ}瀛ּKV3Sv5bwV +8di $] h4ʭ +}"8uJJ&DJIa>\;iP=%W})V`gSm~Hb5KpoͬʥH/h N^04Oi*2{+_q[aW.W^J~azQj +UVY46NMI?9sW{Og*X]tM ,REϩj=IZu.%&`MRٶ +KjccE~eH>,[\җcq(tAcad%|5LL ]sQa-68q G7&/77cmG\t.U\GbFQ 㝇yH-HEH!G&*};KӐ̥xrFU& $57M$ILB"ZdM` 9XbŘu~%y0I3q,SvI ٪ +*ʜ4K/CNiQ4-b ^F34잭˓s@#/882-Ȋ$0"̡P 4 k8 6SU@]<"u)lR1`@<~8a.\0,`[R^% [񒣋V!,[঩f0tˡ10yX`d=I5 }cu`m +0QWS€ 9Xu0@ ݝ|b*1IO=`y/ } <;>x,%̀,?XBNXJV[/XQ_T(Cb9TwVb!*]{BU( $"_ C(6IAxئcgJe@t-&0pH +xH$5=R5](SJK KLaG6F_ +Sm~nϙb$=ksۉBSl K< e I#PTOU¿^ D ,qӮ'I3`h@OM +#f` |dP19(SK>TZ3 LBcf@| aq|dK += )}XI1_o%J;rd8X—M> K[)Rz)Ȫ[J,Xj%nGi4̼X7b2gKvgPs6a7\6$M-w5Ï{#Fӧd.޵d8W<ޖ%w[G +3PmdGPeh.JEUb$WeLhH2L p2sYM p䘍,ܥ%-"~;0s {5(XMrO W]cae 5n~QQL-svi3$cݵ?.73WؚfIgpELVO +^{aɰ5-7G0/NlJfXl*IΆ,?o)Ȓ})`*~cDPPB$r0_"-O]Td37z)rC+پ +&Q:z ~6ۄ +M4R?~+8]4zص| Kk3CzKW%c؆7c(J//ZNlt1i>m~w'ʥwS֏ok/nlDNpoZت]vKõׅqaᠰ3ӏI +;W_U\:mݪZWiݬ5ǻ?zds_c^x:m^.CP>ǽ։Ry7<+Ws^ع/6wm8b^5ogGQfzank̵k! 8=x3th5w*|V7N@Œ<[=ƥEuG՛˥ j'|vso*<7ae>=/ pdN=NG1/ޚDiF/ulZD_oO6N;_?$>R)F1 +7[({7Fl2jG$DH5Z?]k^-dO{}v2i,tc~llp܊+MQ(Il1_݀Z.]lԼ:f֫t!U +?+*KjW]Rs)ͮvK333́h >墁ݎB ڐ塮2ssh)+~ 2h>; "01Vj+Gtx,Kª@/:E]wVKtJO4N<7O|-NZAkƳz ^B +jL ז+2hyDлY +ʰf͑}Cms V#ZuA史 +>//4[ˏdZ՞)(`(kh fsP)x(}ptlrЧKy s6:$zc*jv@a{#8{V6.534M "2Ĺ/jP]\;C$CX.݌ Mo&s +"7oCeX18ARcXS*l&7W!48 prx{L ++E.*N@:B)%LK%Zq@b¼$[!UZZȠNr +7O!&^ DnGd\@db3Crԅt}''cyk7 Q6^S%1NZic!N5 3Az7u/4w~98S*ݎ#-O+|_0K;?Lj7K)O\Wϴ9 ZĞG):_WcWHuKȹGPm9+Ԉ] Az|}S-b*HSy&-a=n2:ZO'09pZNAFˬv 5dʤ׬n5f9- b6+7'_hghH!_B\=^OhMD!"+Ky?o/!{r}VwVW#lbdut3x\v܇GػvȠ~,LP0TXε(@}'4b0@d`F0x){O,N4p"(`4-Ix)RA@T`3:hAa"|mdՕx?ΓAQLٺ1T)iڥxҺ'? JOsHr781Th +oֵ^_{ՆX+h7zbˢL#)w=ps,x,1(vO7<&[M[ZZ゗+¼LH+9:?ұ<@}s- *J2˗͍R_IP)|)UFCPk:4ЬUO`ZPO[cz='tB5U%+ܞjbvPbWt7+ŇZVlư0ׂ.sǬrg־59aiH-{E.vGsb fjC\Ū۠5uS2wJ,7^w˨W&2w^ō I]i~`D$h:rR|U \?6 ee[>48y"0-rD7')Yķ3ΜzS xQ3Qn+d;Ӣ0l'M]*XWIǠQbnRM&Lf<sqa*,\_A IwF MƝ߹g]U(/g_ktlyrٛgYs|Kz1(w+>1,b7QkXfK%|Л Z.)^`ph,^j%C١|L+1l"U(:kcqƒ&k +/TZ8#Mc֢1Ŋ, "8&ԶG0nܐG>3v5S$`R@7AdT&Q홗 L$Maw_s AvQI{](fª;^On5]̏Wm{y۽lH$^%b2ŧ `8)X/`X)S keoqʒ^R6"In\qOݲbaKn6l`'rRZ[Evs uQ8" oǫY3&+Cƙ6`eQT9NӰ LF`tT0q*y٩d +t)M6)vX!k1}uS/lG`MicƠ2+ 5q^W1~vҾ9u8^y!;oƪ'bt$}ꨣhY|Y!rTQ.zy>Nɧ ,"2AbѧZ |ƒtyd4O1k> {gY˾x0?'hC~0D;^tHM:g|tSkhBaeUo}V&EPNbV^Ԍ !\ k$z3 g)x3FW @Cv:J>Z ՘=v8ءkkι]w*>Vb', Qx.U&]kauU$co7;(gJɡ"Bk8b;n?IJBn%.~9W/迮{*A\f)c%P]Xqدg|۲/P[oPڃVX49h+wî(B0".3p쪆y6 +7ۚ 7?\hqe6D, =Q=MbcW ,>Ő&&ZU$Ȇ\(0IW>Zpa.0yE`6eyX ӘJLVx?w.B% ()CH&CŎJЖ1"ئ\=e;鰾^UTf +DC[ ^fZjrGZ0F9ZB*wpC+ZMFzy=y_;J k-a)$і'bȢ/XIXd) ]>;# O2ej 8D^bBz%./lf4,ЯD2ރѤX\޼WQ.WN=WOe|_#Wawe-.DX[,02v7Ӎ={ؐu^~];_ܽ׃HuǨsC,|;7ƹU*/OnsmzF !h}{Ӣvz;x3nuvꪼAJp9%}!nn1i5zJ9}ܦ2^jF{lE;=wh;t~N8/U4vϳGtbk2vAr:jf3Jn*X^Ol9Ebz>9Di,|yl*YwlfHqœ\YwLD1,q+j2?Z.z}SPt*% R2T᳗u3o +!aȃ{5 < xѦZ{B)Īߔ߶iu:EAnk:UB4KOzAxG`0.!9lN[Qp8;L~hBxQ.hCNns0cuslkL6욧2?˪6|($uk\@*x=h25fRZB +Y/&_ûfyI Ȏ=t;=R~Q9Vy!E45 mgcri(Xz5: $1wRT *Ta0•ž'{_6Ĥp ь,8,td>PZp:2gw%*9E#IFTCTT;Jg%$k{뱏k&JGuR+wRr3qԩF+GЭ!9VA g@ry&$VPӺ4-|v:d]rӱ3g컞,YV@ӢGiGoų+tC:}^YsuVZ&Q}VOx@'*shy +N ьYώc>HlՑǹfYJHTX̤z9Wa!T`dV,9L.Yrs`1 [I@ 5ޱߺƣcA &Ф[TOT1`B[pQ'{-eеLȩd2{ޣ} ^X-֛luފ$C2X;ωWW6@YwP-Ph= ѩ1`g)Șf ;`+!YwN YE9+[1:]*d,11+5A0r%FsfaF-d̶"GhKKŕBrG4yĶ^лܔ ;OmIwE'JiKm2:Q\;J!'v3[hwLƫEʔa*1YI7jYi|l|}p$H_xt;j0lvrq!2#G "c8{A:C+cB} ^lJ{beI-4ߕLCa޽e+)ݚR+Y5vuޔ9Ks s*BG7l4wBSt7Ӭ>̺8>Y8:`bh8MxhnOjyvqZb v彽PN_}>4|E4W}h&val~ji_ c Dіlߺtr_J $Q#rqKT (#3 +e-(x=}rȹpn!ۯ^ۃ*L +rşB|_Yw {W=ްx 1S=JJ*ɐl@OKm9X{kL8ɐ?]tw=٨G.Ne.1["Χ%&/66|_~MK<]WtXyrDw2ʓٓ =x0-p#$q~:mBݝ>r&KU̥L>qҋ_~*O MX^ c=uK켈B/Ǡ(<\|{ tRVܠ.%g&2vZ {+ *[ +n A/U`.ըEy0 1u|E&AC^\nJ& }}ܴAV+"r\"ȆHђezRTU)%10Yh{N0o[^4ndb̈K֝3ecFfJWfuY|EMvN. !ǐ>a^.%bo3"XĠH ՁC7rddTF⬥9=G|W׌^ʀc^&Nf1*Z֙d1'pvU(M%F)QϞ^rw2۰H:1Jƪ_ +r-P +N<aVgrR.+ix@Jd^GWӂJk6ϩxEkrxeAvyUn:"R&O |@gG[.-+m*.i;e#g+Q^D5ŋ('++լ]Dwj o_=]C%YUR}K;IVzvRtrzځ& [j-iU;-Ux,WNI>stream +HWZJ}<K Ԡ삌0,WFF;!n iOUN-EAw'I%Og[T ٴ$''bSzSNJs-[=JZuQfBDe$99b~R명xk}LIx/Lv)q%]H\2jtT3z:B"z\ w2e[uVWɭ#?(pˊBgjAʅđ'\I<*{0 "-o[QeyrA +( + 8`{F bW2 60ϵ\:wJmp24qv3L +T2ֶKήP-I{Ž", cSo"de6FV+m +5<.]"6{˃yBuc'0FMe1A-(ه-ݢ$+6 {`ce~g& x<~rS'rf@1Saҭvx~r.s_rW;i~2W:(>I}zgI%>.1ԅ(߆+?HqcUqeH??IrYd3$/z-{H`L]y%xmFԟ>0?hkTWU(Yk4ևF3Aۨ ꧿ +XP6fS{)zeÊ0F9$Hq*cG H +"+ XVQk4+EYvU_UaIвv?ݜn.I]B(ڨQJJ^#J]p +^Fy?'?[E }.,Rn.!S˓ٝSg dY{^Y)QWoQ4ʋY:OgsY6B]Mj㆘0̛%x8Ww_X,W>ܣ +Qlw$/ȭ¹ RuI܋-cǸZB컂- GbGLRK瘽Nq +{qӞiT%1.ftobÊg{[ *A4dAD?,:$1S.n/ ʃUTr ۶&k.b }ܜy~>-= Wϙ,kѴ:;,5W5+%`q9uiIJ{Rnw{Oy\YbX{ 05Vx`{Wc81rFNK=o + _mM}(?CY0aMU!_ w|{zb] +1^;jkx`@-~c/:/RAPV,4m٣ +ya"Ϳw/dl;zCOM<~MQ+/;e#}(n2RڤÎTOHiEgϚ$7C>RiX߯]'?185\#C>4O;ĝc׮#Oa +zQ:VZs咙' B1ԑ \,yKXNM&܋}>I0MXm75F\$iFxԁd;d9F!|̝冖5n`,shch"|B溢LÎkT] H.Ε?]"ēu`e@ -1*grneYn%]h=M1wnӠb R>@ ' 1+"& ;f; HDChPV94l j +5r> kXcvD(ĐkE3pUbiݪq#-"aJ\(=ֻfEe22ɺ_ʲ~|0BrP..C|Xl77$#%*BVIUXb/0 +n:{@8 +f]\*_C*2 +5yؿl+ܗX& At|כa +dP%\@S(iw0,u| +fesi+4NqLommH\tIcHؙB$4}IVPmXh1 ˃3tRMh] [x}yb܋V`{8X6P8{!zE8anC-oC &`&TFnc%36K e-`^ac^e ǃeJLmx |Im1J-=;]5Vx67!5}mq0\qq1ȅՒ[䭘x§&UF6&DVGiCӚ?0!o1bwT"|1IȀl+X6(H2/ q0~r7[|qJ7]Q;$c?uW\vC{p%~E* )a*qJ^tJDpډ Q@w/s#a,5G|\,~=~ 0f?móդ[{Љ4L_ZM9Ĝ'1ʤ2;h#{,b"Յz0"Xʝ0]j49{! `nFy穈9 xMvsӲa6+me$}hϢ'2c1q8-VZer}^ROSa_B_I$p7^ā{Km?չ*E@ȈƈKl1FkbF#{F9ļgZkS[ė"TLu2] U}ƅ+'$eCL*ctQ53xjh=Cvl =nzQ]NſF]݉wa*oktBց%AemMzQ/CzQ]/CLYxJ["_pft& :/ou%שׁR#P蒔@0QIZ}Їŗb%oX(v8@|}z=LdςEBKfѶ0 +sw䜌k|"eڋ/U&*<#^P1#(#v1V {&NqRhmiwGg$k;k & +eWB<ź% RLZWoo$(.S]]v4Sm%So= `( CHEHm4a \&/=[ۢ6ˀ;y(bݝ.$>)|/-ގ s zxpM;͋;p/tgCe1$砪d1ʜ+oWUQXzLFp:6qy9"z;oK^7˳oz3zS?@0S;9B߰h>T g>iզ~ ݻ%m2}\!(2hqP+ʳ-+mfv<00 }5eFOrSϷ{ s@o8e|iweo=[\}r%u$%3ۚNT#tK#>e߁ BrFE*xT3i`]ڱn&go:|:͠D\-9"j>rW&pt'&`PԃQYl"X(a6`3d'+MdS.Nƭ +P0,vjQJe&OdhD1MoR^U1i3l^RXLd41((^oQ[>)V.#E+8)4 19mw.4weH0+h +D\e PD$Hή4J:& e./ t&ݣc0Zզ6^FZJM4!՜Ѝau[8!2,*WT˩>=W+C-54(ޞъ&_Ca.uBr+IR۫3FuTyį~Cʽ +$WV5v)?gz<# -1D&\gO&~|R9o*[da_m;|5Y PhvH^~u:+ʯ%7B^,v%_k`ZX/2~_\bW/M E^_㳅OjBW@ɻ[n6vA<‰ i)V +ۥ# T]68f=y9R\kN|NlǾk fwN?t6p ~rC\,I-M&7yf!.Mh^8C1=7`~QM-R-@ _(s9{ԨH渣x+]#5_.0虈zW e}z"`x_u,IA~e 9j)O{\xJVc~9'V9PǍgA &\#lېU*f `'e(b(`l`)R0D).+6+~)Zq2~ֲSi`~Z_G{u_8(2: RcCV9\p^}{CO6tp}E󁝝QUQP+;'䟟zR0z*pMI-6@בgas$ߪ;qtcnud zcn\sZUeΝg8Am[es9iT-kJ\J3Q:9)4VWtY7e OO˪v*hGyla3΂aͽ@,co1lV$Ą0NDCdH';</ Ģw~uRw *D" ŗ5ٵaA%G%{Bk+w %n08bO 6I"GoeM1`eǿa%ل gc?ӻJ-X,"e@2;+)*RYL +ey;X3 $;VI; qI9H~mR t$!1 AJMVt)K( #F +їxcMaͻJ &6cU# |c'j$YSXH& @Ѓj 1O!ʣL0.@AapN<TA=_&hpvo@}a&NWƄjС maŮ E5\ L52-5`N?][6&g6BQڊ >dN{{`" c c,wj߫[)> lL&˾L>Nc!0.UCp|%\\`-96y$6nmucڒ-Goeɀ2Ȩ5)y-m/}v֛:Ys +~TւWУMe` lx8O # 9@szKgaih\AZ# S0Ud䋝c]B#@Ґ +UҊ(({缪ivTCf,uM-p@Pol. wIU-?eRet/`22 ᥆P<H]Kߊ7TҖ|dU vYY&juX^~'"(OŽ lldWB `=&QvD.lPQ6=P,Ywd }7ـ-:7:zLpkdK;j̟sW$WnxNC̀ Ak諂?'aRjѬ[wSr|Yz÷/jzKV8ijGUj(,<#R@vPb0PM7!" Ҩ nx37?|6&lMdLPUɦ&_'z.cR uSEIfh!T v\1L'9Y%Kb,d"RH JxKw`PLkjd&Mm\.xƐL7)+ +w* +|mh&>lu/(ȴn} ɭA =aۖL%@(_KDz1y|=I+]L[ǷVl~a"Qƣ|ChR%*h-T;)Qxjĵ2֪@k4b5QF ~Q.5,ĕ=Kժ˒M01v +Y!rN6P\1Tfp]]ܷ9n!@R߅kj, &F{*pĈ 㻄$ +4>5bxmrq-Xm{GhE$|@H +m~  Q!;xOS=`=^0@#kIҭĕ [F- Pb"( +s?ouw6qxN뫪uѬ)d? &!vXeΚSb`7IUAp3/i\3N)?){Nr5j$cr<31eמᎯi&9I@v=j/!lJ@cË;]]eynPǑ)%!c6kH9*.#%qh'Q0;F:64tU˥Kg@4K\Ϯϖp5QZ%_^u̞!+`̳,TCahHe4o?O.t!c5@b  ,d bPp\-mt\Iz!n٢ +j *N2eeWVg)Yt|`Ԕ26l܏8A09UnrrwbqT9jw #LHg +CsEX +Q5Fpn{ m$`N$'d.4di[qK >ʲ_Nf-, ¹'Y`tCpyHRX< a]4 +5 B'6,*,b_SMe Ie5Zrb9:b-IYsN/xXk装Nzm#f|PD_Q&+\mV-[Qg1Ǖϳ+U 2\D$.҉f#7,)oψ^+ xggCMAolT' 7(bs)!Չ+R7f{dw6=BrQ,usԀQeP2|e'lY,SЫGӅAȚlHȄܖ=5l@_epp0"P Ԝ%uxBRRQtbwnl%+ boF~laz,.'B„PJ2`.v: Es+d3/AH>B,zB#q)>[ *eQWX:T- #æbG倜) ^C}yf6.H p2.c}N6N'WN6N% Lv:A^NBvJ).pS(kgYqmq0^>xlxbO@n۩tQ*}e]0>gj 7*37nӪ͘-[3f',vJۃgV!طַd0 ’'NOdnx"MEF[#ԡCC"7C;$ 2lZ ᒐ1̪K\{en5,y87͂s/ mSM8?Oр]AWƸCQ-g,,\{,_)C|W c_ʙR&a`M3g&%8a֥<';dq: ގŢrgH #ોzx>y z@Aa=t40J-xlpaa=q<7kp/Ct0ycL)wai@qUZxiȧd +X(RӔ2+c +t\~{̑>O^r48.'9E0Z+BH&Yk[Q䠈&` { zNi$q +AT]XZ,4>IA{bjUG]sC_NB+&ctL?f'Vq%{E? J tȯp^a-FǼ !8iyw.J :`YzO|߯|&яzջ&BQ-.Lbu{TJB}x4LTzR71%ĵ +ÕEeN` a#Hm,ڙA(DN5̀^-b( ϣw,S\NE !"pPD:P֣<"5`=:8/ ~ygE#)QkC)c.>_ǬBd]! p̀_1ӾK!2e)[A^9tG_+Ϧ^F/p^ ~+ e_ޕuAP+}yuxJtXjqlh[&vIb).}R0wwSW'ͻCi/:ޣ0a~:Q,#)ʖKxoetT endstream endobj 6 0 obj [5 0 R] endobj 21 0 obj <> endobj xref 0 22 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000015183 00000 n +0000000000 00000 f +0000016591 00000 n +0000062202 00000 n +0000015234 00000 n +0000015556 00000 n +0000016890 00000 n +0000016777 00000 n +0000015777 00000 n +0000016030 00000 n +0000016078 00000 n +0000016661 00000 n +0000016692 00000 n +0000016963 00000 n +0000017146 00000 n +0000018191 00000 n +0000038336 00000 n +0000051296 00000 n +0000062225 00000 n +trailer <<4FC2DE12E22C4B5188B88322691C6F62>]>> startxref 62411 %%EOF \ No newline at end of file diff --git a/tests/ImageTypes/images/Circles_svg.svg b/tests/ImageTypes/images/Circles_svg.svg new file mode 100644 index 0000000..db0ef8b --- /dev/null +++ b/tests/ImageTypes/images/Circles_svg.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/tests/ImageTypes/images/Cool2WarmBar.gif b/tests/ImageTypes/images/Cool2WarmBar.gif new file mode 100644 index 0000000..141ce2a Binary files /dev/null and b/tests/ImageTypes/images/Cool2WarmBar.gif differ diff --git a/tests/ImageTypes/images/Green2RedDivBar.ppm b/tests/ImageTypes/images/Green2RedDivBar.ppm new file mode 100644 index 0000000..6b614e8 --- /dev/null +++ b/tests/ImageTypes/images/Green2RedDivBar.ppm @@ -0,0 +1,4 @@ +P6 +300 15 +255 +3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7;3579:<= ?"@#B%D&E'G(I*J+L,M.O/P0R1T3U4W5X7Z8[9]:^<`=a>c?dAfBgCiDjFlGmHoIpKrLsMuOvPxQyR{T|U~VXYZ[]^_abcefgijk•mÖnĘoęqŚrƛsƝuǞvǟwȠyɢzɣ{ʤ}ʥ~˦˨̩ͪͫάέϯϰбвѳѴҵҶӷӸԹԺջռս־ֿ£åĦħƩƪǫȭɮʯʱ˲̴͵ͶθϹϺмѽѾϿϾνͻͺ̹˸ʷɵɴȳDzǰƯŮĭìê}|{zyxwvttrqponmlkjihgfe~d|c{byax`w_u^t]s\q[pZnYmXkWjViUgTfTdScQaQ`P^O]N[MZLXLWJUJTIRHPGOFMFLEJDHCGBEBCAB@@?>>==;=9<7; \ No newline at end of file diff --git a/tests/ImageTypes/images/RainbowBar.tif b/tests/ImageTypes/images/RainbowBar.tif new file mode 100644 index 0000000..f910848 Binary files /dev/null and b/tests/ImageTypes/images/RainbowBar.tif differ diff --git a/tests/IncludeDirectories/CMakeLists.txt b/tests/IncludeDirectories/CMakeLists.txt new file mode 100644 index 0000000..b60a4e1 --- /dev/null +++ b/tests/IncludeDirectories/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(IncludeDirectory NONE) + +include(../../UseLATEX.cmake) + +set(UseLATEX_TEST_NAME "adding include directories") + +add_latex_document(IncludeStuff.tex + INPUTS CopiedInput.tex copied-subdir/CopiedInSubdir.tex + INCLUDE_DIRECTORIES + copied-subdir + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/uncopied-subdir + CONFIGURE IncludeStuff.tex CopiedInput.tex copied-subdir/CopiedInSubdir.tex + ) diff --git a/tests/IncludeDirectories/CopiedInput.tex b/tests/IncludeDirectories/CopiedInput.tex new file mode 100644 index 0000000..1ea0283 --- /dev/null +++ b/tests/IncludeDirectories/CopiedInput.tex @@ -0,0 +1,4 @@ +% -*- latex -*- + +% This should only compile if working with the "copied" version of the latex file. +This is a copied input for @UseLATEX_TEST_NAME@. diff --git a/tests/IncludeDirectories/IncludeStuff.tex b/tests/IncludeDirectories/IncludeStuff.tex new file mode 100644 index 0000000..0fe86c1 --- /dev/null +++ b/tests/IncludeDirectories/IncludeStuff.tex @@ -0,0 +1,22 @@ +% -*- latex -*- + +\documentclass{article} + +\begin{document} + +% Make a line that will get a parse error if this file is not configured. This makes sure that the configured file is read first. +Running tests for @UseLATEX_TEST_NAME@. + +Included from CopiedInput: +\input{CopiedInput} + +Included from copied-subdir/CopiedInSubdir: +\input{CopiedInSubdir} + +Included from source dir: +\input{UncopiedInput} + +Included from source subdirectory: +\input{UncopiedInSubdir} + +\end{document} diff --git a/tests/IncludeDirectories/README b/tests/IncludeDirectories/README new file mode 100644 index 0000000..f1e6d50 --- /dev/null +++ b/tests/IncludeDirectories/README @@ -0,0 +1,3 @@ +This test makes sure that the INCLUDE_DIRECTORIES option works correctly. +It tests to make sure that it works against directories that are copied to +the build directory and those that remain in the source directory. diff --git a/tests/IncludeDirectories/UncopiedInput.tex b/tests/IncludeDirectories/UncopiedInput.tex new file mode 100644 index 0000000..1469ab3 --- /dev/null +++ b/tests/IncludeDirectories/UncopiedInput.tex @@ -0,0 +1,3 @@ +% -*- latex -*- + +This comes from a file in the source directory. diff --git a/tests/IncludeDirectories/copied-subdir/CopiedInSubdir.tex b/tests/IncludeDirectories/copied-subdir/CopiedInSubdir.tex new file mode 100644 index 0000000..1ea0283 --- /dev/null +++ b/tests/IncludeDirectories/copied-subdir/CopiedInSubdir.tex @@ -0,0 +1,4 @@ +% -*- latex -*- + +% This should only compile if working with the "copied" version of the latex file. +This is a copied input for @UseLATEX_TEST_NAME@. diff --git a/tests/IncludeDirectories/uncopied-subdir/UncopiedInSubdir.tex b/tests/IncludeDirectories/uncopied-subdir/UncopiedInSubdir.tex new file mode 100644 index 0000000..6140025 --- /dev/null +++ b/tests/IncludeDirectories/uncopied-subdir/UncopiedInSubdir.tex @@ -0,0 +1,3 @@ +% -*- latex -*- + +This comes from a file in a source subdirectory. diff --git a/tests/MultiDocuments/CMakeLists.txt b/tests/MultiDocuments/CMakeLists.txt new file mode 100644 index 0000000..eae6ec2 --- /dev/null +++ b/tests/MultiDocuments/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(MultiDocuments NONE) + +add_subdirectory(subdir1) +add_subdirectory(subdir2) +add_subdirectory(subdir2_2) diff --git a/tests/MultiDocuments/README b/tests/MultiDocuments/README new file mode 100644 index 0000000..288e750 --- /dev/null +++ b/tests/MultiDocuments/README @@ -0,0 +1,10 @@ +This tests appropriate behavior when a project (or multi-project) tries to +create multiple documents with multiple add_latex_document calls. It also +creates them in separate subdirectories, with each subdirectory +independently loading UseLATEX.cmake. This is typical in a large project +that might bring in several subprojects. + +When running this project, 3 documents should be built, one in each +subdirectory. You should not get errors or warnings about a target being +defined multiple times. You should be able to build using the pdf, dvi, ps, +and safepdf targets. diff --git a/tests/MultiDocuments/subdir1/CMakeLists.txt b/tests/MultiDocuments/subdir1/CMakeLists.txt new file mode 100644 index 0000000..dc3e83b --- /dev/null +++ b/tests/MultiDocuments/subdir1/CMakeLists.txt @@ -0,0 +1,6 @@ +include(../../../UseLATEX.cmake) + +add_latex_document(Subdirectory1.tex + IMAGE_DIRS images + INPUTS IncludedFile.tex + ) diff --git a/tests/MultiDocuments/subdir1/IncludedFile.tex b/tests/MultiDocuments/subdir1/IncludedFile.tex new file mode 100644 index 0000000..88fe51f --- /dev/null +++ b/tests/MultiDocuments/subdir1/IncludedFile.tex @@ -0,0 +1 @@ +This text comes from an included file. diff --git a/tests/MultiDocuments/subdir1/Subdirectory1.tex b/tests/MultiDocuments/subdir1/Subdirectory1.tex new file mode 100644 index 0000000..8585910 --- /dev/null +++ b/tests/MultiDocuments/subdir1/Subdirectory1.tex @@ -0,0 +1,15 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +\textbf{Document from subdirectory 1} + +Here is an image: +\fbox{\includegraphics[width=2in]{images/Cool2WarmBar}} + +This included file should show up on the next page. +\include{IncludedFile} + +\end{document} diff --git a/tests/MultiDocuments/subdir1/images/Cool2WarmBar.png b/tests/MultiDocuments/subdir1/images/Cool2WarmBar.png new file mode 100644 index 0000000..99397fb Binary files /dev/null and b/tests/MultiDocuments/subdir1/images/Cool2WarmBar.png differ diff --git a/tests/MultiDocuments/subdir2/CMakeLists.txt b/tests/MultiDocuments/subdir2/CMakeLists.txt new file mode 100644 index 0000000..ff398a0 --- /dev/null +++ b/tests/MultiDocuments/subdir2/CMakeLists.txt @@ -0,0 +1,3 @@ +include(../../../UseLATEX.cmake) + +add_latex_document(Subdirectory2.tex) diff --git a/tests/MultiDocuments/subdir2/Subdirectory2.tex b/tests/MultiDocuments/subdir2/Subdirectory2.tex new file mode 100644 index 0000000..b750ffd --- /dev/null +++ b/tests/MultiDocuments/subdir2/Subdirectory2.tex @@ -0,0 +1,7 @@ +\documentclass{article} + +\begin{document} + +\textbf{Document from subdirectory 2} + +\end{document} diff --git a/tests/MultiDocuments/subdir2_2/CMakeLists.txt b/tests/MultiDocuments/subdir2_2/CMakeLists.txt new file mode 100644 index 0000000..afb4f21 --- /dev/null +++ b/tests/MultiDocuments/subdir2_2/CMakeLists.txt @@ -0,0 +1,5 @@ +include(../../../UseLATEX.cmake) + +add_latex_document(Subdirectory2.tex + TARGET_NAME RenamedTargetForSubdirectory2_2 + ) diff --git a/tests/MultiDocuments/subdir2_2/Subdirectory2.tex b/tests/MultiDocuments/subdir2_2/Subdirectory2.tex new file mode 100644 index 0000000..35618f6 --- /dev/null +++ b/tests/MultiDocuments/subdir2_2/Subdirectory2.tex @@ -0,0 +1,7 @@ +\documentclass{article} + +\begin{document} + +\textbf{Document from subdirectory 2\_2} + +\end{document} diff --git a/tests/MultiDotFilename/CMakeLists.txt b/tests/MultiDotFilename/CMakeLists.txt new file mode 100644 index 0000000..eba7d54 --- /dev/null +++ b/tests/MultiDotFilename/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(MultiDotFilename NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(multi.dot.filename.tex + BIBFILES multi.dot.filename.bib + IMAGES my.image.eps + ) diff --git a/tests/MultiDotFilename/README b/tests/MultiDotFilename/README new file mode 100644 index 0000000..d482337 --- /dev/null +++ b/tests/MultiDotFilename/README @@ -0,0 +1,11 @@ +This test exercises problems with filenames containing multiple periods. +The tex, bib, and image files all have more than one dot. The tex and bib +files should be handled properly. In general, the image file is not. +CMake should handle this image correctly in that it is correctly +copied/converted to the build directory. However, many distributions of +LaTeX do not handle these images correctly. + +The tex file links in the image using its full name as an eps file. That +seems to work for my distribution, which has been picky about all other +configurations, when making a dvi file. If the LaTeX build fails, that may +not be an actual problem with UseLATEX.cmake. diff --git a/tests/MultiDotFilename/multi.dot.filename.bib b/tests/MultiDotFilename/multi.dot.filename.bib new file mode 100644 index 0000000..555e296 --- /dev/null +++ b/tests/MultiDotFilename/multi.dot.filename.bib @@ -0,0 +1,4 @@ +@book(foo, + author = "Hero Protagonist", + title = "The Life of Foo" +) diff --git a/tests/MultiDotFilename/multi.dot.filename.tex b/tests/MultiDotFilename/multi.dot.filename.tex new file mode 100644 index 0000000..8ed541e --- /dev/null +++ b/tests/MultiDotFilename/multi.dot.filename.tex @@ -0,0 +1,16 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +Here is an image. + +\includegraphics{my.image.eps} + +\cite{foo} + +\bibliographystyle{plain} +\bibliography{multi.dot.filename} + +\end{document} diff --git a/tests/MultiDotFilename/my.image.eps b/tests/MultiDotFilename/my.image.eps new file mode 100644 index 0000000..9e47c20 --- /dev/null +++ b/tests/MultiDotFilename/my.image.eps @@ -0,0 +1,500 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 0.18.4 (http://poppler.freedesktop.org) +%%Creator: Adobe Illustrator CS3 +%%LanguageLevel: 2 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 144 144 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2004 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + 3 1 roll 2 array astore + /setpagedevice where { + pop 3 dict begin + /PageSize exch def + /ImagingBBox null def + /Policies 1 dict dup begin /PageSize 3 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/cshow where { + pop + /cshow2 { + dup { + pop pop + 1 string dup 0 3 index put 3 index exec + } exch cshow + pop pop + } def +}{ + /cshow2 { + currentfont /FontType get 0 eq { + 0 2 2 index length 1 sub { + 2 copy get exch 1 add 2 index exch get + 2 copy exch 256 mul add + 2 string dup 0 6 5 roll put dup 1 5 4 roll put + 3 index exec + } for + } { + dup { + 1 string dup 0 3 index put 3 index exec + } forall + } ifelse + pop pop + } def +} ifelse +/awcp { + exch { + false charpath + 5 index 5 index rmoveto + 6 index eq { 7 index 7 index rmoveto } if + } exch cshow2 + 6 {pop} repeat +} def +/Tj { + fCol + 1 index stringwidth pdfTextMat idtransform pop + sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16 { + fCol + 2 index stringwidth pdfTextMat idtransform pop + sub exch div + pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj16V { + fCol + 2 index stringwidth pdfTextMat idtransform exch pop + sub exch div + 0 pdfWordSpacing pdfTextMat dtransform 32 + 4 3 roll pdfCharSpacing add 0 exch + pdfTextMat dtransform + 6 5 roll Tj1 +} def +/Tj1 { + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 8 2 roll + pdfTextRender 1 and 0 eq pdfPatternCS not and { + 6 copy awidthshow + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 7 index 7 index moveto + 6 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + false awcp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne pdfPatternCS or { + 8 6 roll moveto + false awcp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + 8 {pop} repeat + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { pdfFontSize 0.001 mul mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { pdfFontSize 0.001 mul mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2 image operators +/pdfImBuf 100 string def +/pdfIm { + image + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfImM { + fCol imagemask + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +q +q +0 0 144 144 re +W +/DeviceCMYK {} cs +[0.05 0 0.9 0] sc +false op +false OP +q +[1 0 0 1 135 72] cm +0 0 m +0 -34.793 -28.205 -63 -63 -63 c +-97.793 -63 -126 -34.793 -126 0 c +-126 34.793 -97.793 63 -63 63 c +-28.205 63 0 34.793 0 0 c +f +Q +/DeviceCMYK {} CS +[0 0 0 1] SC +4 M +q +[1 0 0 1 135 72] cm +0 0 m +0 -34.793 -28.205 -63 -63 -63 c +-97.793 -63 -126 -34.793 -126 0 c +-126 34.793 -97.793 63 -63 63 c +-28.205 63 0 34.793 0 0 c +h +S +Q +q +[1 0 0 1 38 56.4189] cm +0 0 m +0 -17.334 23.333 -24 32 -24 c +S +Q +q +[1 0 0 1 102 56.4189] cm +0 0 m +0 -17.334 -23.334 -24 -32 -24 c +S +Q +/DeviceCMYK {} cs +[0 0 0 1] sc +q +[1 0 0 1 60.3335 94] cm +0 0 m +0 -5.891 -4.775 -10.667 -10.667 -10.667 c +-16.558 -10.667 -21.333 -5.891 -21.333 0 c +-21.333 5.891 -16.558 10.667 -10.667 10.667 c +-4.775 10.667 0 5.891 0 0 c +f +Q +q +[1 0 0 1 98.667 94] cm +0 0 m +0 -5.891 -4.775 -10.667 -10.667 -10.667 c +-16.559 -10.667 -21.333 -5.891 -21.333 0 c +-21.333 5.891 -16.559 10.667 -10.667 10.667 c +-4.775 10.667 0 5.891 0 0 c +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/tests/MultiIndex/CMakeLists.txt b/tests/MultiIndex/CMakeLists.txt new file mode 100644 index 0000000..a9bdb33 --- /dev/null +++ b/tests/MultiIndex/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(MultiIndex NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(SingleIndex.tex + USE_INDEX + ) + +add_latex_document(MultiIndex.tex + USE_INDEX + INDEX_NAMES terms people + ) diff --git a/tests/MultiIndex/MultiIndex.tex b/tests/MultiIndex/MultiIndex.tex new file mode 100644 index 0000000..beaa1e2 --- /dev/null +++ b/tests/MultiIndex/MultiIndex.tex @@ -0,0 +1,25 @@ +\documentclass{article} + +\usepackage{blindtext} + +\usepackage{multind} +\makeindex{terms} +\makeindex{people} + +\begin{document} + +\index{terms}{foo} +\index{terms}{bar} +\index{terms}{baz} + +\index{people}{Homer} +\index{people}{Marge} +\index{people}{Bart} +\index{people}{Lisa} +\index{people}{Maggie} + +\blindtext + +\printindex{terms}{Term Index} +\printindex{people}{People Index} +\end{document} diff --git a/tests/MultiIndex/README b/tests/MultiIndex/README new file mode 100644 index 0000000..342fbb2 --- /dev/null +++ b/tests/MultiIndex/README @@ -0,0 +1,4 @@ +This test exercises the building of files that use multiple indices with +the multind package. For completeness, making a single index with the +makeindex package is also tested. If both documents builds, then the test +passes. diff --git a/tests/MultiIndex/SingleIndex.tex b/tests/MultiIndex/SingleIndex.tex new file mode 100644 index 0000000..0a5df12 --- /dev/null +++ b/tests/MultiIndex/SingleIndex.tex @@ -0,0 +1,18 @@ +\documentclass{article} + +\usepackage{blindtext} + +\usepackage{makeidx} +\makeindex + +\begin{document} + +\index{foo} +\index{bar} +\index{baz} + +\blindtext + +\printindex + +\end{document} diff --git a/tests/MultiIndex/multind.sty b/tests/MultiIndex/multind.sty new file mode 100644 index 0000000..ef91c28 --- /dev/null +++ b/tests/MultiIndex/multind.sty @@ -0,0 +1,65 @@ +% indexes document style option for producing multiple indexes +% for use with the modified bbok style, CHbook.sty +% Written by F.W. Long, Version 1.1, 12 August 1991. + +% Modified by F.W. Long, Version 1.1a, 29 August 1991 +% to get the index heading correctly spaced. + +% Modified by F.W. Long, Version 1.1b, 31 August 1991 +% to remove the abbreviation \ix (which should be in the document, not here). + +% Modified \makeindex and \index commands to allow multiple indexes +% in both cases the first parameter is the index name. +% They now work more like \@starttoc and \addcontentsline. +% \index is no longer defined inside \makeindex but determines +% whether the appropriate file is defined before writing to it. + +\def\makeindex#1{\begingroup + \makeatletter + \if@filesw \expandafter\newwrite\csname #1@idxfile\endcsname + \expandafter\immediate\openout \csname #1@idxfile\endcsname #1.idx\relax + \typeout{Writing index file #1.idx }\fi \endgroup} + +\def\index#1{\@bsphack\begingroup + \def\protect##1{\string##1\space}\@sanitize + \@wrindex{#1}} + +% \@wrindex now checks that the appropriate file is defined. + +\def\@wrindex#1#2{\let\thepage\relax + \xdef\@gtempa{\@ifundefined{#1@idxfile}{}{\expandafter + \write\csname #1@idxfile\endcsname{\string + \indexentry{#2}{\thepage}}}}\endgroup\@gtempa + \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} + +% Modified \printindex command to allow multiple indexes. +% This now takes over much of the work of \theindex. +% Again, the first parameter is the index name. +% The second parameter is the index title (as printed). + +\newif\if@restonecol +\def\printindex#1#2{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi + \columnseprule \z@ \columnsep 35pt + \newpage \twocolumn[{\Large\bf #2 \vskip4ex}] + \markright{\uppercase{#2}} + \addcontentsline{toc}{section}{#2} + \@input{#1.ind}} + +% The following index commands are taken from book.sty. +% \theindex is modified to not start a chapter. + +\def\theindex{\parindent\z@ + \parskip\z@ plus .3pt\relax\let\item\@idxitem} +\def\@idxitem{\par\hangindent 40pt} +\def\subitem{\par\hangindent 40pt \hspace*{20pt}} +\def\subsubitem{\par\hangindent 40pt \hspace*{30pt}} +\def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi} +\def\indexspace{\par \vskip 10pt plus 5pt minus 3pt\relax} + +% the command \ix allows an abbreviation for the general index + +%\def\ix#1{#1\index{general}{#1}} + +% define the \see command from makeidx.sty + +\def\see#1#2{{\em see\/} #1} diff --git a/tests/README b/tests/README new file mode 100644 index 0000000..38c8e55 --- /dev/null +++ b/tests/README @@ -0,0 +1,3 @@ +This directory contains simple documents that test features and fixes of +UseLATEX.cmake. You will find many features missing as I was very late in +starting this practice and have not gone back to retest earlier features. diff --git a/tests/Subdirectory/CMakeLists.txt b/tests/Subdirectory/CMakeLists.txt new file mode 100644 index 0000000..29f1707 --- /dev/null +++ b/tests/Subdirectory/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 2.8.4) + +project(Subdirectory NONE) + +include(../../UseLATEX.cmake) + +add_latex_document(subdir/Subdirectory.tex + IMAGE_DIRS subdir/images + INPUTS subdir/IncludedFile.tex + ) diff --git a/tests/Subdirectory/README b/tests/Subdirectory/README new file mode 100644 index 0000000..cd45cea --- /dev/null +++ b/tests/Subdirectory/README @@ -0,0 +1,4 @@ +This tests appropriate behavior when the document is located in a +subdirectory. When running this test, make sure that the document is built +correctly, and that the auxclean and clean targets get rid of all the built +files. diff --git a/tests/Subdirectory/subdir/IncludedFile.tex b/tests/Subdirectory/subdir/IncludedFile.tex new file mode 100644 index 0000000..88fe51f --- /dev/null +++ b/tests/Subdirectory/subdir/IncludedFile.tex @@ -0,0 +1 @@ +This text comes from an included file. diff --git a/tests/Subdirectory/subdir/Subdirectory.tex b/tests/Subdirectory/subdir/Subdirectory.tex new file mode 100644 index 0000000..9651ed4 --- /dev/null +++ b/tests/Subdirectory/subdir/Subdirectory.tex @@ -0,0 +1,13 @@ +\documentclass{article} + +\usepackage{graphicx} + +\begin{document} + +Here is an image: +\fbox{\includegraphics[width=2in]{subdir/images/Cool2WarmBar}} + +This included file should show up on the next page. +\include{subdir/IncludedFile} + +\end{document} diff --git a/tests/Subdirectory/subdir/images/Cool2WarmBar.png b/tests/Subdirectory/subdir/images/Cool2WarmBar.png new file mode 100644 index 0000000..99397fb Binary files /dev/null and b/tests/Subdirectory/subdir/images/Cool2WarmBar.png differ