BNU-FZH

fengzhenhua@outlook.com

SkCode 是根据 NvChad(它是一个优秀且支持拓展的 nvim lua 配置)"抄袭"而来, 你可以理解成 SkCode 它的代码都来源于这个仓库. SkCode 的代码结构是来源于 NvChad, 但是 SkCode 也绝不是简简单单的抄代码, 我希望 vim 的配置更加简单, 所以将一些代码进行优化, 删除不需要的功能, 添加人性化的键位绑定, 以及提供前端的 Lsp 配置, 于是就出现了 SkCode.

阅读全文 »

/etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。

当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。下面我来介绍如何在此文件下填写信息。

文件示例

一个简单的 /etc/fstab,使用内核名称标识磁盘:

1
/etc/fstab # <file system> <dir> <type> <options> <dump> <pass> tmpfs /tmp tmpfs nodev,nosuid 0 0 /dev/sda1 / ext4 defaults,noatime 0 1 /dev/sda2 none swap defaults 0 0 /dev/sda3 /home ext4 defaults,noatime 0 2
阅读全文 »

Linux 查看PCI设备命令—lspci

选项与参数:

1
2
3
-v :显示更多的 PCI 接口装置的详细信息
-vv :比 -v 还要更详细的信息
-n :直接观察 PCI 的 ID 而不是厂商名称

查看一般详细信息

1
lspci -v

查看网卡详细信息:

1
2
3
4
5
6
7
lspci -s 04:00.0 -vv

-s :后面接的是每个设备的总线、插槽与相关函数功能

或:

lspci -n -d 8086:3002 -vvv

选项详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-vv
使得 lspci 以过冗余模式显示更详细的信息 (事实上是 PCI 设备能给出的所有东西)。这些数据的确切意义没有在此手册页中解释,如果你想知道更多,请参照 /usr/include/linux/pci.h 或者 PCI 规范。
-n
以数字形式显示 PCI 生产厂商和设备号,而不是在 PCI ID 数据库中查找它们。
-x
以十六进制显示 PCI 配置空间 (configuration space) 的前64个字节映象 (标准头部信息)。此参数对调试驱动和 lspci 本身很有用。
-xxx
以十六进制显示所有 PCI 配置空间的映象。此选项只有 root 可用,并且很多 PCI 设备在你试图读取配置空间的未定义部分时会崩溃 (此操作可能不违反PCI标准,但是它至少非常愚蠢)。
-b
以总线为中心进行查看。显示所有 IRQ 号和内存地址,就象 PCI 总线上的卡看到的一样,而不是内核看到的内容。
-t
以树形方式显示包含所有总线、桥、设备和它们的连接的图表。
-s [[&lt;bus&gt;]:][&lt;slot&gt;][.[&lt;func&gt;]]
仅显示指定总线、插槽上的设备或设备上的功能块信息。设备地址的任何部分都可以忽略,或以“*”代替 (意味着所有值)。所有数字都是十六进制。例如:“0:”指的是在0号总线上的所有设备;“0”指的是在任意总线上0号设备的所有功能块;“0.3”选择 了所有总线上0号设备的第三个功能块;“.4”则是只列出每一设备上的第四个功能块。
-d [&lt;vendor&gt;]:[&lt;device&gt;]
只显示指定生产厂商和设备 ID 的设备。 这两个 ID 都以十六进制表示,可以忽略或者以“*”代替 (意味着所有值)。
-i &lt;file&gt;
使用 &lt;file&gt; 作为 PCI ID 数据库而不是使用默认的 /usr/share/hwdata/pci.ids。
-p &lt;dir&gt;
使用 &lt;dir&gt; 作为包含 PCI 总线信息的目录而不是使用默认的目录 /proc/bus/pci。
-m
以机器可读的方式转储 PCI 设备数据 (支持两种模式:普通和冗余),便于脚本解析。
-M
使用总线映射模式,这种模式对总线进行全面地扫描以查明总线上的所有设备,包括配置错误的桥之后的设备。请注意,此操作只应在调试时使 用,并可能造成系统崩溃 (只在设备有错误的时候,但是不幸的是它们存在),此命令只有 root 可以使用。同时,在不直接接触硬件的 PCI 访问模式中使用 -M 参数没有意义,因为显示的结果 (排除 lspci 中的 bug 的影响) 与普通的列表模式相同。
--version
显示 lspci 的版本。这个选项应当单独使用。

