这是对这个问题的后续回答创建其内容传递给 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
这里有一些我看过的东西 - 这并不是说其中一个没有解决方案,而是我还没能解决。
使用
tikz-matrix
。这是我的主题早期帖子。使用
nicematrix
。我还没有找到一种方法来指定(例如)不同的\hline
s 可以有不同的厚度。使用
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	{%
\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 秒。
\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
。
我意识到这不是对您的问题的明确回答,但我认为您值得花点时间看看这些。