我知道,由于各种原因,一些用户使用Perl
或sed
来预处理他们的乳胶文件。
我也正在考虑这样做,因此我想寻求您的指导,以便我能够顺利进入这个领域。
我的用例是简单的宏扩展预处理
If $\ep$ is small... --> If $\epsilon$ is small...
这样编译会话就变成了
doc.tex --preprocessor--> post.tex --pdftex--> post.pdf
并出现以下问题
doc.tex
和中的行号通常不匹配post.tex
。因此pdftex
错误消息指向 中的行post.tex
。但实际上,人们想要 中的行号doc.tex
。同理
synctex
。向后和向前搜索都是关于 的post.tex
。但是,人们实际上希望它们是关于 的doc.tex
。doc.tex
有时,人们想在和之间来回切换post.tex
。preprocessor
知道两个文档的行之间的对应关系。但是,如何以可行的方式表达这些知识呢?我的意思是,文本编辑器没有为这些前后切换提供现成的支持。
那么,您是否知道一些可以平整(1)-(3)的软件、工作流程或技术?
我环顾四周,但只能找到示例Perl
或sed
预处理脚本。
我从未在某处看到过有关工作流程问题的讨论。
编辑
线路不匹配可能源于大的扩张
A function is continuous if
\multiline_continuity_definition_I_often_use
Hence ...
定义扩展为
\begin{description}
\item[Standard]
$\forall \epsilon ... $
\item[Nonstandard]
$x \approx y ... $
\end{description}
编辑2
本题重点讨论预处理技术。
我的例子非常简单,但我希望它们能够抓住预处理环节的主要挑战。
答案1
据我所知,这个问题没有完整的解决方案,因为它会根据您的需求而变化。
但是这里有两个提示,在大多数情况下可以排除你的三个问题:
尽可能使用 LaTeX
你的第一个例子可以很容易地通过
\newcommand{\ep}{\epsilon}
第二个
\newcommand{\multiline_continuity_definition_I_often_use}{% You might prefer a shorter name :)
\begin{description}
\item[Standard]
$\forall \epsilon ... $
\item[Nonstandard]
$x \approx y ... $
\end{description}
}
关键点是要避免shadok逻辑,即“不要浪费时间开发你并不真正需要的工具”。即使这个工具看起来很漂亮。
尝试区分文档中的内容和不包含的内容
这是针对需要预处理器的“真实”示例。通常,这是因为它们涉及动态数据(如果您需要始终执行完全相同的操作,则 latex 应该足够)和复杂的计算/处理。
然后,您可以做的是将这个动态部分从文档中分离出来。例如,\input
一个文件只包含需要预处理的部分。然后预处理文档(\input
例如,遵循这些,或者简单地根据扩展名过滤辅助文件),并编译。
Latex 可以以文件行错误样式输出错误,这样行号就不会乱了。如果您使用的是支持多文件的编辑器(例如)emacs + AUCTeX + refTeX
,这几乎可以透明地实现。
关于 synctex,它也不会引起任何问题。至于基础文档和处理文档之间的来回切换...嗯,因为你只更改了小的辅助文件,所以应该没有问题。
这个工作流程的一个很好的例子就是sagetex
软件包。它允许用户使用符号计算软件进行一些计算sage
,并将其结果直接排版在.pdf
文档中。
它使用一些后期处理使其对用户更加透明,但想法是一样的:
- 用户在
.tex
文件中输入计算结果(使用一些命令) - 第一次运行
pdflatex
提取文件中的所有这些sage
位document.sage
。 sage
该文件的运行将创建document.sageout
包含结果的文件。- 第二次运行将
pdflatex
这些结果插入到最终文档中。
它是一个完全开发的软件包,经过认真优化以方便用户使用,但您不需要如此精心设计的解决方案。例如,您可以手动创建额外的文件(借助编辑器,只需键入\input{filename}
并按下几个键即可)。
再说一次,这不是一个完整的解决方案,您可能需要做一些工作来找出真正适合您需求的东西......把它当作您的工作流程的提示,仅此而已。