From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/sudoku/sudoku.dtx | 393 +++++++++++++++++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 macros/latex/contrib/sudoku/sudoku.dtx (limited to 'macros/latex/contrib/sudoku/sudoku.dtx') diff --git a/macros/latex/contrib/sudoku/sudoku.dtx b/macros/latex/contrib/sudoku/sudoku.dtx new file mode 100644 index 0000000000..23c46369ac --- /dev/null +++ b/macros/latex/contrib/sudoku/sudoku.dtx @@ -0,0 +1,393 @@ +% \iffalse meta-comment +% +% sudoku.dtx +% Copyright 2005,2006 Paul Abraham +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3 of this license or (at your option) any +% later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of +% LaTeX version 2003/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% This Current Maintainer of this work is Paul Abraham. +% +% This work consists of the files sudoku.dtx, sudoku.ins +% README, CHANGES and the derived file sudoku.sty. +% +% \fi +% +% \iffalse +%\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%\ProvidesPackage{sudoku} +% [2006/03/25 v1.0.1 Sudoku grid] +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{sudoku} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{sudoku.dtx} + \PrintChanges + \PrintIndex +\end{document} +% +% \fi +% +% \CheckSum{104} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \changes{v1.0}{2005/06/29}{Initial version} +% \changes{v1.0.1}{2006/03/25}{Added ability to specify line thickness} +% +% \GetFileInfo{sudoku.sty} +% +% \DoNotIndex{\newcommand,\newenvironment} +% \setlength{\parindent}{0pt} +% \setlength{\parskip}{5pt plus 2pt minus 1pt} +% +% \title{The \textsf{sudoku} package\thanks{This document +% corresponds to \textsf{sudoku}~\fileversion, dated \filedate.}} +% \author{Paul Abraham \\ \texttt{paul.abraham@linuxdirect.org}} +% +% \maketitle +% +% \section{Introduction} +% +% The \textsf{sudoku} package allows the user to typeset +% sudoku\footnote{I~have seen Sudoku written as Sudoku +% (one word) and Su Doku (two words). I don't know which of them (if +% either) is more correct than the other. I am just using one word.} +% puzzles. +% +% A~sudoku puzzle is a 9$\times$9 grid where some of the squares in +% the grid contain numbers. The rules are simple: +% every column can only contain the digits 1 to 9, +% every row can only contain the digits 1 to 9 and +% every 3$\times$3 box can only contain the digits 1 to 9. +% +% The puzzle derives its name from the Japanese \textit{Su}, meaning +% number, and \textit{Doku\/} meaning singular or solitary. +% +% More information, including help and example puzzles, can be found +% at \texttt{www.sudoku.org.uk}. This site also has blank sudoku grids +% (or worksheets), but you will not need to print them from there if +% you have this package installed. +% +% \section{Acknowledgements} +% +% I~want to thank Morten H\o gholm who took my first attempt at +% creating a sudoku environment in \LaTeX\ and corrected all my +% mistakes. He then gave me the help and encouragement to publish +% it as a package. +% +% \section{Usage} +% +% \DescribeMacro{\sudokuformat} +% This macro contains the formatting information for each number +% in the grid. The default value is \verb|\Huge\sffamily|, which +% gives correctly sized numbers for the default grid size, but it +% can be changed with \verb|\renewcommand*\sudokuformat[1]{\|\meta{font}|#1}|. +% +% \DescribeMacro{\sudokusize} +% This length contains the size of the grid, defaulting to \verb|10cm|. +% It can be changed with \verb|\setlength\sudokusize{|\meta{size}|}|. +% +% \DescribeMacro{\sudokuthickline} +% This length determines the thickness of the thick lines and defaults +% to \verb|2pt|. It can be changed with +% \verb|\setlength\sudokuthickline{|\meta{size}|}|. +% +% \DescribeMacro{\sudokuthinline} +% This length determines the thickness of the thin lines and defaults +% to \verb|0.4pt|. It can be changed with +% It can be changed with \verb|\setlength\sudokuthinline{|\meta{size}|}|. +% +% \DescribeEnv{sudoku-block} +% This environment draws the sudoku grid. The contents of each cell +% in the grid are delimited by the vertical bar (\verb+|+) character. +% +% \DescribeEnv{sudoku} +% This environment starts a \verb|center| environment, then uses the +% \verb|sudoku-block| environment to draw the grid. +% +% \section{Examples} +% +% This should be a relatively easy puzzle to solve. +% +% \begin{verbatim} +% \begin{sudoku} +% |2|5| | |3| |9| |1|. +% | |1| | | |4| | | |. +% |4| |7| | | |2| |8|. +% | | |5|2| | | | | |. +% | | | | |9|8|1| | |. +% | |4| | | |3| | | |. +% | | | |3|6| | |7|2|. +% | |7| | | | | | |3|. +% |9| |3| | | |6| |4|. +% \end{sudoku} +% \end{verbatim} +% The output is shown in figure~\ref{easypuzzle}. The solution is shown in +% figure~\ref{easysolution}. +% +% \begin{figure}[t] +% \begin{sudoku} +% |2|5| | |3| |9| |1|. +% | |1| | | |4| | | |. +% |4| |7| | | |2| |8|. +% | | |5|2| | | | | |. +% | | | | |9|8|1| | |. +% | |4| | | |3| | | |. +% | | | |3|6| | |7|2|. +% | |7| | | | | | |3|. +% |9| |3| | | |6| |4|. +% \end{sudoku} +% \caption{Easy puzzle\label{easypuzzle}} +% \end{figure} +% +% This is a bit more difficult. +% +% \begin{verbatim} +% \begin{sudoku} +% | |2| | |3| |9| |7|. +% | |1| | | | | | | |. +% |4| |7| | | |2| |8|. +% | | |5|2| | | |9| |. +% | | | |1|8| |7| | |. +% | |4| | | |3| | | |. +% | | | | |6| | |7|1|. +% | |7| | | | | | | |. +% |9| |3| |2| |6| |5|. +% \end{sudoku} +% \end{verbatim} +% The output is shown in figure~\ref{difficultpuzzle}. The solution is shown in +% figure~\ref{difficultsolution}. +% +% \begin{figure}[t] +% \begin{sudoku} +% | |2| | |3| |9| |7|. +% | |1| | | | | | | |. +% |4| |7| | | |2| |8|. +% | | |5|2| | | |9| |. +% | | | |1|8| |7| | |. +% | |4| | | |3| | | |. +% | | | | |6| | |7|1|. +% | |7| | | | | | | |. +% |9| |3| |2| |6| |5|. +% \end{sudoku} +% \caption{Difficult puzzle\label{difficultpuzzle}} +% \end{figure} +% +% \newpage +% This code will create the same grid inline: +% \begin{verbatim} +% \renewcommand*\sudokuformat[1]{\sffamily#1} +% \setlength\sudokusize{5cm} +% Easy Sudoku Puzzle +% \begin{sudoku-block} +% |2|5| | |3| |9| |1|. +% | |1| | | |4| | | |. +% |4| |7| | | |2| |8|. +% | | |5|2| | | | | |. +% | | | | |9|8|1| | |. +% | |4| | | |3| | | |. +% | | | |3|6| | |7|2|. +% | |7| | | | | | |3|. +% |9| |3| | | |6| |4|. +% \end{sudoku-block} +% \end{verbatim} +% +% \StopEventually{} +% +%\iffalse +% 2005/06/29 v1.0 Initial version +% 2006/03/25 v1.0.1 Added ability to specify line thickness +%\fi +% +% \section{Implementation} +% +% First initialise a couple of counters that keep track of where we are. +% \begin{macrocode} +\newcounter{@sudoku@row} +\newcounter{@sudoku@col} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand*\@sudoku@separator[1]{% + \stepcounter{@sudoku@col}% + \ifx#1\@sudoku@separator + \expandafter#1% + \else + \ifx.#1% + \setcounter{@sudoku@col}{-1}% + \addtocounter{@sudoku@row}{-1}% + \else + \put(\value{@sudoku@col},\value{@sudoku@row})% + {\makebox(1,1){\sudokuformat{#1}}}% + \fi + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\begingroup + \catcode`\|=\active + \gdef\@sudoku@activate{\let|=\@sudoku@separator} +\endgroup +% \end{macrocode} +% +% Now we can draw the grid. Each 3$\times$3 box has thicker borders +% than the rest of the grid. From version 1.0.1, the line thickness +% can be determined by changing \verb|\sudokuthinline| and +% \verb|\sudokuthickline|. +% +% \begin{macrocode} +\newcommand*\@sudoku@grid{ +% \end{macrocode} +% +% First draw the thin lines. +% +% \begin{macrocode} + \linethickness{\sudokuthinline}% + \multiput(0,0)(1,0){10}{\line(0,1){9}}% + \multiput(0,0)(0,1){10}{\line(1,0){9}} +% \end{macrocode} +% +% Now draw the thick lines. +% +% \begin{macrocode} + \linethickness{\sudokuthickline}% + \multiput(0,0)(3,0){4}{\line(0,1){9}}% + \multiput(0,0)(0,3){4}{\line(1,0){9}} +% \end{macrocode} +% +% Finally try and fill in the four corners of the grid. +% +% \begin{macrocode} + \linethickness{0.5\sudokuthickline}% + \put(0,0){\framebox(0,0){}}% + \put(9,0){\framebox(0,0){}}% + \put(0,9){\framebox(0,0){}}% + \put(9,9){\framebox(0,0){}} +} +% \end{macrocode} +% +% The default font is a huge, sans serif font. +% \begin{macrocode} +\newcommand*\sudokuformat[1]{\Huge\sffamily#1} +% \end{macrocode} +% +% The grid defaults to a 10 centimetre square. +% \begin{macrocode} +\newdimen\sudokusize +\setlength\sudokusize{10cm} +% \end{macrocode} +% +% Set line thicknesses to 0.4pt and 2pt for thin and thick lines. +% \begin{macrocode} +\newdimen\sudokuthinline +\setlength\sudokuthinline{0.4pt} +\newdimen\sudokuthickline +\setlength\sudokuthickline{2pt} +% \end{macrocode} +% +% Make the size of each square $1/9$ of the size of sudoku grid. +% \begin{macrocode} +\newenvironment{sudoku-block}{% + \catcode`\|=\active + \@sudoku@activate + \setcounter{@sudoku@col}{-1}% + \setcounter{@sudoku@row}{8}% + \setlength\unitlength{.111111\sudokusize}% + \begin{picture}(9,9)% + \@sudoku@grid\@sudoku@grab@arguments + }{\end{picture}} +% \end{macrocode} +% +% As we change the \verb|catcode| of \verb+|+ inside the environment, +% under normal \TeX\ we can't just use such an environment as an argument +% of another command. This can be solved by using e\TeX\ as engine for +% \LaTeX, which is what all the major distributions do currently. +% \begin{macrocode} + \begingroup + \@ifundefined{eTeXversion}{\endgroup + \def\@sudoku@grab@arguments#1{% + \ifx#1\@sudoku@separator + \expandafter#1% + \else + \PackageError{sudoku}{% + Sudoku puzzles are not allowed in the arguments\MessageBreak + of other commands}{% + Either fix this in your source (possibly using the `lrbox' + environment) or use an eTeX based LaTeX format} + \fi + }% + }{\endgroup + \def\@sudoku@grab@arguments#1.#2.#3.#4.#5.#6.#7.#8.#9.{% + \scantokens{#1.#2.#3.#4.#5.#6.#7.#8.#9.}}% + } +% \end{macrocode} +% +% The |sudoku| environment simply calls the |sudoku-block| +% environment inside a |center| environment. +% \begin{macrocode} +\newenvironment{sudoku}{% + \begin{center}% + \begin{sudoku-block}}{\end{sudoku-block}\end{center}} +% \end{macrocode} +% +% \Finale +% +% \begin{figure}[b] +% \begin{sudoku} +% |2|5|8|7|3|6|9|4|1|. +% |6|1|9|8|2|4|3|5|7|. +% |4|3|7|9|1|5|2|6|8|. +% |3|9|5|2|7|1|4|8|6|. +% |7|6|2|4|9|8|1|3|5|. +% |8|4|1|6|5|3|7|2|9|. +% |1|8|4|3|6|9|5|7|2|. +% |5|7|6|1|4|2|8|9|3|. +% |9|2|3|5|8|7|6|1|4|. +% \end{sudoku} +% \caption{Solution for easy puzzle\label{easysolution}} +% \end{figure} +% +% \begin{figure}[b] +% \begin{sudoku} +% |6|2|8|5|3|4|9|1|7|. +% |5|1|9|8|7|2|4|3|6|. +% |4|3|7|9|1|6|2|5|8|. +% |8|6|5|2|4|7|1|9|3|. +% |3|9|2|1|8|5|7|6|4|. +% |7|4|1|6|9|3|5|8|2|. +% |2|5|4|3|6|9|8|7|1|. +% |1|7|6|4|5|8|3|2|9|. +% |9|8|3|7|2|1|6|4|5|. +% \end{sudoku} +% \caption{Solution for difficult puzzle\label{difficultsolution}} +% \end{figure} +% +\endinput -- cgit v1.2.3