编者注:本文译自微软官方发布的指南。

Linux 是一款操作系统,与 Windows 有许多相似之处,但由于其开源和高度定制化的特性,衍生出众多的版本。安装 Linux 的前提是,你需要决定一个安装方式,并选定一个适合的 Linux 发行版。

要安装 Linux,你需要如下步骤:

  1. 首先,确定一个安装方式。你可以选择使用 Windows 的 Linux 子系统Windows Subsystem for Linux(WSL)进行安装,也可以选择完全安装在物理硬件上(即裸机安装),或者在本地或云端创建一个虚拟机(VM)来运行 Linux。
  2. 其次,选择一个 Linux 发行版。如:Ubuntu、Debian、Kali Linux、OpenSUSE 等。
  3. 然后,按照你所选的安装方法进行操作。具体可以是以下四种方式之一:
    • 使用 Windows 子系统 Linux(WSL)中的安装 Linux 命令
    • 在云中创建一个 Linux 虚拟机(VM)
    • 在本机创建一个 Linux 虚拟机(VM)
    • 创建一个可引导的 USB,以安装裸机版 Linux
  4. Linux 安装完成后,你需要熟悉你所选发行版的包管理器,更新和升级可获取的包,并熟悉微软提供的 Linux 资源,比如培训课程、为 Linux 设计的流行工具、新闻以及开源活动等。
阅读全文 »

本文翻译自 GIMP 官网,是 GIMP 教程的一部分。

软件安装

  1. Windows:
  2. Linux:
    • Archlinux 或 Endeavor:
      1
      sudo pacman -S gimp 
    • Debian 或 ubuntu:
      1
      sudo apt-get install gimp

目的

恭喜你!你在电脑上安装了 GIMP!GIMP 是一个非常强大的图像处理软件,但是不要被它吓到。即使你没有时间学习高级的电脑图形处理技能,GIMP 仍然可以是一个非常有用和方便的快速修改图像的工具。

我希望这些例子能帮助你解决那些需要对图像应用进行快速修改的小需求。希望这也能让你学习到 GIMP 更强大的图像编辑能力。

为了便于快速查看,我将在这篇快速教程中涵盖以下四个要点:

  • 更改图像的大小(尺寸),即缩放
  • 更改 JPEG 的大小(文件大小)
  • 剪裁图像
  • 旋转或翻转图像
阅读全文 »

U盘启动,如何在BIOS设置U盘为第一启动项呢?BIOS设置有两种方式,一种是利用快捷键设置U盘启动,而另一种则是针对没有快捷键可利用的电脑使用的,接下来小编就为大家详细介绍一下U盘启动BIOS设置的两种方式吧。

方式一

  1. 制作一个U盘启动盘

  2. 找到自己电脑型号所对应的BIOS快捷键,可参考下图显示的BIOS启动快捷键,如若没有可自行查询

BIOS启动快捷键
  1. 将U盘插入电脑,开机或重启,当开机画面出现时按下快捷键,进入启动项选择界面,这时候我们就将带有“USB”字样的选项设置为U盘启动

方式二

  1. 将制作好的U盘启动盘插入电脑,在开机时按下特定的热键进入BIOS。这里要注意:不同类型的电脑进入BIOS设置程序的按键不同,有的机型可以在开机时看到屏幕上给出热键的提示(一般在右下角或左下角),大多数台式机进入BIOS的热键是del键,笔记本是F2键,有的则没有提示。大家亦可参考小编为你准备的各种型号的电脑进入BOIS的热键,具体如下图所示:
BOIS的热键

笔记本方面,不同笔记本进入BIOS方式不一样,一般都是由主板决定的,某些特殊主板请看下图:

5.png
  1. 进入BIOS设置后,我们使用右方向键移动到“Boot”,接着使用上下方向键将光标移动到U盘的选项“Removable Devices”上,而有的电脑一般是以USB开头,这里用户要注意以下
进入BIOS设置
  1. 通过“+”键将U盘选项移动到第一位,然后按下F10保存退出即可
将U盘选项移动到第一位

ImageMagick 是一套开源图形处理工具,其中用的最多的命令就是 convert。之前,薄荷君介绍了《图像魔术:ImageMagick轻松转换PDF和图片》的用法,今天要介绍的是它拼接图片的用法。

LinuxMint 自带了 ImageMagick。如果是其他发行版,请先安装之:
sudo apt install imagemagick

