我想尝试一下 LaTeX 包创建,主要是因为拖延的原因……但我不知道如何开始。例如,以前的问题我得到了一些不错的答案。我想从中选择一个答案并创建一个包。
- 我该如何开始?
- 如果其他人发现它有用,我应该如何记录它?
- 我如何发布它?
也许我应该说,我不想让任何人为我做这项工作...我更希望有人能告诉我如何才能自己做这项工作!
答案1
这是三个相关但又不同的问题。我们在这个网站上已经找到了一些很好的答案。所以也许我们可以借此机会总结一下。
此答案是社区 wiki,因此请随意编辑。当然,您可以添加除网站链接之外的更多信息。
开始编写包
记录软件包
- 我如何记录我的风格文件?
- 用于记录自写软件包的软件包(sty-files)
- 包装文档的黄金标准是什么?
- 如何使用 dtx 记录 expl3 宏
dtxtut.pdf
“如何打包你的 LaTeX 包”- Joseph Wright 的博客文章“模型 .dtx 文件”
发布包
答案2
我花了大约一天的时间尝试构建自己的包。抱歉,你的公主在另一座城堡里;我决定写下我的发现。这是血管内皮生长因子“你好世界!”项目,并采取了一些捷径来减少代码大小和答案大小。
答案将帮助您了解哪些东西可以组合在一起以及如何组合。它还将向您展示如何在本地运行您的软件包,以便您可以检查 TeX 安装和软件包的完整性。
初始点
首先,我将展示不使用包时我的 TeX 是什么样子。包的目的是将 的定义移到\hello
名为 的包中mypackage
。
document.tex
\documentclass{article}
\newcommand{\hello}{Hello, World!}
\begin{document}
\hello
\end{document}
我设法实现了这个目标,并且在回答完这个答案后,您也可以使用以下 TeX。
package.tex
\documentclass{article}
\usepackage{mypackage}
\begin{document}
\hello
\end{document}
制作包裹
包文件
有两种类型的包; 样式 ( .sty
) 和类 ( .cls
)。为此,我们将创建一种样式。在编写自己的样式或类时,我建议查看 Wikibooks 的创建包页。
LaTeX 中的版本通常以 ISO 8601 日期格式 YYYY/MM/DD 提供。因此,当您同时指定 TeX 和软件包版本时,您应该以该格式输入两者。
mypackage.sty
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{mypackage}[2020/02/28 1.0.0 Tutorial project]
\newcommand{\hello}{Hello, World!}
\endinput
以上是我制作的样式文件。
\NeedsTeXFormat
指定需要哪个版本的 TeX,同时指定版本(日期)。\ProvidesPackage
指定我们要定义的包。我有:- 调用包
mypackage
, 将 TeX 版本设置为今天的日期,
2020/02/28
指定版本语义版本控制
1.0.0
添加了项目的简短描述。
教程项目
- 调用包
\newcommand
定义想要的\hello
命令。\endinput
表示样式文件的结束。
本地安装
最好对代码进行完整性检查。这样我们就可以在本地安装包。如果您需要安装自己的或他人的包,则需要知道这一点。
- 查找 TEXMF 文件夹的位置。
制作所需的文件夹TeX 目录结构、TDS、标准。
因为我们正在制作一个 LaTeX 项目,所以我们将其放在 中
texmf/tex/latex
。为了保持文件夹整洁,我们将把包放在mypackage
文件夹中。将您的包复制到新创建的文件夹。
在壳里它看上去会像这样。
笔记:确保您更改了%USERPROFILE%/texmf
您的输出。
$ kpsewhich -var-value=TEXMFHOME
%USERPROFILE%/texmf
$ mkdir %USERPROFILE%/texmf/tex/latex/mypackage/
$ cp mypackage.sty %USERPROFILE%/texmf/tex/latex/mypackage/
如果找不到您的包,因为您的 TeX 不符合 TDS,那么您可以告诉 TeX 它在哪里。
$ texhash %USERPROFILE%/texmf
测试包
我们现在可以运行package.tex
,它会按预期输出“Hello, World!”。
记录它
从 sty 转换为 dtx
TeX 项目文档化的标准是通过dtx。这是一些同时包含文档和软件包的黑魔法。为了实现这一壮举,代码包含大量注释,并且需要安装程序。
ins 文件从 dtx 中提取信息并构建 sty 或 cls 文件。
代码大部分是样板。
mypackage.ins
\input docstrip.tex
\keepsilent
\usedir{tex/latex/mypackage}
\generate{\file{mypackage.sty}{\from{mypackage.dtx}{package}}}
\Msg{Please move mypackage.sty to a TDS directory}
\endbatchfile
- 您应该将所有出现的更改
mypackage
为您的包的名称。 您可以
\Msg
随意更改。
如果您希望将消息分成多行,还可以添加其他消息。想想
print
,echo
或者sys.stdout.write
。
制作 dtx
要构建文档,您需要对 dtx 文件运行 TeX。就像对任何其他 TeX 文档所做的一样。
mypackage.dtx
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1994/06/01]
%<package>\ProvidesPackage{mypackage}[2020/02/28 1.0.0 Tutorial project]
%<*driver>
\documentclass{ltxdoc}
\usepackage{mypackage}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{mypackage.dtx}
\end{document}
%</driver>
% \fi
%
% \begin{macro}{\hello}
% This is the function to display "Hello world!"
% \begin{macrocode}
\newcommand{\hello}{Hello world!}
% \end{macrocode}
% \end{macro}
\endinput
当文件通过 TeX 运行时,它会评估从\documentclass
到 的部分\end{document}
,就像任何其他 TeX 文件一样。如果您注释掉该\DocInput
行,那么您只会得到一个空文件。
运行时会发生神奇的事情\DocInput
。这会第二次评估文件,这次会从文件中删除注释。\iffalse
和\fi
导致整个第一部分不会在第二次评估时运行,从而阻止\DocInput
第二次运行,并阻止\NeedsTeXFormat
永远运行。
从这里开始,文件的其余部分就很简单了。
%<package>
是一个特殊注释,其中包括 sty 中未注释的行。
正如我们package
在 ins 中指定的那样。\generate{\file{mypackage.sty}{\from{mypackage.dtx}{package}}}
笔记:中间不要有空格
%
,<
否则将不会被包含。\begin{macro}
使用以下行作为描述来记录宏。\newcommand{\hello}{...}
被出口到猪圈。\endinput
被出口到猪圈。
本地安装
要安装该包,我们需要运行 ins 从 dtx 中提取 sty。
提取猪圈后,我们只需像之前一样安装它即可。
在外壳中,它看起来会像这样。
$ tex mypackage.ins
$ cp mypackage.sty %USERPROFILE%/texmf/tex/latex/mypackage/
您还可以通过运行 dtx 来查看文档。
$ pdflatex mypackage.dtx
$ ./mypackage.pdf
出版
现在您知道了 sty、cls、ins 和 dtx 文件是什么以及如何安装它们,了解如何发布 TeX 包就非常简单了。Stefan Kottwitz 提供的链接回答可以更好地描述这一点。
向前走
我想重申,这是一个关于如何制作和安装您自己的文档包的 MVCE。因此我偷工减料,没有介绍一半可用的工具。
- Wikibooks 上有更完整的描述如何建造猪圈或 cls。
- 斯科特·帕金如何打包你的 LaTeX 包关于如何编写自己的 dtx 和 ins。
- Stefan Kottwitz 的回答,因为现在您应该对整个系统有足够的了解,可以单独理解各个帖子。