如何在休闲活动的同时延长编译时间?

如何在休闲活动的同时延长编译时间?

今天我想起了那个老笑话,一个程序员可以为他在工作时的休闲活动找一个不可否认的借口,理由是他只是在等待他的代码编译。

虽然我是个工作狂和公平的玩家,但这样的借口时不时还是有用的,那么,用尽可能少的额外代码实现长编译时间的最佳方法是什么呢?

任何巧妙的附加价值都将获得额外的假想分,比如让 LaTeX 高级用户甚至专家难以立即识别原因(花费的时间越长越好)或非常有创意的识别方法。

所有解决方案最终都必须编译,因此禁止使用无限循环等。理想解决方案不应该生产书面输出对于已构建的文档,面具本身从控制台输出日志,加载尽可能少的包, 并难以检测

以此作为基本模板,并使用 UNIX 等time来查找编译所花的时间(如果有任何解决方案,我将在相同条件下计时并发布结果)(这是不必要的,因为实际上有无限的解决方案)。

\documentclass{article}
\usepackage{lipsum}
\begin{document}
\title{Title}
\author{Author}
\date{Today}
\maketitle
\lipsum
\end{document}

希望它值得你花些时间去阅读并开怀大笑,而不只是我的惯用手法(也许是愚蠢的)创作之一。

答案1

加上pdfTeX

\everypar{\ifnum\pdfelapsedtime<\maxdimen
  \the\expandafter\everypar\else\pdfresettimer\fi}

\begin{document}(如果您使用的是 ,则在 之后pdfLaTeX)。这将等待四个半小时(\maxdimen缩放秒,即 2^{30-16} 秒)后再开始每个段落。替换\maxdimen为 65536(和一个空格)可在每个段落获得一秒钟的延迟。编写一本包含 1000 个段落的书大约需要六个月。对于 90 个字符的添加来说还不错。

只需多一点代码(184 个字符),就可以实现与引擎无关的阿克曼函数\A让我们通过稍微改变参数来获得几乎任何延迟(我不确定什么时候会超出 TeX 的限制)。

\def\A#1#2{\the\numexpr\B{#1}{#2+1}\empty
  {\A{#1-1}{\B{#2}1\empty{\A{#1}{#2-1}}.}}.\relax}
\def\B#1{\ifnum\numexpr#1=0 \C\else\C\fi}
\def\C#1#2#3#4#5.{#1#3#4}
\everypar{{\count0=\A{3}{1}}}

我在我的计算机上将每段编译时间增加了大约 6 分钟。这个答案的另一个好处是,定义可以很容易地分散在序言中以避免被发现。使用xint让我们可以操作更大的数字,因此为提供更大的参数\A

\usepackage{xint}
\def\C#1#2#3#4#5.{#1#3#4}
\def\b#1{\if0\s{#1}\C\else\C\fi}
\let\s\xintSgn
\let\d\romannumeral
\let\x\xintAdd
\def\a#1#2{\b{#1}{\x{#2}1}\empty{%
    \a{\x{#1}{-1}}
    {\d-`-\b{#2}1\empty{\a{#1}{\d-`-\x{#2}{-1}}}.}}.}
\everypar{\d-\xintSgn{\A{3}{1}} }

最后这段代码没有经过测试:xint增加了 TeX 算法的开销,导致整个过程非常慢。使用更慢的包bigintcalc,因为它出现得早xint,而且没有那么优化。

答案2

这应该会让你忙上一两分钟(我在 5 分钟后停止了测试运行)

\documentclass{article}


\begin{document}
\everypar{\ifnum\thepage000<\maxdimen\par\fi}

hello

\end{document}

答案3

免责声明:对于这可能对您的 CPU 造成的任何损坏,我不负责!:D

基于hyperref和 的解决方案foreach

\documentclass{article}
\usepackage{tikz}
\usepackage{hyperref}
\usepackage{lipsum}

\begin{document}
\title{The art of wasting time} 
\author{dcmst}
\maketitle
\lipsum[1]
  \begin{tikzpicture}
  \def \n {1000}
  \foreach \s in {1,...,\n}{
  \node {\hypertarget{\s}{}};
  \node {\hyperlink{\s}{}};
  }
  \end{tikzpicture}
\lipsum[1]
\end{document}

在 i7 笔记本电脑上,1000 个循环编译需要 3-4 秒;10000 个循环编译需要 53 秒!等等。

只需增加数量,您将有更多时间玩[在此处插入您最喜欢的视频游戏]。

这根本不会产生任何输出,所以你也可以责怪你的旧机器并要求更新、更快的机器:)

编辑:看起来 16383 是 的最大可接受值\n。然后您显然可以堆叠多个循环并foreach根据需要添加任意数量的循环。两个foreach值为 10000 的实例导致我出现TeX capacity exceeded错误。

编辑 2:要删除编译警告,可以将~\null字符添加到hypertarget第二link个参数中。

编辑 3:增加main_memory数量后,我设法让编译持续了 4 分钟,然后手动停止。除了添加另一个节点外,foreach还可以通过添加更多节点对(如 MWE 中的两个节点)来延长时间。

答案4

将整个系列的讲座演示beamer文稿保存在一个文件中。

正如我在另一个回答中所说,这条建议来自真实世界当然,通常人们会尝试减少编译时间,为了实现这个目标,我开发了我在https://tex.stackexchange.com/a/52904/86。但是,如果您不使用这些方法,从beamer包含整个讲座课程的文件编译讲座可能会花费...时间。

(出于显而易见的原因,我不会发布这个代码!)

相关内容