首先学习一下图片的横向拼接,举例如下:(01.jpg 和 02.jpg 是原文件,11.jpg 是拼接后的文件)
convert 01.jpg 02.jpg +append 11.jpg

查看拼接后的图片,非常完美。

现在学习一下图片的纵向拼接,举例如下:(03.jpg 和 04.jpg 是原文件,33.jpg 是拼接后的文件)
convert 03.jpg 04.jpg -append 33.jpg

是的,你没有看错,横向与纵向的区别就是 + 和 – 。

看看纵向拼接的图片,Perfect。

小结:ImageMagick 是一套非常小巧但强大、实用的开源图形处理工具,更多用法,等你来探索!

Linux 下的下载工具算是很丰富的了,目前主流的有 FDM、Motrix、迅雷、uGet 等等。但是今天的主角 Motrix 算是比较全能的一位了。

Motrix 除了支持常规的 http 下载,还支持 BT、磁力甚至迅雷链接。当然,ed2k 电驴链接暂不支持。Motrix 的外观走小清新风格,简洁明快,点缀配色恰到好处,选项设置简单明了。
Motrix 官网:https://motrix.app

Motrix 提供了 deb 安装包和 Appimage 包,对新手用户非常友好,各个主流 Linux 发行版都可以使用。

安装后,启动 Motrix,真的是没有任何多余的按钮和功能,简洁实用,上手使用没有任何难度。看上去也非常舒服。

添加一个 BT 下载任务进行测试。当然也可以同时添加多个任务。

在种子资源足够的情况下,Motrix 下载基本上能达到满速,非常不错。

添加一个迅雷链接进行测试。可能会提示资源不一定存在,不管它,先下载试试看。

Motrix 下载一些热门迅雷资源还是没问题,速度也不错。但是毕竟不是原生迅雷,在部分资源解析方面,尤其是对于冷门资源,Motrix 还是容易下载失败。不过也没关系,现在迅雷链接已经不复当年盛况,主流的 BT 和磁力就够用了。

进入 Motrix 的设置页面,在基础设置里,就是一些外观界面、保存路径、限速、任务数量、消息通知等设置,一看就会。

在进阶设置页面,值得称赞的是,Motrix 默认添加了 Tracker 服务器,不必像 Qbittorrent 那样手动添加了。而且 Motrix 的 Tracker 服务器列表还是每天自动更新。对于BT和磁力下载而言,真是太有帮助了。

特别值得一提的是,Motrix 可以设置模拟用户代理,直接点击下方的客户端即可,其中 du 是指百度网盘,对于使用 x 猴脚本的用户而言,这个可是非常有用。

小结:相较于 FDM,Motrix 功能更为全面,界面也更好看,一些黑科技功能也更好用。当然,Motrix 能提供各大浏览器扩展就更完美了。

局域网文件传送,主要用于手机与电脑或者手机与手机之间,对于 Linux 用户而言,站长薄荷君之前推荐过 LANDrop、Dukto、Feem 等。随着时过境迁,很多优秀的开源项目都没有维护了,目前能够良好支持手机与电脑(Linux)的局域网文件传送工具中,Feem 算是不错的了。当然,美中不足是有广告。

现在,LocalSend 来了!

顾名思义,LocalSend 就是本地传送工具。这是一款开源软件,可以良好支持 Linux、MacOS 和 Windows 电脑平台,也良好支持 Android 和 iOS 移动平台。而且,LocalSend 的界面非常简洁清新,颇有原生 Android 系统的风格。关键是没有广告!

更贴心的是,LocalSend 为 Linux 用户提供了 Deb 安装包和 Appimage 包,主流 Linux 发行版都可以无忧使用,真是太棒了!
LocalSend 官网:https://localsend.org/

启动 LocalSend,接收、发送、设置,三大功能,没有任何多余的元素,而且中文化非常好。

在发送页面,就可以看到在同一局域网内运行 LocalSend 的其他设备。

薄荷君实测,通过 iPhone 向电脑(Linux)发送文件,如图所示,这是电脑端提示接收的界面。当然还可以设置成自动接收。

这是传送过程以及完成的界面。

要发送文件(图片、文件夹都可以),先点击添加,添加本地文件,然后点击下方的其他设备,向其发送。

等待目标设备接收。

局域网传送,速度很快。

在看看 LocalSend 的设置选项,都是中文见面,一看就会,毫无难度。

