LaTeX 的预处理器?

LaTeX 的预处理器?

我很好奇,想知道是否有人对 LaTeX 文档的预处理器有什么建议。我想到的是类似 cpp 的东西。我提出这个问题的动机是,我正在写一个大型文档,在其中插入我自己的注释,例如

\textbf{XXX TO DO: need transition paragraph. Make sure to mention xy's work. XXX}

例如。当我定期将(未完成的)文档的部分内容发布给选定人员时,我会注释掉 TO DO,并用更简单的字符串替换页脚中的详细 Subversion 版本字符串(版本、日期、时间等),以表明我的作者身份,并且该文档不应分发。如果这些更改可以自动进行,我会很高兴,而像 cpp 这样的东西似乎是显而易见的候选者。

我意识到使用 awk 或 sed 编写一个小预处理器并不是什么大事,但理想情况下我想重用现有的软件。到目前为止,我的挖掘只发现了 gpp

http://en.nothingisreal.com/wiki/GPP

和 filepp

http://www.cabaret.demon.co.uk/filepp/

不过,从网站上的日期来看,这两个似乎都相当老了。有什么评论、经验或想法吗?

答案1

这是使用该包的版本ifdraft。在我的 MWE 中,当您使用 进行编译时,您会有 TODO 而没有页脚(在标记的位置使用您的 subversion 代码来获取一个)\documentclass[draft]{article},而没有 TODO 和我的假页脚,没有选项draft

\documentclass{article}

\usepackage{ifdraft}
\usepackage{blindtext}
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhead{}
\renewcommand{\headrulewidth}{0pt}

\ifdraft{
    \lfoot{
        % insert subversion code here
    }
}{
    \lfoot{Written by Psirus, do not distribute.}
}

\newcommand\mytodo[1]{
    \ifdraft{
        \textbf{#1}
    }{}
}

\begin{document}
    \blindtext
    \mytodo{I have to remember this!}
\end{document}

答案2

虽然前面的答案为 OP 的实际问题提供了很好的解决方案,但下面的内容更详细地阐述了“类似 CPP 的预处理”和 (La)TeX 之间的关系。

除了大量的“内部清理”(删除注释、空格等)之外,CPP 还提供了三种可由用户通过预处理器命令控制的操作:

(1)将另一个文件的内容包含到标记流中:

#include "file.ext"

这直接映射到 (La)TeXs\input{file}命令。

(2)宏的定义与扩展:

#define MAGIC 4711
void main(){
  return MAGIC; // expands to: return 4711;
}

嗯,(La)TeX 完全是关于宏及其扩展的,所以这映射到\def\newcommand或它的一个风格。事实上,(La)TeX 的宏处理功能要强大得多。

(3)条件编译:

#define DRAFT

void main() {
  #ifdef DRAFT
    printf("DBG: in main()\n");
  #endif
}

这是唯一不直接映射到某些 (La)TeX 概念的 CPP 原语。虽然在许多情况下可以通过某些 \if ... \fi构造(或相应的命令,如\ifdraft{}{}Psirus 的答案中所示)来模拟它,但有一个细微的差别:使用条件编译,我们实际上处于元级别,也就是说,我们改变了程序文本它被输入到编译器:如果条件计算结果为假,则删除条件块的代码行,即编译器甚至看不到它们。因此,它们可能包含“奇怪的语法”,例如不平衡的括号或控制结构。次要影响(如果条件部分非常大)是编译时间减少,因为需要词法分析和解析的程序文本更少。

对于 (La)TeX,真正的条件编译可以通过以下方式实现:comment包裹

\documentclass{article}

\usepackage{comment}
\usepackage{lipsum}
\usepackage{fancyhdr}

\pagestyle{fancy}

\includecomment{todos}      % #define todos
\excludecomment{svninfo}    % #undef svninfo

\fancyhead{}
\renewcommand{\headrulewidth}{0pt}

\lfoot{Written by Psirus, do not distribute.}
\begin{svninfo}
    \lfoot{SVN STUFF}
\end{svninfo}


\newcommand\mytodo[1]{}

\begin{todos}
\renewcommand\mytodo[1]{
    \textbf{#1}
}
\end{todos}

\begin{document}
    \lipsum
    \mytodo{I have to remember this!}
\end{document}

答案3

对于带有待办事项的简单操作,该todonotes包就可以了,如评论中所述。此外,@Prirus 的想法很棒。对于更高级的编辑,我建议使用两个不同的主 tex 文档。您可能include/input无论如何都拥有所有内容,因此您可以创建两个不同的布局并使用简单的分别编译它们Makefile。或者如果您愿意,可以同时进行两者。

查看这些答案,可以在那里找到一些更复杂的建议。还可以查看带有Makefile标签的主题这里

答案4

尝试潘多克

pandoc -o preprocessed_output.tex LaTeX_input.tex

相关内容