Wieder gibt es eine Optimierung meines Lernens … Der Fortschritt ist in diesem Fall ein Rückschritt auf doppelseitig gedruckte Karteikarten 🙂

Die Kunst war, das ganze „Bulk-freundlich“ zu kriegen … d.h. es geht um einige hundert Karteikarten … Da darf das erstellen nicht viel Zeit kosten.
Ein anderes bedeutendes Detail war, wie man die Karteikarten nicht als Bild, sondern möglichst als ein Vektor-Format/HTML druckt, sodass die Auflösung beim Drucken nicht verloren geht. Ich hab es als Bild versucht, das sah wirklich schlimm aus.
Im Folgenden, ein paar Hinweise, wie man das hinbekommen kann:
Zuallererst muss man sein Anki2 Deck so anpassen, dass jede Karte einen Rahmen mit fester Größe hat. Dazu kann man z.B. eine neue CSS-Klasse .cardx einführen. Zusätzlich sollte man versuchen, die Inhalte alle zentriert darstellen zu lassen. Bei DIVs ist das etwas schwierig, es gibt aber eine css-Eigenschaft display, die das ermöglicht:
.cardx {
width: 640px;
height: 452px;
display: table-cell;
text-align: center;
vertical-align: middle;
border: 1px solid;
}
DIVs unterstützt die letzte Eigenschaft normalerweise nicht und auch margin:auto kann kein vertikales Zentrieren der Inhalte. display: table-cell wird zwar von alten browsern nicht unterstützt, darauf kommt es hier aber nicht an.
Man wrappe jetzt alle Inhalte in
<div class='cards'>
<span>
{{Expression}}
...
</span>
</div>
Das div gibt die Größe und Zentrierung vor, das span reduziert die größe des Inhalts auf das Minimum. DIVs können sowas nicht, weil sie implizit eine Breite von 100% haben. Normalerweise wrappe Anki die Inhalte selbst in einem span, weshalb dieser wahrscheinlich sogar weggelassen werden könnte.
Wenn das Karten-Modell gespeichert und Anki2 alle Karten upgedatet hat, dann kann man alles exportieren.
Man wählt exportieren -> als raw-Text-File.
Dieses File hat eine Karte pro Zeile und die Vor- und Rückseite als reines HTML, jeweils durch einen tabulator \t getrennt.
Man könnte die allererste Karte, Vor- und Rückseite so bekommen:
LINE=$( cat export.txt | head -1 )
FRONT=$( echo -e "$LINE" | awk -F'\t' '{print $1}' )
BACK=$( echo -e "$LINE" | awk -F'\t' '{print $2}' )
Selbstverständlich lässt sich alle Fronts und Backs so generieren
while read LINE;
do
FRONT=$( echo -e "$LINE" | awk -F'\t' '{print $1}' )
BACK=$( echo -e "$LINE" | awk -F'\t' '{print $2}' )
....
done < <( cat export.txt )
Im Grunde müsste man $FRONT oder $BACK nur noch in ein HTML-Gerüst einbauen, welches das Anki-Style-Sheet enthält und anschließend mit z.B. wkhtmltopdf nach PDF konvertieren.
Bsp:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
.cardx {
width: 640px;
height: 453px;
display: table-cell;
vertical-align: middle;
text-align:center;
font-family: TakaoPGothicKanjiABC;
}
...
</style>
</head>
<body>
{CARD}
</body>
</html>
Eingesetzt bekommt man $FRONT oder $BACK, wenn man
cat template.html | sed "s|{CARD}|$FRONT|g" > front.html
cat template.html | sed "s|{CARD}|$BACK|g" > back.html
ausführt. Die HTML-Dateien kann man nun mit wkhtmltopdf in ein PDF wandeln und mit pdfcrop zuschneiden.
Nun hat man eizelne hübsche PDF-Dateien mit jeweils der Vorder oder Rückseite.
Man muss diese nur noch zu irgendwas druckbarem zusammensetzen.
An dieser Stelle könnte ich Latex empfehlen … Ich bin noch beim Experimentieren, aber es könnte ungefähr so aussehen:
PDF, das (in diesem Fall) die Vorderseiten von 4 Karten enthält:
\documentclass[paper=a6]{scrartcl}
\usepackage{geometry}
\usepackage[pdftex]{graphicx}
\geometry{left=0.5cm,right=0.5cm,top=0.5cm,bottom=0.5cm}
\pagestyle{empty}
\setlength{\tabcolsep}{0mm}
\renewcommand{\arraystretch}{3}
\begin{document}
\clearpage
\begin{tabular}[H!]{ll}
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=0,scale=0.90]{./images/500_front-crop.pdf} \\
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=0,scale=0.90]{./images/501_front-crop.pdf} \\
\end{tabular}
\newpage
\begin{tabular}[H!]{ll}
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=0,scale=0.90]{./images/502_front-crop.pdf} \\
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=0,scale=0.90]{./images/503_front-crop.pdf} \\
\end{tabular}
\end{document}
Und hier das PDF, das die Rückseiten enthält:
\documentclass[paper=a6]{scrartcl}
\usepackage{geometry}
\usepackage[pdftex]{graphicx}
\geometry{left=0.5cm,right=0.5cm,top=0.5cm,bottom=0.5cm}
\pagestyle{empty}
\setlength{\tabcolsep}{0mm}
\renewcommand{\arraystretch}{2}
\begin{document}
\vspace*{-12mm}
\begin{tabular}[H!]{ll}
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=180,scale=0.90]{./images/503_back-crop.pdf} \\
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=180,scale=0.90]{./images/502_back-crop.pdf} \\
\end{tabular}
\newpage
\vspace*{-12mm}
\begin{tabular}[H!]{ll}
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=180,scale=0.90]{./images/501_back-crop.pdf} \\
\hspace{-4mm}\includegraphics[width=105mm,height=74mm,angle=180,scale=0.90]{./images/500_back-crop.pdf} \\
\end{tabular}
\end{document}
Das Ganze ist für jeweils zwei DIN-A7 Karten auf einem DIN-A6 Ausdruck. Man muss nach dem Drucken den ausgedruckten Stapel andersrum einlegen und mit dem anderen PDF bedrucken.
Dieses Latex-Dokument lässt sich dann natürlich auch gleich automatisiert erstellen, d.h. im Grunde wird es so laufen, dass man sein Anki-Deck leicht anpasst, das Script startet und zum Schluss kommen zwei PDFs raus, die man auf die Karten drucken muss 🙂
Ich bin noch am Basteln … Ich denke aber, dass ich bald meinen Prozess so verfeinert und automatisiert habe, dass ich mit geringem Aufwand die Karten drucken kann …
Im nächsten Artikel erkläre ich dann die eigentliche Motivation dahinter 🙂