我正在使用此答案中给出的函数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}
。有效,尽管我仍然对最初出现的问题感兴趣,以及上面的代码是否可以变得更高效,例如不需要第二个参数。