From 8f4a817d38db95fbfb01692a89b6f51d555851fe Mon Sep 17 00:00:00 2001 From: Tue Herlau <tuhe@dtu.dk> Date: Wed, 15 Mar 2023 19:17:37 +0100 Subject: [PATCH] tmp updates --- .gitlab-ci.yml | 2 +- build/lib/jinjafy/__init__.py | 43 -- build/lib/jinjafy/cache/__init__.py | 8 - build/lib/jinjafy/cache/simplecache.py | 94 ---- build/lib/jinjafy/jinja_env.py | 136 ----- build/lib/jinjafy/jinja_matlab_load.py | 149 ------ build/lib/jinjafy/jinjafy.py | 214 -------- build/lib/jinjafy/plot/__init__.py | 1 - build/lib/jinjafy/plot/plot_helpers.py | 48 -- build/lib/jinjafy/snipper.py | 89 ---- build/lib/jinjafy/textools.py | 187 ------- .../02450_beamer_preamble.tex | 93 ---- .../DTU_Beamer_files/02450_lectures_base.tex | 25 - .../beamer_slider_preamble.tex | 93 ---- .../DTU_Beamer_files/beamercolorthemeDTU.sty | 29 -- .../DTU_Beamer_files/beamerfontthemeDTU.sty | 38 -- .../DTU_Beamer_files/beamerinnerthemeDTU.sty | 52 -- .../DTU_Beamer_files/beamerouterthemeDTU.sty | 98 ---- .../DTU_Beamer_files/beamerthemeDTU.sty | 255 --------- build/lib/slider/DTU_Beamer_files/blank.png | Bin 3161 -> 0 bytes .../slider/DTU_Beamer_files/departments.tex | 130 ----- .../DTU_Beamer_files/dtu_slideshow_base.tex | 25 - .../slider/DTU_Beamer_files/dtucolours.tex | 83 --- .../DTU_Beamer_files/tex_compute_uk.pdf | Bin 3167 -> 0 bytes .../DTU_Beamer_files/tex_dtu_compute_a_uk.pdf | Bin 13504 -> 0 bytes .../slider/DTU_Beamer_files/tex_dtu_frise.pdf | Bin 32488 -> 0 bytes .../slider/DTU_Beamer_files/tex_dtu_logo.pdf | Bin 1830 -> 0 bytes .../DTU_Beamer_files/textext_preamble.tex | 9 - build/lib/slider/__init__.py | 0 build/lib/slider/__main__.py | 6 - build/lib/slider/beamer_nup.py | 79 --- build/lib/slider/convert.py | 126 ----- build/lib/slider/latexutils.py | 36 -- build/lib/slider/legacy_importer.py | 487 ------------------ build/lib/slider/slide.py | 282 ---------- build/lib/slider/slide_fixer.py | 140 ----- build/lib/slider/slider_cli.py | 94 ---- build/lib/slider/slider_init.py | 66 --- src/beamer_slider.egg-info/PKG-INFO | 2 +- src/beamer_slider.egg-info/SOURCES.txt | 3 +- src/slider/convert.py | 2 +- src/slider/legacy_importer.py | 3 +- src/slider/version.py | 2 +- 43 files changed, 8 insertions(+), 3221 deletions(-) delete mode 100644 build/lib/jinjafy/__init__.py delete mode 100644 build/lib/jinjafy/cache/__init__.py delete mode 100644 build/lib/jinjafy/cache/simplecache.py delete mode 100644 build/lib/jinjafy/jinja_env.py delete mode 100644 build/lib/jinjafy/jinja_matlab_load.py delete mode 100644 build/lib/jinjafy/jinjafy.py delete mode 100644 build/lib/jinjafy/plot/__init__.py delete mode 100644 build/lib/jinjafy/plot/plot_helpers.py delete mode 100644 build/lib/jinjafy/snipper.py delete mode 100644 build/lib/jinjafy/textools.py delete mode 100644 build/lib/slider/DTU_Beamer_files/02450_beamer_preamble.tex delete mode 100644 build/lib/slider/DTU_Beamer_files/02450_lectures_base.tex delete mode 100644 build/lib/slider/DTU_Beamer_files/beamer_slider_preamble.tex delete mode 100644 build/lib/slider/DTU_Beamer_files/beamercolorthemeDTU.sty delete mode 100644 build/lib/slider/DTU_Beamer_files/beamerfontthemeDTU.sty delete mode 100644 build/lib/slider/DTU_Beamer_files/beamerinnerthemeDTU.sty delete mode 100644 build/lib/slider/DTU_Beamer_files/beamerouterthemeDTU.sty delete mode 100644 build/lib/slider/DTU_Beamer_files/beamerthemeDTU.sty delete mode 100644 build/lib/slider/DTU_Beamer_files/blank.png delete mode 100644 build/lib/slider/DTU_Beamer_files/departments.tex delete mode 100644 build/lib/slider/DTU_Beamer_files/dtu_slideshow_base.tex delete mode 100644 build/lib/slider/DTU_Beamer_files/dtucolours.tex delete mode 100644 build/lib/slider/DTU_Beamer_files/tex_compute_uk.pdf delete mode 100644 build/lib/slider/DTU_Beamer_files/tex_dtu_compute_a_uk.pdf delete mode 100644 build/lib/slider/DTU_Beamer_files/tex_dtu_frise.pdf delete mode 100644 build/lib/slider/DTU_Beamer_files/tex_dtu_logo.pdf delete mode 100644 build/lib/slider/DTU_Beamer_files/textext_preamble.tex delete mode 100644 build/lib/slider/__init__.py delete mode 100644 build/lib/slider/__main__.py delete mode 100644 build/lib/slider/beamer_nup.py delete mode 100644 build/lib/slider/convert.py delete mode 100644 build/lib/slider/latexutils.py delete mode 100644 build/lib/slider/legacy_importer.py delete mode 100644 build/lib/slider/slide.py delete mode 100644 build/lib/slider/slide_fixer.py delete mode 100644 build/lib/slider/slider_cli.py delete mode 100644 build/lib/slider/slider_init.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 04ac682..500ff56 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,7 +19,7 @@ stages: - apt install -y xvfb # Virtual framebuffer for GL stuff. - apt install -y inkscape pdftk - apt install -y latexmk poppler-utils # latexmk and pdftocairo - - DEBIAN_FRONTEND='noninteractive' apt install -y texlive-latex-recommended texlive-latex-extra texlive-science pdf2svg + - DEBIAN_FRONTEND='noninteractive' apt install -y texlive-latex-recommended texlive-latex-extra texlive-science pdf2svg texlive-fonts-extra texlive-fonts-recommended - pip install -U Pillow - pip install -e ./ - cd tests diff --git a/build/lib/jinjafy/__init__.py b/build/lib/jinjafy/__init__.py deleted file mode 100644 index 0bebe70..0000000 --- a/build/lib/jinjafy/__init__.py +++ /dev/null @@ -1,43 +0,0 @@ -from jinjafy.jinjafy import jinjafy_comment -from jinjafy.jinjafy import jinjafy_template -from jinjafy.jinja_matlab_load import matlab_load -# from slider import latexmk -from jinjafy.textools import mat2table -import subprocess -# import os -import platform -# from subprocess import subprocess - - -def execute_command(command, shell=True): - if not isinstance(command, list): - command = [command] - if not platform.uname()[0] == "Linux": - result = subprocess.run(command, stdout=subprocess.PIPE, shell=shell) - out = result.stdout - else: - out = subprocess.check_output(command, shell=shell) - s = out.decode("utf-8") - OK = True - return s, OK - - -# def get_system_name(): -# if is_win(): -# return "Win" -# if is_compute(): -# return "thinlinc.compute.dtu.dk" -# if is_cogsys_cluster(): -# return "cogys cluster" - -# def execute_command(command, shell=True): -# if not isinstance(command, list): -# command = [command] -# # if not is_compute(): -# # result = subprocess.run(command, stdout=subprocess.PIPE, shell=shell) -# # out = result.stdout -# # else: -# out = subprocess.check_output(command, shell=shell) -# s = out.decode("utf-8") -# OK = True -# return s, OK \ No newline at end of file diff --git a/build/lib/jinjafy/cache/__init__.py b/build/lib/jinjafy/cache/__init__.py deleted file mode 100644 index a46ef35..0000000 --- a/build/lib/jinjafy/cache/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from jinjafy.cache.simplecache import cache_update_str as cache_update_str -from jinjafy.cache.simplecache import cache_contains_str as cache_contains_str - -from jinjafy.cache.simplecache import cache_update_file as cache_update_file -from jinjafy.cache.simplecache import cache_contains_file as cache_contains_file - -from jinjafy.cache.simplecache import cache_update_dir as cache_update_dir -from jinjafy.cache.simplecache import cache_contains_dir as cache_contains_dir \ No newline at end of file diff --git a/build/lib/jinjafy/cache/simplecache.py b/build/lib/jinjafy/cache/simplecache.py deleted file mode 100644 index e24ab19..0000000 --- a/build/lib/jinjafy/cache/simplecache.py +++ /dev/null @@ -1,94 +0,0 @@ -from hashlib import md5 -import os -import pickle -import glob - -def dir_content_cache_(dir, pattern="*"): - fl = glob.glob(dir + "/" + pattern) - s = ''.join(fl) - key = "key_"+dir - return fl, s,key - -def cache_contains_dir(cache_base, dir, pattern="*"): - # fl = glob.glob(dir) - fl,s,key = dir_content_cache_(dir, pattern=pattern) - - v = [cache_contains_file(cache_base, f) for f in fl] - if all(v) and cache_contains_str(cache_base, key, s): - return True - return False - -def cache_update_dir(cache_base, dir, pattern="*"): - fl, s, key = dir_content_cache_(dir, pattern=pattern) - cache_update_str(cache_base, key, s) - for f in fl: - cache_update_file(cache_base, f) - - -def cache_contains_str(cache_base,key=None,value=None): - assert(key or value) - value = hash_binary_(value.encode()) - if not key: key = value - return cache_contains_hash(cache_base, key, value) - -def cache_update_str(cache_base,key,value): - assert(key or value) - value = hash_binary_(value.encode()) - if not key: key = value - return cache_update_hash(cache_base, key, value) - - -def cache_contains_file(cache_base,file): - key = os.path.abspath(file) - if not os.path.exists(file): - return False - value = hash_file_(file) - return cache_contains_hash(cache_base, key, value) - -def hash_file_(file): - import hashlib - hasher = hashlib.md5() - with open(file, 'rb') as afile: - buf = afile.read() - hasher.update(buf) - return hasher.hexdigest() - -def cache_update_file(cache_base, file): - key = os.path.abspath(file) - value = hash_file_(file) - return cache_update_hash(cache_base, key, value) - - -def cache_contains_hash(cache_base,key,hash_val): - cc = load_cache(cache_base) - return cc.get(key,"Not found") == hash_val - -def cache_update_hash(cache_base,key,hash_val): - cc = load_cache(cache_base) - cc[key] = hash_val - save_cache(cache_base, cc) - - -def hash_binary_(str_bin): - return md5(str_bin).hexdigest() - - -def cache_file(cache_base): - return os.path.join(cache_base, "cache.pkl") - -def save_cache(cache_base, cache): - with open(cache_file(cache_base), 'wb') as f: - pickle.dump(cache,f) - -def load_cache(cache_base): - if not os.path.exists(cache_file(cache_base)): - save_cache(cache_base, {'default' : 42}) - return load_cache(cache_base) - with open(cache_file(cache_base), 'rb') as f: - return pickle.load(f) - - -if __name__ == "__main__": - cache_base = "./" - - print("Hello World") diff --git a/build/lib/jinjafy/jinja_env.py b/build/lib/jinjafy/jinja_env.py deleted file mode 100644 index 102ef96..0000000 --- a/build/lib/jinjafy/jinja_env.py +++ /dev/null @@ -1,136 +0,0 @@ -import numpy as np -from fractions import Fraction -import jinja2 - - -def format_list_symbols(list, pattern, symbol="x", seperator=",\ "): - return format_join(list, pattern=symbol+"_{%i}", seperator=seperator) - - -def n2w(i): - w = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', - 9: 'nine', 10: 'ten'} - return i if i < 0 or i > 10 else w[i] - - -def format_list(list_, pattern): - list_ = tolist(list_) - return [pattern % s for s in list_] - - -def format_join(list, pattern, seperator=",\ ",withand=False,withor=False,lastsep=None): - ls = format_list(list, pattern) - if withand: - return seperator.join(ls[:-1]) + "$, and $" + ls[-1] - if withor: - return seperator.join(ls[:-1]) + "$, or $" + ls[-1] - return seperator.join(ls) - - -def format_join_enum(list, pattern="x_{%i}=%g", seperator=",\ "): - list = tolist(list) - return seperator.join(format_list( zip( range(1,len(list)+1 ), list), pattern)) - - -def as_set(l, symbol='f_{%i}'): - if type(l) != list and type(l) != np.ndarray: - l = [l] - l = tolist(l) - s = [symbol%(i,) for i in l] - s = '\{' + ", ".join(s) + "\}" - return s - - -def as_set_list(ll, symbol='%g'): - s = [] - for l in ll.flat: - l = tolist(l) - s.append(as_set(l, symbol)) - s = ["$"+ds+"$" for ds in s] - s = ", ".join(s) - return s - - -def infty(n,tol=10^8): - if n > tol: - s = '\infty' - else: - s = str(n) - return s - - -def flatten(ar): - v = [] - if type(ar) is np.ndarray or type(ar) is np.array: - for x in ar.flat: - m = flatten(x) - if type(m) == list: - v = v + m - else: - v.append(m) - else: - v = ar - return v - - -def tolist(l): - if type(l) == np.ndarray: - l2 = [] - for x in l.flat: - l2.append( x.tolist() if isinstance(x,np.ndarray) else x ) - l = l2 - - elif type(l) == list or hasattr(l, '__iter__'): - pass - else: - l = [l] - return l - - -def jget(A,n=0): - A = flatten(A) - return A[n] - - -def as_rational(x, output='tex', always_frac=False): - if type(x) == jinja2.runtime.Undefined: - return "UNDEFINED(jinja2)" - b = Fraction.from_float(x).limit_denominator(10000) - s = "output_error_in_as_rational_filter" - if output == 'tex': - if (b.denominator == 1 or b.numerator == 0) and not always_frac: - s = '%i'%b.numerator - else: - s = "\\frac{%i}{%i}"%(b.numerator, b.denominator) - return s - - -def mylen(l): - if isinstance(l, np.ndarray): - sz = l.size - else: - sz = len(l) - return sz - - -def permute_exam_answers(section,permutation): - v = section.split("\\item") - v = v[:5] + v[-1:] - assert(len(v) == 6) - permutation = [0] + permutation + [5] - v[0] = "\\begin{answer}[%i]\n"%permutation.index(1) - v2 = "\\item".join( [v[i] for i in permutation] ) - return v2 - - -def startswithvowel(value): - if value.lower().startswith(("a", "e", "i", "o","u")): - return True - else: - return False - - -def aan(s): - if s.startswith("no "): - return "" - return "an" if startswithvowel(s) else "a" diff --git a/build/lib/jinjafy/jinja_matlab_load.py b/build/lib/jinjafy/jinja_matlab_load.py deleted file mode 100644 index c675815..0000000 --- a/build/lib/jinjafy/jinja_matlab_load.py +++ /dev/null @@ -1,149 +0,0 @@ -import numpy as np -import scipy.io as spio - -def matlab_load(mfile): - j = mfile.rfind('.') - if j > -1: - ex = mfile[j + 1:] - base = mfile[:j] - else: - ex = '' - base = mfile - mat = loadmat(base + '.mat') - mat = uuroll(mat) - mat = fix_1_arrays(mat) - mat = fix_strings(mat) - mat = fix_simple_lists(mat) - return mat - - -def loadmat(filename): - ''' - this function should be called instead of direct spio.loadmat - as it cures the problem of not properly recovering python dictionaries - from mat files. It calls the function check keys to cure all entries - which are still mat-objects - ''' - data = spio.loadmat(filename,struct_as_record=False) - data2 = _check_keys(data) - return data2 - - -def _check_keys(dd): - ''' - checks if entries in dictionary are mat-objects. If yes - todict is called to change them to nested dictionaries - ''' - if isinstance(dd, spio.matlab.mio5_params.mat_struct): - dd = _check_keys(_todict(dd)) - elif type(dd) == dict: - for key in dd: - kv = flist(dd[key]) - if type( kv ) == spio.matlab.mio5_params.mat_struct: - dd[key] = _check_keys(kv) - else: - dd[key] = _check_keys(dd[key]) - elif type(dd) == list: - dd = [_check_keys(l) for l in dd] - elif type(dd) == np.ndarray: - if dd.dtype.str == '|O' and dd.size > 0: - if type( flist(dd.flat[0]) ) == spio.matlab.mio5_params.mat_struct: - for i in range( dd.size ): - dd.flat[i] = _check_keys( flist( dd.flat[i]) ) - else: - for i in range(dd.size): - dd.flat[i] = _check_keys(dd.flat[i]) - - return dd - -def fix_simple_lists(l): - if type(l) == dict: - for k,v in l.items(): - l[k] = fix_simple_lists(v) - elif type(l) == np.ndarray and l.dtype.name == "uint8" and l.shape[0] == 1 and l.ndim == 2: - # l = l.tolist() - l = l.tolist()[0] - return l - -def apply_recursively(l, myfun): - if type(l) == dict: - for k,v in l.items(): - l[k] = apply_recursively(v, myfun) - elif type(l) == np.ndarray and l.dtype.str == '|O' and l.size > 0: - for i in range( l.size ): - l.flat[i] = apply_recursively( l.flat[i], myfun) - else: - l = myfun(l) - return l - - -def fix_1_arrays(l): - def _fix_1_arrays(l): - if type(l) == np.ndarray and l.size == 1 and np.issubdtype(l.dtype, np.number): - l = l.flat[0] - return l - l = apply_recursively(l, _fix_1_arrays) - return l - - -def fix_strings(l): - if type(l) == dict: - for k,v in l.items(): - l[k] = fix_strings(v) - elif type(l) == np.ndarray and l.size > 0: - tp = type(superpop(l.flat[0])) - if tp == str or tp == np.str_: - l = [superpop(x) for x in l.flat ] - if len(l) == 1: - l = l.pop() - return l - - -def superpop(l): - if type(l) == list and len(l) == 1: - return superpop(l[0]) - if type(l) == np.ndarray and l.size == 1: - return superpop(l.tolist()) - return l - - -def flist(l): - if type(l) == list and len(l) == 1: - l = flist( l.pop() ) - - if type(l) == np.ndarray and l.dtype.name == "object": - l3 = [flist(v) for v in l.flat] - l = flist( l3 ) - return l - - -def _todict(matobj): - ''' - A recursive function which constructs from matobjects nested dictionaries - ''' - dict = {} - for strg in matobj._fieldnames: - elem = matobj.__dict__[strg] - if isinstance(elem, spio.matlab.mio5_params.mat_struct): - dict[strg] = _todict(elem) - else: - dict[strg] = elem - return dict - - -def uuroll(v): - if type(v) is dict: - for key,val in v.items(): - v[key] = uuroll(val) - if type(v) is np.ndarray or type(v) is np.array: - for j in range(v.size): - v.flat[j] = uuroll(v.flat[j]) - return v - - -def uroll(mat): - for k in mat.keys(): - v = mat[k] - v = uuroll(v) - mat[k] = v - return mat \ No newline at end of file diff --git a/build/lib/jinjafy/jinjafy.py b/build/lib/jinjafy/jinjafy.py deleted file mode 100644 index 43da4a7..0000000 --- a/build/lib/jinjafy/jinjafy.py +++ /dev/null @@ -1,214 +0,0 @@ -import inspect -import jinja2 -from math import floor, log10 -import os -import numpy as np -from jinjafy import jinja_env - - -def jinjafy_template(data,file_in,file_out=None, filters={},template_searchpath=None): - if template_searchpath: - file_in = os.path.relpath(file_in, template_searchpath) - - return jinjafy_comment(data, file_in=file_in, file_out=file_out,jinja_tag=None, filters=filters,template_searchpath=template_searchpath) - - -def jinjafy_comment(data,file_in=None,file_out=None,jinja_tag="jinja",jinja_code=None,trim_whitespace=True,trim_comments=True,comment_char="#", - filters={},template_searchpath=None): - # Extract all comments from the given file and jinjafy them. - if file_in is None: - frame = inspect.stack()[1] - module = inspect.getmodule(frame[0]) - file_in = module.__file__ - elif not jinja_tag: - trim_comments=False - trim_whitespace=False - - if not template_searchpath: - with open(file_in,'r') as f: - s = f.read() - if jinja_tag: - stag = "<" + jinja_tag + ">" - etag = "</" + jinja_tag + ">" - - i_start = s.find(stag) - i_end = s.find(etag) - s = s[i_start+len(stag):i_end] - ss = [s] - if trim_comments: - ss = [ds.strip()[1:] for ds in s.splitlines() if len(ds.strip()) > 0 and ds.strip()[0] in ["#", "%"] ] - if trim_whitespace: - ss = [ds.strip() for ds in ss] - - jinja_code = '\n'.join(ss) - - from jinjafy.snipper import SnipperExtension - extensions = [SnipperExtension] - if template_searchpath: - if not isinstance(template_searchpath, list): - template_searchpath = [template_searchpath] - template_searchpath = [ts.replace("\\", "/") for ts in template_searchpath] - templateLoader = jinja2.FileSystemLoader(searchpath=template_searchpath) - env = jinja2.Environment(lstrip_blocks=True, trim_blocks=True,loader=templateLoader, extensions=extensions) - else: - env = jinja2.Environment(lstrip_blocks=True, trim_blocks=True, extensions=extensions) - - import math - env.globals['exp'] = math.exp - env.globals['sqrt'] = math.sqrt - env.globals['cos'] = math.cos - env.globals['sin'] = math.sin - - env.globals['mround'] = mround - env.globals['bold'] = bold - env.globals['fmat'] = fmat - env.globals['enumerate'] = enumerate - env.globals['zip'] = zip - env.globals['ensure_numpy'] = ensure_numpy - env.globals['transpose'] = transpose - import math - env.globals['ceil'] = math.ceil - env.globals['floor'] = math.floor - - - from pylatexenc import latexencode - env.globals['utf8tolatex'] = latexencode.utf8tolatex - env.globals['as_set'] = jinja_env.as_set - env.globals['as_set_list'] = jinja_env.as_set_list - env.globals['len'] = jinja_env.mylen - env.globals['get'] = jinja_env.jget - env.globals['tolist'] = jinja_env.tolist - - filters['as_set'] = jinja_env.as_set - filters['format_list'] =jinja_env.format_list - filters['format_join'] = jinja_env.format_join - filters['format_join_enum'] = jinja_env.format_join_enum - filters['pm'] = lambda x: f" {x}" if x < 0 else f"+{x}" - filters['bold'] = bold - filters['capfirst'] = lambda x: (x[0].upper() + x[1:] if len(x) > 1 else x.upper()) if x != None and isinstance(x, str) else x - filters['lowerfirst'] = lambda x: (x[0].lower() + x[1:] if len(x) > 1 else x.lower()) if x != None and isinstance(x, str) else x - filters['infty'] = jinja_env.infty - filters['n2w'] = jinja_env.n2w - def latex_url(url): - if not isinstance(url, str): - return url - url = url.replace("%", r"\%") - return url - filters['latex_url'] = latex_url - filters['format_list_symbols'] = jinja_env.format_list_symbols - filters['mround'] = mround - def eround(val,l): - x = str(mround(val, l)) - if l == 0: - return x - if '.' not in x: - x = x + "." - n = l - (len(x) - x.find(".") - 1) - if n > 0: - x = x + "0"*n - return x - - filters['eround'] = eround - filters['get'] = jinja_env.jget - filters['flatten'] = jinja_env.flatten - filters['aan'] = jinja_env.aan - filters['bracket'] = bracket - filters['tolist'] = jinja_env.tolist - filters['rational'] = jinja_env.as_rational - filters['permute_exam_answers'] = jinja_env.permute_exam_answers - env.filters.update(filters) - - data['block_start_string'] = '{%' - if not template_searchpath: - jinja_out = env.from_string(jinja_code).render(data) - else: - file_in = file_in.replace("\\", "/") - template = env.get_template(file_in) - jinja_out = template.render(data) - - if file_out is not None: - with open(file_out,'w',encoding='utf-8') as f: - # jinja_out = jinja_out.encode('utf-8') - - f.write(jinja_out) - print("Writing to: " + file_out) - - return jinja_out - - -def bold(bob,d=True) : - if not isinstance(bob, str) : - bob = str(bob) - if d : - bob = '\\textbf{' + bob +"}" - return bob - - -def fmat(bob,l=2,dobold=False) : - bob = mround(bob,l) - bob = bold(bob, dobold) - return bob - -def bracket(s): - return "{"+str(s)+"}" - -def un2str(x, xe, precision=2): - """pretty print nominal value and uncertainty - - x - nominal value - xe - uncertainty - precision - number of significant digits in uncertainty - - returns shortest string representation of `x +- xe` either as - x.xx(ee)e+xx - or as - xxx.xx(ee)""" - # base 10 exponents - x_exp = int(floor(log10(x))) - xe_exp = int(floor(log10(xe))) - - # uncertainty - un_exp = xe_exp - precision + 1 - un_int = round(xe * 10 ** (-un_exp)) - - # nominal value - no_exp = un_exp - no_int = round(x * 10 ** (-no_exp)) - - # format - nom(unc)exp - fieldw = x_exp - no_exp - fmt = '%%.%df' % fieldw - result1 = (fmt + '(%.0f)e%d') % (no_int * 10 ** (-fieldw), un_int, x_exp) - - # format - nom(unc) - fieldw = max(0, -no_exp) - fmt = '%%.%df' % fieldw - result2 = (fmt + '(%.0f)') % (no_int * 10 ** no_exp, un_int * 10 ** max(0, un_exp)) - - # return shortest representation - if len(result2) <= len(result1): - return result2 - else: - return result1 - - -def mround(val, l=2): - if not isinstance(l, int): - return un2str(val, l, 1) - else: - if isinstance(val, np.ndarray): - return np.round(val * 10 ** l) / (10 ** l) - else: - return round(val * 10 ** l) / (10 ** l) - - -def transpose(X): - return np.transpose( ensure_numpy( X) ) - - -def ensure_numpy(X): - if type(X) != np.ndarray: - X = np.asarray(X) - if X.ndim == 1: - X = np.transpose( np.expand_dims(X,1) ) - return X \ No newline at end of file diff --git a/build/lib/jinjafy/plot/__init__.py b/build/lib/jinjafy/plot/__init__.py deleted file mode 100644 index d2254a5..0000000 --- a/build/lib/jinjafy/plot/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# from thtools.plot.plot_helpers import * diff --git a/build/lib/jinjafy/plot/plot_helpers.py b/build/lib/jinjafy/plot/plot_helpers.py deleted file mode 100644 index 594e718..0000000 --- a/build/lib/jinjafy/plot/plot_helpers.py +++ /dev/null @@ -1,48 +0,0 @@ -import matplotlib.pyplot as plt -import numpy as np -import seaborn as sns -import inspect -import os -from datetime import datetime - -def subplots(nrows=2, ncols=2, size_inches=(10,12), *args): - fig,axx = plt.subplots(nrows, ncols, *args) - fig.set_size_inches(size_inches[0], size_inches[1]) - if not isinstance(axx, list): - axx = np.asarray(axx, dtype=np.object).reshape((nrows, ncols)) - return fig, axx - -def get_colors(palette="dark",max_colors=5): - return sns.color_palette(palette, max_colors) - - -def watermark_plot(extra="", nback=2, fz_y=10): - # from slider.thtools_base import watermark_string - s = watermark_string(nback=nback) - plt.figtext(0.05, 0.95, s) - - - -def watermark_string(nback=2): - - - tm = datetime.now().strftime('%b-%d-%I:%M%p') - # for line in traceback.format_stack(): - # # print(line.strip()) - v = inspect.stack() - ss = [] - j = 0 - for i in range(len(v)): - if "plot_helpers.py" in v[i].filename: continue - ss.append( os.path.basename( v[i].filename) ) - j = j + 1 - if j > nback: break - # from thtools import execute_command - from jinjafy import execute_command - v, _ = execute_command("git rev-parse --short HEAD".split()) - - ss.append(tm) - return ('/'.join(ss) + f" @{v}").strip() - - - diff --git a/build/lib/jinjafy/snipper.py b/build/lib/jinjafy/snipper.py deleted file mode 100644 index ad55d29..0000000 --- a/build/lib/jinjafy/snipper.py +++ /dev/null @@ -1,89 +0,0 @@ -from jinja2 import nodes -from jinja2.ext import Extension -import os - - -class SnipperExtension(Extension): - # a set of names that trigger the extension. - tags = set(['snipper']) - - def __init__(self, environment): - super(SnipperExtension, self).__init__(environment) - - # add the defaults to the environment - environment.extend( - fragment_cache_prefix='', - fragment_cache=None - ) - self.ofile = "" - - def parse(self, parser): - # the first token is the token that started the tag. In our case - # we only listen to ``'cache'`` so this will be a name token with - # `cache` as value. We get the line number so that we can give - # that line number to the nodes we create by hand. - lineno = next(parser.stream).lineno - - # now we parse a single expression that is used as cache key. - args = [parser.parse_expression()] - ofile = os.path.join(os.path.dirname(parser.filename), args[0].value) - args[0].value = ofile - if not os.path.isdir(os.path.dirname(ofile)): - os.makedirs(os.path.dirname(ofile)) - self.ofile = ofile - print("Snipper args", args, "ofile", ofile) - - # if there is a comma, the user provided a timeout. If not use - # None as second parameter. - if parser.stream.skip_if('comma'): - args.append(parser.parse_expression()) - else: - args.append(nodes.Const(None)) - - # now we parse the body of the cache block up to `endcache` and - # drop the needle (which would always be `endcache` in that case) - body = parser.parse_statements(['name:endsnipper'], drop_needle=True) - - # now return a `CallBlock` node that calls our _cache_support - # helper method on this extension. - return nodes.CallBlock(self.call_method('_snip_method', args), - [], [], body).set_lineno(lineno) - - # parser.environment.loader.searchpath - # parser.parse_statements(body) - return body - - def _snip_method(self, name, timeout, caller): - # rv = 0 - # key = self.environment.fragment_cache_prefix + name - - # try to load the block from the cache - # if there is no fragment in the cache, render it and store - # it in the cache. - # rv = self.environment.fragment_cache.get(key) - # if rv is not None: - # return rv - rv = caller() - outfile = name - print("Actually snipping to ", self.ofile, "name", name, "timeout", timeout) - with open(name, 'w') as f: - f.write(rv) - # print("Actually snipping to ", self.ofile, 'writing', rv) - - # self.environment.fragment_cache.add(key, rv, timeout) - return rv - - - def _cache_support(self, name, timeout, caller): - """Helper callback.""" - key = self.environment.fragment_cache_prefix + name - - # try to load the block from the cache - # if there is no fragment in the cache, render it and store - # it in the cache. - rv = self.environment.fragment_cache.get(key) - if rv is not None: - return rv - rv = caller() - self.environment.fragment_cache.add(key, rv, timeout) - return rv \ No newline at end of file diff --git a/build/lib/jinjafy/textools.py b/build/lib/jinjafy/textools.py deleted file mode 100644 index 511932d..0000000 --- a/build/lib/jinjafy/textools.py +++ /dev/null @@ -1,187 +0,0 @@ -from jinjafy import jinjafy_comment -import numpy as np - -#"<jinja1>" -#\begin{tabular}{ {{cc}} } -# {% if bookstabs %}\toprule{% endif %} -# {% if vvlabels %} -# {% for vl in vvlabels %} -# {% if loop.index > 1 %} & {% endif %} \multicolumn{ {{vl[0]}} }{ {{vl[2]}} }{ {{vl[1]}} } -# {% endfor %} \\ -# {% for vl in vvlabels %} -# {% if vl[3] %} -# \cmidrule(r){ {{vl[3]}} } -# {% endif %} -# {% endfor %} -# {% endif %} -# {% for row in X %} -# {% if bookstabs and loop.index == 2%}\midrule{% endif %} -# {% for c in row %} -# {% if loop.index > 1 %} & {% endif %} {{ c['tex'] }} {% if loop.index == W %} \\ {% endif %} -# {% endfor %} -# {% endfor %} -# {% if bookstabs %}\bottomrule{% endif %} -#\end{tabular} -#</jinja1> -# Convert a matrix to a table super quickly -def mat2table(X,vlabels=None,hlabels=None,file_out = None, bookstabs=True, vvlabels=None,plot=False,pdf_out=None, standalone=False): - X, Xx, Xerr,Xdl = fmat_X2dict(X) - if pdf_out: plot = True - #%% - if plot: - import matplotlib.pyplot as plt - #plt.style.use('ggplot') - plt.style.use('seaborn') - fig = plt.figure() - ax = fig.gca() - #ax = plt.gca() - ls = [] - for j in range(X.shape[0]): - ls.append(ax.plot(Xx[j, :]).pop() ) - - if Xerr[j]: - plt.errorbar(range(X.shape[1]), Xx[j,:], yerr=Xerr[j], color=ls[j].get_color()) - - for i in range( X.shape[1] ): - if 'xs' in X[j,i]: - plt.plot([i]*len(X[j,i]['xs']), X[j,i]['xs'], '.', color=ls[j].get_color()) - - if vlabels: - plt.legend(ls, vlabels, bbox_to_anchor=(1.04, 1), loc="upper left") - if hlabels: - plt.xticks(range(X.shape[1]), hlabels[1:]) - #plt.subplots_adjust(right=0.5) - plt.tight_layout(rect=[0, 0, 1, 1]) - plt.show() - #if pdf_out: - # fig.savefig(pdf_out, bbox_inches='tight') - - - if vlabels: - vltex = [{'tex': v} for v in vlabels] - for i in range(len(Xdl)): - Xdl[i] = [vltex[i]] + Xdl[i] - - if hlabels: - Xdl = [ [{'tex': h} for h in hlabels] ] + Xdl - - if vvlabels: - cc = 1 - for i in range(len(vvlabels)): - if len(vvlabels[i]) < 3: - vvlabels[i].append("c") - dl = vvlabels[i][0] - if dl == 1: - a = None - else: - a = "%i-%i"%(cc, cc+dl-1) - cc = cc + dl - vvlabels[i] = vvlabels[i] + [a] - - H = len(Xdl) - W = len(Xdl[0]) - cc = ["c" for i in range(W)] - if vlabels: - cc[0] = "l" - cc = "".join(cc) - - def fmat(x): - if isinstance(x, int): - x = str(x) - if isinstance(x, float): - x = "%2.3f"%x - return x - - #X = [ [fmat(x) for x in row] for row in X] - - data = {'X' : Xdl, 'hlabels': hlabels, 'vlabels': vlabels, 'cc': cc, 'H':H, 'W': W, 'bookstabs': bookstabs, - 'vvlabels': vvlabels} - - from jinjafy.jinjafy import jinjafy_comment - s = jinjafy_comment(data,jinja_tag="jinja1") - if file_out: - print("Writing to: " + file_out) - - if standalone: - s = jinjafy_comment({"s": s}, jinja_tag="jinja3") - - with open(file_out, 'w') as f: - f.write(s) - if standalone: - - from slider import latexmk - latexmk(file_out) - - - return s -# "<jinja3>" -# \documentclass[crop]{standalone} -# \usepackage{booktabs} -# \usepackage{siunitx} -# \begin{document} -# {{s}} -# \end{document} -# </jinja3> - -def fmat_X2dict(X): - X = np.asarray(X, dtype=np.object) - if len(X.shape) > 2: - X2 = np.ndarray(X.shape[:2], dtype=np.object) - for i in range(X.shape[0]): - for j in range(X.shape[1]): - X2[i, j] = X[i, j, :].squeeze() - X = X2 - X = np.reshape(X, X.shape[:2]) - - for i in range(X.shape[0]): - for j in range(X.shape[1]): - dx = X[i,j] - if isinstance(dx, (list, np.ndarray)): - dx = [x for x in np.ravel(dx)] - - if not isinstance(dx, dict): - dx = {'x': dx} - elif not isinstance(dx['x'], str): - x = dx['x'] - # if isinstance(x, np.ndarray): - if 'tex' not in dx: - dx['std'] = np.std(x) - dx['std_mean'] = np.std(x) / np.sqrt( len(x)) - dx['xs'] = x - dx['x'] = np.mean(x) - x2, u2 = mround( dx['x'], dx['std_mean'] ) - - dx['tex'] = '\\SI{%g\\pm %.2f}{}'%(x2, u2) - - if 'tex' not in dx: - dx['tex'] = dx['x'] - - X[i,j] = dx - - Xerr = [None] * X.shape[0] - Xx = np.zeros(X.shape) - - for i in range(X.shape[0]): - if "std" in X[0,0]: - Xerr[i] = [dx['std_mean'] for dx in X[i]] - - for j in range(X.shape[1]): - Xx[i,j] = X[i,j]['x'] - - Xdl = [] - for i in range(X.shape[0]): - dx = [] - for j in range(X.shape[1]): - dx.append(X[i,j]) - Xdl.append(dx) - - - return X,Xx,Xerr,Xdl - -import math -def mround(x,u): - n = np.floor(np.log10(x)+1) - dx = np.round(x / np.power(10.0, n), 2) - du = np.round(u / np.power(10.0, n), 2) - return dx * np.power(10, n), du * np.power(10.0,n) - diff --git a/build/lib/slider/DTU_Beamer_files/02450_beamer_preamble.tex b/build/lib/slider/DTU_Beamer_files/02450_beamer_preamble.tex deleted file mode 100644 index 2dd8694..0000000 --- a/build/lib/slider/DTU_Beamer_files/02450_beamer_preamble.tex +++ /dev/null @@ -1,93 +0,0 @@ -% WARNING! This file was automatically generated; see slider/DTU_Beamer_files for original version. -\usepackage[T1]{fontenc} -\usepackage[utf8]{inputenc} -\usepackage[english]{babel} -\usepackage{pgfplots} -\pgfplotsset{compat=newest} -\usepackage{booktabs} -\usepackage{siunitx} - -\usepackage[inkscape=true,inkscapeformat=pdf,inkscapelatex=true]{svg} -\svgpath{osvgs/} - -\usepackage{url} -\usepackage{pmboxdraw} -\usepackage{amssymb} -\usepackage{pgffor} - -\usetheme[department=compute]{DTU} -\newcommand{\tabitem}{{\color{dtured}$\bullet$} } -\usepackage[absolute,overlay]{textpos} -\textblockorigin{0mm}{0mm} - -\setlength{\TPHorizModule}{\paperwidth} -\setlength{\TPVertModule}{\paperheight} - -% Latin Modern -\usepackage{lmodern} -\newcommand{\overlabel}[1]{ \begin{textblock}{1}(0,0) \url{#1} \end{textblock} } - -% Verdana font type -%\usepackage{verdana} -% Helvetica -%\usepackage{helvet} -% Times (text and math) -%\usepackage{newtx, newtxmath} - -% \usetheme[department=compute]{DTU} - -\makeatletter - -\def\osvg{\@ifnextchar[{\@with}{\@without} } -\def\@with[#1]#2{ - \foreach[count=\n] \x in {#1}{ - \iftoggle{overlabel_includesvgs}{ - \IfFileExists{osvgs/x_do_not_edit_#2-l\n_nofonts.pdf}{ - \begin{textblock}{1}(0,0) - \includegraphics<\x>[width=1.0\linewidth]{osvgs/x_do_not_edit_#2-l\n_nofonts} - \end{textblock} - }{ File: \url{osvgs/x_do_not_edit_#2-l\n_nofonts.pdf} does not exist; bad layer import? Check \url{osvgs/#2.svg} including layer information. - } - } - } - \olabel{#2} -} -\def\@without#1{ - % Try to include first 10 layer files if they are there. - \foreach[count=\n] \x in {1,...,10}{ - \iftoggle{overlabel_includesvgs}{ - \IfFileExists{osvgs/x_do_not_edit_#1-l\n_nofonts.pdf}{ - \begin{textblock}{1}(0,0) - \includegraphics<\n->[width=1.0\linewidth]{osvgs/x_do_not_edit_#1-l\n_nofonts} - \end{textblock} - }{ - } - } - } - \olabel{#1} -} -\newcommand{\olabel}[1]{ - \iftoggle{overlabel_includelabels}{ - \begin{textblock}{1}(0,0) \url{#1} \end{textblock} - }{ - \begin{textblock}{1}(0,0) {\color{white} \url{#1} } \end{textblock} - } -} - -\makeatother - -\makeatother -\ifdefined\bluem -% nothing. -\else - -\newcommand\bluem[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{ #1 }}} -\newcommand\redm[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{ #1 }}} -\newcommand\greenm[1]{{\textcolor[HTML]{398E00}{ #1 }}} -\newcommand\yellowm[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{ #1 }}} - -\newcommand\bluet[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{\textbf{#1}}}} -\newcommand\redt[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{\textbf{#1}}}} -\newcommand\greent[1]{{\textcolor[HTML]{398E00}{\textbf{#1}}}} -\newcommand\yellowt[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{\textbf{#1}}}} -\fi \ No newline at end of file diff --git a/build/lib/slider/DTU_Beamer_files/02450_lectures_base.tex b/build/lib/slider/DTU_Beamer_files/02450_lectures_base.tex deleted file mode 100644 index c8c834a..0000000 --- a/build/lib/slider/DTU_Beamer_files/02450_lectures_base.tex +++ /dev/null @@ -1,25 +0,0 @@ -\documentclass[aspectratio=43]{beamer} -\usepackage{etoolbox} -\newtoggle{overlabel_includesvgs} -\newtoggle{overlabel_includelabels} - -\toggletrue{overlabel_includesvgs} -\toggletrue{overlabel_includelabels} - -\input{02450_beamer_preamble} - -\IfFileExists{generated/slide1.tex}{ \input{generated/slide1} }{ } -\begin{document} - \begin{frame} - \maketitle -\end{frame} -\begin{frame} -\IfFileExists{generated/slide2.tex}{ \input{generated/slide2} }{ } -\end{frame} -\begin{frame} -\IfFileExists{generated/slide3.tex}{ \input{generated/slide3} }{ } -\end{frame} - -\input{svg_converted_slides} - -\end{document} diff --git a/build/lib/slider/DTU_Beamer_files/beamer_slider_preamble.tex b/build/lib/slider/DTU_Beamer_files/beamer_slider_preamble.tex deleted file mode 100644 index 2dd8694..0000000 --- a/build/lib/slider/DTU_Beamer_files/beamer_slider_preamble.tex +++ /dev/null @@ -1,93 +0,0 @@ -% WARNING! This file was automatically generated; see slider/DTU_Beamer_files for original version. -\usepackage[T1]{fontenc} -\usepackage[utf8]{inputenc} -\usepackage[english]{babel} -\usepackage{pgfplots} -\pgfplotsset{compat=newest} -\usepackage{booktabs} -\usepackage{siunitx} - -\usepackage[inkscape=true,inkscapeformat=pdf,inkscapelatex=true]{svg} -\svgpath{osvgs/} - -\usepackage{url} -\usepackage{pmboxdraw} -\usepackage{amssymb} -\usepackage{pgffor} - -\usetheme[department=compute]{DTU} -\newcommand{\tabitem}{{\color{dtured}$\bullet$} } -\usepackage[absolute,overlay]{textpos} -\textblockorigin{0mm}{0mm} - -\setlength{\TPHorizModule}{\paperwidth} -\setlength{\TPVertModule}{\paperheight} - -% Latin Modern -\usepackage{lmodern} -\newcommand{\overlabel}[1]{ \begin{textblock}{1}(0,0) \url{#1} \end{textblock} } - -% Verdana font type -%\usepackage{verdana} -% Helvetica -%\usepackage{helvet} -% Times (text and math) -%\usepackage{newtx, newtxmath} - -% \usetheme[department=compute]{DTU} - -\makeatletter - -\def\osvg{\@ifnextchar[{\@with}{\@without} } -\def\@with[#1]#2{ - \foreach[count=\n] \x in {#1}{ - \iftoggle{overlabel_includesvgs}{ - \IfFileExists{osvgs/x_do_not_edit_#2-l\n_nofonts.pdf}{ - \begin{textblock}{1}(0,0) - \includegraphics<\x>[width=1.0\linewidth]{osvgs/x_do_not_edit_#2-l\n_nofonts} - \end{textblock} - }{ File: \url{osvgs/x_do_not_edit_#2-l\n_nofonts.pdf} does not exist; bad layer import? Check \url{osvgs/#2.svg} including layer information. - } - } - } - \olabel{#2} -} -\def\@without#1{ - % Try to include first 10 layer files if they are there. - \foreach[count=\n] \x in {1,...,10}{ - \iftoggle{overlabel_includesvgs}{ - \IfFileExists{osvgs/x_do_not_edit_#1-l\n_nofonts.pdf}{ - \begin{textblock}{1}(0,0) - \includegraphics<\n->[width=1.0\linewidth]{osvgs/x_do_not_edit_#1-l\n_nofonts} - \end{textblock} - }{ - } - } - } - \olabel{#1} -} -\newcommand{\olabel}[1]{ - \iftoggle{overlabel_includelabels}{ - \begin{textblock}{1}(0,0) \url{#1} \end{textblock} - }{ - \begin{textblock}{1}(0,0) {\color{white} \url{#1} } \end{textblock} - } -} - -\makeatother - -\makeatother -\ifdefined\bluem -% nothing. -\else - -\newcommand\bluem[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{ #1 }}} -\newcommand\redm[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{ #1 }}} -\newcommand\greenm[1]{{\textcolor[HTML]{398E00}{ #1 }}} -\newcommand\yellowm[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{ #1 }}} - -\newcommand\bluet[1]{{\textcolor[rgb]{0.20, 0.40, 0.80}{\textbf{#1}}}} -\newcommand\redt[1]{{\textcolor[rgb]{0.60, 0.00, 0.00}{\textbf{#1}}}} -\newcommand\greent[1]{{\textcolor[HTML]{398E00}{\textbf{#1}}}} -\newcommand\yellowt[1]{{\textcolor[rgb]{1.00, 0.80, 0.00}{\textbf{#1}}}} -\fi \ No newline at end of file diff --git a/build/lib/slider/DTU_Beamer_files/beamercolorthemeDTU.sty b/build/lib/slider/DTU_Beamer_files/beamercolorthemeDTU.sty deleted file mode 100644 index 8e406d1..0000000 --- a/build/lib/slider/DTU_Beamer_files/beamercolorthemeDTU.sty +++ /dev/null @@ -1,29 +0,0 @@ -% beamercolorthemeDTU.sty -% This file is a part of the DTU beamer package and makes sure that -% the DTU colours are available. This file does neither redefine -% beamer settings, nor does it add new configurations. It has to be -% maintained for backward compatibility. -% -% Changelog -% 2011-06-23 jowr Replaced the old colour definitions with the new ones from the design guide -% 2011-07-05 jowr Added alternative colours for the graphs -% 2011-08-16 jowr Moved colour definitions to resources folder, also used in poster class -% 2014-09-27 jowr Added documentation and prepared merge to git repository -% -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Load the file if it exists, throw a warning otherwise -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -\InputIfFileExists{dtucolours}{ - \PackageInfo{dtubeamer}{Successfully loaded the DTU colours.} - }{ - \PackageWarning{dtubeamer}{Could not load the colours from dtucolours.sty. This compilation is likely to fail.} - }% - -\mode<presentation> - -% The new design does not need any adaption here, black is -% the default colour. - -\mode<all> \ No newline at end of file diff --git a/build/lib/slider/DTU_Beamer_files/beamerfontthemeDTU.sty b/build/lib/slider/DTU_Beamer_files/beamerfontthemeDTU.sty deleted file mode 100644 index 49c4eab..0000000 --- a/build/lib/slider/DTU_Beamer_files/beamerfontthemeDTU.sty +++ /dev/null @@ -1,38 +0,0 @@ -% Copyright 2014 by Remus Mihail Prunescu - -% LaTeX Support Group 2014 -% DTU Official Presentation - -% For PDFLATEX -\usefonttheme{professionalfonts} - -% Title font -\setbeamerfont{title}{size=\large, series=\bfseries} -\setbeamercolor{title}{fg=black} - -% Subtitle font -\setbeamerfont{subtitle}{size=\small, series=\normalfont} - -% Author font -\setbeamerfont{author}{size=\small, series=\normalfont} - -% Footline -\setbeamerfont{framecounter in head/foot}{size=\tiny} -\setbeamerfont{department in head/foot}{size=\tiny, series=\bfseries} -\setbeamerfont{title in head/foot}{size=\tiny} -\setbeamerfont{date in head/foot}{size=\tiny} - -% Frametitle -\setbeamerfont{frametitle}{size=\large, series=\bfseries} -\setbeamerfont{block body}{size=\small} -\setbeamerfont{section title}{size=\small} -\setbeamerfont{block body alerted}{size=\small} -\setbeamerfont{block body example}{size=\small} -\setbeamerfont{block title}{size=\large,parent={structure,block body}} -\setbeamerfont{block title alerted}{parent={block title,alerted text}} -\setbeamerfont{block title example}{parent={block title,example text}} -\setbeamerfont{itemize/enumerate body}{size=\small} - -% Colors -\setbeamercolor{frametitle}{fg=black} -\setbeamercolor{structure}{fg=black} \ No newline at end of file diff --git a/build/lib/slider/DTU_Beamer_files/beamerinnerthemeDTU.sty b/build/lib/slider/DTU_Beamer_files/beamerinnerthemeDTU.sty deleted file mode 100644 index 9e464ff..0000000 --- a/build/lib/slider/DTU_Beamer_files/beamerinnerthemeDTU.sty +++ /dev/null @@ -1,52 +0,0 @@ -% Copyright 2007 by Till Tantau -% Copyright 2010 by Remus Mihail Prunescu - -% LaTeX Support Group 2010 -% DTU Official Presentation - - -\mode<presentation> - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Title page: DTU -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\defbeamertemplate*{title page}{DTU}[1][] -{ - % Set bInTitle to true to make sure the right footline is printed - \global\edef\bInTitle{true} - - \linespread{1.45} - % Content of the title page - - % Title + Subtitle - \vspace{\dimTitleOffset} - \begin{beamercolorbox}[left]{title box} - \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle\par - \ifx\insertsubtitle\@empty - \else - \vspace{\dimSubtitleOffset} - {\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle\par} - \fi - \end{beamercolorbox} - - \vspace{\dimAuthorOffset} - % Author - \begin{beamercolorbox}[left]{author box} - \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor - \end{beamercolorbox} - - \vspace{\dimInstituteOffset}% Institute - \begin{beamercolorbox}[left]{institute box} - \usebeamerfont{institute}\usebeamercolor[fg]{author}\insertinstitute - \end{beamercolorbox} - - % Title graphic - {\usebeamercolor[fg]{titlegraphic}\inserttitlegraphic\par} - - % Fill the space till bottom - \vskip0pt plus 1filll -} - -\mode -<all> diff --git a/build/lib/slider/DTU_Beamer_files/beamerouterthemeDTU.sty b/build/lib/slider/DTU_Beamer_files/beamerouterthemeDTU.sty deleted file mode 100644 index 79b75f4..0000000 --- a/build/lib/slider/DTU_Beamer_files/beamerouterthemeDTU.sty +++ /dev/null @@ -1,98 +0,0 @@ -% Copyright 2014 by Remus Mihail Prunescu - -% LaTeX Support Group 2014 -% DTU Official Presentation - -\mode<presentation> - -\setbeamercolor*{framecounter in head/foot}{parent=palette tertiary} -\setbeamercolor*{department in head/foot}{parent=palette tertiary} -\setbeamercolor*{title in head/foot}{parent=palette tertiary} -\setbeamercolor*{date in head/foot}{parent=palette tertiary} - -% No navigation symbols -\setbeamertemplate{navigation symbols}{} - -% Header -\setbeamertemplate{headline} -{ - \ifdefstring{\bDTUWhiteFrame}{true} - { - \insertFrameDTUWhiteLogo - } - { - \ifdefstring{\bInTitle}{true} - { - \insertTitleDTULogo - } - { - \insertFrameDTULogo - } - } -} - -% Footer -\setbeamertemplate{footline} -{ - \ifdefstring{\bInTitle}{true} - { - \vspace{-0.35\paperheight} - \begin{beamercolorbox}[wd=\paperwidth]{title bottom} - \vbox{% - \makebox[0pt][l]{\hspace{\dimDTUDepLogoXOffset}\insertdepartmentlogoA}% - \vbox{% - \hspace{\dimDTUFriseXOffset}% - \makebox[0pt][l]{\insertDTUFrise}% - \vspace{\dimDTUDepFriseOffset}% - }% - }% - \vspace{\dimDTUFriseYOffset} - \end{beamercolorbox} - \global\def\bInTitle{false} - } - { - \ifdefstring{\bDTUWhiteFrame}{true} - { - } - { % - \hbox{ % - \hspace{\dimTextLeftMargin}\hspace{-1.5pt}\insertframenumber % - \setlength{\widthframenumber}{2em + \widthof{\insertframenumber}} % - \setlength{\widthdepartment}{1em + \widthof{\insertdepartmentandinstitute}} % - \setlength{\widthdate}{1em + \widthof{00 00000000 0000}} % Tue: Added extra 0's (2 to 7) to prevent wrap - \setlength{\widthtitle}{\textwidth-\widthframenumber-\widthdepartment-\widthdate-\dimTextLeftMargin-\dimTextLeftMargin} % - %\parbox[t]{\widthframenumber}{\insertframenumber} % - \parbox[t]{\widthdepartment}{\insertdepartmentandinstitute} % - \parbox[t]{\widthtitle}{\raggedleft\insertshorttitleinfooter} % - \parbox[t]{\widthdate}{\raggedleft\DTUDateFormat\insertdate} % - \vspace{\dimFootlineYOffset} % - } - } - } -} - -% Position the frame title so that it would get into the headline -\setbeamertemplate{frametitle} -{ - \vspace{\dimPlaceTitleInHeader} - \ifdefstring{\inShowSection}{true} - { - \usebeamerfont{section title}\color{black!20}% - \ifnumcomp{\thesection}{=}{0}{% - \ \par% - } - {% - \insertsection\par - } - } - { - \vspace{\dimFrameTitleOffset} - } - \vspace{-1pt}\usebeamerfont{frametitle}% - \ifdefstring{\bDTUWhiteFrame}{true}{\color{white}}{\color{black}}% - \insertframetitle - \vspace{\dimAfterFrameTitleOffset} -} - -\mode -<all> diff --git a/build/lib/slider/DTU_Beamer_files/beamerthemeDTU.sty b/build/lib/slider/DTU_Beamer_files/beamerthemeDTU.sty deleted file mode 100644 index d8841f6..0000000 --- a/build/lib/slider/DTU_Beamer_files/beamerthemeDTU.sty +++ /dev/null @@ -1,255 +0,0 @@ -% Copyright Remus Mihail Prunescu - -% LaTeX Support Group -% DTU Official Presentation - -\mode<presentation> - -\RequirePackage{etoolbox} -\RequirePackage{datetime} -\RequirePackage{keyval} -\RequirePackage{calc} - -% Enlarge slide size -\beamer@paperwidth 1.09375\beamer@paperwidth% -\beamer@paperheight 1.09375\beamer@paperheight% - -% Extra package -\InputIfFileExists{departments}% - {\ClassInfo{}{The file departments.tex with department logo file naming has been loaded.}}% - {\ClassInfo{}{The file departments.tex is missing. Consult the manual.}% -}% - -% Default values for options -\newcommand{\inDepartmentShortName}{elektro} -\newcommand{\inLanguage}{english} -\newcommand{\inShowSection}{true} - -% Check language -\@ifpackagewith{babel}{danish}{% - \renewcommand{\inLanguage}{danish}% -}{} - - -% Save options -\DeclareOptionBeamer{department}{\renewcommand{\inDepartmentShortName}{#1}} -\DeclareOptionBeamer{showsection}{\renewcommand{\inShowSection}{#1}} -\ProcessOptionsBeamer - -% % % % % % % % % % % % -% Define Dimensions -% % % % % % % % % % % % - -\newcommand{\dimDTULogoWidth}{0.0394\paperwidth} % Percent -\newcommand{\dimDTULogoHeight}{0.0777\paperheight} % Percent -\newcommand{\dimDTULogoYOffset}{0.0404\paperheight} % Percent -\newcommand{\dimDTULogoXOffset}{0.9176\paperwidth} % Percent - -\newcommand{\dimDTUDepLogoXOffset}{0.062\paperwidth} % Percent -\newcommand{\dimDTUDepLogoHeight}{0.0897\paperheight} % Percent - -\newcommand{\dimDTUFriseYOffset}{0.03\paperheight} % Percent -\newcommand{\dimDTUFriseXOffset}{0.418\paperwidth} % Percent -\newcommand{\dimDTUFriseHeight}{0.3412\paperheight} % Percent -\newcommand{\dimDTUDepFriseOffset}{0.018\paperheight} % Percent - -\newcommand{\dimTitleOffset}{0.148\paperheight} -\newcommand{\dimSubtitleOffset}{0.0175\paperheight} -\newcommand{\dimFrameTitleOffset}{0.033\paperheight} -\newcommand{\dimAfterFrameTitleOffset}{-0.008\paperheight} -\newcommand{\dimAuthorOffset}{0.06\paperheight} -\newcommand{\dimInstituteOffset}{0.027\paperheight} - -\newcommand{\dimFootlineYOffset}{0.025\paperheight} % Tue: This was 0.0355 in original file - -\newcommand{\dimLeftMarginI}{0.02\paperwidth} -\newcommand{\dimTextLeftMargin}{0.0669\paperwidth} % Percent - -\newcommand{\dimPlaceTitleInHeader}{-0.09\paperheight} - - -\makeatletter -\setbeamersize{text margin left=\dimTextLeftMargin, text margin right=\dimTextLeftMargin} -\makeatother - -% % % % % % % % % % % % -% End of Dimensions -% % % % % % % % % % % % - -% New commands to be used in the DTU template -%\newcommand{\insertdepartmentandinstitute}{\departmenttitle , \institutetitle} -\newcommand{\insertdepartmentandinstitute}{\departmenttitle} -\newcommand{\insertDTULogo}{\includegraphics[width=\dimDTULogoWidth]{tex_dtu_logo}} -\newcommand{\insertDTUWhiteLogo}{} -\newcommand{\inserttitlefootline}{} -\newcommand{\inserttitleheadline}{} -\newcommand{\institutetitle}{} - -% Internal variable to check if \titlepage was called: false by default -\def\bInTitle{false} -\def\bDTUWhiteFrame{false} - -% Process language -% Is it DK or UK? -\ifdefstring{\inLanguage}{danish} -{ - \renewcommand{\institutetitle}{Danmarks Tekniske Universitet} - \renewcommand{\insertDTUWhiteLogo}{\includegraphics[height=\dimDTULogoHeight]{tex_dtu_dk_a1_neg}} -} -{ - \ifdefstring{\inLanguage}{english} - { - \renewcommand{\institutetitle}{Technical University of Denmark} - \renewcommand{\insertDTUWhiteLogo}{\includegraphics[height=\dimDTULogoHeight]{tex_dtu_uk_a1_neg}} - } - { - % Undefined language - % Default values are used - } -} - -\ifcsdef{department@\inDepartmentShortName} -{ - \activateDepartmentInfo{\inLanguage}{\inDepartmentShortName} -} -{ - \PackageError{DTU Beamer Template}{Department is undefined. Reverting to default (elektro).}{Check the user guide for defined departments. If you cannot find it then contact support group to add the department.} - \activateDepartmentInfo{\inLanguage}{elektro} -} - -% Command for generating the department title -\newcommand{\departmenttitle}{\thedepartmentNameText} -% Command for inserting the department logo -\newcommand{\insertdepartmentlogoA}{% - \ifdefstring{\inDepartmentShortName}{admin} - { - } - { - \includegraphics[height=\dimDTUDepLogoHeight]{\thedepartmentLogo} - } -} -% Command for inserting frise -\newcommand{\insertDTUFrise}{\includegraphics[height=\dimDTUFriseHeight]{\thedepartmentFrise}} - -% Command used from frame DTU logo (headline) -\newcommand{\insertFrameDTULogo} -{ - \vspace{\dimDTULogoYOffset} - \begin{beamercolorbox}[right]{logo in head/foot}% - \insertDTULogo\makebox[\dimDTULogoWidth][]{} - \end{beamercolorbox} -} -\newcommand{\insertFrameDTUWhiteLogo} -{ - \vspace{\dimDTULogoYOffset} - \begin{beamercolorbox}[right]{logo in head/foot}% - \insertDTUWhiteLogo\makebox[\dimDTULogoWidth][]{} - \end{beamercolorbox} -} - -% Command used in title page for inserting the DTU logo in headline -\newcommand{\insertTitleDTULogo} -{ - \insertFrameDTULogo -} - -% Change themes -\usefonttheme{DTU} -\useoutertheme{DTU} -\useinnertheme{DTU} -\usecolortheme{DTU} - -% Left margin for list environment -\setlength{\leftmargini}{\dimLeftMarginI} - -% Adjust bullets placement -\setlength\labelsep{3pt} - -\setbeamersize{text margin left=\dimTextLeftMargin} - -% Itemize -\setbeamertemplate{items}[circle] -\setbeamercolor{itemize item}{fg=dtured} -\setbeamercolor{itemize subitem}{fg=dtured} - -\setbeamerfont{section in toc}{size=\small} -\setbeamerfont{subsection in toc}{size=\scriptsize} - -\setbeamertemplate{enumerate items}[circle] -\setbeamercolor{item projected}{fg=white,bg=dtured} - -% Table of contents -\setbeamertemplate{section in toc}{% - \color{dtured}$\bullet$ \inserttocsection \par} - -\setbeamertemplate{subsection in toc}{ - \hskip1em{\color{dtured}$\bullet$} \inserttocsubsection \par} - -% Fix space between sections and subsections in toc -\makeatletter -\patchcmd{\beamer@sectionintoc} - {\vfill} - {\vskip\itemsep} - {} - {} -\pretocmd{\beamer@subsectionintoc} - {\vskip0.5\itemsep} - {} - {} -\makeatother - - -% Date format -\newcommand{\DTUDateFormat}{\DTUDate} -\newdateformat{DTUDate}{\THEDAY.\THEMONTH.\THEYEAR} - -% Customize blocks -\setbeamertemplate{blocks}[rounded][shadow=true] -\setbeamercolor{block title}{fg=white,bg=dtured} -\setbeamerfont{block title}{series=\bfseries\small} -\setbeamercolor{block body}{fg=black,bg=white} - - -\newcommand{\defaultDTUFrameStyle}{ - \setbeamertemplate{background}{} - \color{black} -} - -% White DTU frame -\makeatletter -\define@key{beamerframe}{dtuwhitelogo}[true]{% - \global\def\bDTUWhiteFrame{true} - \color{white} -} -\define@key{beamerframe}{bgfilename}{% - \setbeamertemplate{background}{ - \includegraphics[width=\paperwidth,height=\paperheight,keepaspectratio]{#1} - } -} -% Default framestyle -\pretocmd{\beamer@@@@frame} -{ - \global\def\bDTUWhiteFrame{false} - \defaultDTUFrameStyle -} -{}{} -\makeatother - -% Lengths for footer -\newlength{\widthframenumber} -\newlength{\widthdepartment} -\newlength{\widthtitle} -\newlength{\widthdate} - -% Short title for the footer -\makeatletter -\newcommand\insertshorttitleinfooter{% - \beamer@shorttitle% -} -\makeatother - -% Description list -\setbeamercolor{description item}{fg=dtured} - -\mode -<all> diff --git a/build/lib/slider/DTU_Beamer_files/blank.png b/build/lib/slider/DTU_Beamer_files/blank.png deleted file mode 100644 index 082daebc2e8b00d950bcd22987c75a26f0349d97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3161 zcmeAS@N?(olHy`uVBq!ia0y~yV3uKEU~=GKV_;xlw@ENyU|?V@4sv&5Sa(k5B?AKk zOS+@4BLl<6e(pbstPBhcoCO|{#S9EWB_ParFHOFJfr0y-r;B4qMcmu#hKvUk1P&Zn z{?C@#S#`qOyw0{YwY&@r4iA2FGcbIZ^N@jo!KjUyf#HM%9|MCzvIPS}L(iz-Xn>3+ zhS7{LS~855ila5cXl*!J8;;h7qqX6ntqnWQ$hiA+)W}+XC}Ln>VDNPHb6Mw<&;$Tp CXOsT` diff --git a/build/lib/slider/DTU_Beamer_files/departments.tex b/build/lib/slider/DTU_Beamer_files/departments.tex deleted file mode 100644 index d248470..0000000 --- a/build/lib/slider/DTU_Beamer_files/departments.tex +++ /dev/null @@ -1,130 +0,0 @@ -% departments.tex -% This file is a part of the DTU letter package and contains the file path for -% the grahic file, and text name for the different departments. -% -% Changelog -% 2010-04-07 Added % at the end of each line to make it possible to use the definitions in the documentation -% 2010-04-09 Added the 5th mandatory argument (long text name) -% 2010-04-23 Moved the new argument, #6, to #4 and added all info. However two graphic files are missing and I have therefore made a test: if the graphic file is missing the administration logo is used. -% 2013-02-11 Added compute and diplom department entries. Added check to see that the department macros are defined, otherwise an error is printed. -% -%\makeDepartmentInfo{<danish|english>}{<departmentname>}{<text graphic file name>}{<Big department logo file name>}{<department text name>}{<department long text name>} -% - -\RequirePackage{etoolbox} - -\newcommand\setDepartmentNameLogo[1]{\def\@departmentNameLogo{#1}}% -\newcommand\thedepartmentNameLogo{\@departmentNameLogo}% -\newcommand\setDepartmentNameText[1]{\def\@departmentNameText{#1}}% -\newcommand\thedepartmentNameText{\@departmentNameText}% -\newcommand\setDepartmentLongNameText[1]{\def\@departmentLongNameText{#1}}% -\newcommand\thedepartmentLongNameText{\@departmentLongNameText}% -\newcommand\setDepartmentLogo[1]{\def\@departmentLogo{#1}}% -\newcommand\thedepartmentLogo{\@departmentLogo}% -\newcommand\setDepartmentFrise[1]{\def\@departmentFrise{#1}}% -\newcommand\thedepartmentFrise{\@departmentFrise}% -% -\newcommand\createDepartment[1]{% -\expandafter\def\csname department@#1\endcsname{#1}}% -% -\newcommand\aliasDepartment[2]{% -\expandafter\def\csname department@#2\endcsname{#1}}% -% -\ifundef{\makeDepartmentInfo}{% - \newcommand\makeDepartmentInfo[7]{% - \def\@departmentcmd{\csname department@#2\endcsname} - \createDepartment{#2} - \expandafter\def\csname namelogo#1@\@departmentcmd\endcsname{\setDepartmentNameLogo{#3}}% - \expandafter\def\csname deplogo#1@\@departmentcmd\endcsname{\setDepartmentLogo{#4}}% - \expandafter\def\csname depfrise#1@\@departmentcmd\endcsname{\setDepartmentFrise{#5}}% - \expandafter\def\csname nametext#1@\@departmentcmd\endcsname{\setDepartmentNameText{#6}}% - \expandafter\def\csname namelongtext#1@\@departmentcmd\endcsname{\setDepartmentLongNameText{#7}}% - - }% -}{}% -% -\newcommand\activateDepartmentInfo[2]{% - \ifcsname department@#2\endcsname% - \def\@departmentcmd{\csname department@#2\endcsname}% - \else% - \def\@departmentcmd{\department@admin}% - \fi% - \csname namelogo#1@\@departmentcmd\endcsname% TODO test if command exists before executing it - \csname nametext#1@\@departmentcmd\endcsname% - \csname namelongtext#1@\@departmentcmd\endcsname% - \csname deplogo#1@\@departmentcmd\endcsname% - \csname depfrise#1@\@departmentcmd\endcsname% - % \fromdepartment{\thedepartmentLongNameText} -}% -% -\makeDepartmentInfo{danish} {aqua}{tex_aqua_dk}{tex_dtu_aqua_a}{tex_dtu_aqua_frise}{DTU Aqua}{Institut for Akvatiske Ressourcer}% -\makeDepartmentInfo{english}{aqua}{tex_aqua_uk}{tex_dtu_aqua_a_uk}{tex_dtu_aqua_frise}{DTU Aqua}{National Institute of Aquatic Resources}% - -\makeDepartmentInfo{danish} {byg}{tex_byg_dk}{tex_dtu_byg_a}{tex_dtu_byg_frise}{DTU Byg}{Institut for Byggeri og Anl\ae g}% -\makeDepartmentInfo{english}{byg}{tex_byg_uk}{tex_dtu_byg_a_uk}{tex_dtu_byg_frise}{DTU Civil Engineering}{Department of Civil Engineering}% - -\makeDepartmentInfo{danish}{compute}{tex_compute_uk}{tex_dtu_compute_a}{tex_dtu_frise}{DTU Compute}{Institut for Matematik og Computer Science} -\makeDepartmentInfo{english}{compute}{tex_compute_uk}{tex_dtu_compute_a_uk}{tex_dtu_frise}{DTU Compute}{Department of Applied Mathematics and Computer Science} - -\makeDepartmentInfo{danish} {elektro}{tex_elektro_dk}{tex_dtu_elektro_a}{tex_dtu_frise}{DTU Elektro}{Institut for Elektroteknologi} -\makeDepartmentInfo{english}{elektro}{tex_elektro_uk}{tex_dtu_elektro_a_uk}{tex_dtu_frise}{DTU Electrical Engineering}{Department of Electrical Engineering} - -\makeDepartmentInfo{danish} {energi}{tex_energikonvertering_dk}{tex_dtu_energi_a}{tex_dtu_energi_frise}{DTU Energi}{Institut for Energikonvertering og -lagring} -\makeDepartmentInfo{english}{energi}{tex_energikonvertering_uk}{tex_dtu_energi_a_uk}{tex_dtu_energi_frise}{DTU Energy}{Department of Energy Conversion and Storage} - -\makeDepartmentInfo{danish} {fotonik}{tex_fotonik_dk}{tex_dtu_fotonik_a}{tex_dtu_frise}{DTU Fotonik}{Institut for Fotonik} -\makeDepartmentInfo{english}{fotonik}{tex_fotonik_uk}{tex_dtu_fotonik_a_uk}{tex_dtu_frise}{DTU Fotonik}{Department of Photonics Engineering} - -\makeDepartmentInfo{danish} {fysik}{tex_fysik_dk}{tex_dtu_fysik_a}{tex_dtu_fysik_frise}{DTU Fysik}{Institut for Fysik} -\makeDepartmentInfo{english}{fysik}{tex_fysik_uk}{tex_dtu_fysik_a_uk}{tex_dtu_fysik_frise}{DTU Physics}{Department of Physics} - -\makeDepartmentInfo{danish} {food}{tex_fodevareinstituttet_dk}{tex_dtu_fdevareinstituttet_a}{tex_dtu_frise}{DTU F\o devareinstituttet}{F\o devareinstituttet} -\makeDepartmentInfo{english}{food}{tex_fodevareinstituttet_uk}{tex_dtu_fdevareinstituttet_a_uk}{tex_dtu_frise}{DTU Food}{National Food Institute} - -\makeDepartmentInfo{danish} {kemi}{tex_kemi_dk}{tex_dtu_kemi_a}{tex_dtu_kemi_frise}{DTU Kemi}{Institut for Kemi} -\makeDepartmentInfo{english}{kemi}{tex_kemi_uk}{tex_dtu_kemi_a_uk}{tex_dtu_kemi_frise}{DTU Chemistry}{Department of Chemistry} - -\makeDepartmentInfo{danish} {kemiteknik}{tex_kemiteknik_dk}{tex_dtu_kemiteknik_a}{tex_dtu_kemiteknik_frise}{DTU Kemiteknik}{Institut for Kemiteknik} -\makeDepartmentInfo{english}{kemiteknik}{tex_kemiteknik_uk}{tex_dtu_kemiteknik_a_uk}{tex_dtu_kemiteknik_frise}{DTU Chemical Engineering}{Department of Chemical and Biochemical Engineering} - -\makeDepartmentInfo{danish} {management}{tex_management_dk}{tex_dtu_management_a}{tex_dtu_frise}{DTU Management}{Institut for Systemer, Produktion og Ledelse} -\makeDepartmentInfo{english}{management}{tex_management_uk}{tex_dtu_management_a_uk}{tex_dtu_frise}{DTU Management Engineering}{Department of Management Engineering} - -\makeDepartmentInfo{danish} {mekanik}{tex_mekanik_dk}{tex_dtu_mekanik_a}{tex_dtu_mek_frise}{DTU Mekanik}{Institut for Mekanisk Teknologi} -\makeDepartmentInfo{english}{mekanik}{tex_mekanik_uk}{tex_dtu_mekanik_a_uk}{tex_dtu_mek_frise}{DTU Mechanical Engineering}{Department of Mechanical Engineering} - -\makeDepartmentInfo{danish} {miljo}{tex_miljo_dk}{tex_dtu_milj_a}{tex_dtu_miljoe_frise}{DTU Milj\o}{Institut for Vand og Milj\o teknologi} -\makeDepartmentInfo{english}{environmentalEng}{tex_miljo_uk}{tex_dtu_milj_a_uk}{tex_dtu_miljoe_frise}{DTU Environment}{Department of Environmental Engineering} - -\makeDepartmentInfo{danish} {nanotek}{tex_nanotek_dk}{tex_dtu_nanotek_a}{tex_dtu_frise}{DTU Nanotek}{Institut for Mikro- og Nanoteknologi} -\makeDepartmentInfo{english}{nanotek}{tex_nanotek_uk}{tex_dtu_nanotek_a_uk}{tex_dtu_frise}{DTU Nanotech}{Department of Micro- and Nanotechnology} - -\makeDepartmentInfo{danish} {space}{tex_space_dk}{tex_dtu_space_a}{tex_dtu_space_frise}{DTU Space}{Institut for Rumforskning og Rumteknologi} -\makeDepartmentInfo{english}{space}{tex_space_uk}{tex_dtu_space_a_uk}{tex_dtu_space_frise}{DTU Space}{National Space Institute} - -\makeDepartmentInfo{danish} {systembiologi}{}{tex_dtu_systembiologi_a}{tex_dtu_frise}{DTU Systembiologi}{Institut for Systembiologi} -\makeDepartmentInfo{english}{systembiologi}{}{tex_dtu_systembiologi_a_uk}{tex_dtu_frise}{DTU Systems Biology}{Department of Systems Biology} - -\makeDepartmentInfo{danish} {transport}{tex_transport_dk}{tex_dtu_transport_a}{tex_dtu_transport_frise}{DTU Transport}{Institut for Transport} -\makeDepartmentInfo{english}{transport}{tex_transport_uk}{tex_dtu_transport_a_uk}{tex_dtu_transport_frise}{DTU Transport}{Department of Transport} - -\makeDepartmentInfo{danish} {vaterinaerinstituttet}{tex_veterinaertinstituttet_dk}{tex_dtu_veterinerinstituttet_a}{tex_dtu_vet_frise}{DTU Veterin\ae rinstituttet}{Veterin\ae rinstituttet} -\makeDepartmentInfo{english}{vaterinaerinstituttet}{tex_veterinaertinstituttet_uk}{tex_dtu_veterinerinstituttet_a_uk}{tex_dtu_vet_frise}{DTU Vet}{National Veterinary Institute} - -\makeDepartmentInfo{danish} {vindenergi}{tex_vindenergi_dk}{tex_dtu_vindenergi_a}{tex_dtu_vindenergi_frise}{DTU Vindenergi}{Institut for Vindenergi} -\makeDepartmentInfo{english}{vindenergi}{tex_vindenergi_uk}{tex_dtu_vindenergi_a_uk}{tex_dtu_vindenergi_frise}{DTU Wind Energy}{Department of Wind Energy} - - -% Extra -\makeDepartmentInfo{danish} {bibliotek}{tex_bibliotek_dk}{tex_dtu_bibliotek_a}{tex_dtu_bibliotek_frise}{DTU Bibliotek}{Danmarks Tekniske Informationcenter}% -\makeDepartmentInfo{english}{bibliotek}{tex_bibliotek_uk}{tex_dtu_bibliotek_uk_a}{tex_dtu_bibliotek_frise}{DTU Library}{Technical Information Center of Denmark}% - -\makeDepartmentInfo{danish} {admin}{tex_dtu_navn_dk}{}{tex_dtu_frise}{Danmarks Tekniske Universitet}{}% -\makeDepartmentInfo{english}{admin}{tex_dtu_navn_uk}{}{tex_dtu_frise}{Technical University of Denmark}{}% - -\makeDepartmentInfo{danish} {riso}{tex_riso_dk}{tex_ris_dtu_a}{tex_dtu_frise}{Ris\o\ DTU}{Nationallaboratoriet for B\ae redygtig Energi} -\makeDepartmentInfo{english}{riso}{tex_riso_uk}{tex_ris_dtu_a_uk}{tex_dtu_frise}{Ris\o\ DTU}{National Laboratory for Sustainable Energy} - -\makeDepartmentInfo{danish}{diplom}{tex_diplom_dk}{tex_dtu_diplom_a}{tex_dtu_frise}{Center for Diplomingeni\o ruddannelse}{DTU Diplom} -\makeDepartmentInfo{english}{diplom}{tex_diplom_dk}{tex_dtu_diplom_a_uk}{tex_dtu_frise}{Center for Diplomingeni\o ruddannelse}{DTU Diplom} - diff --git a/build/lib/slider/DTU_Beamer_files/dtu_slideshow_base.tex b/build/lib/slider/DTU_Beamer_files/dtu_slideshow_base.tex deleted file mode 100644 index 5cc71c6..0000000 --- a/build/lib/slider/DTU_Beamer_files/dtu_slideshow_base.tex +++ /dev/null @@ -1,25 +0,0 @@ -% This is the basic DTU slideshow file. Used when creating a new slideshow with slider -\documentclass[aspectratio=43]{beamer} -\usepackage{etoolbox} - -\input{02450_beamer_preamble} -%\IfFileExists{generated/slide2.tex}{ \input{generated/slide2} }{ } -\newtoggle{overlabel_includesvgs} -\newtoggle{overlabel_includelabels} - -\toggletrue{overlabel_includesvgs} -\toggletrue{overlabel_includelabels} - -\begin{document} -\begin{frame} -\maketitle -\end{frame} - -\begin{frame} \osvg{osvg01} -\frametitle{Example frame} -\begin{enumerate} - \item Item 1 -\end{enumerate} -\end{frame} - -\end{document} \ No newline at end of file diff --git a/build/lib/slider/DTU_Beamer_files/dtucolours.tex b/build/lib/slider/DTU_Beamer_files/dtucolours.tex deleted file mode 100644 index cda2381..0000000 --- a/build/lib/slider/DTU_Beamer_files/dtucolours.tex +++ /dev/null @@ -1,83 +0,0 @@ -% dtucolours.sty -% This file has been a part of the DTU beamer package and is now -% moved to the resources folder because there are other parts of the -% DTU package that need the colours as well. -% -% Changelog -% 2011-06-23 jowr Replaced the old colour definitions with the new ones from the design guide -% 2011-07-05 jowr Added alternative colours for the graphs -% 2011-08-16 jowr Moved colour definitions to resources folder, also used in poster class -% 2012-06-19 jowr Added colours for cooperation with IPU -% 2014-09-27 jowr Replaced definecolor with providecolor, do not overwrite custom colour definitions -% -% -\RequirePackage{xcolor} -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Define primary colours (designguide v2.3, page 13) -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\providecolor{dtured} {rgb}{0.60, 0.00, 0.00} % Primærfarve 1 - CMYK: 0/ 91/ 72/ 23 - RGB: 153/ 0/ 0 -\providecolor{dtugrey} {rgb}{0.60, 0.60, 0.60} % Primærfarve 2 - CMYK: 0/ 0/ 0/ 56 - RGB: 153/153/153 -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Define secondary colours (designguide v2.3, page 13) -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Please note that dtured and dtubrown have the same rgb and hex values and only differ in cmyk and pms notation. -\providecolor{dtuyellow} {rgb}{1.00, 0.80, 0.00} % Sekundærfarve 12 - CMYK: 0/ 25/100/ 0 - RGB: 255/204/ 0 - HEX: FFCC00 -\providecolor{dtuorange} {rgb}{1.00, 0.60, 0.00} % Sekundærfarve 1 - CMYK: 0/ 50/100/ 0 - RGB: 255/153/ 0 - HEX: FF9900 -\providecolor{dtulightred} {rgb}{1.00, 0.00, 0.00} % Sekundærfarve 3 - CMYK: 0/100/100/ 0 - RGB: 255/ 0/ 0 - HEX: FF0000 -\providecolor{dtubrown} {rgb}{0.60, 0.00, 0.00} % Sekundærfarve 4 - CMYK: 0/100/100/ 50 - RGB: 153/ 0/ 0 - HEX: 990000 -\providecolor{dtupurple} {rgb}{0.80, 0.20, 0.60} % Sekundærfarve 6 - CMYK: 25/100/ 0/ 0 - RGB: 204/ 51/153 - HEX: CC3399 -\providecolor{dtuviolet} {rgb}{0.40, 0.00, 0.60} % Sekundærfarve 9 - CMYK: 75/ 75/ 0/ 0 - RGB: 102/ 0/153 - HEX: 660099 -\providecolor{dtudarkblue} {rgb}{0.20, 0.40, 0.80} % Sekundærfarve 13 - CMYK: 75/ 50/ 0/ 0 - RGB: 51/102/204 - HEX: 3366CC -\providecolor{dtulightblue} {rgb}{0.20, 0.80, 1.00} % Sekundærfarve 10 - CMYK: 50/ 0/ 0/ 0 - RGB: 51/204/255 - HEX: 33CCFF -\providecolor{dtulightgreen}{rgb}{0.60, 0.80, 0.20} % Sekundærfarve 11 - CMYK: 25/ 0/100/ 0 - RGB: 153/204/ 51 - HEX: 99CC33 -\providecolor{dtudarkgreen} {rgb}{0.40, 0.80, 0.00} % Sekundærfarve 14 - CMYK: 50/ 0/100/ 0 - RGB: 102/204/ 0 - HEX: 66CC00 -\providecolor{dtucoolgrey} {rgb}{0.59, 0.58, 0.57} % Farve til poster - CMYK: 0/ 1/ 5/ 39 - RGB: 150/148/145 - HEX: 969491 -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Define colours for drawings and graphs (designguide v2.3, page 14) -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\providecolor{graph01}{named}{dtuorange} -\providecolor{graph02}{named}{dtupurple} -\providecolor{graph03}{named}{dtulightblue} -\providecolor{graph04}{named}{dtubrown} -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Define alternate colours for drawings and graphs -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Define alternate colours for graphs, which are compatible with black -% and white printers. The initial set of colours makes it hard to distinguish -% between the two lighter and the two darker colours. -\providecolor{graph01alt}{named}{dtuviolet} -\providecolor{graph02alt}{named}{dtuyellow} -\providecolor{graph03alt}{named}{dtulightred} -\providecolor{graph04alt}{named}{dtulightgreen} -\providecolor{graph05alt}{named}{dtugrey} -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Define colours for IPU related documents, from IPU Designguide (16.09.2008) -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\providecolor{ipugreen} {rgb}{0.00, 0.40, 0.20} % Dark green, 1st standard colour - CMYK: 088/000/095/026 - RGB: 000/102/051 -\providecolor{ipugrey} {rgb}{0.45, 0.47, 0.49} % Dark grey, 2nd standard colour - CMYK: 015/000/000/075 - RGB: 114/121/126 -\providecolor{ipulightgreen}{rgb}{0.36, 0.67, 0.15} % Light green, 1sr secondary colour - CMYK: 070/000/100/000 - RGB: 091/172/038 -\providecolor{ipulightgrey} {rgb}{0.85, 0.86, 0.87} % Light grey, 2nd secondary colour - CMYK: 003/000/003/020 - RGB: 217/220/222 -% -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Old definitions -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \providecolor{dtured} {cmyk}{0.00, 0.95, 0.72, 0.27} -% \providecolor{dtudarkgray} {cmyk}{0.00, 0.00, 0.00, 0.56} -% \providecolor{dtugray} {cmyk}{0.00, 0.00, 0.00, 0.37} -% \providecolor{dtulightgray} {cmyk}{0.00, 0.00, 0.00, 0.19} -% \providecolor{dtudarkblue} {cmyk}{1.00, 0.72, 0.00, 0.38} -% \providecolor{dtublue} {cmyk}{0.60, 0.44, 0.00, 0.24} -% \providecolor{dtulightblue} {cmyk}{0.30, 0.22, 0.00, 0.12} -% \providecolor{dtudarkgreen} {cmyk}{1.00, 0.00, 0.83, 0.47} -% \providecolor{dtugreen} {cmyk}{0.725,0.004,1.00, 0.004} -% \providecolor{dtuyellow} {cmyk}{0.00, 0.00, 1.00, 0.00} -% \providecolor{dtuorange} {cmyk}{0.00, 0.34, 0.91, 0.00} -% \providecolor{dtudarkorange}{cmyk}{0.00, 0.51, 1.00, 0.00} -% \providecolor{dtupurpur} {cmyk}{0.00, 0.94, 0.00, 0.43} -% \providecolor{dtupurple} {cmyk}{0.83, 1.00, 0.00, 0.23} -% diff --git a/build/lib/slider/DTU_Beamer_files/tex_compute_uk.pdf b/build/lib/slider/DTU_Beamer_files/tex_compute_uk.pdf deleted file mode 100644 index 1488ea4bb66ad14ada91789909d4f3b9448e1103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3167 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 diff --git a/build/lib/slider/DTU_Beamer_files/tex_dtu_compute_a_uk.pdf b/build/lib/slider/DTU_Beamer_files/tex_dtu_compute_a_uk.pdf deleted file mode 100644 index d0d2f4efcdd8ace82a3d969627865501743c2671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13504 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 Zuf-*aMI~S#8X6m!8FHzry863u0RZ*ql*j-8 diff --git a/build/lib/slider/DTU_Beamer_files/tex_dtu_frise.pdf b/build/lib/slider/DTU_Beamer_files/tex_dtu_frise.pdf deleted file mode 100644 index a099312f58e8adc076799f45f00699408020fcc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32488 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 diff --git a/build/lib/slider/DTU_Beamer_files/tex_dtu_logo.pdf b/build/lib/slider/DTU_Beamer_files/tex_dtu_logo.pdf deleted file mode 100644 index 862fbcd41103ab0c721cdcf46f52131c89dfbe03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1830 zcmY!laB<T$)HCH$-THRjZ!Tj61BLvgEG`=x1%02?y!4U`1rr4Wg&-~k1qFS#%$$<c zA_aZ7oWzn;m(=9^lvFM|JFeoAqSVA(u8KLS)4cms%z0eCTea#X^m@Fi=8-?Balp9y z)zKT@*=7ECMDi{+|EZ;FB(h}2U+b%vQjB~5{BN(XdnR9h_0Q+~N0vUfJ0<Z`yLjTZ zrX2<O-+Y)Bq+Xc)WV%uv%eIx=udk#>PSP{rk7gHovuNJ^=}X>sFg&=ZY}N2>TkMHB zJ(cZh4zY7Wb8Pl~(plW!{C-bpsle4u(~iF16s)Gzta<v#w{SH*;ii<Sq0<A;ubp<b zW`U^GMu9C}+gaK)%eA`wC+MYi&tcgsp11At=hcFtF*A3+n)TK)@$UL7g*Fzq&%D*& zqh9;|2V33`;T>MtOB_5{KSnWWCTAVm^3Z<H^G)W;iIbN(xxZyR>;K#8#jgA8D<_=E zaeVOST5&a-&Gm(O)nzl5v6sd+Yzxcat4Ot<nC#RR@98G7Aok-_{jTX5HhY(_W`E8! zxi~+)WZ~A99c$yVo=G+=W!iiE+4e^gZ*`_#@)v3D`d2ln<F=^Kk-0pT)AuZHemMQt zKR&-(_GwKb9!=>{`i|WWHgjgU?3$jqaAz7@;LYGE84{j%Em@NabvN6s*H*ga7dNv! zvbr+nZTdH<tgsB0kGIyX2zns+$4Z91s(yo9_{!eu&E*R%53PJTd*wT8kqc7S3*B~q zsa<`r<HEPKY!klwq_4gIMVL+H(?pi=3Y*KUN5bzhX83QM@;B#AWW$Gr<v{`N4}~5l z8P5tiej-G6S8?LX()k?fwq3q6`&Pd_`l9AUx83*J+owJhswThc_svw2UYZfPdiEQ! zwd=mG^m15nb@%xlrCK-GRgS$+m7W-q^}gIK$ziTyrYrm9F2$K5zR^7=vn<~&QJE9= zLUO9f=}XK<H_S<0SLdvGsm`de-9O>#!Y>&$D=tT_7R{QFH+{a8-t8{=IahBbTsoMR z&)Ll7a{44s(6Y?S>leBmu*wbT>f!&iviQfBuZM40s89JCvTNo!77MFAiv4cd*DVjc ze4Vz=V%hdjo5dE0|M_BC_Umg$f7<5vCthZk2+psbZfCG>&cTiyYq#pZe(0}J{7lX0 z{-k^}**xv~&3|MLyezGHC-x%RKa2JMvHgNSjx*N(nD4lM=8V`oYm@ht=#}p1@vXZ3 z(8}$yO09jt_X}lKkD3YuuPR5c(t6GLxi6e!nf#yc$M@O3P+k_4(zA8_lKJA|u6Or^ zgp2GuIQgewtCwESI}W)gGiz6NcNw^gm~B7RudydB(tO$FlP|LET`TvlTW0@i@$r8r zJ63#q!@1EV^~bUDuK4hp{CB_n{;&jf@Mu5#v;9xhQTxmF)BnGJ#+90v0?ojwc`2Z* z56bT#T0ud<($oMX58@fY3kGme;961Q9$b=GlB!^10}=og4~Yf}pkl+>QNd6_KRHps zP{Ga)Bxh#_DkY$%o5Iae&=09BNLA1eNK8)!Dbo)~EK1EQQ80v;H@>MUnTbyM6$;S` z1_}lW#uj=OCME_3Mhd28dS+${v0z=!`FSO&c_qaPprR`XEaYC4Us{0VFo->1QII^y zt-%WVAw`LK#RVWclPh7u&cO=$E~#ai$*Do^P9Q;u5A=gli}Op1l2eNnK;aOC<R6f0 zLE!`PIm8~2e~LkR^}RDwiWQ<2Kwb`lyS5bMMI-~vkOIWHC^fMpzeqtNIWe;+U%^n% z&`{4vK_jE2q`*pFA1s(&lvt3FnOv-wUzDz?3AQGnC_kk%Ih7P`c6P9MHAk`@;(q7E zlEj?+bcoT3>8Zug7(wW%C`wJ^GElJKGJpdGGgDJzQ-w4IsF<O#iHQPORv`~AW?+UP zW?*1wimA@T2t&-!*bGC=#K00m%oJH&Nl{{EPHGXjHVe+IN>#7``zk0uzeEA#aY%CU g%uCBx07U~hUW-c-i%P&gG&Hra;8Im}^>^a}0Anr1<p2Nx diff --git a/build/lib/slider/DTU_Beamer_files/textext_preamble.tex b/build/lib/slider/DTU_Beamer_files/textext_preamble.tex deleted file mode 100644 index 8f34c6d..0000000 --- a/build/lib/slider/DTU_Beamer_files/textext_preamble.tex +++ /dev/null @@ -1,9 +0,0 @@ -\usepackage{amsmath} -\usepackage{amsfonts} -\usepackage{color} -\usepackage{bm} - -\newcommand{\m}[1]{\bm{ #1} } -\newcommand{\mcal}[1]{\mathcal{ #1}} - - \ No newline at end of file diff --git a/build/lib/slider/__init__.py b/build/lib/slider/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/build/lib/slider/__main__.py b/build/lib/slider/__main__.py deleted file mode 100644 index 0961f33..0000000 --- a/build/lib/slider/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -# from jinjafy import execute_command -from slider.latexutils import latexmk -from slider.slider_cli import clize_main_entry_point - -if __name__ == "__main__": - clize_main_entry_point() \ No newline at end of file diff --git a/build/lib/slider/beamer_nup.py b/build/lib/slider/beamer_nup.py deleted file mode 100644 index 7b11e78..0000000 --- a/build/lib/slider/beamer_nup.py +++ /dev/null @@ -1,79 +0,0 @@ -import os -import glob - - -def beamer_nup(pdf_file, nup=6, output=None): - # pdf_file = pdf_file[:-4] + ".pdf" - if nup not in [1, 2, 3, 4, 6]: - assert False - - jinja = os.path.dirname( __file__ ) + "/../../jinja" - if os.path.isdir(jinja): - js = {} - for name in glob.glob(jinja + "/*.tex"): - with open(name, 'r') as f: - js[os.path.basename(name)[:-4] ] = f.read() - - s = "" - for k, v in js.items(): - v = v.replace("\\", "\\\\") - - s += f'{k} = """\n' + v + '\n"""' + "\n" - - with open(os.path.dirname(__file__) + "/jinjastrings/generated.py", 'w') as f: - s = "# WARNING! THIS FILE IS AUTOMATICALLY GENERATED! ALL CHANGES WILL BE WIPED. SEE JINJA DIRECTORY\n"*10 + s - f.write(s) - - - - from slider.jinjastrings.generated import lecture_collector_partial - - import jinja2 - - import tempfile - # tempfile.gettempdir() - tmp = tempfile.TemporaryDirectory().name - os.mkdir(tmp) - import shutil - dest_pdf = tmp + "/" + os.path.basename(pdf_file) - shutil.copyfile(pdf_file, dest_pdf) - - import jinja2 - data = {'a4': False, - 'twoup': False, - 'sixup': False} - if nup == 1: - data['a4'] = True - if nup == 2: - data['twoup'] = True - if nup == 3: - data['threeup'] = True - if nup == 4: - data['fourup'] = True - if nup == 6: - data['sixup'] = True - data['frame'] = True - - data['pdffiles'] = [os.path.basename(dest_pdf)] - - # data = {'hello': 'world'} - print(tmp) - s = jinja2.Environment().from_string(lecture_collector_partial).render(data) - - with open(tmp +"/nup.tex", 'w') as f: - f.write(s) - - from slider import latexmk - latexmk(tmp +"/nup.tex", shell=True) - - if output == None: - output = os.path.dirname(pdf_file) + "/" + os.path.basename(pdf_file)[:-4] + f"_{nup}up.pdf" - shutil.move(tmp +"/nup.pdf", output) - print("[Beamer-nup] Wrote output to", output) - return output - - - -if __name__ == "__main__": - beamer_nup("../../examples/new_project/index.pdf") - diff --git a/build/lib/slider/convert.py b/build/lib/slider/convert.py deleted file mode 100644 index 61b85ca..0000000 --- a/build/lib/slider/convert.py +++ /dev/null @@ -1,126 +0,0 @@ -from jinjafy import execute_command -import os -from bs4 import BeautifulSoup - -def svg2pdf(fin, fout=None, crop=True, text_to_path=False, export_area_page=True): - """ - -C, --export-area-page Area to export is page - -T, --export-text-to-path Convert text to paths (PS/EPS/PDF/SVG) - """ - # text_to_path = True - if fout is None: - fout = fin[:-4] + ".pdf" - cmd = ['inkscape'] - if export_area_page: - cmd.append("-C") - if text_to_path: # Good idea for inkscape which seems to bungle the fonts (space in font names?) - cmd.append("-T") - cmd.append(fin) - cmd.append(f"--export-filename={fout}") - # '-C', '--without-gui', f'--file={fin}', f'--export-pdf={fout}'] - # cmd = ['inkscape', '-C', '-T', '--without-gui', '--file=%s'%svg_fonts_layers[-1], '--export-pdf=%s' % pdf_nofonts_layers[-1]] - execute_command(cmd) - # cmd = f"pdftocairo {fout} -pdf {fout}" - # execute_command(cmd.split()) - - if crop: - cmd = ['pdfcrop', fout, fout] - execute_command(cmd) - - - -def pdf2svg(fin, fout, page_no=None): - ''' - To remove fonts look at - https://tex.stackexchange.com/questions/23407/how-can-i-convert-text-to-paths-with-pdflatex - convert to ps and back to pdf - ''' - if fout is None: - fout = fin[:-4] + ".svg" - - ''' - pdftocairo -svg C:/Users/tuhe/Documents/02465public/Lectures/Lecture_2/Latex/Lecture_2_NO_SVGS.pdf C:/Users/tuhe/Documents/02465public/Lectures/Lecture_2/Latex/osvgs/tmp/determpath.svg -f 2 -l 2 - - ''' - cmd = ['pdftocairo', '-svg', fin, fout] - if page_no is not None: - if not isinstance(page_no, str): - page_no = str(page_no) - cmd += ['-f', str(page_no), '-l', str(page_no)] - - execute_command(cmd) - - -def pdf2png(fin, fout=None, scale_to=None): - if fout is None: - fout = fin[:-4] + ".png" - fout = fout[:-4] - cmd = f"pdftocairo -png -singlefile {fin} {fout}" - if scale_to is not None: - cmd += f" -scale-to {scale_to}" - execute_command(cmd.split()) - return fout + ".png" - - -def pdfcrop(fin, fout=None): - if fout is None: - fout = fin - cmd = f"pdfcrop {fin} {fout}" - execute_command(cmd.split()) - - - -def svg_edit_to_importable(svg_edit_file,verbose=False, keep_background_layer=True): - assert False - """ - Take an inkscape file as input and split it into layers. - CODE NOT IN USE RIGHT NOW; MUST WORK OUT WHAT TO USE IT FOR. - """ - odir = os.path.dirname(svg_edit_file) - fn = os.path.basename(svg_edit_file)[:-4] - - pdf_nofonts_base = odir + "/x_do_not_edit_%s-l%s_nofonts.pdf" - svg_fonts_base = odir + "/" + SVG_TEXINCLUDE_RELPATH + "/%s-l%s_fonts.svg" - if not os.path.exists(os.path.dirname(svg_fonts_base)): - os.mkdir(os.path.dirname(svg_fonts_base)) - - pdf_nofonts_layers = [] - svg_fonts_layers = [] - - with open(svg_edit_file, 'r', encoding="UTF-8",errors="surrogateescape") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - for i in soup.findAll("image", {'id': 'image4444th'}): - i.extract() - - layer_labels = [] - for i in soup.findAll("g", {'inkscape:groupmode': 'layer'}): - if i['inkscape:label'] == "bg_layer": - #i.extract() - pass - else: - layer_labels.append(i['inkscape:label']) - - for j in range(len(layer_labels)): - s2 = soup.__copy__() - for i in s2.findAll("g", {'inkscape:groupmode': 'layer'}): - if layer_labels[j] == i['inkscape:label'] or i['inkscape:label'] == "bg_layer": - pass - else: - i.extract() - # now you got an image only with this layer. save it. - layer_number = layer_labels[j].split(" ").pop() - pdf_nofonts_layers.append(pdf_nofonts_base%(fn,layer_number)) - svg_fonts_layers.append(svg_fonts_base % (fn, layer_number)) - - with open(svg_fonts_layers[-1], 'bw') as f2: - f2.write(s2.encode("UTF-8")) - - cmd = ['inkscape', '-C', '-T', '--without-gui', '--file=%s'%svg_fonts_layers[-1], '--export-pdf=%s' % pdf_nofonts_layers[-1]] - execute_command(cmd) - - if verbose: - print("svg_edit_to_importable called. Converting svg file\n > %s\nto files:"%svg_edit_file) - for s in pdf_nofonts_layers + svg_fonts_layers: - print(" > " + s) - - return pdf_nofonts_layers, svg_fonts_layers diff --git a/build/lib/slider/latexutils.py b/build/lib/slider/latexutils.py deleted file mode 100644 index 2e50e09..0000000 --- a/build/lib/slider/latexutils.py +++ /dev/null @@ -1,36 +0,0 @@ -from jinjafy import execute_command -import os -import shutil - -def latexmk(texfile,pdf_out=None,shell=True,cleanup=False, Linux=False): - cdir = os.getcwd() - dname = os.path.dirname(texfile) - os.chdir(dname) - texfile = os.path.basename(texfile) - if Linux: - CMD = "latexmk -f -g -pdf -interaction=nonstopmode " + texfile - print("Running LaTeX command>> " + CMD) - s = execute_command(CMD.split(" "), shell=shell) - else: - CMD = "latexmk -f -g -pdf -shell-escape -interaction=nonstopmode " + texfile - print("Running LaTeX command>> " + CMD) - s = execute_command(CMD.split(" "),shell=shell) - - if pdf_out: - shutil.copyfile(texfile[:-4]+".pdf", pdf_out) - else: - pdf_out = os.path.join(os.path.dirname(texfile), texfile[:-4]+".pdf") - - if cleanup and os.path.exists(pdf_out): - bft = ['bbl', 'blg', 'fdb_latexmk', 'fls', 'aux', 'synctex.gz', 'log'] - for ex in bft: - import glob - fl = glob.glob(dname + "/*."+ex) - for f in fl: - os.remove(f) - - os.chdir(cdir) - return pdf_out - - - diff --git a/build/lib/slider/legacy_importer.py b/build/lib/slider/legacy_importer.py deleted file mode 100644 index 058a79e..0000000 --- a/build/lib/slider/legacy_importer.py +++ /dev/null @@ -1,487 +0,0 @@ -# Control import of slides from pdf to svg-editable format. -# inkscape -z -f "Input.pdf" -l "Output.svg" -# https://github.com/eea/odfpy -import os -import shutil -from jinjafy import jinjafy_comment -from bs4 import BeautifulSoup -import glob -from jinjafy import execute_command - -CDIR = os.path.dirname(os.path.realpath(__file__)) -CDIR = CDIR.replace('\\','/') - -SVG_EDIT_RELPATH = "osvgs" # files that are supposed to be edited goes here. -SVG_TMP_RELPATH = "tmp" # various files that can be flat out deleted goes here -SVG_TEXINCLUDE_RELPATH = "do_not_edit" # the no_fonts version and the pure (+fonts) versions goes here -DTU_beamer_base = CDIR +"/DTU_Beamer_files" -BLANK_PNG =DTU_beamer_base + "/blank.png" - -def ensure_dir(dname): - assert False - if not os.path.exists(dname): - os.mkdir(dname) - -def join_pdfs(slide_deck_pdf, outfile): - assert False - dn = os.path.dirname(slide_deck_pdf[0]) - files = [os.path.relpath(os.path.dirname(pdf), start=dn) + "/" + os.path.basename(pdf) for pdf in slide_deck_pdf] - outf = os.path.relpath(os.path.dirname(outfile), start=dn) + "/" + os.path.basename(outfile) - cmd = "cd " + dn + " && pdftk " + " ".join(files) + " cat output " + outf - execute_command(cmd.split()) - - -def li_import(slide_deck_pdf, tex_output_path=None, num_to_take=None, force=False, svg_pfix="osvg", svg_height=743.75, svg_width=992.5, - svg_converted_slides="svg_converted_slides.tex"): - assert False - ''' - svg_height and svg_width are used to scale the converted image. This is useful because otherwise the viewbox - will fail to match the DTU template. I.e. these numbers will generally change dependent on the LaTeX template. - - :param slide_deck_pdf: - :param tex_output_path: - :param num_to_take: - :param force: - :param svg_pfix: - :param svg_height: - :param svg_width: - :return: - ''' - # take this slide deck. Generate beamer, svg output. - - if isinstance(slide_deck_pdf, list): - dn = os.path.dirname(slide_deck_pdf[0]) - ofile = os.path.join(dn, "tmp.pdf") - join_pdfs(slide_deck_pdf, ofile) - slide_deck_pdf = ofile - - if tex_output_path is None: - tex_output_path = slide_deck_pdf[:-4]+"_output.tex" - - output_dir = os.path.dirname(tex_output_path) - - # if output_dir is None: - # output_dir = os.path.dirname(slide_deck_pdf) - assert(os.path.exists(output_dir)) - svg_tmp_dir = output_dir + "/" + SVG_EDIT_RELPATH +"/" + SVG_TMP_RELPATH - svg_texinclude_dir = output_dir + "/" + SVG_EDIT_RELPATH +"/" +SVG_TEXINCLUDE_RELPATH - svg_edit_dir = output_dir + "/" +SVG_EDIT_RELPATH - tex_output_file = os.path.basename(tex_output_path) - - print("Converting slides to output: " + tex_output_file) - if os.path.exists(output_dir + "/" + tex_output_file) or glob.glob(svg_edit_dir + "/*.svg"): - print("Non-empty output directory...") - if not force: - raise Exception("Non-empty output directory. Please clean") - - ensure_dir(svg_edit_dir) - ensure_dir(svg_tmp_dir) - ensure_dir(svg_texinclude_dir) - - if not output_dir: - raise Exception("Must specify output directory!") - - lecture_tex_out = move_template_files(output_dir, tex_output_file) - osvgs_basename = [] - print("Splitting slide deck into images...") - - # slide_deck_split_svg = slidedeck_to_images(slide_deck_pdf, svg_tmp_dir + "/" + svg_pfix + "-%i.svg", - # num_to_take=num_to_take) - slide_deck_split_svg = slidedeck_to_images(slide_deck_pdf, svg_tmp_dir+"/"+svg_pfix+"-%i.svg", num_to_take=num_to_take) - print("Converting svg to osvg..") - for i,osvg in enumerate(slide_deck_split_svg): - dosvg = raw_svg_to_osvg(osvg, overwrite_existing=True, height=svg_height, width=svg_width) - osvgs_basename.append(dosvg) - - print("jinjafying and cleaning...") - # osvgs_basename = osvgs_basename[3:] # Drop first 3 slides; automatically generated. - data = {'osvgs_basename' : osvgs_basename} - s = jinjafy_comment(data, jinja_tag="jinja1") - with open(output_dir + "/%s"%svg_converted_slides, 'w') as f: - f.write(s) - return lecture_tex_out - -# <jinja1> -# {% for sf in osvgs_basename %} -# \begin{frame}\osvg{{"{"}}{{sf}}{{"}"}} -# % add content here -# \end{frame} -# {% endfor %} -# </jinja1> -# \begin{textblock}{1}(0,0) -# \includesvg[width=1.0\linewidth]{{"{"}}{{sf}}{{"}"}} -# \end{textblock}\overlabel{ {{sf}} } -# SVG editable file (i.e. with background image) to file which can be imported into -# the .tex file. - -''' -Take a raw svg in the tmp directory and compile it into the nice svg format with empty, white background. -This can be used when importing a new slide deck or when inserting a new overlabel tag somewhere in a -tex document. -''' -def raw_svg_to_osvg(raw_svg_file, overwrite_existing=False, height=None, width=None): - svg_tmp_dir = os.path.dirname(raw_svg_file) - svg_edit_dir = os.path.dirname(svg_tmp_dir) - ofile_edit = svg_edit_dir + "/" + os.path.basename(raw_svg_file) - # if height is not None and width is not None: - # svg_set_hw_(raw_svg_file, raw_svg_file,height=height, width=width) - - ofile_fonts_pure = rm_svg_bg(svg_input=raw_svg_file, svg_output=ofile_edit, height=height, width=width) - png_file = svg_tmp_dir + "/" + os.path.basename(ofile_fonts_pure)[:-4] + ".png" - shutil.copyfile(BLANK_PNG, png_file) - ofile_edit = add_png_background_to_svg(svg_input=ofile_fonts_pure, svg_output=None, png_file=png_file) - pdf_nofonts, svg_fonts = svg_edit_to_importable(ofile_edit) - osvgs_basename = os.path.basename(raw_svg_file)[:-4] - return osvgs_basename - - -''' -Related to li_import. -Set the width/height of an imported slide svg image in case it does not match the DTU template. -''' -def svg_set_hw_(svg_in, svg_out, height, width): - assert False - print(f"HW fix [{height} {width}] > {svg_in} -> {svg_out}") - - with open(svg_in, 'r', encoding="UTF-8") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - tags = soup.find_all("svg") - assert (len(tags) == 1) - tag = tags[0] - tag['height'] = str(height) - tag['width'] = str(width) - tag['viewBox'] = f"0 0 {height} {width}" - # print([svg_input, logo_rem, bg_rem, tx_rem]) - with open(svg_out, 'bw') as f: - f.write(soup.encode("UTF-8")) - return - with open(svg_in, 'r', encoding="UTF-8", errors="surrogateescape") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - tags = soup.find_all("svg") - assert(len(tags) == 1) - tag = tags[0] - tag['height'] = str(height) - tag['width'] = str(width) - tag['viewBox'] = f"0 0 {height} {width}" - s2 = soup.__copy__() - # sout = s2.encode("UTF-8") - # f.close() - with open(svg_out, 'w', encoding="UTF-8") as f2: - f2.write(str(s2)) - -def svg_check_background_layer(svg_edit_file, verbose=False): - assert False - - # Check if svg background layer is pointing to the right .png file. - # this may not be the case sometimes because svg files are moved, etc. which overwrite the default - # background .png path. - with open(svg_edit_file, 'r', encoding="UTF-8",errors="surrogateescape") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - g = None - for i in soup.findAll("g", {'inkscape:groupmode': 'layer'}): - if i['inkscape:label'] == "bg_layer": - g = i - break - ok = True - bgim = g.find("image") - bg_png = bgim['xlink:href'] - real_png = os.path.dirname(svg_edit_file) + "/" + SVG_TMP_RELPATH + "/" + os.path.basename(svg_edit_file)[:-4] + ".png" - real_png = os.path.relpath(real_png, start=os.path.dirname( svg_edit_file) ) - bg_png = os.path.relpath(bg_png,start=os.path.dirname( svg_edit_file) ) - if real_png != bg_png: - print("slider:warning> Bungled background png image in " + svg_edit_file) - s = jinjafy_comment({'png_file': real_png}, jinja_tag="jinja3") - new_img = BeautifulSoup(s, "html.parser") - g.insert_after( new_img) - g.unwrap() - bgim.unwrap() - - with open(svg_edit_file[:-4]+"_test.svg", "w") as f2: - f2.write(soup.prettify(formatter="xml")) - -# <jinja3> -# <g inkscape:groupmode="layer" id="layer1" inkscape:label="bg_layer" style="display:inline" sodipodi:insensitive="true"> -# <image -# xlink:href="{{png_file}}" -# width="100%" -# height="100%" -# preserveAspectRatio="none" -# style="image-rendering:optimizeQuality" -# id="image4444th" -# x="0" -# y="0" /> -# </g> -# </jinja3> - - - -def svg_edit_to_importable(svg_edit_file,verbose=False): - odir = os.path.dirname(svg_edit_file) - fn = os.path.basename(svg_edit_file)[:-4] - - pdf_nofonts_base = odir + "/x_do_not_edit_%s-l%s_nofonts.pdf" - svg_fonts_base = odir + "/" + SVG_TEXINCLUDE_RELPATH + "/%s-l%s_fonts.svg" - if not os.path.exists(os.path.dirname(svg_fonts_base)): - os.mkdir(os.path.dirname(svg_fonts_base)) - - pdf_nofonts_layers = [] - svg_fonts_layers = [] - - with open(svg_edit_file, 'r', encoding="UTF-8",errors="surrogateescape") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - - for i in soup.findAll("image", {'id': 'image4444th'}): - i.extract() - - layer_labels = [] - for i in soup.findAll("g", {'inkscape:groupmode': 'layer'}): - if i['inkscape:label'] == "bg_layer": - #i.extract() - pass - else: - layer_labels.append(i['inkscape:label']) - - for j in range(len(layer_labels)): - s2 = soup.__copy__() - for i in s2.findAll("g", {'inkscape:groupmode': 'layer'}): - if layer_labels[j] == i['inkscape:label'] or i['inkscape:label'] == "bg_layer": - pass - else: - i.extract() - # now you got an image only with this layer. save it. - layer_number = layer_labels[j].split(" ").pop() - pdf_nofonts_layers.append(pdf_nofonts_base%(fn,layer_number)) - svg_fonts_layers.append(svg_fonts_base % (fn, layer_number)) - - with open(svg_fonts_layers[-1], 'bw') as f2: - f2.write(s2.encode("UTF-8")) - - from slider.convert import svg2pdf - svg2pdf(svg_fonts_layers[-1], fout=pdf_nofonts_layers[-1], crop=False, text_to_path=True, export_area_page=True) - # cmd = ['inkscape', '-C', '-T', '--without-gui', '--file=%s'%svg_fonts_layers[-1], '--export-pdf=%s' % pdf_nofonts_layers[-1]] - - if verbose: - print("svg_edit_to_importable called. converted svg file\n > %s\nto files:"%svg_edit_file) - for s in pdf_nofonts_layers + svg_fonts_layers: - print(" > " + s) - - return pdf_nofonts_layers, svg_fonts_layers - -# <jinja2> -# {{svg_start}} -# <g inkscape:groupmode="layer" id="layer1" inkscape:label="bg_layer" style="display:inline" sodipodi:insensitive="true"> -# <image -# xlink:href="{{png_file}}" -# width="100%" -# height="100%" -# preserveAspectRatio="none" -# style="image-rendering:optimizeQuality" -# id="image4444th" -# x="0" -# y="0" /> -# </g> -# <g inkscape:groupmode="layer" -# id="layer2" -# inkscape:label="Layer 1" -# style="display:inline"> -# {{svg_end}} -# </g></svg> -# </jinja2> -def add_png_background_to_svg(svg_input, png_file, svg_output=None): - if not svg_output: svg_output = svg_input - rp = os.path.relpath(png_file, os.path.commonprefix([svg_output, png_file])) - rp = rp.replace("\\", "/") - - with open(svg_input,'r', encoding="UTF-8") as f: - svg = f.read() - mds = "</metadata>" - mds_id = svg.find(mds) - if mds_id < 0: - # file has no meta data. - j = svg.find(">", svg.find("<svg")) - svg = svg[:j+1] + "<metadata></metadata>" +svg[j+1:] - mds_id = svg.find(mds) - - mds_dex = mds_id+len(mds) - - data = {'png_file' : rp, 'svg_start': svg[:mds_dex],'svg_end': svg[mds_dex:]} - svg = jinjafy_comment(data, jinja_tag="jinja2") - - si = svg.find("<svg") + 4 - dsvg = ' xmlns:sodipodi = "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"\n xmlns:inkscape = "http://www.inkscape.org/namespaces/inkscape" \n' - svg = svg[:si] + dsvg + svg[si:] - - with open(svg_output, 'w',encoding="UTF-8") as f: - f.write(svg) - return svg_output - - -def slidedeck_to_images(slide_deck_pdf, base_out_pattern, num_to_take=None): - assert False - if not os.path.exists(os.path.dirname(base_out_pattern)): - os.mkdir(os.path.dirname(base_out_pattern)) - num_pages = num_pages_in_pdf(slide_deck_pdf) - opat = base_out_pattern[:-4] + "_tmp.pdf" - opat.replace("%i", '%d') - cmd = f"pdftk {slide_deck_pdf} burst output {opat} compress" - print("pdftk splitting into ", num_pages) - - execute_command(cmd.split()) - outfiles = [] - slide_deck_split_pdf = [base_out_pattern[:-4] % (i + 1) + "_tmp.pdf" for i in range(num_pages)] - for i, opdf in enumerate(slide_deck_split_pdf): - print("convertion", i, opdf) - ofile = base_out_pattern %(i+1) - cmd = f"pdf2svg {opdf} {ofile}" - execute_command(cmd.split()) - b = os.path.getsize(ofile) - # print(b) - if b == 0: - print("Skipping this file because it has size 0...") - else: - outfiles.append(ofile) - - return outfiles - -def slidedeck_to_images_DEFUNCT(slide_deck_pdf, base_out_pattern, num_to_take=None): - assert False - if not os.path.exists(os.path.dirname(base_out_pattern)): - os.mkdir(os.path.dirname(base_out_pattern)) - - num_pages = num_pages_in_pdf(slide_deck_pdf) - slide_deck_split_pdf = [base_out_pattern[:-4] % (i + 1) + "_tmp.pdf" for i in range(num_pages)] - if num_to_take: slide_deck_split_pdf = slide_deck_split_pdf[0:num_to_take] - - outfiles = [] - for i, opdf in enumerate(slide_deck_split_pdf): - print("convertion", i, opdf) - ofile = base_out_pattern %(i+1) - slide_to_image(slide_deck_pdf, ofile, page_to_take=i+1) - outfiles.append(ofile) - return outfiles - -def num_pages_in_pdf(pdf_file): - assert False - cmd = ['pdftk', '%s' % pdf_file, 'dump_data'] - ss = execute_command(cmd)[0].splitlines() - s = int([s for s in ss if 'NumberOfPages' in s].pop().split()[-1]) - return s - - -def slide_to_image(slide_deck_pdf, output, page_to_take=1, use_inkscape=True): - if not os.path.exists(os.path.dirname(output)): - os.mkdir(os.path.dirname(output)) - slide_deck_split_pdf = output[:-4] + "_tmp.pdf" - ext = output[-3:] - if ext == "svg": - from slider.convert import pdf2svg - pdf2svg(slide_deck_pdf, fout=output, page_no=page_to_take) - # cmd = ['pdftk', '%s' % slide_deck_pdf, 'cat', '%i' % page_to_take, 'output', '%s' % slide_deck_split_pdf] - # # page_to_take = 1 - - # if use_inkscape: - # cmd = ['inkscape', '-C', '--without-gui', '--file=%s' % slide_deck_split_pdf, '-l', '%s' % output] - # else: - # cmd = ['pdf2svg', slide_deck_split_pdf, output] - else: - if os.path.exists(output): - os.remove(output) - cmd = ("pdftocairo -png -f %i -l %i"% (page_to_take, page_to_take)).split(" ") + [slide_deck_pdf, output] - execute_command(cmd) - if ext == "png": - png_with_postfix = glob.glob(output + "-*.png") - if not png_with_postfix: - print("WARNING! no png generated.") - print(output) - else: - png_with_postfix = png_with_postfix.pop() - shutil.move(png_with_postfix, output) - - return output - - -def move_template_files(output_dir="examples/output", output_tex_file=None): - files_to_move = ["tex_dtu_logo.pdf", "tex_dtu_compute_a_uk.pdf", "tex_dtu_frise.pdf", "dtucolours.tex", - "beamerthemeDTU.sty", "beamerfontthemeDTU.sty","beamercolorthemeDTU.sty", - "beamerinnerthemeDTU.sty", "beamerouterthemeDTU.sty", "departments.tex", "tex_compute_uk.pdf", - "02450_beamer_preamble.tex", # Deprecated. - 'beamer_slider_preamble.tex', # The current version. - ] - sd = list( zip(files_to_move, files_to_move) ) - if output_tex_file: - sd.append( ("02450_lectures_base.tex", output_tex_file)) - for (source,dest) in sd: - shutil.copy(DTU_beamer_base + "/" + source, output_dir + "/" + dest) - - if output_tex_file: - lecture_tex_out = output_dir + "/" + output_tex_file - else: - lecture_tex_out = None - - return lecture_tex_out - - -def rm_svg_bg(svg_input, svg_output=None, fix_bg=True, fix_txt=True, fix_logo=True, height=None, width=None): - logo_rem = 0 - tx_rem = 0 - bg_rem = 0 - if not svg_output: - svg_output = svg_input - - with open(svg_input, 'r', encoding="UTF-8") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - BG_white = ["fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none", "fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"] - for bgw in BG_white: - gg = soup.findAll("path", {"style" : bgw}) - for g in gg: - if not fix_bg: break - g['style'] = bgw.replace("opacity:1", "opacity:0") - bg_rem += 1 - if bg_rem >= 2: break - - dtulogo = soup.findAll("image") - for i in dtulogo: - if "iVBORw0KGgoAAAANSUhEUgAABawAAAFcCAYAAAAkg" in i['xlink:href'] and fix_logo: - i.extract() - logo_rem += 1 - - btx = ["font-variant:normal;font-weight:bold;font-size:8px;font-family:Verdana;-inkscape-font-specification:Verdana-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none", - "font-variant:normal;font-weight:normal;font-size:9px;font-family:Verdana;-inkscape-font-specification:Verdana;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none", - "font-variant:normal;font-weight:bold;font-size:9px;font-family:Verdana;-inkscape-font-specification:Verdana-Bold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none", - "font-variant:normal;font-weight:bold;font-size:8px;font-family:Arial;-inkscape-font-specification:Arial-BoldMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none", - "font-variant:normal;font-weight:normal;font-size:9px;font-family:Arial;-inkscape-font-specification:ArialMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"] - - for j,style in enumerate(btx): - if not fix_txt: - break - for tx in soup.findAll("text", {"style": style}): - tx.extract() - tx_rem += 1 - - # soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - if height is not None and width is not None: - ''' - We are doing this if the svg is being imported and the height/width might not match the DTU template viewbox. - - ''' - tags = soup.find_all("svg") - if len(tags) != 1: - a = 1234 - - assert (len(tags) == 1) - tag = tags[0] - tag['height'] = str(height) - tag['width'] = str(width) - tag['viewBox'] = f"0 0 {height} {width}" - - - print([svg_input, logo_rem, bg_rem, tx_rem]) - with open(svg_output, 'bw') as f: - f.write(soup.encode("UTF-8")) - return svg_output - - -if __name__ == "__main__": - print("operating...") - lecture_tex_out = li_import("examples/ex1/Lecture11.pdf", output_dir="examples/output", num_to_take=3) - print("Wrote new main file: " + lecture_tex_out) \ No newline at end of file diff --git a/build/lib/slider/slide.py b/build/lib/slider/slide.py deleted file mode 100644 index ec49193..0000000 --- a/build/lib/slider/slide.py +++ /dev/null @@ -1,282 +0,0 @@ -#!python -# The above makes the script executable. - -import slider.legacy_importer -import PyPDF2 -import os -from jinjafy import execute_command -# from slider import slide -from slider import legacy_importer -from slider.legacy_importer import SVG_EDIT_RELPATH, SVG_TMP_RELPATH, move_template_files, DTU_beamer_base, svg_edit_to_importable -from jinjafy.cache import cache_update_str, cache_contains_str, cache_contains_file, cache_update_file -import shutil -from slider.slide_fixer import check_svg_file_and_fix_if_broken -from slider.latexutils import latexmk -import clize -import glob - -dc = "\\documentclass" - -def fix_handout(s): - i = s.find(dc) + len(dc) - j1 = s.find('[', i) - j2 = s.find("{", i) - if 0 < j1 < j2: - s = s[:j1 + 1] + "handout," + s[j1 + 1:] - else: - s = s[:j2 + 1] + "[handout]" + s[j2 + 1:] - return s - -def set_svg_background_images(lecture_tex, verbose=False, - fix_broken_osvg_files=False, - recompile_on_change=True, - clean_temporary_files=False, - copy_template_resource_files=True, - force_recompile=False, - force_fix_broken_osvg_files = None, - ): - ''' - Main file for fixing/setting osvg background images in the given lecture .pdf. - Usage: - - > slider <text-file-to-convert> - - :param lecture_tex: File to set background image in. - :return: - ''' - MAIN_TEX_DIR = os.path.dirname(lecture_tex) - SVG_TMP_DIR = MAIN_TEX_DIR + "/" + SVG_EDIT_RELPATH + "/" + SVG_TMP_RELPATH - SVG_OSVG_DIR = MAIN_TEX_DIR + "/" + SVG_EDIT_RELPATH - force_fix_broken_osvg_files = [] if force_fix_broken_osvg_files is None else force_fix_broken_osvg_files - - print("Slider is setting the background images for the .tex. file\n> %s" % os.path.abspath(lecture_tex)) - if copy_template_resource_files: - move_template_files(output_dir=MAIN_TEX_DIR, output_tex_file=None) - if not os.path.exists(lecture_tex): - # move a basic .tex file to this location and proceed - shutil.copyfile(DTU_beamer_base +"/dtu_slideshow_base.tex", lecture_tex) - - ANY_CHANGES = True - tex = recursive_tex_apply(lecture_tex) - tex = "\n".join([tex[k] for k in tex]) - all_tex = tex - tex = tex.splitlines() - - ol = "\\osvg" - tex = [s.strip() for s in tex if ol in s and "@ifnextchar" not in s and "%" not in s[:s.find(ol)]] # exclude definition of osvg command - sinfo = {} - - for s in tex: - i = s.find(ol) + len(ol) - if s[i] == "[": i = s.find("]", i) - i = s.find("{", i) - ie = s.find("}", i) - if ie == -1: continue - s = s[i+1:ie] - ii = all_tex.find(s) - frame_start = all_tex.rfind("\\begin{frame}", 0, ii) - frame_end = all_tex.find("\\end{frame}", ii, len(all_tex)) - - cs = all_tex[frame_start:frame_end] - d = {"pdf_label": s, "svg_edit_file": MAIN_TEX_DIR + "/" + SVG_EDIT_RELPATH + "/" + s + ".svg", 'slide_tex': cs} - sinfo[s] = d - # print(d) - - if not os.path.exists(MAIN_TEX_DIR + "/" + SVG_EDIT_RELPATH): - os.mkdir(MAIN_TEX_DIR + "/" + SVG_EDIT_RELPATH) - # Prepare alternative .tex file; compile with handout and watermarks for later reference. - lecture_tex_nosvg = lecture_tex[:-4] + "_NO_SVGS.tex" - with open(lecture_tex, "r") as f: - s = f.read() - - if s.find(dc) < 0: - # find and fix the import - dc2 = "\\input{" - j1 = s.find(dc2)+len(dc2) - j2 = s.find(dc2) + s.find("}", s.find(dc2)) - fhead = MAIN_TEX_DIR + "/" + s[j1:j2]+".tex" - with open(fhead, 'r') as f: - sh = f.read() - sh = fix_handout(sh) - with open(fhead, 'w') as f2: - f2.write(sh) - else: - s = fix_handout(s) - - i = s.find("\\begin{document}") - ii = s.rfind("\n", i - 10, i) - s = s[:ii] + "\n \\togglefalse{overlabel_includesvgs}\n\\toggletrue{overlabel_includelabels}\n" + s[ii:] - - with open(lecture_tex_nosvg, "w") as f: - f.write(s) - - lecture_tex_nosvg_pdf = lecture_tex_nosvg[:-4] + ".pdf" - - # lecture_tex_nosvg_tex = recursive_tex_apply(lecture_tex_nosvg) - - if cache_contains_str(MAIN_TEX_DIR, key='all_tex', value=all_tex) and os.path.exists(lecture_tex_nosvg_pdf): - print("slider> Cache contains nosvg tex file") - else: - cdir = os.getcwd() - os.chdir(os.path.dirname(lecture_tex_nosvg)) - execute_command(("latexmk -shell-escape -f -pdf -interaction=nonstopmode " + os.path.basename(lecture_tex_nosvg)).split(" ")) - os.chdir(cdir) - cache_update_file(MAIN_TEX_DIR, lecture_tex_nosvg) - ANY_CHANGES = True - - # Make .png background images. - with open(lecture_tex_nosvg_pdf, 'rb') as f: - pdfdoc = PyPDF2.PdfFileReader(f) - for i in range(pdfdoc.getNumPages()): - content = pdfdoc.getPage(i).extractText() - for osvg_name, d in sinfo.items(): #enumerate(sinfo): - - if d['pdf_label'] in content: - d['pdf_page'] = i - d['png_bgimg'] = SVG_TMP_DIR + "/" + d['pdf_label'] + ".png" - if not os.path.exists(d['svg_edit_file']): - ''' - Found \osvg{myslide}, but myslide.svg does not exist. Re-create it from the original slide. - ''' - print("Failed to find editable file: %s. Re-creating from snapshot..."%d['svg_edit_file']) - tmp_svg_file = "%s/%s/%s"%(os.path.dirname(d['svg_edit_file']), - SVG_TMP_RELPATH, - os.path.basename(d['svg_edit_file'])) - tmp_svg_file = legacy_importer.slide_to_image(lecture_tex_nosvg_pdf, tmp_svg_file, i + 1) - legacy_importer.raw_svg_to_osvg(tmp_svg_file, overwrite_existing=True) - ANY_CHANGES = True - - if cache_contains_str(MAIN_TEX_DIR, key=d['pdf_label'], value=d['slide_tex']): - # print("slider> Cache contains slide tex; continuing: " + d['pdf_label'] ) - continue - legacy_importer.slide_to_image(lecture_tex_nosvg_pdf, d['png_bgimg'], i + 1) - ANY_CHANGES = True - cache_update_str(MAIN_TEX_DIR, key=d['pdf_label'], value=d['slide_tex']) - - - # This is the step that actually fixes the svg files. i.e. squeeze fonts, etc. - for osvg_name, d in sinfo.items(): - if (osvg_name+".svg") not in force_fix_broken_osvg_files: - if cache_contains_file(MAIN_TEX_DIR, d['svg_edit_file']) and not force_recompile: - continue - ''' - Check if the svg image pass sanity checks: Does it exist and is it okay? - ''' - if fix_broken_osvg_files: - check_svg_file_and_fix_if_broken(d['svg_edit_file'], verbose=verbose) - - legacy_importer.svg_edit_to_importable(d['svg_edit_file'], verbose=verbose) - # legacy_importer.svg_check_background_layer(d['svg_edit_file'], verbose=verbose) # This was an old check for BG img. - cache_update_file(MAIN_TEX_DIR, d['svg_edit_file']) - ANY_CHANGES = True - - if ANY_CHANGES and recompile_on_change: - - latexmk(lecture_tex) - - if clean_temporary_files: - if verbose: - print("> SlideConverter: Removing temporary dirs...") - # raise Exception() - DNE = SVG_OSVG_DIR + "/do_not_edit" - if os.path.exists(SVG_TMP_DIR): - for v in glob.glob(SVG_TMP_DIR + "/*"): - if not v.endswith("png"): - os.remove(v) - - if os.path.exists(DNE): - for v in glob.glob(DNE + "/*"): - if not v.endswith("png"): - os.remove(v) - -def slide_no_by_text(pdf_file, text): - assert False - # Make .png background images. - if os.path.exists(pdf_file): - with open(pdf_file, 'rb') as f: - print(pdf_file) - pdfdoc = PyPDF2.PdfFileReader(f) - for i in range(pdfdoc.getNumPages()): - content = pdfdoc.getPage(i).extractText() - # for j, d in enumerate(sinfo): - if text in content: - return i+1 - else: - print("Warning: slide.py() -> slide_no_by_text(): PDF file not found " + pdf_file) - return -1 - # raise Exception() - -def recursive_tex_apply(doc, fun=None, current_output=None): - if not fun: - def mfun(curdoc, txt, cur_out): - if not cur_out: cur_out = dict() - cur_out[curdoc] = txt - return cur_out - - fun = mfun - if os.path.exists(doc): - def rfile(doc, encoding): - with open(doc, 'r', encoding=encoding) as f: - tex = f.read() - return tex - try: - tex = rfile(doc, encoding="utf-8") - except Exception as e: - print("Problem reading file", doc) - print(e) - import glob - from chardet.universaldetector import UniversalDetector - detector = UniversalDetector() - detector.reset() - with open(doc, 'rb') as f: - detector.feed(f.read()) - detector.close() - res = detector.result['encoding'] - print("Detecting encoding with chardet...") - print(res) - tex = rfile(doc, encoding=detector.result['encoding']) - - current_output = fun(doc, tex, current_output) - for s in tex.splitlines(): - fs = '\\input{' - if fs in s and not s.strip().startswith("%"): - j = s.find(fs) - rec_file = s[j + len(fs):s.find("}", j)] - if os.path.isabs(rec_file): - rec_file_tex = rec_file - else: - rec_file_tex = os.path.dirname(doc) + "/" + rec_file - if not rec_file_tex.endswith(".tex"): - rec_file_tex += ".tex" - - current_output = recursive_tex_apply(rec_file_tex, fun, current_output) - return current_output - -def recursive_tex_collect(doc): - assert False - sdict = recursive_tex_apply(doc) - def gathersub(file): - lines = [] - if file not in sdict: - print(sdict) - raise Exception("Bad error occured in split lines " + file ) - for s in sdict[file].splitlines(): - fs = '\\input{' - if fs in s and not s.strip().startswith("%"): - j = s.find(fs) - rec_file = s[j + len(fs):s.find("}", j)] - if os.path.isabs(rec_file): - rec_file_tex = rec_file - else: - rec_file_tex = os.path.dirname(file) + "/" + rec_file - if not rec_file_tex.endswith(".tex"): - rec_file_tex += ".tex" - - lines += gathersub(rec_file_tex) - else: - lines.append(s) - return lines - - lines = gathersub(doc) - return "\n".join(lines) - diff --git a/build/lib/slider/slide_fixer.py b/build/lib/slider/slide_fixer.py deleted file mode 100644 index 3ca3f50..0000000 --- a/build/lib/slider/slide_fixer.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -Fix broken issues in osvg files. -for instance, you copy a random file, and it has the wrong dimensions, etc. -Need some fairly serious checking I guess... - -Example of a good file: - -inkscape:groupmode="layer" - id="layer1" - inkscape:label="bg_layer" - style="display:inline" - sodipodi:insensitive="true"> -""" - - -good_file = """<?xml version="1.0" encoding="UTF-8"?> -<svg xmlns:sodipodi = "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape = "http://www.inkscape.org/namespaces/inkscape" - height="297.638pt" version="1.2" viewBox="0 0 396.85 297.638" width="396.85pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><metadata></metadata> -<g inkscape:groupmode="layer" id="layer1" inkscape:label="bg_layer" style="display:inline" sodipodi:insensitive="true"> -<image -xlink:href="{0}" -width="100%" -height="100%" -preserveAspectRatio="none" -style="image-rendering:optimizeQuality" -id="image4444th" -x="0" -y="0" /> -</g> -<g inkscape:groupmode="layer" -id="layer2" -inkscape:label="Layer 1" -style="display:inline"> -</svg> -""" - -"""" -First idea would be to simply load files, replace the tmp-stuff, and check if they agree. -""" -from bs4 import BeautifulSoup -import os - -def check_svg_file_and_fix_if_broken(osvg_file, verbose=True): - assert False - ''' - Sanity check the given file. Does the slide appears to be in okay shape? Is it broken? - if it is, fix it. - ''' - # print(osvg_file) - png_ = "tmp/" + os.path.basename(osvg_file)[:-4] + ".png" - - ID = 'image4444th' - to_save = None - with open(osvg_file, 'r', encoding="UTF-8",errors="surrogateescape") as f: - soup = BeautifulSoup(f, 'xml', from_encoding="UTF-8") - - bg_tags = soup.findAll("image", {'id': ID}) - - if len(bg_tags) == 0: - print("uh oh. No background image found in", osvg_file) - - g = None - is_file_ok = True - for i in soup.findAll("g", {'inkscape:groupmode': 'layer'}): - if i['inkscape:label'] == "bg_layer": - g = i - if g is not None: - bgim = g.find("image") - if bgim['id'] == ID: - # We have a BG image, it has the right ID. Also check if the path matches. - bg_png = bgim['xlink:href'] - - if bg_png != png_: - print("Mismatching background PNGs", osvg_file) - print(bg_png, png_) - bgim['xlink:href'] = png_ - to_save = soup.prettify(formatter="xml") - - else: - print("We found the bg_layer tag, but it has no image in it. SVG is broken", osvg_file) - is_file_ok = False - else: - is_file_ok = False - - if is_file_ok: - # Do sanity check of svg height property. - height = soup.find('svg')['height'] - if height.find("pt") > 0: - height = height[:-2] - height = float(height) - # float(soup.find('svg')['height']) - if abs(height - 297.638) > 5: - is_file_ok = False - - if to_save is not None: - # raise Exception("asdfsdaf", osvg_file) - with open(osvg_file, 'w', encoding="UTF-8", errors="surrogateescape") as f: - f.write(to_save) - return - - if not is_file_ok: - # raise Exception("Broken file", osvg_file) - # File is not ok. We have to fix it. But how? - - gsoup = BeautifulSoup(good_file, 'xml', from_encoding="UTF-8") - bstag = BeautifulSoup(str(gsoup.svg.g).format(png_), 'lxml', from_encoding="UTF-8") - g_bg = str(bstag.g) - with open(osvg_file, 'r', encoding="UTF-8", errors="surrogateescape") as f: - s = f.read() - soup = BeautifulSoup(s, 'xml', from_encoding="UTF-8") - print("Finding all tags") - # c = 0 - for j in soup.svg.find_all(recursive=False): - IL= "inkscape:label" - if IL in j.attrs and j[IL] == "bg_layer": - # gsoup = BeautifulSoup(good_file, 'xml', from_encoding="UTF-8") - j.replaceWith(bstag.g) - # print( j['inkscape:label'] ) - break - # print("FOUND") - # print(j) - # c += 1 - # print(c, "-----") - # if c == 4: - # break - - soup.svg.attrs = gsoup.svg.attrs - s = str(soup) - # j = s.find("<defs") - # print("Found defs at j", j) - # s = good_file.format( png_) + "\n" + s[j:] - # import time - # time.sleep(0.1) - # print(s[:4000]) - # soup2 = BeautifulSoup(s, 'xml', from_encoding="UTF-8") - - with open(osvg_file, 'w', encoding="UTF-8", errors="surrogateescape") as f: - f.write(s) - a = 234 \ No newline at end of file diff --git a/build/lib/slider/slider_cli.py b/build/lib/slider/slider_cli.py deleted file mode 100644 index 683b44c..0000000 --- a/build/lib/slider/slider_cli.py +++ /dev/null @@ -1,94 +0,0 @@ -import clize -import os -import sys -import shutil -from slider.slide import set_svg_background_images -import click - -def confirm_start_new_project(latexfile, force=False): - try: - if force or click.confirm(f"Do you want to create a new Slider LaTeX file named {latexfile}?", abort=True): - # print("Starting new project") - from slider.slider_init import slider_init - slider_init(latexfile) - - except click.exceptions.Abort as e: - sys.exit() - - -def slider_cli(latexfile=None, force=False, verbose=False): - """ - Slider software for manipulating overlay-svg images. - To get started, first start a slider project by creating a new folder and running - - > python -m slider index.tex - - This will create a bunch of files including a folder named osvgs. This is where you keep the slides! - - When you edit/change overlays, remember to run - - > python -m slider index.tex - > python -m slider - - to keep everything synchronized. - You can add new overlays by simply using the LaTeX \osvg{labelname}-tag on new slides (and running slider) - Edit the overlays by looking in the \osvg-folder, in this case osvg/labelname.svg. - - Remember the overlays by default import the content of the slides (useful if you want to move existing equations around) - so remember to remove non-wanted contents. - When done, run slider again to keep everything in sync. - - :param latexfile: - :param force: - :param verbose: - """ - - # print("Initializing da slides.") - wdir = os.getcwd() - print(wdir) - if latexfile == None: - print("Trying to manually detect main latex file.") - import glob - files = glob.glob("*.tex") - mfiles = [] - for name in files: - with open(name, 'r') as f: - lines = [l.strip() for l in f.read().splitlines()] - s = "\n".join([l for l in lines if not l.startswith("%")] ) - if "\\begin{document}" in s and "{beamer}" in s and "_NO_SVGS" not in name: - print("Main file found!") - mfiles.append(name) - if len(mfiles) != 1: - print("Many candidate files found") - print(mfiles) - sys.exit() - else: - latexfile = mfiles[0] - # latexfile = "index.tex" - if not latexfile.endswith(".tex"): - latexfile += ".tex" - latexfile = os.path.join(wdir, latexfile) - if os.path.exists(latexfile): - # print("File already exists:", latexfile) - # print("Doing the slide-stuff.") - set_svg_background_images(lecture_tex=latexfile) - else: - confirm_start_new_project(latexfile=latexfile, force=force) - - -def clize_main_entry_point(): - """ - I collect this in one function to make a single entry point regardless of where - > slider - or - > python -m slider - - is used. - - :return: - """ - clize.run(slider_cli) - - -if __name__ == '__main__': - clize_main_entry_point() diff --git a/build/lib/slider/slider_init.py b/build/lib/slider/slider_init.py deleted file mode 100644 index a72e121..0000000 --- a/build/lib/slider/slider_init.py +++ /dev/null @@ -1,66 +0,0 @@ -#!python -# No, do this instead: https://setuptools.readthedocs.io/en/latest/userguide/entry_point.html -# The above makes the script executable. - -import clize -import os -import sys -import shutil - -base_slide = """ -\\documentclass[aspectratio=43]{beamer} -\\usepackage{etoolbox} -\\newtoggle{overlabel_includesvgs} -\\newtoggle{overlabel_includelabels} -\\toggletrue{overlabel_includesvgs} -\\toggletrue{overlabel_includelabels} -\\input{beamer_slider_preamble.tex} - -\\title{Example slide show} -\\author{Tue Herlau} -\\begin{document} -\\begin{frame} -\\maketitle -\\end{frame} - -\\begin{frame}\\osvg{myoverlay} % Use the \\osvg{labelname} - tag to create new overlays. Run slider and check the ./osvgs directory for the svg files! -\\title{Slide with an overlay} -This is some example text! -\\end{frame} - -\\end{document} -""" - -def slider_init(latexfile=None): - # return - # print("Initializing da slides.") - wdir = os.getcwd() - print(wdir) - if latexfile == None: - latexfile = "index.tex" - if not latexfile.endswith(".tex"): - latexfile += ".tex" - latexfile = os.path.join(wdir, latexfile) - if os.path.exists(latexfile): - print("File already exists", latexfile) - # sys.exit() - # Done with the introductory bullshit. - - if not os.path.isdir(os.path.dirname(latexfile)): - os.makedirs(os.path.dirname(latexfile)) - - import jinja2 - with open(latexfile, 'w') as f: - f.write(base_slide) - - print("Initializing with", latexfile) - - # jinja2.Environment().from_string(base_slide) - from slider.slide import set_svg_background_images - set_svg_background_images(latexfile, clean_temporary_files=True) - -if __name__ == "__main__": - # slider_init("../../test/index.tex") - # from slider.latexutils import latexmk - # import slider - clize.run(slider_init) diff --git a/src/beamer_slider.egg-info/PKG-INFO b/src/beamer_slider.egg-info/PKG-INFO index 7e791aa..604eec0 100644 --- a/src/beamer_slider.egg-info/PKG-INFO +++ b/src/beamer_slider.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: beamer-slider -Version: 0.1.25.6 +Version: 0.1.26.1 Summary: Software to create inkscape overlays in Beamer Home-page: https://lab.compute.dtu.dk/tuhe/slider Author: Tue Herlau diff --git a/src/beamer_slider.egg-info/SOURCES.txt b/src/beamer_slider.egg-info/SOURCES.txt index 63e5254..843c350 100644 --- a/src/beamer_slider.egg-info/SOURCES.txt +++ b/src/beamer_slider.egg-info/SOURCES.txt @@ -43,4 +43,5 @@ src/slider/data/DTU_Beamer_files/dtucolours.tex src/slider/data/DTU_Beamer_files/tex_compute_uk.pdf src/slider/data/DTU_Beamer_files/tex_dtu_compute_a_uk.pdf src/slider/data/DTU_Beamer_files/tex_dtu_frise.pdf -src/slider/data/DTU_Beamer_files/tex_dtu_logo.pdf \ No newline at end of file +src/slider/data/DTU_Beamer_files/tex_dtu_logo.pdf +tests/test_slider.py \ No newline at end of file diff --git a/src/slider/convert.py b/src/slider/convert.py index a3837ca..dbeae92 100644 --- a/src/slider/convert.py +++ b/src/slider/convert.py @@ -16,7 +16,7 @@ def svg2pdf(fin, fout=None, crop=True, text_to_path=False, export_area_page=True if text_to_path: # Good idea for inkscape which seems to bungle the fonts (space in font names?) cmd.append("-T") cmd.append(fin) - cmd.append(f"--export-filename={fout}") + cmd.append(f'--export-filename="{fout}"') # '-C', '--without-gui', f'--file={fin}', f'--export-pdf={fout}'] # cmd = ['inkscape', '-C', '-T', '--without-gui', '--file=%s'%svg_fonts_layers[-1], '--export-pdf=%s' % pdf_nofonts_layers[-1]] execute_command(cmd) diff --git a/src/slider/legacy_importer.py b/src/slider/legacy_importer.py index 4ffe0de..bdee3fa 100644 --- a/src/slider/legacy_importer.py +++ b/src/slider/legacy_importer.py @@ -25,7 +25,8 @@ def ensure_dir(dname): os.mkdir(dname) def join_pdfs(slide_deck_pdf, outfile): - assert False + # Used by the legacy slide importer. + # assert False dn = os.path.dirname(slide_deck_pdf[0]) files = [os.path.relpath(os.path.dirname(pdf), start=dn) + "/" + os.path.basename(pdf) for pdf in slide_deck_pdf] outf = os.path.relpath(os.path.dirname(outfile), start=dn) + "/" + os.path.basename(outfile) diff --git a/src/slider/version.py b/src/slider/version.py index 0bb8fc3..b9ffbe5 100644 --- a/src/slider/version.py +++ b/src/slider/version.py @@ -1 +1 @@ -__version__ = "0.1.25.6" \ No newline at end of file +__version__ = "0.1.26.1" \ No newline at end of file -- GitLab