如何不重复加载文件?

如何不重复加载文件?

version.tex我创建了一个包含消息的文件git log.tex然后,此文件被包含到我的main.tex文件中,如下所示:

\renewcommand{\footsnippy}{%
  Author Name,
  Title of my Book,  %
  \input{version}
}

因为footsnippy文档类使用它来将当前日期、作者、标题(现在还有 git log)打印到每一页上。

但是:LaTeX 现在慢了不少,因为似乎现在\input执行的是每一页。嗯……

看:

...
) [11] (./version.tex) [12] (./version.tex) [13] (./version.tex) [14]
(./version.tex) [15] (./version.tex) [16] (./version.tex) [17] (./version.tex)
[18] (./version.tex) [19] (./version.tex) [20] (./version.tex) [21]
(./version.tex) [22]) (./wikitex/00Vorwort.tex (./version.tex) [23]
(./version.tex) [24]) (./version.tex) [25] (./wikitex/teil01beginn.tex
(./version.tex) [26]
...

有什么方法可以避免文件被一遍又一遍地读取?

答案1

您只需加载一次文件即可,关键是catchfile包:

\usepackage{catchfile}

\newcommand{\gitinput}[1]{%
  \begingroup
  \ifcsname gitinput#1\endcsname
  \else
    \CatchFileDef\temp{#1}{}
    \global\expandafter\let\csname gitinput#1\endcsname\temp
  \fi
  \endgroup
  \csname gitinput#1\endcsname
}

\renewcommand{\footsnippy}{%
  Author Name,
  Title of my Book,
  \gitinput{version}
}

第一次执行时\gitinput{version},将定义宏\gitinputversion,展开为文件内容version.tex。然后,\gitinputversion每次调用时都会执行该命令\gitinput{version};但文件不会被读取多次。

这比设置可重复使用的框具有优势,因为本方法将尊重周围的字体形状和字体大小条件。

答案2

没有任何包,我savebox按照@MarcoDaniel 的建议使用了。

\newsavebox{\tversion}
\savebox{\tversion}{{\tiny\input{version}}}

\renewcommand{\footsnippy}{%
    Author Name,
    Title of my Book,
    \usebox{\tversion}
}

如您所见,我必须将格式添加\tiny到保存框中,因为保存框本身,而不仅仅是加载的文件内容。这意味着,之前在footsnippy文本命令中完成的格式\input{version}不再适用于保存框。所以我必须在保存框中应用它。

相关内容