我很好奇,想知道是否有人对 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
答案4
尝试潘多克:
pandoc -o preprocessed_output.tex LaTeX_input.tex