使用 etoolbox 进行预处理而无需编译

使用 etoolbox 进行预处理而无需编译

我想知道是否可以在不使用软件包进行编译的情况下进行预处理etoolbox。基本上,我想做以下事情。给定一个以下格式的文件:

\documentclass{article}
\usepackage{etoolbox}
\providebool{pre}
\setbool{pre}{true}

\begin{document}
This line is always there.

\ifbool{pre}{
  This line is there if \texttt{pre}.
}{
  This line is here if \texttt{\tilde pre}.
}


\end{document}

我想知道是否有一种方法可以编译它,以便我得到包含以下文本的文件作为输出:

\documentclass{article}
\usepackage{etoolbox}
\providebool{pre}
\setbool{pre}{true}

\begin{document}
This line is always there.

This line is there if \texttt{pre}.


\end{document}

cleveref该包通过其选项提供了类似的功能poorman,但它只是自动生成一个sed脚本来修改原始文件。如果有办法实现这一点(即自动生成一个sed可以在原始文件上运行以获取所需输出的脚本),我也很乐意了解这一点。

编辑:对@egreg 的澄清:我实际上想在编译结束时获得预处理的源文件,而不仅仅是正确条件编译的 pdf 输出。例如,编译上面的第一个示例pdflatex 将产生与pdf编译第二个示例产生的输出完全相同的输出。但是,我在编译结束时想要的不仅仅是正确的输出pdf,而且还是一个源文件中被拒绝的分支ifbool已被完全删除。

我的用例是,我有一个源文件,该文件被编写pdf为根据一个标志(如pre上面的标志)为两个不同的收件人生成两个不同的输出。但是,其中一个输出需要发送给也需要 TeX 源的收件人。我不希望这个收件人看到我为他们自定义输出而输入的条件。

答案1

这将创建一个干净的源文件(但不是 pdf):

\documentclass{article}
\usepackage{newfile}
\usepackage{etoolbox}
\providebool{pre}
%\setbool{pre}{true}
\setbool{pre}{false}
\begin{document}
\newoutputstream{preproc}
\openoutputfile{preproc}{preproc}
%
\addtostream{preproc}{\protect\documentclass{article}}
\addtostream{preproc}{\protect\begin{document}}
\addtostream{preproc}{This line is always there.\par}
\ifbool{pre}{
\addtostream{preproc}{  This line is there if \texttt{pre}.}
}{
\addtostream{preproc}{  This line is here if \texttt{\textasciitilde pre}.}
}
\addtostream{preproc}{\protect\end{document}}
\closeoutputstream{preproc}
\end{document}

编辑:

以下文件main.tex提供预处理的输出文件 output.tex,并output.pdf使用命令 pdflatex --jobname=output main

\begin{filecontents*}{output}
\documentclass{article}
\begin{document}
\input{preproc}
\end{document}
\end{filecontents*}
\documentclass{article}
\usepackage{newfile}
\usepackage{etoolbox}
\providebool{pre}
\setbool{pre}{true}
%\setbool{pre}{false}
\begin{document}
\newoutputstream{preproc}
\openoutputfile{preproc}{preproc}
%
%\addtostream{preproc}{\protect\documentclass{article}}
%\addtostream{preproc}{\protect\begin{document}}
\addtostream{preproc}{This line is always there.\par}
\ifbool{pre}{
\addtostream{preproc}{  This line is there if \texttt{pre}.}
}{
\addtostream{preproc}{  This line is here if \texttt{\textasciitilde pre}.}
}
%\addtostream{preproc}{\protect\end{document}}
\closeoutputstream{preproc}
\input{preproc}
\end{document}

相关内容