来自单个 dtx 的多个文档

来自单个 dtx 的多个文档

DTX 格式允许从单个 dtx 文件生成包代码(.sty文件)和文档(文件)。.pdf

是否可以从单个 dtx 文件生成多个 PDF(例如不同语言的 PDF)?

答案1

我的答案分为两部分:首先我展示如何使用 DTX 文件(即 docstrip 标签)来提取不同语言的不同部分,然后我讨论在包的实际 DTX 文件中遇到的问题。

通常,您可以使用 docstrip 标签<*lang1>...</lang1>来标记包含第一语言文本等的所有文件部分,例如<*de>..</de>表示德语。然后使用 INS 文件(您应该已经为 DTX 文件准备好了)将这些部分提取到 TEX 文件中,然后可以单独编译该文件。仅包含这些文本的“DTX”文件看起来类似于:

<*en>
 Hello!
</en>
<*de>
 Hallo!
</de>
<*klingon>
 Qapla’!
</klingon>
Common part

然后有一个如下的 INS 文件:

\input docstrip.tex
\generate{%
  \file{<name>-en.tex}{\from{<name>.dtx}{en}}%
  \file{<name>-de.tex}{\from{<name>.dtx}{de}}%
  \file{<name>-klingon.tex}{\from{<name>.dtx}{klingon}}%
}

并编译如下:

tex <name>.ins
latex <name>-en
latex <name>-de
latex <name>-klingon

然而,请注意,DTX 文件中的常规文档已被注释掉,因此无法提取。如果您想在一个 DTX 文件中包含多种语言,您可以在文档部分使用一些 if 开关,然后使用一个小包装器相应地设置此 if 开关。我为我的adjustbox包做了类似的事情。

我在 DTX 文件的开头,就在\documentclass以下代码之前,它定义了 if-switch,如果不存在则将其设置为 true:

\expandafter\ifx\csname ifenglish\endcsname\relax
    \expandafter\newif\csname ifenglish\endcsname
    \englishtrue
\fi

在文档中我这样使用它:

\ifenglish
   Do you wish a cup of tea?    % (British) English
\else
   Wie willst du deinen Kaffee? % German (we drink coffee!)
\fi

最后我有以下包装器代码,将 if-switch 设置为错误的它启用德语部分并简单地输入 DTX 文件。要使此功能正常工作,您需要在 中使用明确的名称,\DocInput{<name>.dtx}而不是\jobname

% \iffalse
%<*de>
%% Wrapper to set language to German.
\expandafter\newif\csname ifenglish\endcsname
\englishfalse
\input{adjustbox.dtx}
%</de>
% \fi

INS 文件包含将其提取到 TEX 文件的指令:

\input docstrip.tex
\generate{%
  \file{<name>.sty}{\from{<name>.dtx}{<name>.sty}}%
  \file{<name>-de.tex}{\from{<name>.dtx}{de}}%
}

然后运行编译英文手册latex <name>.dtx,提取 STY 和其他 TEX 文件使用:,tex <name>.ins然后latex <name>-de编译德文手册。

答案2

你可以使用.dtxfile生成多个.tex文件,然后分别编译,这样就可以得到多个文档。

相关内容