Я бы использовал скрипт Perl для генерации скриптов LaTeX. Но это я.
Edit:
Ну, это то, что мне нравится в Stackoverflow: множество интересных и забавных задач, которые нужно решить. Моя жена вроде наркомана по судоку, поэтому я подумал, что напечатать пару брошюр, чтобы она была счастлива, не повредит.
Примечание. Образец PDF-файла результатов доступен по адресу Scribd .
Сначала я пошел на CTAN (если вы не знаете, это старший брат CPAN.) Я нашел модуль для LaTeX, который называется (что еще?) sudoku, Я прочитал документацию и посчитал ее достаточно хорошей.
Во-вторых, я хотел это в формате буклета. На этот раз модуль, который я нашел в CTAN, был слишком неясен и сложен в использовании, поэтому я продолжил поиск и нашел статью под названием LaTeX: создание 5 буклетов , написанных Свеном Хартенштейном. Первая строка этой статьи гласит: «Так я делаю буклеты формата А5, напечатанные на бумаге формата А4 (которая затем складывается один раз) с использованием LaTeX ...»
Наконец, я искал CPAN для хорошего генератора судоку. Есть много решателей, но я просто хотел напечатать головоломку, поэтому я остановился на Games :: Sudoku :: Component , и я написал небольшой Perl-скрипт для генерации файла TeX, называемый sudoku.pl:
#!/usr/bin/perl
use strict;
use warnings;
use Games::Sudoku::Component;
my $sudoku = Games::Sudoku::Component->new(size => 9);
print '
\documentclass[a5paper,headsepline,titlepage,10pt,normalheadings,DIVcalc]{scrbook}
\usepackage{sudoku}
\begin{document}
\title{Sudoku}
\author{L. Herrera}
\maketitle
\renewcommand*\sudokuformat[1]{\Large\sffamily#1}
\setlength\sudokusize{6cm}
\setlength\sudokuthickline{1pt}
';
print "\\chapter*{Easy puzzles}\n";
foreach (1 .. 16) {
print "\\section*{Puzzle $_}\n";
$sudoku->generate(blanks => 50);
my $puzzle = $sudoku->as_string(
separator => '|',
linebreak => "|.\n|",
);
$puzzle =~ s/0/ /gs;
print "\\begin{sudoku}\n|", $puzzle, "|.\n";
print "\\end{sudoku}\n\n\n";
}
print "\\end{document}\n";
Затем я дословно скопировал сценарий, созданный Свеном, и назвал его booklet.sh
:
#!/bin/sh
#
# This script takes an A5 latex file as input and produces an A4
# document (both ps and pdf) for printing an A5 booklet
#
# Usage:
# booklet [filename without extension]
latex $1
latex $1
# make an a5 ps from dvi:
dvips -t a5 -o $1.ps $1.dvi
# sort pages
psbook $1.ps tmp1.ps
# put two pages on one a4 sheet
psnup -Pa5 -pa4 -2 tmp1.ps tmp2.ps
# change a5 to a4 in ps file
sed 's/^%%DocumentPaperSizes: A5/%%DocumentPaperSizes: a4/g' < tmp2.ps > $1_booklet.ps
# produce pdf files, pdflatex ist used (twice) to get bookmarks
pdflatex $1.tex
pdflatex $1.tex
ps2pdf -sPAPERSIZE=a4 $1_booklet.ps
# delete tmp files
rm tmp1.ps tmp2.ps
Теперь я регенерирую небольшой буклет, готовый к печати, просто выполнив
perl sudoku.pl > puzzle1.tex && ./booklet.sh puzzle1