帮助 makedtx --- DocInput 未定义

帮助 makedtx --- DocInput 未定义

我正在尝试为我拥有的包生成 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.instestp.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环境的保护,并将正确排版:

在此处输入图片描述

相关内容