限制 \input 以避免不愉快的重复

限制 \input 以避免不愉快的重复

避免多次输入文件描述了如何防止文件被\input多次使用。但是,我想知道是否有办法将其限制为仅input当文件在最近的五页内时才阻止它...但如果自上次以来至少有五页,\input则允许它。\input

我有一个数据集,将要生成的文件\input(图表)与数据对象关联起来。我不想看到同一个图表连续多次输入(在同一页或几页内多次看到同一个图表是令人不快的),但如果稍后与数据元素关联,我很高兴再次看到包含该图表。

例如,按名称排序的美国城市地图集可能会显示该城市所在州的一张小地图。始终包含地图非常容易,但仅包含一次地图稍微有点棘手,但并不难。我想知道是否可以做到第一次包含地图,然后\input忽略任何再次尝试,除非当前页面和上次包含的页面之间至少有(一定数量)页面\input

答案1

\ifnum\numexpr\c@page>\numexpr\uniquenameforthisfile+5\relax
\xdef\uniquenameforthisfile{\the\c@page}
\input{thisfile}
\fi

以及初始化

\def\uniquenameforthisfile{0}

在开始时

不应在 5 页内输入两次文件(使用它\pageref来获取页码会更准确一些,但设置起来比较棘手,尤其是当页码未格式化为整数时。)

答案2

根据 David 的出色回应,我做了一个包装(包装)\input

\def\limitinput#1{
  \IfFileExists{#1}{
    \expandafter\ifx\csname limit@#1\endcsname\relax
      \expandafter\xdef\csname limit@#1\endcsname{\the\c@page}
      \input{#1}{}
    \else
      \ifnum\numexpr\c@page>\numexpr\expandafter\csname limit@#1\endcsname+3\relax
        \input{#1}
        \expandafter\xdef\csname limit@#1\endcsname{\the\c@page}
      \fi
    \fi
  }{}
}

大约:

  • 如果命名的文件存在(命名的文件可能由外部进程创建,也可能不由外部进程创建,因此不要假设它存在):

    • 如果我之前没有见过(尝试输入)此文件,请输入它并捕获我执行此操作的页码。

    • 如果我之前曾看过此文件,但它是在 3 页以上之前,请输入它并捕获我执行此操作的页码。

    • 如果我以前见过这个文件,而且它是最近的(不超过 3 页之前),请不要输入它并且不要捕获页码。

这不会很精确。由于页面内容在构建和内容浮动之间会有一点偏移(这两者都表明使用\pageref更可靠),因此在页面计算中不会严格准确……但只要在一两页之内,就应该足够接近了。如果需要,我可以稍后再回来修改。

相关内容