From bd891ec9222e7ca176eebe834c630d4fc5c7a25e Mon Sep 17 00:00:00 2001 From: managan Date: Thu, 30 Oct 2008 23:00:18 +0000 Subject: [PATCH] This new test and emitter update recursively checks the whole source of the latex document for commands that affect what side effect files will be created, and for graphics files that are included (so we can convert postscript to pdf if pdflatex is being run). Now that this is recursive we could tighten up on the side effect file list (e.g. a \makeindex with no \index commands won't make all the files we tell scons to expect as side effects) but I think that is asking for trouble if we mess it up. git-svn-id: http://scons.tigris.org/svn/scons/trunk@3750 fdb21ef1-2011-0410-befe-b5e4ea1792b1 --- src/engine/SCons/Tool/tex.py | 82 +++++++------ test/TEX/multiple_include.py | 231 +++++++++++++++++++++++++++++++++++ 2 files changed, 276 insertions(+), 37 deletions(-) create mode 100644 test/TEX/multiple_include.py diff --git a/src/engine/SCons/Tool/tex.py b/src/engine/SCons/Tool/tex.py index 9405ea5e..d033fdd9 100644 --- a/src/engine/SCons/Tool/tex.py +++ b/src/engine/SCons/Tool/tex.py @@ -127,7 +127,6 @@ _null = SCons.Scanner.LaTeX._null modify_env_var = SCons.Scanner.LaTeX.modify_env_var def FindFile(name,suffixes,paths,env): - #print "FindFile: name %s, suffixes "% name,suffixes," paths ",paths if Verbose: print " searching for '%s' with extensions: " % name,suffixes @@ -417,6 +416,49 @@ def tex_pdf_emitter(target, source, env): return (target, source) +def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir): + # for theFile (a Node) update any file_tests and search for graphics files + # then find all included files and call ScanFiles for each of them + content = theFile.get_contents() + if Verbose: + print " scanning ",str(theFile) + + for i in range(len(file_tests_search)): + if file_tests[i][0] == None: + file_tests[i][0] = file_tests_search[i].search(content) + + # For each file see if any graphics files are included + # and set up target to create ,pdf graphic + # is this is in pdflatex toolchain + graphic_files = includegraphics_re.findall(content) + if Verbose: + print "graphics files in '%s': "%str(theFile),graphic_files + for graphFile in graphic_files: + graphicNode = FindFile(graphFile,graphics_extensions,paths,env) + # see if we can build this graphics file by epstopdf + graphicSrc = FindFile(graphFile,TexGraphics,paths,env) + if graphicSrc != None: + if Verbose and (graphicNode == None): + print "need to build '%s' by epstopdf %s -o %s" % (graphFile,graphicSrc,graphFile) + graphicNode = env.PDF(os.path.join(targetdir,str(graphicSrc))) + env.Depends(target[0],graphicNode) + + # recursively call this on each of the included files + inc_files = [ ] + inc_files.extend( include_re.findall(content) ) + if Verbose: + print "files included by '%s': "%str(theFile),inc_files + # inc_files is list of file names as given. need to find them + # using TEXINPUTS paths. + + for src in inc_files: + srcNode = srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env) + if srcNode != None: + file_test = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir) + if Verbose: + print " done scanning ",str(theFile) + return file_tests + def tex_emitter_core(target, source, env, graphics_extensions): """An emitter for TeX and LaTeX sources. For LaTeX sources we try and find the common created files that @@ -477,18 +519,11 @@ def tex_emitter_core(target, source, env, graphics_extensions): # build the list of lists file_tests = [] for i in range(len(file_tests_search)): - file_tests.append( [file_tests_search[i].search(content), file_tests_suff[i]] ) + file_tests.append( [None, file_tests_suff[i]] ) # TO-DO: need to add a way for the user to extend this list for whatever # auxiliary files they create in other (or their own) packages - inc_files = [str(source[0]), ] - inc_files.extend( include_re.findall(content) ) - if Verbose: - print "files included by '%s': "%source[0],inc_files - # inc_files is list of file names as given. need to find them - # using TEXINPUTS paths. - # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS'] savedpath = modify_env_var(env, 'TEXINPUTS', abspath) paths = env['ENV']['TEXINPUTS'] @@ -511,34 +546,7 @@ def tex_emitter_core(target, source, env, graphics_extensions): if Verbose: print "search path ",paths - # search all files read (including the original source file) - # for files that are \input or \include - for src in inc_files: - # we already did this for the base file - if src != inc_files[0]: - content = "" - srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env) - if srcNode: - content = srcNode.get_contents() - for i in range(len(file_tests_search)): - if file_tests[i][0] == None: - file_tests[i][0] = file_tests_search[i].search(content) - - # For each file see if any graphics files are included - # and set up target to create ,pdf graphic - # is this is in pdflatex toolchain - src_inc_files = includegraphics_re.findall(content) - if Verbose: - print "graphics files in '%s': "%basename,src_inc_files - for graphFile in src_inc_files: - graphicNode = FindFile(graphFile,graphics_extensions,paths,env) - # see if we can build this graphics file by epstopdf - graphicSrc = FindFile(graphFile,TexGraphics,paths,env) - if graphicSrc != None: - if Verbose and (graphicNode == None): - print "need to build '%s' by epstopdf %s -o %s" % (graphFile,graphicSrc,graphFile) - graphicNode = env.PDF(os.path.join(targetdir,str(graphicSrc))) - env.Depends(target[0],graphicNode) + file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir) for (theSearch,suffix_list) in file_tests: if theSearch: diff --git a/test/TEX/multiple_include.py b/test/TEX/multiple_include.py new file mode 100644 index 00000000..2b3cfe0f --- /dev/null +++ b/test/TEX/multiple_include.py @@ -0,0 +1,231 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +""" +Test creation of a fully-featured TeX document (with bibliography +and index) in a variant_dir. + +Test courtesy Rob Managan. +""" + +import TestSCons + +test = TestSCons.TestSCons() + +latex = test.where_is('latex') +epstopdf = test.where_is('epstopdf') +if not latex: + test.skip_test("Could not find 'latex'; skipping test.\n") + +if not epstopdf: + test.skip_test("Could not find 'epstopdf'; skipping test.\n") + +test.subdir(['docs']) + + +test.write(['SConstruct'], """\ +import os + +env = Environment(ENV = { 'PATH' : os.environ['PATH'] }) + +test = env.PDF(source='test.tex') +""") + + +test.write(['Fig1.ps'], """\ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: Fig1.fig +%%Creator: fig2dev Version 3.2 Patchlevel 4 +%%CreationDate: Tue Apr 25 09:56:11 2006 +%%For: managan@mangrove.llnl.gov (Rob Managan) +%%BoundingBox: 0 0 98 98 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def + +end +save +newpath 0 98 moveto 0 0 lineto 98 0 lineto 98 98 lineto closepath clip newpath +-24.9 108.2 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/sc {scale} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/tr {translate} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit + 0.06299 0.06299 sc +% +% Fig objects follow +% +7.500 slw +% Ellipse +n 1170 945 766 766 0 360 DrawEllipse gs col0 s gr + +$F2psEnd +rs +""") + + +test.write(['Fig1.tex'], +r"""\begin{picture}(0,0)% +\includegraphics{Fig1}% +\end{picture}% +\setlength{\unitlength}{4144sp}% +% +\begingroup\makeatletter\ifx\SetFigFont\undefined% +\gdef\SetFigFont#1#2#3#4#5{% + \reset@font\fontsize{#1}{#2pt}% + \fontfamily{#3}\fontseries{#4}\fontshape{#5}% + \selectfont}% +\fi\endgroup% +\begin{picture}(1548,1546)(397,-879) +\put(856,-196){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{\rmdefault}{\mddefault}{\updefault}{\color[rgb]{0,0,0}center $r_0$}% +}}} +\end{picture} +""") + + +test.write(['test.tex'], +r"""\documentclass{report} + +\usepackage{graphicx} +\usepackage{epsfig,color} % for .tex version of figures if we go that way + +\usepackage{makeidx} +\makeindex + +\begin{document} + +\title{Report Title} + +\author{A. N. Author} + +\maketitle + +\begin{abstract} +there is no abstract +\end{abstract} + +\tableofcontents +\listoffigures + +\chapter{Introduction} + +The introduction is short. + +\index{Acknowledgements} + +\section{Acknowledgements} + +The Acknowledgements are shown as well. + +\index{Getting the Report} + +\input{getReport} + +\end{document} +""") + +test.write(['getReport.tex'], +r""" +To get a hard copy of this report call me. + +\begin{figure}[htbp] +\begin{center} +\input{Fig1.tex} % testing figure variant that uses TeX labeling +\caption{Zone and Node indexing} +\label{fig1} +\end{center} +\end{figure} + +All done now. + +%\bibliographystyle{unsrt} +%\bibliography{test} +\newpage + +\printindex +""") + +# makeindex will write status messages to stderr (grrr...), so ignore it. +test.run(arguments = '.', stderr=None) + + +# All (?) the files we expect will get created in the variant_dir +# (mybuild/docs) and not in the srcdir (docs). +files = [ + 'test.aux', + 'test.idx', + 'test.ilg', + 'test.ind', + 'test.lof', + 'test.log', + 'test.pdf', + 'test.toc', + 'Fig1.pdf' +] + +for f in files: + test.must_exist([ f]) + + +test.pass_test() -- 2.26.2