flashcard-tools

Tools for working with LaTeX flashcards
git clone git://lumidify.org/flashcard-tools.git
Log | Files | Refs | README

commit 4be43722c22cd976821bd7ca7a9cc509a491d736
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 11 Apr 2020 15:05:44 +0200

Commit initial scripts

Diffstat:
AMakefile | 3+++
AREADME.md | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Aaddcard.pl | 31+++++++++++++++++++++++++++++++
Acompile_all.sh | 16++++++++++++++++
Agentsv.sh | 9+++++++++
Atmp_compile.sh | 24++++++++++++++++++++++++
6 files changed, 132 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile @@ -0,0 +1,3 @@ +all: + # Compile the latest flashcard + ./tmp_compile.sh "`cat .cur_card`" diff --git a/README.md b/README.md @@ -0,0 +1,49 @@ +# Flashcard Tools + +## Tools for working with LaTeX flashcards + +### Directory structure + +* `defs.tex` - Contains all `\usepackage` statements and commands needed for the + LaTeX in the flashcards. This should *not* include `\documentclass` since that + is added automatically by the rendering scripts (it is different for different + scripts, so it can't be included in `defs.tex`). +* `flashcards/` - Contains the actual flashcard files. + +### Flashcard structure: + +* Line 1 - Contains a "theorem number" or something similar this is what the + file is named after when using `addcard.pl`. + If this line contains '|' anywhere, the text after it is taken to be the + name of another flashcard that must be displayed before this one when it + is displayed using a viewer that supports this notation (useful for + splitting cards into smaller parts). +* Line 2 - Contains the front side of the card. +* Rest of the file - Contains the back side of the card. + +### Helper Scripts + +* addcard.pl <initials> <card number> - Adds a card with the given number and + initials to the directory `flashcards` and opens it with `vi`. The file + name is based on the number and initials, so `./addcard.pl xx 1.2.3` will + open the file `flashcards/01-02-03_00xx`. The extra number after the underscore + is increased if the file already exists. The argument <card number> is pasted + into the first line of the file automatically. Additionally, `addcard.pl` + writes the file of the current card into `.cur_card` so that it can be + read by a Makefile (see 'Sample Workflow' below). +* tmp_compile.sh <card name> - Compiles the given card in `flashcards/` to the + file `tmp_compile.pdf`. +* compile_all.sh - Compiles all flashcards in `flashcards/` into one big file. +* gentsv.sh - Generates a TSV file suitable for importing into Mnemosyne. + Note that you still need to add the definitions (`defs.tex`) for the project + into the Mnemosyne config. + +### Sample Workflow + +Just add a new card with `addcard.pl`. When you're done editing it, run `make` +(assuming you have the sample Makefile in the directory). This compiles the +card to `tmp_compile.pdf`. If your PDF viewer supports reloading documents, +you can just leave it open and reload every time you create a new card. + +Once you're done adding all cards, you can use any of the other helper scripts +to compile the cards to one big file or do whatever. diff --git a/addcard.pl b/addcard.pl @@ -0,0 +1,31 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +die "Loser.\n" if @ARGV != 2; + +sub gen_filename { + my ($second_idx, @groups) = @_; + my $str = join "-", map {sprintf "%02d", $_} @groups; + return sprintf("flashcards/%s_%02d%s", $str, $second_idx, $ARGV[0]); +} + +my @groups; +push @groups, $1 while $ARGV[1] =~ m/(\d+)\.?/g; +if (@groups) { + my $second_idx = 0; + my $filename; + while (-e ($filename = gen_filename $second_idx, @groups)) { + $second_idx++; + } + open my $fh, ">", $filename or die "Moron.\n"; + print $fh $ARGV[1]; + close $fh; + open $fh, ">", ".cur_card" or die "Fool.\n"; + print $fh $filename; + close $fh; + system("vi", $filename); +} else { + die "Idiot.\n"; +} diff --git a/compile_all.sh b/compile_all.sh @@ -0,0 +1,16 @@ +# Compiles all flashcards to PDF + +echo '\\documentclass[grid,avery5371]{flashcards}' > complete.tex +cat defs.tex >> complete.tex +echo '\\cardfrontstyle{headings}' >> complete.tex +printf '\\begin{document}\n' >> complete.tex +for i in `ls flashcards` +do + meta1=`head -n 1 "flashcards/$i" | tr -d '\n' | sed s/\|.*$//` + meta2=`sed '2!d' "flashcards/$i" | tr -d '\n'` + body=`tail -n +3 "flashcards/$i"` + printf '\\begin{flashcard}[%s]{%s}\n%s\n\\end{flashcard}\n' "$meta1" "$meta2" "$body" >> complete.tex +done +printf '\\end{document}\n' >> complete.tex +pdflatex complete.tex +rm complete.{tex,log,aux} diff --git a/gentsv.sh b/gentsv.sh @@ -0,0 +1,9 @@ +rm -f mnemosyne.tsv +for i in `ls flashcards` +do + printf '<latex>' >> mnemosyne.tsv + head -n 1 flashcards/$i | tr -d '\n' >> mnemosyne.tsv + printf '</latex>\t<latex>' >> mnemosyne.tsv + tail -n +2 flashcards/$i | sed 's/%.*$//g' | tr '\n' ' ' >> mnemosyne.tsv + printf '</latex>\n' >> mnemosyne.tsv +done diff --git a/tmp_compile.sh b/tmp_compile.sh @@ -0,0 +1,24 @@ +# Compiles the flashcard with the given ID to PDF, +# adding the necessary frontmatter beforehand. + +if [ $# -eq 0 ] +then + echo "USAGE: ./tmp_compile.sh <flashcard_id>" + exit 1 +fi + +if [ ! -e "flashcards/$1" ] +then + echo "File doesn't exist: flashcards/$1" + exit 1 +fi + +meta1=`head -n 1 "flashcards/$1" | tr -d '\n'` +meta2=`sed '2!d' "flashcards/$1" | tr -d '\n'` +body=`tail -n +3 "flashcards/$1"` +echo '\\documentclass[grid,avery5371]{flashcards}' > tmp_compile.tex +cat defs.tex >> tmp_compile.tex +echo '\\cardfrontstyle{headings}' >> tmp_compile.tex +printf '\\begin{document}\n\\begin{flashcard}[%s]{%s}\n%s\n\\end{flashcard}\n\\end{document}\n' "$meta1" "$meta2" "$body" >> tmp_compile.tex +pdflatex tmp_compile.tex +rm tmp_compile.{aux,log,tex}