不区分大小写的操作系统(例如 Windows/MacOS)

不区分大小写的操作系统(例如 Windows/MacOS)

我希望能够创建一个 TeX 文件,只需一次编译即可输出多个 PDF 文件。我甚至不确定这是否可行。以下是设置:

我正在写几十封求职信,希望它们看起来都“个性化”。所以我定义了一个函数,它调用多个变量,例如地址、机构名称、空缺职位等,并为每个函数调用输出一封“个性化”求职信。问题是 TeX 文件的编译只输出一个文件。由于我最终会在线提交所有这些文件,我希望每封信都在自己的文件中。有没有办法在 TeX 级别做到这一点?

答案1

您如何存储这些信息?您可以为每个字母创建一个信息文件

% letter1.adr
\def\toname{Foo}

% letter2.adr
\def\toname{Bar}

然后有一个主文件

% main.tex
\documentclass[addrfield]{scrlttr2}
\input \jobname.adr

\begin{document}
\begin{letter}{\toname}
\opening{Dear \toname, }
 A nice letter.
\end{letter}
\end{document}

然后你可以用类似下面的命令从命令行编译所有字母

对于(*.adr)中的%i,请执行pdflatex -jobname =%i main.tex

科玛束还提供了用于更复杂的地址文件的工具。

答案2

\write18是的,如果您启用(例如pdflatex --shell-escape使用 MiKTeX),这是可能的。然后您可以pdflatex在文档中再次调用。举个例子(代码不是我写的)。它将生成三个文档\jobname1- \jobname3

不区分大小写的操作系统(例如 Windows/MacOS)

\documentclass{article}

\ifx\conditionmacro\undefined
  \immediate\write18{%
    pdfLaTeX --jobname="\jobname1"
    \gdef\string\conditionmacro{1}\string\input\space\jobname
  }%
  \immediate\write18{%
    pdfLaTeX --jobname="\jobname2"
    \gdef\string\conditionmacro{2}\string\input\space\jobname
  }%
  \immediate\write18{%
    pdfLaTeX --jobname="\jobname3"
    \gdef\string\conditionmacro{3}\string\input\space\jobname
  }%
  \expandafter\stop
\fi

\begin{document}
\ifnum\conditionmacro=1 Condition is 1\fi
\ifnum\conditionmacro=2 Condition is 2\fi
\ifnum\conditionmacro=3 Condition is 3\fi

\verb|\conditionmacro| is \texttt{\meaning\conditionmacro}.
\end{document}

区分大小写的操作系统(例如 Linux)

正如 Martin Heller 的评论中所述,您需要针对区分大小写的操作系统将此代码更改为:

\documentclass{article}

\ifx\conditionmacro\undefined
  \immediate\write18{%
    pdflatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \immediate\write18{%
    pdflatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \immediate\write18{%
    pdflatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi

\begin{document}

\ifnum\conditionmacro=1 Condition is 1\fi 

\ifnum\conditionmacro=2 Condition is 2\fi

\ifnum\conditionmacro=3 Condition is 3\fi

\verb|\conditionmacro| is \texttt{\meaning\conditionmacro}.

\end{document}

针对 lualatex 进行编辑

在较新的 luatex 版本中,\write18 不再具有特殊含义,不能像这样使用。然后您需要重载的 shellesc 包\write。它还提供了一个\ShellEscape可用于(也用于 pdflatex)代替原始命令的包。示例如下所示。

\documentclass{article}
\usepackage{shellesc}
\ifx\conditionmacro\undefined
  \ShellEscape{%
    lualatex --jobname="\jobname1"
    "\gdef\string\conditionmacro{1}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname2"
    "\gdef\string\conditionmacro{2}\string\input\space\jobname"
  }%
  \ShellEscape{%
    lualatex --jobname="\jobname3"
    "\gdef\string\conditionmacro{3}\string\input\space\jobname"
  }%
  \expandafter\stop
\fi

\begin{document}

\ifnum\conditionmacro=1 Condition is 1\fi

\ifnum\conditionmacro=2 Condition is 2\fi

\ifnum\conditionmacro=3 Condition is 3\fi

\verb|\conditionmacro| is \texttt{\meaning\conditionmacro}.

\end{document}

答案3

答案是否定的,TeX 输出一个 PDF 文件。

之后我会使用一个工具来分割 PDF 文件。pdf页面(特克斯)pdfsam, 和pdftk应该可以解决问题。

答案4

您可以按照 Patrick 所说的去做,也可以从脚本语言(例如,Perl + Template Toolkit)生成 TeX 文件,然后使用环境变量传递参数。

例如在 Linux 上使用 bash,你可以这样做 $ PARAM1=VALUE1 PARAM2=VALUE2 perl ./compile.pl

相关内容