#!/usr/bin/python from string import Template import subprocess import sys with open('all_settings.tex', 'r') as f: template = Template(f.read()) themes = 'Default', 'Rays', 'Basic', 'Simple', 'Envelope', 'Wave', 'Board', 'Autumn', 'Desert' colors = 'Default', 'Australia', 'Britain', 'Sweden', 'Spain', 'Russia', 'Denmark', 'Germany' palettes = 'Default', 'BlueGrayOrange', 'GreenGrayViolet', 'PurpleGrayBlue', 'BrownBlueOrange' backgrounds = 'Default', 'VerticalGradation', 'Rays', 'BottomVerticalGradation', 'Empty' titles = 'Default', 'Basic', 'Empty', 'Filled', 'Envelope', 'Wave', 'VerticalShading' blocks = 'Default', 'Basic', 'Minimal', 'Envelope', 'Corner', 'Slide', 'TornOut' notes = 'Default', 'VerticalShading', 'Corner', 'Sticky' ################################################################################## ## This function creates a latex document from the template in ## "all_settings.tex" by substituting the values for the theme, and ## for the color, background, title, block and note commands, and ## adding a specific message as the title and a sub-message as the ## author of the document. Then it compiles this file (called ## "filename.tex"), keeps only the pdf file, and remembers its name ## for future. ## ## We also need latex commands because the resulting pdf contains the ## code of the document. So we need to modify certain characters for ## latex. ## def createTexAndCompile( message, submessage, theme, colorcommand, backgroundcommand, titlecommand, blockcommand, notecommand, themelatexcommand, colorlatexcommand, backgroundlatexcommand, titlelatexcommand, blocklatexcommand, notelatexcommand, filename, filelist ): page = template.substitute( { 'messagevar': message, 'submessagevar': submessage, 'themevar': theme, 'colorvar': colorcommand, 'backgroundvar': backgroundcommand, 'titlevar': titlecommand, 'blockvar': blockcommand, 'notevar': notecommand, 'themestylevar': themelatexcommand, 'colorstylevar': colorlatexcommand, 'backgroundstylevar': backgroundlatexcommand, 'titlestylevar': titlelatexcommand, 'blockstylevar': blocklatexcommand, 'notestylevar': notelatexcommand, } ) ## create a tex file with open(filename + '.tex', 'w') as f: f.write(page) ## compile the tex file subprocess.call('pdflatex {}.tex'.format(filename).split()) ## clean up auxiliary files (non-pdf) subprocess.call('rm -f {}.tex'.format(filename).split()) subprocess.call('rm -f {}.aux'.format(filename).split()) subprocess.call('rm -f {}.log'.format(filename).split()) ## remember the name of the file for future filelist.append(filename) return ################################################################################## ################################################################################## ## This function is for testing styles using the Default theme, or for ## testing each theme without modifications. ## ## This function creates latex commands for each style, depending on ## the values of theme, color, palette, background, title, block and ## note. Then calls function createTexAndCompile that uses these ## commands to create and compile the actual document. ## ## The main difference of this function with ## createTexAndCompileAllOptions is follows. The generated pdf ## contains the code used to generate it, so that users could easily ## see the settings. In this function the code is kept minimal, so the ## commands of the form \usesomestyle{Default} are not ## displayed. Therefore, if one uses a non-Default theme and then, for ## instance, default block style, it would have effect in the ## generated pdf, but the code in the pdf would not be correct. ## ## Thus, in principle this function can be used for arbitrary ## combinations of options, but the correctness of the code in the pdf ## file is guaranteed only for testing styles using the Default theme, ## or for testing each theme without modifications. ## def createTexAndCompileOneOption( message, submessage, theme, color, palette, background, title, block, note, filelist ): themelatexcommand = '' colorcommand = colorlatexcommand = '' backgroundcommand = backgroundlatexcommand = '' titlecommand = titlelatexcommand = '' blockcommand = blocklatexcommand = '' notecommand = notelatexcommand = '' ## only if theme is the default one, we also specify other styles if theme != 'Default' and theme != '': themelatexcommand = r'\bs usetheme\{' + theme + r'\}\\' if color != '': if palette != '': colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{' + color + '}' colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + ']\{' + color + r'\}\\' else: colorcommand = r'\usecolorstyle{' + color + '}' colorlatexcommand = r'\bs usecolorstyle\{' + color + r'\}\\' if colorcommand == r'\usecolorstyle{Default}' or colorcommand == r'\usecolorstyle[colorPalette=Default]{Default}': colorcommand = colorlatexcommand = '' elif palette != '' and palette != 'Default': colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{Default}' colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + r']\{Default\}\\' if background != 'Default' and background != '': backgroundcommand = r'\usebackgroundstyle{' + background + '}' backgroundlatexcommand = r'\bs usebackgroundstyle\{' + background + r'\}\\' if title != 'Default' and title != '': titlecommand = r'\usetitlestyle{' + title + '}' titlelatexcommand = r'\bs usetitlestyle\{' + title + r'\}\\' if block != 'Default' and block != '': blockcommand = r'\useblockstyle{' + block + '}' blocklatexcommand = r'\bs useblockstyle\{' + block + r'\}\\' if note != 'Default' and note != '': notecommand = r'\usenotestyle{' + note + '}' notelatexcommand = r'\bs usenotestyle\{' + note + r'\}\\' filename = 'ff_' + theme + color + palette + background + title + block + note createTexAndCompile( message, submessage, theme, colorcommand, backgroundcommand, titlecommand, blockcommand, notecommand, themelatexcommand, colorlatexcommand, backgroundlatexcommand, titlelatexcommand, blocklatexcommand, notelatexcommand, filename, filelist ) return ################################################################################## ################################################################################## ## This function is for testing all combinations of styles. ## ## This function creates latex commands for each style, depending on ## the values of color, palette, background, title, block and note. ## Then calls function createTexAndCompile that uses these commands to ## create and compile the actual document. ## def createTexAndCompileAllOptions( message, submessage, theme, color, palette, background, title, block, note, filelist ): themelatexcommand = '' colorcommand = colorlatexcommand = '' backgroundcommand = backgroundlatexcommand = '' titlecommand = titlelatexcommand = '' blockcommand = blocklatexcommand = '' notecommand = notelatexcommand = '' if theme != '': themelatexcommand = r'\bs usetheme\{' + theme + r'\}\\' else: themelatexcommand = r'\bs usetheme\{Default\}\\' if color != '': if palette != '': colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{' + color + '}' colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + ']\{' + color + r'\}\\' else: colorcommand = r'\usecolorstyle{' + color + '}' colorlatexcommand = r'\bs usecolorstyle\{' + color + r'\}\\' elif palette != '': colorcommand = r'\usecolorstyle[colorPalette=' + palette + ']{Default}' colorlatexcommand = r'\bs usecolorstyle[colorPalette=' + palette + r']\{Default\}\\' if background != '': backgroundcommand = r'\usebackgroundstyle{' + background + '}' backgroundlatexcommand = r'\bs usebackgroundstyle\{' + background + r'\}\\' if title != '': titlecommand = r'\usetitlestyle{' + title + '}' titlelatexcommand = r'\bs usetitlestyle\{' + title + r'\}\\' if block != '': blockcommand = r'\useblockstyle{' + block + '}' blocklatexcommand = r'\bs useblockstyle\{' + block + r'\}\\' if note != '': notecommand = r'\usenotestyle{' + note + '}' notelatexcommand = r'\bs usenotestyle\{' + note + r'\}\\' filename = 'ff_' + theme + color + palette + background + title + block + note createTexAndCompile( message, submessage, theme, colorcommand, backgroundcommand, titlecommand, blockcommand, notecommand, themelatexcommand, colorlatexcommand, backgroundlatexcommand, titlelatexcommand, blocklatexcommand, notelatexcommand, filename, filelist ) return ################################################################################## ################################################################################## ## A function to combine all pdfs whose names are given in the list filelist, ## in a file called outputFile ## def combinePdfs( outputFile, filelist ): ## merging all pdfs in filelist command = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=' + outputFile + '.pdf' subprocess.call( command.split() + [t + '.pdf' for t in filelist] ) return ################################################################################## ################################################################################## ## A function to remove pdf files whose names are given in the list filelist ## def removePdfs( filelist ): ## removing the pdfs for filename in filelist: subprocess.call('rm -f {}.pdf'.format(filename).split()) return ################################################################################## ################################################################################## ## A function to combine all pdfs whose names are given in the list filelist, ## in a file called outputFile, then remove these files ## def combineAndRemovePdfs( outputFile, filelist ): combinePdfs( outputFile, filelist ) removePdfs( filelist ) return ################################################################################## ################################################################################## ## A function to try all options: color palettes, color styles, backgrounds, ## titles, blocks and notes separately def testAllOptionsSeparately( ): filenames = [] ##########------------------------------########## ##########------------------------------########## ########## varying themes color = palette = background = title = block = note = '' submessage = 'All options are defined by the theme' outputFile = 'all_themes' for theme in themes: message = 'Using ' + theme + ' theme' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) ##########------------------------------########## ########## varying color styles del filenames[:] theme = background = title = block = note = 'Default' palette = '' submessage = 'with the rest being Default' outputFile = 'all_colors' for color in colors: message = 'Using ' + color + ' color style' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) ########## varying color palettes del filenames[:] theme = color = background = title = block = note = 'Default' submessage = 'with the Default color style' outputFile = 'all_palettes' for palette in palettes: message = 'Using ' + palette + ' color palette' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) ##########------------------------------########## ########## varying backgrounds del filenames[:] theme = color = palette = title = block = note = 'Default' submessage = 'with the rest being Default' outputFile = 'all_backgrounds' for background in backgrounds: message = 'Using ' + background + ' background style' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) ##########------------------------------########## ########## varying titles del filenames[:] theme = color = palette = background = block = note = 'Default' submessage = 'with the rest being Default' outputFile = 'all_titles' for title in titles: message = 'Using ' + title + ' title style' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) ##########------------------------------########## ########## varying blocks del filenames[:] theme = color = palette = background = title = note = 'Default' submessage = 'with the rest being Default' outputFile = 'all_blocks' for block in blocks: message = 'Using ' + block + ' block style' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) ##########------------------------------########## ########## varying notes del filenames[:] theme = color = palette = background = title = block = 'Default' submessage = 'with the rest being Default' outputFile = 'all_notes' for note in notes: message = 'Using ' + note + ' note style' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) del filenames[:] ###############--------------------############### ############### combine the 7 pdfs into one called all_settings outputs = 'all_themes', 'all_colors', 'all_palettes', 'all_backgrounds', 'all_titles', 'all_blocks', 'all_notes' combinePdfs('all_settings', outputs) return ################################################################################## ################################################################################## ## A function to try all combinations of options: themes, palettes, ## color, background, title, block and note styles ## def testAllOptionsCombined( ): filenames = [] outputFile = 'all_combinations' for theme in themes: for color in colors: for palette in palettes: for background in backgrounds: for title in titles: for block in blocks: for note in notes: message = 'Using ' + theme + ', ' + palette submessage = color + background + title + block + note createTexAndCompileAllOptions(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) del filenames[:] return ################################################################################## ################################################################################## ## A function to test all predefined themes def testThemes( ): filenames = [] color = palette = background = title = block = note = '' submessage = 'All options are defined by the theme' outputFile = 'all_themes' for theme in themes: message = 'Using ' + theme + ' theme' createTexAndCompileOneOption(message, submessage, theme, color, palette, background, title, block, note, filenames) combineAndRemovePdfs(outputFile, filenames) del filenames[:] return ################################################################################## ################################################################################## def usageMessage(): print 'usage: ' print ' all_settings.py' print ' produces all_settings.pdf by ' print ' testing all themes and all options separately, and ' print ' combining them into one file.' print r' all_settings.py all' print r' tests all combinations of all options. Be careful! 352800 combinations' return ################################################################################## ################################################################################## ############################## Main Body ######################################### ################################################################################## def main(): if len(sys.argv) == 1: ## tests all options separately, and generates files all_settings, ## all_themes, all_colors, all_palettes, all_backgrounds, ## all_titles, all_blocks, and all_notes testAllOptionsSeparately() elif len(sys.argv) == 2: if sys.argv[1] == 'all': testAllOptionsCombined() else: ## in future we can allow more parameters, for instance compiling ## all options for a particular theme usageMessage() sys.exit(2) else: usageMessage() sys.exit(2) if __name__ == "__main__": main()