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
你可以使用.dtx
file生成多个.tex
文件,然后分别编译,这样就可以得到多个文档。