diff options
author | Camil Staps | 2016-07-22 18:24:42 +0200 |
---|---|---|
committer | Camil Staps | 2016-07-22 18:24:42 +0200 |
commit | 550f084f6879c6c4f919aceede2cdb1f767ce21b (patch) | |
tree | e0e6c570d439f6648dd8428f41d652290741c23b | |
parent | --where-has added (diff) |
texformat.py: create latex formats for students
-rw-r--r-- | texformat-example.list | 13 | ||||
-rwxr-xr-x | texformat.py | 111 |
2 files changed, 124 insertions, 0 deletions
diff --git a/texformat-example.list b/texformat-example.list new file mode 100644 index 0000000..ac164b0 --- /dev/null +++ b/texformat-example.list @@ -0,0 +1,13 @@ +\arabic*: +1-3 +4 + 1-2 + 5-6 +5 + 1 + \Roman* + 5-9 + 11 + 4 + 7 +7-9 diff --git a/texformat.py b/texformat.py new file mode 100755 index 0000000..36a07c3 --- /dev/null +++ b/texformat.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +import argparse +import os +import re +import sys + +HEADER = '\\documentclass[a4paper]{article}\n\n'\ + '\\author{} %%TODO\n'\ + '\\title{Huiswerk %s, week %d}\n\n'\ + '\\usepackage{enumitem}\n'\ + '\\usepackage[dutch]{babel}\n\n'\ + '\\begin{document}\n\n'\ + '\\maketitle\n' + +FOOTER = '\n\\end{document}' + +class ExercisesList: + STYLES = ['\\arabic*.', '(\\alph*)', '\\roman*.'] + + def __init__(self, indent=0, style=None): + self.indent = indent + self.style = style if style is not None else self.STYLES[self.indent] + self.exercises = [] + + def read(self, lines): + i = -1 + while i < len(lines) - 1: + i += 1 + line = lines[i] + + # Single item + m = re.search(r'^\t{%d}(\d+)$' % self.indent, line) + if m is not None: + self.exercises.append(int(m.group(1))) + continue + + # Range + m = re.search(r'^\t{%d}(\d+)-(\d+)$' % self.indent, line) + if m is not None: + self.exercises += range(int(m.group(1)), int(m.group(2)) + 1) + continue + + # Style + m = re.search(r'^\t{%d}(\S.*)$' % self.indent, line) + if m is not None: + self.style = m.group(1) + continue + + # Indent + if line[:self.indent + 1] == '\t' * (self.indent + 1): + sublist = ExercisesList(self.indent + 1) + i += sublist.read(lines[i:]) - 1 + self.exercises.append(sublist) + continue + + # This line is not for us + break + return i + + def to_latex(self): + latex = [] + indent = '\t' * self.indent * 2 + i = 1 + + latex.append(indent + '\\begin{enumerate}') + if self.style != self.STYLES[self.indent]: + latex[0] += '[label=%s]' % self.style + for item in self.exercises: + if type(item) is ExercisesList: + latex += item.to_latex() + else: + if item != i: + latex.append(indent + '\t\\setcounter{enumi%s}{%d}' % + ('i' * self.indent, item - 1)) + i = item + latex.append(indent + '\t\\item %TODO ' + str(item)) + i += 1 + latex.append(indent + '\\end{enumerate}') + return latex + + +def parse_args(): + """Parse command line arguments""" + pars = argparse.ArgumentParser(description='TeX format') + + pars.add_argument( + '-i', '--input', + type=argparse.FileType('r'), default=sys.stdin) + pars.add_argument( + '-o', '--output', + type=argparse.FileType('w'), default=sys.stdout) + + pars.add_argument('-c', '--course', type=str, required=True) + pars.add_argument('-w', '--week', type=int, required=True) + + return pars.parse_args() + +def main(): + args = parse_args() + + lines = [line[:-1] for line in args.input.readlines()] + + exercises = ExercisesList() + exercises.read(lines) + + print(HEADER % (args.course, args.week)) + print('\n'.join(exercises.to_latex())) + print(FOOTER) + +if __name__ == '__main__': + main() |