所以...我可以玩井字游戏(井字棋)在 PDF 中:每个棋盘配置都是一页,棋盘的每个单元格都是一个链接,指向与该动作对应的页面。生成的 PDF 文件包含 6046 页,大小为 3MB。我的 PDF 查看器显示速度有点慢。
有什么方法可以减少这种包含大量简单页面和大约 50000 个链接的 pdf 的大小? 我也对加快编译速度的方法感兴趣。
(要生成 pdf,请运行pdflatex
以下命令。)
\documentclass[12pt]{article}
\usepackage[paperwidth=48pt,paperheight=48pt,margin=0pt]{geometry}
\usepackage[hidelinks]{hyperref}
\newcount\0 \newcount\1 \newcount\2
\newcount\3 \newcount\4 \newcount\5
\newcount\6 \newcount\7 \newcount\8
\newcount\p
\def\here{\the\numexpr\0+3*(\1+3*(\2+3*(\3+3*(\4+3*(\5+3*(\6+3*(\7+3*\8)))))))}
\def\cell#1#2{\ifnum#1=\p\c#1\else\hyperlink{\here+\p*#2}{\c#1}\fi}
\def\c#1{\hbox to 14.5pt{\hfil\ifcase#1\or x\else o\fi\hfil}}
\def\|{\hskip-.2pt\vrule width.4pt\hskip-.2pt}%
\def\-{\noalign{\hrule height.4pt}}%
\def\mk#1{\p#1
\hypertarget{\here}{%
\hbox to 48pt{\hfil\vbox to 48pt{\vfil
\everycr{}\tabskip 0pt\relax
\halign{&\strut##\cr
\cell\0 {1}\|&\cell\1 {3}\|&\cell\2 {9}\cr\-%
\cell\3 {27}\|&\cell\4 {81}\|&\cell\5 {243}\cr\-%
\cell\6{729}\|&\cell\7{2187}\|&\cell\8{6561}\cr}%
\vfil}\hfil}}\newpage}
\begin{document}
\def\ter#1#2{#1=0 #2\relax #1=1 #2\relax #1=-1 #2\relax}
\ter\0{\ter\1{\ter\2{\ter\3{\ter\4{\ter\5{\ter\6{\ter\7{\ter\8{%
\ifcase\numexpr\0+\1+\2+\3+\4+\5+\6+\7+\8\relax\mk{1}\or\mk{-1}\fi}}}}}}}}}
\end{document}
答案1
获得更少页面的一种方法是消除所有具有超过 1 行/列/对角线的 X 和 O 的页面,因为当您正确玩井字游戏时您无法到达这些页面。
但编译时可能需要更长的时间。
答案2
我使用 pdflatex 将您的 tex 文件翻译成了 pdf。我获得了一个 6046 页的 pdf 文档。这是包含相等数量的 O 和 X 的棋盘的正确数量,加上包含比 O 多一个的 X 的棋盘的数量(因为是 X 开始游戏)。您可以通过将适当的二项式系数的乘积相加来轻松获得数字 6046。但是,某些超链接是多余的,因为它们永远不会在实际游戏中使用。例如,pdf 的第 3113 页展示了一个有 3 个 X 和 2 个 O 的棋盘,如下所示:XXX \ - O - \ O - - ;X 赢得游戏的情况。那么这一页不应该包含任何超链接,因为游戏可能被视为结束。但是生成的 pdf 文件的第 3113 页仍然有 7 个超链接,单击 9 个框中的每一个就可以轻松看到:9 次可能的单击中有 7 次会将您发送到不同的页面。因此,我的结论是,通过改进使用的算法,您可能能够减少超链接的数量,从而减少 pdf 文件的大小。如何改进算法将是一个有待进一步研究的问题。