我想知道是否可以在不使用软件包进行编译的情况下进行预处理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}