小结:LocalSend 无论是从界面布局、外观颜值还是功能便捷性方面都是当今最好的局域网文件传送工具,强烈推荐大家使用!

文学编程是 TeX 的作者高德纳提出的编程方式,主张程序员在编写代码的过程中详细地记录自己的思维方式和内在逻辑。这种编程方式注重编码的逻辑而将编码本身放在更次要的位置,因而不充分的设计在这种编程方式下无所遁形。文学编程的另一个优点是它产生的代码文档能帮助程序员在任意时候重新会想起当时编码的思路。

在 LaTeX 中,可以用 Doc 和 DocStrip 这两个工具来实现文学编程。

对于程序员来说,最重要的有三个部分:

  • 代码;
  • 代码文档;
  • 用户手册。

使用 Doc 和 DocStrip 可以将这三个部分集中到一个 .dtx 文件当中。这篇文章将分三个部分讲述如何构建这样一个 .dtx 文件。

.ins 文件

INS 三个字母是「Install」的缩写,顾名思义,这个文件是和安装相关的。.ins 文件通常用来控制 TeX 从 .dtx 文件里释放宏包文件,它的结构最为简单,大概是这样的。

  1. 作为注释的版权信息
  2. 载入 docstrip.tex
  3. 写入 DocStrip 的控制命令
  4. 编写将写入生成文件的版权信息
  5. 生成文件指令
  6. 写入提示信息用以完成安装
  7. 结束安装文件

这里粗体标记的是必不可少的部分,其他部分或多或少都可以省略。

我们逐步构建一个完整的 .ins 文件。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%% Copyright (C) 2003--2015
%% CTEX.ORG and any individual authors listed elsewhere in this file.
%% --------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3c of this license or (at your option) any later
%% version. This version of this license is in
%% http://www.latex-project.org/lppl/lppl-1-3c.txt
%% and the latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
%% --------------------------------------------------------------------------

这是 ctex 宏包的版权声明信息。

  • 这里的每一行都以百分号开头,因此在声明版权的同时不会影响正常的编译流程。
  • 版权声明部分,首先是声明版权的归属。
  • 接下来,声明许可协议为 LPPL。大多数 TeX 相关的宏包或软件,都在 LPPL 协议下发布。

1
\input docstrip.tex

载入 docstrip.tex


1
\keepsilent

这是 DocStrip 的控制命令之一,其作用是关闭 DocStrip 的日志输出功能。默认情况下,DocStrip 会详细输出它的每一步操作。对于大多数人来说,成百上千行的日志徒惹人嫌弃,因此我们关闭它。

更多的控制命令可以参考 DocStrip 的文档。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\preamble

Copyright (C) 2003-2015
CTEX.ORG and any individual authors listed in the documentation.
------------------------------------------------------------------------------

This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
version 1.3c of this license or (at your option) any later
version. This version of this license is in
http://www.latex-project.org/lppl/lppl-1-3c.txt
and the latest version of this license is in
http://www.latex-project.org/lppl.txt
and version 1.3 or later is part of all distributions of
LaTeX version 2005/12/01 or later.

