拥有 cls 到 fmt 的转换

拥有 cls 到 fmt 的转换

我可以使用 PdfTeX 转换.cls我自己的格式吗?.fmt

笔记:我们的人员经常更改/更新类文件(源.cls文件)。因此,我想转换不可编辑的类格式。

答案1

针对预加载类的格式的过程。该类的名称theclass如下。

类文件

由于类已以格式加载,因此无法再指定全局/类选项。配置可以通过命令来实现,\theclasssetup就像许多包和一些类所做的那样,例如\sisetup包的siunitx\hypersetup包的一些选项hyperref

用于测试的虚拟类文件theclass.cls

% File: theclass.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{theclass}[2015/07/02 v1.0 Class for something]

% Implementation of the class
\LoadClass{article}

\endinput

theclass.ini格式生成文件

新的格式文件由 LaTeX 和类组成。该文件theclass.ini包含格式的命令。未加载 LaTeX,因为可以重复使用可用的 LaTeX 格式。但需要加载和\documentclass重新定义类,以允许使用预加载或未预加载类的格式处理普通 LaTeX 文档。

% File: theclass.ini
%
% Check for e-TeX
\expandafter\ifx\csname eTeXversion\endcsname\relax
  \begingroup
    \catcode`\{=1
    \catcode`\}=2
    \catcode`\^=7
    \newlinechar=10 %
    \def\space{ }
    \def\MessageBreak{^^J\space\space}
    \errmessage{%
      The eTeX extension is missing.\MessageBreak
      It can be enabled by option `-etex`\MessageBreak
      or starting the first filename with a star `*'.\MessageBreak
      The format generation is aborted%
    }
  \endgroup
  \csname fi\endcsname % end \ifx
  \csname @@end\endcsname % for the case a LaTeX format is already loaded
  \end % end job
\fi

% Load class
\NeedsTeXFormat{LaTeX2e}
\documentclass{theclass}\relax

% Now we have to redefine \documentclass to get valid user documents.
\makeatletter
\renewcommand*{\documentclass}[2][]{%
  \def\reserved@a{#2}%
  \ifx\reserved@a\theclass@name
    \def\reserved@a{#1}%
    \ifx\reserved@a\@empty
    \else
      \ClassWarningNoLine{theclass}{%
        This format has already loaded the class\MessageBreak
        and does not support global options.\MessageBreak
        The following options are ignored:\MessageBreak
        \@spaces[#1]%
      }%
    \fi 
      \expandafter\theclass@datecheck
  \else
    \ClassError{theclass}{%
      This format has already loaded the class `theclass'\MessageBreak
      and cannot be used with other classes.\MessageBreak
      LaTeX run is aborted%
    }\@ehd
    \expandafter\@@end % abort job.
  \fi
}
\newcommand*{\theclass@name}{theclass}
\newcommand*{\theclass@datecheck}[1][]{%
  \@ifclasslater{theclass}{#1}{%
  }{%
    \@latex@warning@no@line{%
      You have requested,\on@line,
      version\MessageBreak
      `#1' of class\space\theclass@name,\MessageBreak
      but only version\MessageBreak
      `\csname ver@\[email protected]\endcsname'\MessageBreak
      is available in this format%
    }%
  }%  
}     

% Format identification
\begingroup
  \edef\x{%
    \noexpand\typeout{%
      Class \theclass@name\space \@nameuse{ver@\[email protected]}.%
    }%
    \noexpand\typeout{%
      Format created at \the\year/\two@digits\month/\two@digits\day
      \space by class author.%
    }%
  }%  
\expandafter\endgroup
\expandafter\everyjob\expandafter{\the\expandafter\everyjob\x}
\makeatother

% Generate format
\dump
\endinput

格式生成

这是 TeX Live (2015) 的 示例pdflatex。由于 的格式pdflatex已经可用,因此 重用了&pdflatex。特殊字符&通常需要在命令行上转义,例如\&pdflatex(bash) 或"&pdflatex"。选项--ini启用 iniTeX 模式。在这种情况下,--etex未给出选项,因为它是从 的导入格式文件继承的pdflatex

pdflatex --ini "&pdflatex" theclass.ini

这将生成格式文件theclass.fmt。(过去的扩展名是.efmteTeX 扩展。)

用法

测试文件:

\documentclass{theclass}
% or \documentclass{theclass}[2015/07/02]
\begin{document}
Hello Word!
\end{document}

theclass.fmt可以使用以下方式加载新格式&(所有 TeX 编译器都应支持):

pdflatex "&theclass" test

或者选项--fmt(TeX Live 支持):

pdflatex --fmt=theclass test

pdftex可以使用,但它对纯文本格式(而不是 LaTeX)使用了错误的搜索路径。可以通过覆盖程序名称来修复此问题:

pdftex --progname=pdflatex --fmt=theclass test

安装

格式文件可以在当前目录中找到,也可以安装在texmf(TDS) 树中。引擎 pdfTeX 的格式文件theclass.fmt安装在:

TDS:web2c/pdftex/theclass.fmt

根可以是主树 ( TEXMFHOME) 或本地树 ( TEXMFLOCAL)。后者(或 MiKTeX)需要更新文件名数据库。程序texhashmktexlsr可用于 TeX Live 中的此目的。

相关内容