foreach LaTeX 输入文件,输出 PDF 文件

foreach LaTeX 输入文件,输出 PDF 文件

我有一堆表格保存在单独的文件和文件夹中,这些表格已用主文件进行了编译,逐一注释了主文件中每个文件的名称,并繁琐地重命名生成的 PDF 输出。

几个月来我制作了一百多张表格。现在我想以不同的风格重新编译它们,所以我正在寻找一种自动化这个过程的方法。

以下是一次不成功的尝试,它基于本网站上的一些建议,特别是这个问题

用文字总结一下我在下面的代码中尝试做的事情:

  1. 创建文件a.texb.tex用作输入(这些是我的表格);
  2. 定义一个命令将文件名存储为列表,a并且b(无需自动文件命名);
  3. 一个foreach循环(包pgffor)来调用每个输入文件 a.tex以及b.tex内部的基本文档头/前言(standalone类)并用名称保存它temp.tex
  4. 然后调用\immediate\write18{pdflatex...运行 pdflatex temp.tex
  5. 预期输出是两个名为a.pdf和 的PDF 文件b.pdf。我在启用的情况下运行它 shell-escape

不用说,它不起作用,非常感谢您的帮助!

% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape]
\documentclass{article}
\usepackage{pgffor}% \foreach
\usepackage{filecontents}
\begin{filecontents*}{a.tex}
  First file (a table without preamble)
\end{filecontents*}

\begin{filecontents*}{b.tex}
  Second file (a table without preamble)
\end{filecontents*}

\newcommand*{\ListOfFiles}{a,b}

\foreach \x in \ListOfFiles{%
  \begin{filecontents*}{temp.tex}%
    \documentclass{standalone}%
    %\usepackage{stylesforalltables}
    \begin{document}%
    \input{\x}
    \end{document}%
  \end{filecontents*}%
  \immediate\write18{pdflatex -jobname=\x\space temp}
}%

答案1

您不能将其用作filecontents另一个命令的参数。但您可以在单独的filecontents环境中定义主文件。将其称为compileall.tex(或其他)

\documentclass{article}
\usepackage{pgffor}% \foreach
\usepackage{filecontents}

\begin{filecontents*}{master.tex}
\documentclass{standalone}
%\usepackage{stylesforalltables}
\begin{document}
\input{\jobname}
\end{document}
\end{filecontents*}

\begin{filecontents*}{a.tex}
  First file (a table without preamble)
\end{filecontents*}

\begin{filecontents*}{b.tex}
  Second file (a table without preamble)
\end{filecontents*}

\newcommand*{\ListOfFiles}{a,b}

\foreach \x in \ListOfFiles{%
  \immediate\write18{pdflatex -jobname=\x\space master}
}

\stop

master.tex但是,按照上面的方法编写并从命令行执行会更简单(假设bash

for i in {a,b}; do pdflatex -jobname=$i master; done

答案2

这是一个解决方案(简单\write)。

\documentclass{article}
\usepackage{pgffor}% \foreach
\usepackage{filecontents}

\begin{filecontents*}{a.tex}
  First file (a table without preamble)
\end{filecontents*}

\begin{filecontents*}{b.tex}
  Second file (a table without preamble)
\end{filecontents*}


\newcommand*{\ListOfFiles}{a,b}


\newwrite\temp
\foreach \x in \ListOfFiles{
\immediate\openout\temp=temp.tex
\immediate\write\temp{
    \string\documentclass{standalone}
    \string\begin{document}
    \string\input{\x}
    \string\end{document}
}
\immediate\closeout\temp
\immediate\write18{pdflatex -jobname=\x\space temp}
}%

\begin{document}
foo
\end{document}

或者(更短)使用\unexpanded

\immediate\write\temp{\unexpanded{%
    \documentclass{standalone}
    \begin{document} 
    \input{\jobname} 
    \end{document}}

相关内容