A .gitignore => .gitignore +3 -0
@@ 0,0 1,3 @@
+__pycache__
+*.tex
+
A __pycache__/conf.cpython-37.pyc => __pycache__/conf.cpython-37.pyc +0 -0
M conf.py => conf.py +18 -57
@@ 1,70 1,31 @@
-# String used for \author tag.
-author: str = ""
+from typing import Dict, List
+
# Number of spaces used to indent tag.
indent_lvl: int = 2
-# Packages included at top of documents.
-packages: dict[str, tuple[str]] = {
- "inputenc": "utf8",
- "multicol": None,
- "graphicx": None
-}
-
-# Document template.
-article_template = r"""
-\documentclass[13pt]{article}
-
-$packages
-
-\title{$title}
-\author{$author}
-\date{\today}
-
-\begin{document}
- \maketitle
-
-\end{document}
-"""
+# String used for \author tag.
+author: str = ""
# Beamer theme.
beamer_theme: str = "Boadilla"
-# Beamer frame template.
-frame_template: str = r"""
-\begin{frame}
- \frametitle{}
- \section{}
-
- \framesubtitle{}
- \subsection{}
-
-\end{frame}
-"""
-
-# Presentation template.
-presentation_template: str = r"""
-\documentclass{beamer}
-
-\usetheme{$theme}
-
-$packages
+# Packages included at top of documents.
+# Must be a mapping object contains package name as key and options as list of string.
+packages: Dict[str, List[str]] = {
+ "inputenc": ["utf8"],
+ "multicol": [],
+ "graphicx": []
+}
-\title{$title}
-\author{$author}
-\date{\today}
+class Template:
+ # Document template.
+ article = open("templates/article").read()
-\begin{document}
- \begin{frame}
- \titlepage{}
- \end{frame}
+ # Beamer frame template.
+ frame = open("templates/frame").read()
- \begin{frame}
- \frametitle{Table of contents}
- \tableofcontents
- \end{frame}
-$content
-\end{document}
-"""
+ # Slideshow template.
+ presentation = open("templates/presentation").read()
A templates/article => templates/article +12 -0
@@ 0,0 1,12 @@
+\documentclass[13pt]{article}
+
+$packages
+
+\title{$title}
+\author{$author}
+\date{\today}
+
+\begin{document}
+ \maketitle
+
+\end{document}
A templates/frame => templates/frame +9 -0
@@ 0,0 1,9 @@
+
+\begin{frame}
+ \frametitle{}
+ \section{}
+
+ \framesubtitle{}
+ \subsection{}
+
+\end{frame}
A templates/presentation => templates/presentation +23 -0
@@ 0,0 1,23 @@
+\documentclass{beamer}
+
+\usetheme{$theme}
+
+$packages
+
+\title{$title}
+\author{$author}
+
+\date{\today}
+
+\begin{document}
+ \begin{frame}
+ \titlepage{}
+ \end{frame}
+
+ \begin{frame}
+ \frametitle{Table of contents}
+ \tableofcontents
+ \end{frame}
+$content
+\end{document}
+
A test.tex => test.tex +34 -0
@@ 0,0 1,34 @@
+\documentclass{beamer}
+
+\usetheme{Boadilla}
+
+\usepackage{{inputenc}}[utf8]
+\usepackage{{multicol}}
+\usepackage{{graphicx}}
+
+\title{test}
+\author{}
+
+\date{\today}
+
+\begin{document}
+ \begin{frame}
+ \titlepage{}
+ \end{frame}
+
+ \begin{frame}
+ \frametitle{Table of contents}
+ \tableofcontents
+ \end{frame}
+
+ \begin{frame}
+ \frametitle{}
+ \section{}
+
+ \framesubtitle{}
+ \subsection{}
+
+ \end{frame}
+
+\end{document}
+
M texsetup.py => texsetup.py +25 -17
@@ 1,29 1,33 @@
import argparse
+from itertools import repeat
import string
import textwrap
+from typing import Dict, Iterable
import conf
-enclose = lambda string: "{%s}" % string
+bracketed = lambda text: "{%s}" % text
+hooked = lambda text: "[%s]" % text
-def render_packages(packages: dict[str, tuple[str]]) -> str:
- return "\n".join(r"\usepackage"
- + (f"{enclose(name)}[{option}]"
- if option
- else enclose(name))
- for name, option in packages.items())
+def render_packages(packages: Dict[str, Iterable[str]]) -> str:
+ """Return formated \usepackage tag."""
+ return "\n".join(r"\usepackage{%s}%s" % (bracketed(name),
+ "".join(map(hooked, options)))
+ for name, options in packages.items())
def render_frames(template: str, frame_nb: int) -> str:
- return textwrap.indent("".join(template
- for f in range(frame_nb)),
- conf.indent_lvl*" ")
+ """Return given template formated and repeated frame_nb time."""
+ frames = "".join(repeat(template, frame_nb))
+
+ return textwrap.indent(frames, conf.indent_lvl*" ")
def cli_parser() -> argparse.ArgumentParser:
+ """Create and return an ArgumentParser object."""
parser = argparse.ArgumentParser(description="Setup easily tex document.")
parser.add_argument("-p", "--presentation",
@@ 35,11 39,13 @@ def cli_parser() -> argparse.ArgumentParser:
return parser
-def write_output(filename: str, content: str) -> str:
+def write_as_tex(filename: str, text: str) -> str:
+ """Create a file named filename and write given text into it."""
+ filename += ".tex"
with open(filename, "w") as f:
- f.write(content)
+ f.write(text)
- return f"Generate {filename}."
+ return f"Generate '{filename}'."
if __name__ == "__main__":
@@ 49,21 55,23 @@ if __name__ == "__main__":
title, frame_nb = args.presentation
packages = render_packages(conf.packages)
- content = render_frames(conf.frame_template, int(frame_nb))
+ content = render_frames(conf.Template.frame, int(frame_nb))
- template = string.Template(conf.presentation_template)
+ template = string.Template(conf.Template.presentation)
result = template.substitute(theme=conf.beamer_theme,
packages=packages,
title=title,
author=conf.author,
content=content)
+
+ print(write_as_tex(title, result))
elif args.document:
title = args.document
packages = render_packages(conf.packages)
- template = string.Template(conf.article_template)
+ template = string.Template(conf.Template.article)
result = template.substitute(packages=packages,
title=title,
author=conf.author,)
- print(write_output(f"{title}.tex", result))
+ print(write_as_tex(args.document, result))