初始点

初始点

我想尝试一下 LaTeX 包创建,主要是因为拖延的原因……但我不知道如何开始。例如,以前的问题我得到了一些不错的答案。我想从中选择一个答案并创建一个包。

  • 我该如何开始?
  • 如果其他人发现它有用,我应该如何记录它?
  • 我如何发布它?

也许我应该说,我不想让任何人为我做这项工作...我更希望有人能告诉我如何才能自己做这项工作!

答案1

答案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表示样式文件的结束。

本地安装

最好对代码进行完整性检查。这样我们就可以在本地安装包。如果您需要安装自己的或他人的包,则需要知道这一点。

  1. 查找 TEXMF 文件夹的位置
  2. 制作所需的文件夹TeX 目录结构、TDS、标准。

    因为我们正在制作一个 LaTeX 项目,所以我们将其放在 中texmf/tex/latex。为了保持文件夹整洁,我们将把包放在mypackage文件夹中。

  3. 将您的包复制到新创建的文件夹。

在壳里它看上去会像这样。
笔记:确保您更改了%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随意更改。
    如果您希望将消息分成多行,还可以添加其他消息。

    想想printecho或者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。因此我偷工减料,没有介绍一半可用的工具。

相关内容