This work has the LPPL maintenance status `maintained'.

The Current Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
------------------------------------------------------------------------------

\endpreamble

\preamble\endpreamble 之间的部分,将被写入由 DocStrip 生成的所有文档(默认情况下)。比如上面这段 ctex 宏包的版权信息将写入每一个生成的文件。


下面的内容是整个 .ins 文件里最重要的部分,它控制着如何生成最终的宏包文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\generate
{
\usedir{tex/latex/ctex}
\file{ctex.sty} {\from{\jobname.dtx}{package,style}}
\file{ctexcap.sty} {\from{\jobname.dtx}{package,ctexcap}}
\file{ctexsize.sty} {\from{\jobname.dtx}{package,ctexsize}}
\file{ctexart.cls} {\from{\jobname.dtx}{class,article}}
\file{ctexbook.cls} {\from{\jobname.dtx}{class,book}}
\file{ctexrep.cls} {\from{\jobname.dtx}{class,report}}
\file{ctexspa.def}
{
\from{\jobname.dtx} {ctexspa}
\from{ctexpunct.spa} {}
}
}

\generate 命令中的\file{⟨filename⟩}{\from{⟨sourcefilename⟩}{⟨optionlist⟩}} 用来指定宏包文件的生成方式。这里的含义是,从 ⟨sourcefilename⟩ 中抽取含有 ⟨optionlist⟩ 标记的部分,生成 ⟨filename⟩ 这个文件。

一个 \generate 里可以有多个 \file 命令。一个 \file 命令里可以有多个 \from 命令。一个 \from 命令里的 ⟨option⟩,组成 ⟨optionlist⟩。其中 ⟨option⟩ 需要用逗号隔开,\file 之间和 \from 之间则不需要。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\obeyspaces
\Msg{*************************************************************}
\Msg{* *}
\Msg{* To finish the installation you have to move the following *}
\Msg{* file into proper directories searched by TeX: *}
\Msg{* *}
\Msg{* The recommended directory is TDS:tex/latex/ctex *}
\Msg{* *}
\Msg{* ctex.sty *}
\Msg{* ctexcap.sty *}
\Msg{* ctexsize.sty *}
\Msg{* ctexart.cls *}
\Msg{* ctexbook.cls *}
\Msg{* ctexrep.cls *}
\Msg{* ctexspa.def *}
\Msg{* *}
\Msg{* To produce the documentation run the file ctex.dtx *}
\Msg{* through XeLaTeX. *}
\Msg{* *}
\Msg{* Happy TeXing! *}
\Msg{* *}
\Msg{*************************************************************}

这里的内容会在处理完 .ins 文件之后显示在控制台,用来提示使用者将文件置入指定的目录。TeX 会忽略连续的空格,第一行的 \obeyspaces 则会让 TeX 输出这些空格。


1
\endbatchfile

显式地结束安装文件,此后的所有内容都会被忽略。

将上面的代码依次粘贴到一起,就是一个最简单的 .ins 文件了。

.dtx 文件

.dtx 文件比 .ins 文件复杂得多。.ins 文件在整个过程中会被读取一次,而 .dtx 文件却会被读取三次。下面是对此三个步骤的简略描述。如果暂时看不懂也没有关系,下一节我们将会化身人肉编译器,逐行分析示例。

处理 .ins 文件的时候,会载入 .dtx 文件。这时候 .dtx 文件中以 % 开头的行将被全部忽略,而以 % 开头的行则会用于记录 ⟨option⟩。程序会根据 .ins 文件中 \generate 命令里 \from 的指示的 ⟨option⟩ 抽取 .dtx 文件中 ⟨option⟩ 相关内容。这个过程中,没有以 % 开头的行会根据 ⟨option⟩ 写入文件,而 % 开头的行则被抑制并保护起来。最终生成宏包文件。

第二遍处理 .dtx 文件的时候,在读入 \documentclass{ltxdoc} 之前,所有的内容与通常意义上的 LaTeX 代码完全一致。因此需要依靠 \iffalse% \iffalse 来保护相关代码,这些代码通常是 README 文件和 LICENSE 文件。在读入 \DocInput{filename.dtx} 之后,.dtx 文件会被第三次载入处理。处理完成之后遇到 \end{document},后续的内容被全部忽略。最终生成说明文档。

第三遍处理 .dtx 是被 \DocInput 载入的。此时,文档内(几乎)所有的 % 都被忽略。因为 LaTeX 只能有一个 \documentclass 以及一对 \begin{document}\end{document},所以 \end{document} 之前的所有内容都应当在这一次处理的时候被忽略。因此这部分内容应该被 \iffalse\fi 保护起来。

.dtx 文件由以下部分组成。

  1. 包含在 % \iffalse% \fi 中间的版权信息
  2. 包含在 % \iffalse% \fi 中间的宏包基本信息
  3. 包含在 %<*driver>%</driver> 中间的 ltxdoc 文档类及相关代码,这部分代码也应包含在 % \iffalse% \fi 中间
  4. \end{document} 之后的说明文档,这部分文档应该隐藏在行首的 % 之后
  5. 在说明文档最后的代码说明,以及间杂在代码说明中间的代码,其中代码说明也应该隐藏在行首的 % 之后,而代码本身则不应该被 % 保护

示例 .dtx 文件的具体内容,可以参看下一节。

人肉编译器

我们来看两个文件,分别是 dtxtut.insdtxtut.dtx。你可以下载这两个文件,然后跟着我的思路一起分析。

首先我们要生成宏包文件,在命令行中运行

1
xelatex dtxtut.ins

注意,这里的后缀名不可省略。

文件读入之后,直到 12 行都是注释,直接忽略。接着到了第 13 行,读入了 docstrip.tex 这个文件。随后进行了一些设置之后来到了第 26 行.

1
\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}

这里 \jobname 是当前文件的名字(不含后缀),即 dtxtut。所以这里会从 dtxtut.dtx 文件中,抽取 package 的部分,组成名为 dtxtut.sty 这个文件。

现在我们读取 dtxtut.dtx。前 18 行都是注释,忽略。19 -- 21 行是 package 部分,输出。23 行开始了名为 driver 的部分,直到 32 行结束。接下来一直到 81 行都是注释,忽略。82行开始了名为 package 的部分,于是程序将 82 行开始到 100 行中没有注释掉的部分抽出来,输出。这样,输出的内容接在 \preamble 之后,保存为 dtxtut.sty 文件。

接下来我们生成宏包文档,在命令行中运行

1
xelatex dtxtut.dtx

同样,这里的后缀名不可省略。

前 23 行都是注释,忽略。24 行载入了 ltxdoc 文档类,随后载入了刚刚生成的 dtxtut.sty 宏包。26 行的 \EnableCrossrefs 打开了代码索引的生成(如果你将来不需要,可以用 \DisableCrossrefs 打开)。27 行的 \CodelineIndex 则使得索引指向代码行号,而不是页码。28 行的 \RecordChanges 则会让文档类记录宏包的变化记录。

接下来,30 行的 \DocInput{\jobname.dtx} 重新载入了这个文件本身,但(几乎)所有的 % 符号都被忽略。第 1 行遇到 \iffalse,直到 16 行的 \fi,中间的内容都被忽略。17 行是空行。18 行又遇到 \iffalse,直到 33 行的 \fi,中间的内容都被忽略。注意,这里正好跳过了 driver 部分。

接下来的 \CheckSum\CharacterTable 是为了检测 .dtx 文件完整性的两个工具。众所周知,.dtx 文件包含了一个宏包的几乎所有信息,如果文件在网络传输的过程中出错,则宏包安装必然失败。因此,检测文件的完整性就变得很有必要。

\CheckSum 采用了一个很简单的方案来检验完整性。它将从 \StopEventually 开始到 \Finale 结尾的,在 macrocode 环境里的反斜杠 \ 计数,将计数的值作为校验和。在生成文档的过程中,程序将会计算这个值,并于 \CheckSum{} 中的值进行比对。若二者不一致,则说明传输过程中可能出现错误。

\CharacterTable 更为直接一点。程序将检查代码中出现的符号均包含在 \CharacterTable 之中。若不然,则认为传输过程中可能出错。

接下来的内容,直到第 76 行都很好理解。77 行出现了 \StopEventually 命令,并在参数中启动了 \PrintIndex 命令。我们刚才说了 \StopEventually 会开启校验和的检查,而 \PrintIndex 则会在此处打印代码索引。

macrocode 环境是一个特殊的环境,它有点类似于 LaTeX 原生的 verbatim 环境。它在大多数情况下的行为和 verbatim 环境相同,大体上是将代码输出到最终的文档当中。

这样持续运行到 103 行,遇到 \Finale 命令,校验和计算的终点。此时,程序将会计算出校验和,并与文档中给出的校验和进行比较。如果 \CheckSum 不存在,或者给出的值为 0,那么程序会给出正确的值,让你填入文档。如果 \CheckSum 存在,但值与程序计算的不符,那么程序会报错,并给出正确的值。改正后重新编译才能得到文档。如果 \CheckSum 存在,且校验和通过,那么程序会继续运行。

104 行是 \endinput,结束整个文件,本次对 dtxtut.dtx 的处理结束,回到上一次的断点。

30 行之后,31 行就是 \end{document},文档处理结束,之后的内容全都被忽略。输出文档,退出。

.dtx.ins 合二为一

细心的读者会发现,整个过程中,.dtx 文件承担了几乎所有的功能,而 .ins 文件只是一个「指路人」。这些读者可能会思考,是不是有办法将 .ins 文件并入 .dtx 文件呢?答案是肯定的。

对于这类合二为一的 .dtx 文件,使用 Plain TeX 格式编译,会启动 DocStrip 工具,得到宏包文件;使用 LaTeX 格式编译,则会生成文档。

这里给出一个来自知乎提问示例(略有修改),你可以在我的答案里看到对此的具体分析。

引用