编译后输入文件出现多次?

编译后输入文件出现多次?

我正在使用此答案中给出的函数https://tex.stackexchange.com/a/7657/110509(稍加改动,ls #1/*.tex子目录ls #1/*/*.tex #1/*.tex中的文件也会包含在内)。

但是如果我跑

latex -shell-escape -interaction=nonstopmode  Master.tex
pdflatex -shell-escape -interaction=nonstopmode  Master.tex

我的文件 Master.dvi 没有内容表,但文件 Master.pdf 包含上述函数包含的所有文件(即它们都在文档中出现两次)。我尝试过的所有其他 latex 和 pdflatex 组合,无论是否使用 -shell-escape,要么没有上下文表,要么文件出现不止一次。

有人知道,首先为什么会发生这种情况?其次我该如何解决这个问题?

在我看来,每次编译时该函数都在运行。

编辑

现在我有机会尝试一个例子。这是我的 Master.tex 文件:

\documentclass[a4paper,16pt]{article}
\makeatletter
\def\app@exe{\immediate\write18}
\def\inputAllFiles#1{%

  \app@exe{ls #1/*/*.tex #1/*.tex | xargs cat >> \jobname.tmp}%
  \InputIfFileExists{\jobname.tmp}{}
  \AtEndDocument{\app@exe{rm -f #1/\jobname.tmp}}}
\makeatother
\begin{document}
\title{Test}
\date{\today}

\maketitle
\newpage
\tableofcontents
\newpage

\inputAllFiles{/home/user/My_answers/Test/Main1/}
\inputAllFiles{/home/user/My_answers/Test/Main2/}
\end{document}

在目录中.../Main1/我有 。/Min1_1/File1_1.tex和 。/Min1_2/File1_2.tex并且在.../Main2/我有./Min2_1/File2_1.tex./Min2_2/File2_1.tex。 例如 File1_1.tex 文档中的每个代码都非常简单,例如

\section{File 1.1}
Hi
\subsection{subsection 1}

有趣的是,如果我注释掉其中一个\inputAllFiles函数,代码就能正常工作,但似乎是因为我使用了两个(或更多)函数才导致了问题。

答案1

由于我使用的是 Windows,因此我无法测试这一点,因此我请您进行以下内容测试。

查看你的代码

\def\inputAllFiles#1{%
                                                              % line 2
  \app@exe{ls #1/*/*.tex #1/*.tex | xargs cat >> \jobname.tmp}% line 3
  \InputIfFileExists{\jobname.tmp}{}                          % line 4
  \AtEndDocument{\app@exe{rm -f #1/\jobname.tmp}}}            % line 5

我在第 3 行发现一个问题:>> \jobname.tmp 延伸或者创建当前目录中的文件\jobname.tmp(不一定是包含第一个子文件的目录...)那么如何在它所属的子目录中创建这个临时文件,就像>> #1/\jobname.tmp你在第 5 行所做的那样?那么你的第二个子目录中就没有文件了\jobname.tmp...

据我所知,linux 会> \jobname.tex覆盖现有文件\jobname.tmp,但我不确定(很长时间没有使用 linux)。这可能是您的命令的替代方法...

或者,例如,您可以删除第 2 行中所有可能存在的文件\jobname.tmp( del \jobname.tmp > nul),因为您调用了两次该命令。在原始解决方案中,它仅被调用一次,因此不可能存在较旧的文件\jobname.tmp

答案2

作为一个快速修复(注意我是 OP),用以下函数替换

\makeatletter
\def\app@exe{\immediate\write18}
\def\inputAllFiles#1#2{%

  \app@exe{ls #1/*/*.tex #1/*.tex | xargs cat >> \jobname#2.tmp}%
  \InputIfFileExists{\jobname#2.tmp}{}
  \AtEndDocument{\app@exe{rm -f #1/\jobname#2.tmp}}}

\makeatother

然后使用输入\inputAllFiles{pathtodir}{random_string}。有效,尽管我仍然对最初出现的问题感兴趣,以及上面的代码是否可以变得更高效,例如不需要第二个参数。

相关内容