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
    are needed on subsequent runs of latex to finish tables of contents,
    bibliographies, indices, lists of figures, and hyperlink references.
    """
    basename = SCons.Util.splitext(str(source[0]))[0]
    basefile = os.path.split(str(basename))[1]
    targetdir = os.path.split(str(target[0]))[0]
    targetbase = os.path.join(targetdir, basefile)

    basedir = os.path.split(str(source[0]))[0]
    abspath = os.path.abspath(basedir)
    target[0].attributes.path = abspath

    #
    # file names we will make use of in searching the sources and log file
    #
    emit_suffixes = ['.aux', '.log', '.ilg', '.blg', '.nls', '.nlg', '.gls', '.glg', '.alg'] + all_suffixes
    auxfilename = targetbase + '.aux'
    logfilename = targetbase + '.log'
    flsfilename = targetbase + '.fls'
    syncfilename = targetbase + '.synctex.gz'

    env.SideEffect(auxfilename,target[0])
    env.SideEffect(logfilename,target[0])
    env.SideEffect(flsfilename,target[0])
    env.SideEffect(syncfilename,target[0])
    if Verbose:
        print("side effect :",auxfilename,logfilename,flsfilename,syncfilename)
    env.Clean(target[0],auxfilename)
    env.Clean(target[0],logfilename)
    env.Clean(target[0],flsfilename)
    env.Clean(target[0],syncfilename)

    content = source[0].get_text_contents()

    # set up list with the regular expressions
    # we use to find features used
    file_tests_search = [auxfile_re,
                         makeindex_re,
                         bibliography_re,
                         bibunit_re,
                         multibib_re,
                         addbibresource_re,
                         tableofcontents_re,
                         listoffigures_re,
                         listoftables_re,
                         hyperref_re,
                         makenomenclature_re,
                         makeglossary_re,
                         makeglossaries_re,
                         makeacronyms_re,
                         beamer_re,
                         newglossary_re,
                         biblatex_re ]
    # set up list with the file suffixes that need emitting
    # when a feature is found
    file_tests_suff = [['.aux','aux_file'],
                  ['.idx', '.ind', '.ilg','makeindex'],
                  ['.bbl', '.blg','bibliography'],
                  ['.bbl', '.blg','bibunit'],
                  ['.bbl', '.blg','multibib'],
                  ['.bbl', '.blg','.bcf','addbibresource'],
                  ['.toc','contents'],
                  ['.lof','figures'],
                  ['.lot','tables'],
                  ['.out','hyperref'],
                  ['.nlo', '.nls', '.nlg','nomenclature'],
                  ['.glo', '.gls', '.glg','glossary'],
                  ['.glo', '.gls', '.glg','glossaries'],
                  ['.acn', '.acr', '.alg','acronyms'],
                  ['.nav', '.snm', '.out', '.toc','beamer'],
                  ['newglossary',],
                  ['.bcf', '.blg','biblatex'] ]
    # for newglossary the suffixes are added as we find the command
    # build the list of lists
    file_tests = []
    for i in range(len(file_tests_search)):
        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

    # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
    savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
    paths = env['ENV']['TEXINPUTS']
    if SCons.Util.is_List(paths):
        pass
    else:
        # Split at os.pathsep to convert into absolute path
        paths = paths.split(os.pathsep)

    # now that we have the path list restore the env
    if savedpath is _null:
        try:
            del env['ENV']['TEXINPUTS']
        except KeyError:
            pass # was never set
    else:
        env['ENV']['TEXINPUTS'] = savedpath
    if Verbose:
        print("search path ",paths)

    # scan all sources for side effect files
    aux_files = []
    file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)

    for (theSearch,suffix_list) in file_tests:
        # add side effects if feature is present.If file is to be generated,add all side effects
        if Verbose and theSearch:
            print("check side effects for ",suffix_list[-1])
        if (theSearch != None) or (not source[0].exists() ):
            file_list = [targetbase,]
            # for bibunit we need a list of files
            if suffix_list[-1] == 'bibunit':
                file_basename = os.path.join(targetdir, 'bu*.aux')
                file_list = glob.glob(file_basename)
                # remove the suffix '.aux'
                for i in range(len(file_list)):
                    file_list.append(SCons.Util.splitext(file_list[i])[0])
            # for multibib we need a list of files
            if suffix_list[-1] == 'multibib':
                for multibibmatch in multibib_re.finditer(content):
                    if Verbose:
                        print("multibib match ",multibibmatch.group(1))
                    if multibibmatch != None:
                        baselist = multibibmatch.group(1).split(',')
                        if Verbose:
                            print("multibib list ", baselist)
                        for i in range(len(baselist)):
                            file_list.append(os.path.join(targetdir, baselist[i]))
            # now define the side effects
            for file_name in file_list:
                for suffix in suffix_list[:-1]:
                    env.SideEffect(file_name + suffix,target[0])
                    if Verbose:
                        print("side effect tst :",file_name + suffix, " target is ",str(target[0]))
                    env.Clean(target[0],file_name + suffix)

    for aFile in aux_files:
        aFile_base = SCons.Util.splitext(aFile)[0]
        env.SideEffect(aFile_base + '.aux',target[0])
        if Verbose:
            print("side effect aux :",aFile_base + '.aux')
        env.Clean(target[0],aFile_base + '.aux')
    # read fls file to get all other files that latex creates and will read on the next pass
    # remove files from list that we explicitly dealt with above
    if os.path.isfile(flsfilename):
        content = open(flsfilename, "r").read()
        out_files = openout_re.findall(content)
        myfiles = [auxfilename, logfilename, flsfilename, targetbase+'.dvi',targetbase+'.pdf']
        for filename in out_files[:]:
            if filename in myfiles:
                out_files.remove(filename)
        env.SideEffect(out_files,target[0])
        if Verbose:
            print("side effect fls :",out_files)
        env.Clean(target[0],out_files)

    return (target, source)
def tex_emitter_core ( target , source , env , graphics_extensions ) : basename = SCons . Util . splitext ( str ( source [ 0 ] ) ) [ 0 ] basefile = os . path . split ( str ( basename ) ) [ 1 ] targetdir = os . path . split ( str ( target [ 0 ] ) ) [ 0 ] targetbase = os . path . join ( targetdir , basefile ) basedir = os . path . split ( str ( source [ 0 ] ) ) [ 0 ] abspath = os . path . abspath ( basedir ) target [ 0 ] . attributes . path = abspath emit_suffixes = [ '.aux' , '.log' , '.ilg' , '.blg' , '.nls' , '.nlg' , '.gls' , '.glg' , '.alg' ] + all_suffixes auxfilename = targetbase + '.aux' logfilename = targetbase + '.log' flsfilename = targetbase + '.fls' syncfilename = targetbase + '.synctex.gz' env . SideEffect ( auxfilename , target [ 0 ] ) env . SideEffect ( logfilename , target [ 0 ] ) env . SideEffect ( flsfilename , target [ 0 ] ) env . SideEffect ( syncfilename , target [ 0 ] ) if Verbose : print ( "side effect :" , auxfilename , logfilename , flsfilename , syncfilename ) env . Clean ( target [ 0 ] , auxfilename ) env . Clean ( target [ 0 ] , logfilename ) env . Clean ( target [ 0 ] , flsfilename ) env . Clean ( target [ 0 ] , syncfilename ) content = source [ 0 ] . get_text_contents ( ) file_tests_search = [ auxfile_re , makeindex_re , bibliography_re , bibunit_re , multibib_re , addbibresource_re , tableofcontents_re , listoffigures_re , listoftables_re , hyperref_re , makenomenclature_re , makeglossary_re , makeglossaries_re , makeacronyms_re , beamer_re , newglossary_re , biblatex_re ] file_tests_suff = [ [ '.aux' , 'aux_file' ] , [ '.idx' , '.ind' , '.ilg' , 'makeindex' ] , [ '.bbl' , '.blg' , 'bibliography' ] , [ '.bbl' , '.blg' , 'bibunit' ] , [ '.bbl' , '.blg' , 'multibib' ] , [ '.bbl' , '.blg' , '.bcf' , 'addbibresource' ] , [ '.toc' , 'contents' ] , [ '.lof' , 'figures' ] , [ '.lot' , 'tables' ] , [ '.out' , 'hyperref' ] , [ '.nlo' , '.nls' , '.nlg' , 'nomenclature' ] , [ '.glo' , '.gls' , '.glg' , 'glossary' ] , [ '.glo' , '.gls' , '.glg' , 'glossaries' ] , [ '.acn' , '.acr' , '.alg' , 'acronyms' ] , [ '.nav' , '.snm' , '.out' , '.toc' , 'beamer' ] , [ 'newglossary' , ] , [ '.bcf' , '.blg' , 'biblatex' ] ] file_tests = [ ] for i in range ( len ( file_tests_search ) ) : file_tests . append ( [ None , file_tests_suff [ i ] ] ) savedpath = modify_env_var ( env , 'TEXINPUTS' , abspath ) paths = env [ 'ENV' ] [ 'TEXINPUTS' ] if SCons . Util . is_List ( paths ) : pass else : paths = paths . split ( os . pathsep ) if savedpath is _null : try : del env [ 'ENV' ] [ 'TEXINPUTS' ] except KeyError : pass else : env [ 'ENV' ] [ 'TEXINPUTS' ] = savedpath if Verbose : print ( "search path " , paths ) aux_files = [ ] file_tests = ScanFiles ( source [ 0 ] , target , paths , file_tests , file_tests_search , env , graphics_extensions , targetdir , aux_files ) for ( theSearch , suffix_list ) in file_tests : if Verbose and theSearch : print ( "check side effects for " , suffix_list [ - 1 ] ) if ( theSearch != None ) or ( not source [ 0 ] . exists ( ) ) : file_list = [ targetbase , ] if suffix_list [ - 1 ] == 'bibunit' : file_basename = os . path . join ( targetdir , 'bu*.aux' ) file_list = glob . glob ( file_basename ) for i in range ( len ( file_list ) ) : file_list . append ( SCons . Util . splitext ( file_list [ i ] ) [ 0 ] ) if suffix_list [ - 1 ] == 'multibib' : for multibibmatch in multibib_re . finditer ( content ) : if Verbose : print ( "multibib match " , multibibmatch . group ( 1 ) ) if multibibmatch != None : baselist = multibibmatch . group ( 1 ) . split ( ',' ) if Verbose : print ( "multibib list " , baselist ) for i in range ( len ( baselist ) ) : file_list . append ( os . path . join ( targetdir , baselist [ i ] ) ) for file_name in file_list : for suffix in suffix_list [ : - 1 ] : env . SideEffect ( file_name + suffix , target [ 0 ] ) if Verbose : print ( "side effect tst :" , file_name + suffix , " target is " , str ( target [ 0 ] ) ) env . Clean ( target [ 0 ] , file_name + suffix ) for aFile in aux_files : aFile_base = SCons . Util . splitext ( aFile ) [ 0 ] env . SideEffect ( aFile_base + '.aux' , target [ 0 ] ) if Verbose : print ( "side effect aux :" , aFile_base + '.aux' ) env . Clean ( target [ 0 ] , aFile_base + '.aux' ) if os . path . isfile ( flsfilename ) : content = open ( flsfilename , "r" ) . read ( ) out_files = openout_re . findall ( content ) myfiles = [ auxfilename , logfilename , flsfilename , targetbase + '.dvi' , targetbase + '.pdf' ] for filename in out_files [ : ] : if filename in myfiles : out_files . remove ( filename ) env . SideEffect ( out_files , target [ 0 ] ) if Verbose : print ( "side effect fls :" , out_files ) env . Clean ( target [ 0 ] , out_files ) return ( target , source )
An emitter for TeX and LaTeX sources.
    For LaTeX sources we try and find the common created files that
    are needed on subsequent runs of latex to finish tables of contents,
    bibliographies, indices, lists of figures, and hyperlink references.