使用表格语法排版数独网格

使用表格语法排版数独网格

这是对这个问题的后续回答创建其内容传递给 TikZ 矩阵的环境,它没有揭示任何针对具体问题的解决方案(但确实让我知道可以尝试另一个包)。

我需要创建一个环境来绘制数独网格,其中使用的语法是环境的语法tabular。也就是说,单元格由 分隔&,新行由 表示\\

以下代码是使用的解决方案tabularray

\documentclass[11pt]{article}
\usepackage{tabularray}
\usepackage{color}
\newenvironment{sudoku}[1][]{%
    \begin{tblr}{
        hline{1,4,7,10}={blue,2pt},
        hline{2,3,5,6,8,9}={blue,0.5pt},
        vline{1,4,7,10}={blue,2pt},
        vline{2,3,5,6,8,9}={blue,0.5pt},
        abovesep=3pt,
        #1
    }
}{%
    \end{tblr}
}
\begin{document}
\begin{sudoku}
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
\end{sudoku}
\end{document}

这将是完美的,除了以下几点:

  • 它在某些设备上根本不起作用(可能与软件包的 LaTeX 3 性质有关)
  • 在可以工作的设备上,编译包含 20 或 30 个数独网格的 tex 文件所花费的时间变得越来越严重。(请参阅此处查看相关文章

因此,我需要一些计算量较小的东西:毕竟,它只是一个 9x9 网格!有人可以替换上述环境定义中的代码sudoku来呈现类似/相同的结果吗?

此外,tabularray这里有一些我看过的东西 - 这并不是说其中一个没有解决方案,而是我还没能解决。

  1. 使用tikz-matrix。这是我的主题早期帖子

  2. 使用nicematrix。我还没有找到一种方法来指定(例如)不同的\hlines 可以有不同的厚度。

  3. 使用sudoku。也许可以做些什么来catcodes代替正常的语法?

更广泛地说:我们 LaTeX 用户似乎仍然必须使用类似表格的结构,其中样式必须嵌入表格代码中,而不是单独应用(如果您熟悉网页设计,请考虑精心制作的页面的 HTML 和 CSS 之间的区别)。这就是为什么tabularray(几乎)完美。

提前感谢你的帮助!

答案1

这是一个带有的程序nicematrix

我不知道它对你来说是否足够快......

\documentclass[11pt]{article}
\usepackage{nicematrix,tikz}
\usepackage{color}

\NewDocumentEnvironment{sudoku} {}
  {
    \begin{NiceTabular}{*{9}{c}}[hvlines,rules={width=0.2pt,color=blue}]
  }
  {
    \CodeAfter
        \tikz \draw [line width=0.7pt,blue] 
                 (4-|1) -- (4-|10) 
                 (7-|1) -- (7-|10) 
                 (1-|4) -- (10-|4) 
                 (1-|7) -- (10-|7)  
                 (1-|1) rectangle (10-|10) ;
    \end{NiceTabular}
  }

\begin{document}
\begin{sudoku}
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
1&2&3&4&5&6&7&8&9\\
\end{sudoku}

\end{document}

上述代码的输出

答案2

普通 TeX 解决方案:

\newcount\suline
\def\thickline{1.4pt}
\def\sudokuA{\advance\suline by1 \ifnum\suline<10 \expandafter \sudokuB \fi}
\def\sudokuB#1&#2&#3&#4&#5&#6&#7&#8&#9{%
   \hbox{\vrule width\thickline
         \bx{#1}.\bx{#2}.\bx{#3}|%
         \bx{#4}.\bx{#5}.\bx{#6}|%
         \bx{#7}.\bx{#8}.\bx{#9}|}%
   \hrule \ifnum\numexpr \suline-(\suline/3)*3=0 height\thickline \fi
}
\def\bx#1#2{\hbox to1.5em{\lower.5em\vbox to1.5em{}\hss\ignorespaces#1\unskip\hss
                          \vrule \if|#2 width\thickline\fi}}

\def\sudoku#1{\vbox\bgroup \let\\=\sudokuA
   \hrule height\thickline \\#1\egroup
}

\sudoku{
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
    1&2&3&4&5&6&7&8&9\\
}
\bye   

您可以比较一下速度……

答案3

好吧,这不是 OP 所要求的(因为我不尊重数据的表格符号),但出于进一步的目的,我认为最好添加一个简单的Z 解决方案。我没有花时间进行基准测试,但对于这个单个网格,运行时间不到 2 秒。

使用 TikZ 渲染数独

\documentclass[12pt]{article}
\usepackage{tikz}

\tikzset{thck/.style={blue,line width=2pt},thn/.style={blue,line width=0.5pt}}
\newcommand{\sudoku}[1]{%
    \begin{tikzpicture}
        \draw[thn] (0,0) grid (9,9);
        \draw[thck,line cap=rect] (0,0) grid[step=3] (9,9);
        
        \foreach \n [count=\i from 0] in {#1}
            {
            \pgfmathtruncatemacro{\x}{Mod(\i,9)}
            \pgfmathtruncatemacro{\y}{\i/9)}
            \node at (\x+0.5,9-\y-0.5) {\n};
            }
    \end{tikzpicture}
    }
    
\begin{document}    
    \sudoku{
    1,2,3,4,5,6,7,8,9,
    9,8,7,6,5,4,3,2,1,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9,
    1,2,3,4,5,6,7,8,9
    }
\end{document}

答案4

你看过了吗sudokubundle

它基本上有三个包:printsudoku打印一个谜题;solvesudoku尽力解决一个谜题;以及createsukodo创建可通过 解决的谜题solvesudoku

我意识到这不是对您的问题的明确回答,但我认为您值得花点时间看看这些。

相关内容