导出文档的两个副本,并打开和关闭 \newif 变量

导出文档的两个副本,并打开和关闭 \newif 变量

考虑以下文档(test.tex):

\documentclass{article}
\usepackage{blindtext}

\newif \ifoption
\optiontrue                                            % (*)

\begin{document}
\ifoption
% Print some blind text
\blindtext
\else
% Print lots of blind text
\Blindtext
\fi
\end{document}

照原样,它会打印一段盲文。如果将指示的行更改为\optionfalse,它会打印几段盲文。

我想配置我的编译器任务(即当我在 TeXworks 中按下 Ctrl+T 时会发生什么)以同时生成三个 PDF 文件:

  • 一个test-optiontrue.pdf只有一段盲文的电话
  • 其中一个test-optionfalse.pdf有几段盲文
  • 一个test.pdf与实际出现的设置相匹配的调用test.tex

这可能吗?例如,有没有办法修改对 pdfLaTeX 的调用,以便它按原样编译文档一次,然后用\if每个替代值覆盖并编译这些情况?

如果这不可能,我的替代方案是什么?最重要的是,我的文档正文已经按照格式编写\ifoption ... \else ... \fi,因此我强烈建议采用只需要修改文档标题的解决方案。

Babel 不是一个选择,因为它与我正在使用的其他软件包不兼容。

答案1

pdflatex基于 Unix 系统的解决方案

将声明集中到\newif一行,比如说第 3 行test.tex

\documentclass{article}
\usepackage{blindtext}
\newif\ifoption\optiontrue         % Line 3

\begin{document}
\ifoption
% Print some blind text
\blindtext
\else
% Print lots of blind text
\Blindtext
\fi
\end{document}

您可以将其放在文档的早期位置,甚至在 之前\documentclass{article},这样它的行号就永远不会改变。

compile.sh接下来,在同一目录中创建一个 shell 脚本,test.tex内容如下:

sed '3 c\
\\newif\\ifoption\\optiontrue' test.tex  | pdflatex -jobname=test-optiontrue
sed '3 c\
\\newif\\ifoption\\optionfalse' test.tex | pdflatex -jobname=test-optionfalse

sed命令用适当的\newif声明替换第 3 行,然后我们将其通过管道传输到pdflatex。该-jobname选项为您提供不同的文件名。请注意转义字符 的使用\

现在您可以bash compile.sh从终端运行来产生所需的输出。

显然,使用 Babel 比这种不成熟的解决方案更好。

答案2

读了 Max 的回答后,我完全不熟悉 Babel,因为它与 Latex 有关系。因此,您必须从这个角度考虑这个回答。

所述问题特别需要一种可以与 Texworks 结合使用的解决方案。您遇到此问题的原因是,使用 Texworks 等文本编辑器处理 Latex 文档的整个方法存在缺陷。

这是一个非常有争议的论断。许多用户,甚至可能是大多数用户,都更愿意使用 Texworks 等现成的软件。另一种方法是使用程序员的编辑器,例如 Vi/Vim 或 Emacs。这些编辑器几乎可以无限编程,可以执行任何(奇怪的)内部文字处理任务。此外,Emacs 肯定可以在(例如)Windows 操作系统环境中以及 Linux 中使用。我猜 Vi/Vim 的一些变体也同样可用。我还猜想一些类似的程序员编辑器可以在Apple操作系统环境中使用。

这个回复的目的是为了让不同的读者做出明智的决定。也就是说,假设你使用的是现成的软件而不是程序员的编辑器。当你遇到像这篇文章中这样的挑战时,你可以考虑是否继续使用(例如)Texworks,并使用一个不太优雅的解决方案来应对这种情况。另一种选择是投入大量时间/精力来研究你要使用哪种程序员的编辑器,然后解决相应的学习曲线。


此回复的其余部分使用了 OP(即原始海报)提出的具体挑战来说明在使用程序员编辑器时如何处理这种情况。

Pdflatex 允许命令行选项,例如工作名称,用于指定输出文件名。您可以谷歌搜索“pdflatex jobname”来查找相关讨论/示例。

在研究您的帖子时,我试图确定是否可以在 Pdflatex 命令行上覆盖/设置 Max 答案中的相应行:

\newif\ifoption\optiontrue

我的粗略研究没有定论。这里需要研究和实验。研究的一部分可能涉及谷歌搜索“pdflatex 设置文档选项”。

假设一切都可以通过 pdflatex 命令行进行控制。程序员的编辑器(例如 Emacs、Vi/Vim)将以编程方式知道文件名,并能够以编程方式格式化和调用 pdflatex 命令行。此外,程序员的编辑器(即 Emacs)允许使用 GUI 界面,您可以在其中自定义菜单栏,当文档具有 *.tex 而不是 *.txt 扩展名时,菜单栏就会出现。

假设可以在 pdflatex 命令行上设置所需的盲文选项,那么您可以调用所需的处理,创建 3 个单独的 pdf 文件,每个输出文件都有适当命名,只需用鼠标单击您创建的菜单选项即可。


本回复的其余部分讨论了如何使用程序员的编辑器来处理超出 pdflatex 命令行选项所能处理的范围的情况。OP 提出的具体挑战将用作示例。

笔记
我从未真正使用过以下方法。所以我可能没有正确指定 Latex 语法。但是,这个想法是显而易见的。

我将改变 OP 用来制作 test.tex 的策略,如下所示:

...
\usepackage{blindtext}
\newboolean{blindtext}
\setboolean{blindtext}{false}
...
% Editor-flag-1
% \setboolean{blindtext}{true}
\if{\boolean{blindtext}}{\blindtext-1}
\setboolean{blindtext}{false} 
...
% Editor-flag-2
% \setboolean{blindtext}{true}
\if{\boolean{blindtext}}{\blindtext-2}
\setboolean{blindtext}{false} 
...   

我实际上不熟悉 blindtext 包以及乳胶文档中布尔值的创建和使用。在上面的例子中,blindtext-1 和 blind-text-2 旨在表示您将在打印的该位置调用不同的文本段落。

在程序员的编辑器中(即在 Emacs 中),创建一个高度自定义的函数并从 GUI 中的自定义菜单栏调用该函数是一件简单的事情。例如,您可以拥有一个执行以下操作的函数:

  • 询问程序员编辑器内部的变量以确定源文件名(例如test.tex)。

  • 找到字符串“Editor-flag-1”。
    转到下一行。
    取消注释该行。
    保存文件。
    调用 Pdflatex,指定源文件名和 Jobname。
    重新注释该行。

  • 找到字符串“Editor-flag-2”。
    转到下一行。
    取消注释该行。
    保存文件。
    调用 Pdflatex,指定源文件名和 Jobname。
    重新注释该行。

  • 保存文件。
    调用 Pdflatex,指定源文件名和 Jobname。

相关内容