我正在尝试为我拥有的包生成 CTAN .dtx
/.ins
文件,但我偶然发现了一个我无法解决或找不到解决方法的问题。我在 Ubuntu 18.04 上,使用 LaTeX Live 2017。
考虑以下几个文件(简化,清晰):
testp.sty
:
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesPackage{testp}
\def\testp{Yay}
\endinput
和testdoc.tex
:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{testp}
\begin{document}
\testp
\end{document}
第二个编译成功。现在我尝试创建以下dtx/ins
对:
makedtx -author "Me" -src "testp\.sty=>testp.sty" -doc testdoc.tex testp
这将生成testp.ins
和testp.dtx
文件。如果我将它们移动到另一个目录中,然后在文件latex
上运行testp.ins
,则testp.sty
文件将正确生成。但是现在,如果我在文件latex
上运行.dtx
,则会出现此错误:
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=latex)
restricted \write18 enabled.
entering extended mode
(./testp.dtx
LaTeX2e <2017-04-15>
Babel <3.18> and hyphenation patterns for 84 language(s) loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def))
(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def
(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu)
(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu)
(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu))) (./testp.sty)
(./testp.aux)
! Undefined control sequence.
l.40 \DocInput
{testp.dtx}
?
如果我添加\usepackage{doc}
到testdoc.tex
文件(谢谢
菲利佩·奥莱尼克),我现在有这个错误:
θ64° [romano:~/software/bugs/makedtx/check] % latex testp.dtx
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=latex)
restricted \write18 enabled.
entering extended mode
(./testp.dtx
LaTeX2e <2017-04-15>
Babel <3.18> and hyphenation patterns for 84 language(s) loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def))
(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def
(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu)
(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu)
(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu)))
(/usr/share/texlive/texmf-dist/tex/latex/base/doc.sty
(/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty)) (./testp.sty)
No file testp.aux.
(./testp.dtx
! LaTeX Error: Can be used only in preamble.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.55 \NeedsTeXFormat
{LaTeX2e}[1996/06/01]
?
...所以我做错了一些事情;有人可以解释一下吗?
答案1
第一个问题是缺少doc
定义的包\DocInput
。
第二个问题是,生成的.dtx
文件如下所示:
%\iffalse
% \begin{macrocode}
%<*testp.sty>
% \end{macrocode}
%\fi
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesPackage{testp}
\def\testp{Yay}
\endinput
%\iffalse
% \begin{macrocode}
%</testp.sty>
% \end{macrocode}
%\fi
在\DocInput
运行中,当%
忽略时,\iffalse
上面的两个就会消失,剩下的就是来自的所有内容\NeedsTeXFormat
。但请记住,您已经在之后了\begin{document}
,并且\NeedsTeXFormat
在这里是无效的(如错误消息所示)。
makedtx
不阻止(我认为应该阻止)代码执行,因此会引发错误。节5 个例子文档makedtx
显示您需要macrocode
自己将代码放入块内:
所以你testp.sty
应该改为(为了说明而添加的评论):
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesPackage{testp}
% \end{macrocode}
%
% Define a very important command:
% \begin{macrocode}
\def\testp{Yay}
\endinput
% \end{macrocode}
然后在排版运行中,代码将受到macrocode
环境的保护,并将正确排版: