我希望能够间接控制 latex 的行为。让我试着解释一下我的意思。我有一个由程序生成的大型文档。我们可以假设每个页面(或页面组)都包含
\oversize{12}
或\oversize{22}
,或类似的东西,其中12
和22
是部分指示符,\oversize
是我将要编写的宏。我的目标是通常不执行任何操作,但在特殊情况下\oversize
评估。\enlargethispage{3\baselineskip}
我想在文本文件中描述这些特殊情况,它可能看起来像
5
37
289
以表明对于那些特定的页面,我需要放大页面,或者可能看起来像
\newcommand{\bigpages}{5 37 289}
或类似的东西。
关键是能够在生成 latex 文件之后以某种方式指示哪些页面/页面组需要放大。(生成的 latex 文档的序言input
或include
相关页面列表可以。)
我对 TeX/LaTeX 作为一种编程语言了解不够,不知道有哪些构造可用于此。在大多数语言中,我会做一些愚蠢的事情,比如创建一个需要修复的页面组数组或列表,如果参数出现\oversize
在列表中,我会发出命令\enlargethispage
,否则什么也不会发出。
我们这里讨论的是一份 500 页的文档,其中大约 8 页将被放大,因此 O(nk) 解决方案(其中 n 是页数,k 是放大次数)完全没问题。有人能给我指出正确的方向吗?
答案1
xstring 包实际上足以解决这个问题。解决方案的一个最小示例是
\documentclass{scrartcl}
\usepackage{xstring}
\usepackage{lipsum}
\newcommand{\oversize}[1]{%
\IfSubStr{\bigpages}{\space#1\space}{
% if part
\enlargethispage{3\baselineskip}
}{
% else part
}
}
\newcommand{\bigpages}{ 1 3 }
\begin{document}
\oversize{1}
\lipsum[1-6]
\newpage
\oversize{2}
\lipsum[1-6]
\newpage
\oversize{3}
\lipsum[1-6]
\end{document}
编译此示例时,可以看到第 1 页和第 5 页被放大了,因为给出了相应的标记,\bigpages
而第 3 页没有给出。
答案2
这是同一件事的稍微花哨一点的版本,允许人们指定每页扩展多少。这显然很大程度上归功于@MHvM 的回答,但我认为最基本的键值对解码可能会在将来对某些人有所帮助。
\documentclass{scrartcl}
\usepackage{xstring}
\usepackage{lipsum}
% Define "pageexpansions" here: for each page-header % identifier, % n, write n:k,
% surrounded by spaces, to indicate that the page headed
% by person n should be lengthened by k lines. The following,
% for instance, says that item 1 should be lengthened by 4
% lines; item 3 by 4 lines, and item 4 by 2 lines.
\newcommand{\pageexpansions}{ 1:4 3:4 4:2 }
\newcommand{\optionalexpand}[1]{%
\IfSubStr{\pageexpansions}{\space#1:}{
% if part
\StrCut{\pageexpansions}{\space#1:}\csA\csB
\StrCut{\csB}{\space}\crA\crB
\enlargethispage{\crA\baselineskip}
}{
% else part
}
}
\begin{document}
\optionalexpand{1}
\lipsum[1-6]
\newpage
\optionalexpand{2}
\lipsum[1-6]
\newpage
\optionalexpand{3}
\lipsum[1-6]
\newpage
\end{document}