我一直在努力做好并制作我的原型包.dtx
文件(特别是TeX-SX 包但这不是特别相关)。我的工作流程有点像这样:
.tex
在文件中使用测试修改一些宏- 将宏位分叉到
.sty
文件中,测试保留在.tex
文件中 - 将宏修改为合理的值
- 将测试转换成类似文档的内容
- 将文件转换
.sty
为.dtx
- 添加文档
- 宣布某处并要求测试人员
此时,我进入“添加功能和修复错误”阶段。编辑比编辑.dtx
稍微不那么直观.sty
(必须记住这些macrocode
东西,但我已经习惯了),但我通常不想每次都重建文档 - 我通常有一个单独的测试文件,只测试我正在编辑的那些部分。因此,虽然我可以添加pdflatex file.dtx
以生成新.sty
文件,但它也生成文档有点过分。这不仅浪费了时间而且还可以隐藏.sty
位中的任何错误,并将其隐藏在有关文档位的信息环之下。
那么:我该如何pdflatex
告诉仅有的.sty
运行时生成文件pdflatex file.dtx
?
(顺便说一句,如果有人碰巧建议改进我的工作流程,我将不胜感激。)
答案1
我使用的方法是建立一个.dtx
文件,以便pdflatex <filename>.dtx
提取代码和排版文档,而tex <filename>.dtx
只进行提取。我使用的基本上是
% \iffalse meta-comment
%<*internal>
\iffalse
%</internal>
%<*readme>
%</readme>
Some README information here :-)
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
\expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
---------------------------------------------------------------
<PACKAGE> --- <DESCRIPTION>
Maintained by <NAME>
E-mail: <EMAIL>
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------
\endpreamble
\postamble
Copyright (C) DATE by
<NAME> <<EMAIL>>
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
this license or (at your option) any later version. The latest
version of this license is in the file:
http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status) by
<NAME>.
This work consists of the file <PACKAGE>.dtx
and the derived files <PACKAGE>.pdf,
<PACKAGE>.sty and
<PACKAGE>.ins.
\endpostamble
\usedir{tex/latex/<PACKAGE>}
\generate{
\file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\usedir{source/latex/<PACKAGE>}
\generate{
\file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\usedir{doc/latex/<PACKAGE>}
\generate{
\file{README.txt}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
\expandafter\endbatchfile
\else
\expandafter\endgroup
\fi
%</internal>
%<*driver>
\documentclass{ltxdoc} % or whatever
%\DisableImplementation
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% CODE AND DOCUMENTATION HERE
所发生的情况是,测试(在internal
防护装置内部)意味着提取是在 LaTeX 组内部完成的,但不是针对纯 TeX,而是在到达文档部分之前退出。
然后我使用它进行测试的方法是创建一个非常简单的测试文件,并\write18
启用它。类似
\immediate\write18{tex <FILENAME>.dtx}
\documentclass{article}
\usepackage{<FILENAME>}
\begin{document}
Tests here.
\end{document}
这让我可以做很多简单(或不太简单)的测试而不需要排版所有内容。
答案2
您可能还会将安装程序代码放入.dtx
文件中。这种风格现在似乎很流行。如图所示,执行此操作的经典方法clsguide
是将docstrip
命令放入单独的.ins
文件中,然后提取.sty
文件:
因此,使用以下方法解包:
pdflatex somepackage.ins % extract .sty file
尽管:
pdflatex somepackage.dtx % compile manual
我对所有软件包都使用了 Makefile,并且unpack
第一行有一个目标,因此我只需要说make unpack
或make package
哪个是别名。
文件的最小示例.ins
是:
\input docstrip.tex
\keepsilent
\generate{\file{somepackage.sty}{\from{somepackage.dtx}{package}}}
\endbatchfile
请参阅clsguide
更大的示例。