间接控制行为:如何延长某些页面而不延长其他页面?

间接控制行为:如何延长某些页面而不延长其他页面?

我希望能够间接控制 latex 的行为。让我试着解释一下我的意思。我有一个由程序生成的大型文档。我们可以假设每个页面(或页面组)都包含 \oversize{12}\oversize{22},或类似的东西,其中1222是部分指示符,\oversize是我将要编写的宏。我的目标是通常不执行任何操作,但在特殊情况下\oversize评估。\enlargethispage{3\baselineskip}

我想在文本文件中描述这些特殊情况,它可能看起来像

5
37
289

以表明对于那些特定的页面,我需要放大页面,或者可能看起来像 \newcommand{\bigpages}{5 37 289}或类似的东西。

关键是能够在生成 latex 文件之后以某种方式指示哪些页面/页面组需要放大。(生成的 latex 文档的序言inputinclude相关页面列表可以。)

我对 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}

相关内容