替代方法:使用fmtutil替换原始格式

替代方法:使用fmtutil替换原始格式

我创建了一个具有我自己的非标准连字符模式的文件,但我不知道如何强制 LaTeX 使用我的模式而不是默认模式。

我正在使用 Linux Mint 和 pdflatex 编译我的“.tex”文件。我发现了一个dumylang选项和一个dumyhyph.tex文件,用于“测试新的连字模式”,这正是我想要做的。然而,到目前为止,我还无法激活它们。

我的图案文件包含以下内容:

\patterns{ 
 1p 1t 1c 1k 1j 1w t2r 
 1fe 1fa 1fo 1fi 1fy 1fu 
 1re 1ra 1ro 1ri 1ry 1ru  
 1se 1sa 1so 1si 1sy 1su 
%
%...deleted lines...
%
 kyle me2ke ky2nu ni2e fa2l r2ke 
 u2je u2ma i2jau ru2me 
 e2m a2m o2m i2m y2m u2m nh2ma nh2mu 
 3e2le 3e2la 3e2lo 3e2li 3e2ly 3e2lu 
 }
%\dump

我该怎么做?(请详细说明,因为我对 TeX 和 Linux 的经验非常有限)

答案1

我在对该问题的评论中尝试给出的部分答案不起作用,至少有两个原因:

  • 个人 texmf 树中的格式文件 ( $TEMFHOME) 是不是 允许用同名覆盖系统格式文件(非常明智);

  • 无论如何,pdfTeX 引擎的格式名称应该是 pdflatex.fmt,而不是latex.fmt

因此,最好的办法是为自定义格式指定一个自定义名称(这似乎也很明智)。我将逐步解释一种可行的方法,这次,我自己进行了测试。 请注意,以下说明假设使用 TeX Live 发行版!

首先,在文件系统的任意位置创建一个临时目录;此后,此目录将被称为FOO/。接下来,假设您的自定义连字文件如下所示:

% It's a dummy file dumyhyph.tex created for testing purposes.
% This file is normally defined in language.dat et may be used by language
% styles such as french.sty to define a temporary language. B. Gaulle 23/10/91

\begingroup
\patterns{ % dummy patterns
.ach4
z4zy
% I add a pattern that does permit hyphenation:
aa5a
% (hyphenation will be possible only at places where at least three consecutive 
% "a" characters occur).
}
\endgroup

当然,这只是一个例子,但它是我下面要使用的例子。请注意,它只定义了允许的连字符,即aa-a

我们将在此文件末尾添加以下行

\gdef\ParapaPonziPonziPo{*** This is my home-made LaTeX format! ***}

我们这样做只是为了有一种方法可以更轻松地检查在 TeX 运行期间加载的是我们的自定义格式,而不是系统格式。因此,我们的文件现在如下所示:

% It's a dummy file dumyhyph.tex created for testing purposes.
% This file is normally defined in language.dat et may be used by language
% styles such as french.sty to define a temporary language. B. Gaulle 23/10/91

\begingroup
\patterns{ % dummy patterns
.ach4
z4zy
% I add a pattern that does permit hyphenation:
aa5a
% (hyphenation will be possible only at places where at least three consecutive 
% "a" characters occur).
}
\endgroup
\gdef\ParapaPonziPonziPo{*** This is my home-made LaTeX format! ***}

保存在FOO/dumyhyph.tex;注意基本名称dumyhyph.tex 必须可以使用。此后,创建FOO当前目录。

我们将调用我们的自定义格式pdflatexmyhyphen;因此,在目录内FOO,在 shell 提示符下发出以下命令:

pdflatex -ini -etex -jobname pdflatexmyhyphen pdflatex.ini

片刻之后,您将再次获得 shell 提示符;您现在应该发现FOO包含以下文件:

dumyhyph.tex
pdflatexmyhyphen.fmt
pdflatexmyhyphen.log
texsys.aux

花一分钟时间查看抄本文件pdflatexmyhyphen.log;向下滚动直到找到以下内容

===========================================
Local configuration file hyphen.cfg used
===========================================

…省略了一些行…

\l@usenglish=\language0
\l@USenglish=\language0
\l@american=\language0
\l@dumylang=\language1

(./dumyhyph.tex)

这一行(./dumyhyph.tex)证明该文件dumyhyph.tex是从当前目录输入的,与其他连字模式文件相反。

好的,现在运行命令

kpsewhich -var-value TEXMFHOME

了解你的系统假设你的个人 texmf 树位于何处;假设答案是

/home/donalddu/texmf

然后,在路径中创建任何缺失的目录

/home/donalddu/texmf/web2c/

(请注意,这/home/donalddu/应该是你的主目录,因此你可以这样做没有(不需要超级用户权限);最后,将文件pdflatexmyhyphen.fmt从移动(或复制)FOO//home/donalddu/texmf/web2c/

就这些;正如@cfr 所说,无需运行mktexlsr:包含自定义连字模式的自定义格式已可供使用。

那么,让我们尝试一下,通过编译以下文件 - 我们称之为TryMyHyphenation.tex

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\ifdefined\ParapaPonziPonziPo
    \typeout{\ParapaPonziPonziPo}
\fi

\usepackage[english]{babel}



\begin{document}

This is a paragraph written in English, to which English hyphenation rules 
apply.  It is followed by some other paragraphs written in our ``dummy 
language''; in order to make our custom hyphenation rules apply to them, we 
enclose them within a \texttt{hyphenrules} environment.

\begin{hyphenrules}{dumylang}

The ``dummy language'' is curiously similar to English, except that it doesn't
permit words to be hyphenated at all---or almost so.  Indeed, a peculiarity of
this language is that it includes non-English words like
``mumbawohckijutresxxiukklanghornitudinal'' and ``axaxaxaaaxaxaxa'', and
that---aha!---hyphenation is permitted when three~``a'' occur in a row.  So,
while, for example, ``mumbawohckijutresxxiukklanghornitudinal'' cannot be
broken, and hence produces ``overfull \verb|\hbox|es'', the word
``axaxaxaaaxaxaxa'' \emph{can} be hyphenated, provided, of course, that you are
using a \LaTeX\ format that incorporates our custom hyphenation patterns.

Another paragraph that again demonstrate this: pneumococcus, axaxaxaaaxaxaxa,
hyperbola, neutrino.

\end{hyphenrules}

\end{document}

首先,尝试使用普通的 LaTeX 格式进行编译,使用常用命令

pdflatex TryMyHyphenation

看看结果:你会发现单词“axaxaxaaaxaxaxa”是不是用连字符。

接下来,尝试使用新的自定义格式编译它:这可以通过-fmt命令行选项来完成。也就是说,输入

pdflatex -fmt pdflatexmyhyphen TryMyHyphenation

现在应该发生两件事:

  1. 在编译过程中,你应该看到以下消息

    *** This is my home-made LaTeX format! ***
    

    并在成绩单文件中找到它;

  2. TeX 现在应该能够将单词“axaxaxaaaxaxaxa”用连字符连接起来。

这是我在第二次运行中得到的输出:

使用自定义格式获得的输出


替代方法:使用fmtutil替换原始格式

昨天我还没有测试过这种方法,所以我不敢推荐它。与之前的答案相反,这次我们不会用不同的名字制作自定义格式,但我们会pdflatex.fmt用自定义版本覆盖文件本身。虽然无法在个人 texmf 树中执行此操作,但可以在 TeX Live 的监督下从主目录的不同位置执行此操作。事实证明,此解决方案实际上比前一个解决方案更容易执行;但替换 (pdf)LaTeX 格式本身并不是所有用户都感到满意的事情……  (:-)(当然,也有很多很好的理由,即使是知识渊博的用户也可能宁愿避免这样做。)

因此,让我们从dumyhyph.tex保存在我们选择的目录中的自定义文件重新开始FOO/(请记住,虽然目录的名称和位置是任意的,但基本名称dumyhyph.tex 必须使用):

% It's a dummy file dumyhyph.tex created for testing purposes.
% This file is normally defined in language.dat et may be used by language
% styles such as french.sty to define a temporary language. B. Gaulle 23/10/91

\begingroup
\patterns{ % dummy patterns
.ach4
z4zy
% I add a pattern that does permit hyphenation:
aa5a
% (hyphenation will be possible only at places where at least three consecutive 
% "a" characters occur).
}
\gdef\ParapaPonziPonziPo{*** This is a home-made TeX format! ***}
\def\typeout{\immediate\write17}
\obeyspaces
\typeout{****************************************************************}
\typeout{*   Custom hyphenation pattern file `dumyhyph.tex' has been    *}
\typeout{*        loaded instead of the original `dumyhyph.tex'!        *}
\typeout{****************************************************************}
\endgroup

如您所见,我添加了一些横幅,它们将在格式化过程中显示。创建FOO/当前目录并发出以下命令之一:

  • 如果你只想重建pdflatex.fmt格式文件,请发出

    mktexfmt pdflatex.fmt
    

    (这是我的建议,至少对于测试目的而言);

  • 如果你想重建全部pdfTeX 引擎的格式,问题

    fmtutil --byengine pdftex
    

    (你确定这是你想要的吗?)。

终端上会闪现很多消息:其中一条消息很重要,它会在您再次获得 shell 提示符之前显示。它会告诉您自定义格式的安装位置,如下所示:

fmtutil: /home/mezzetti/.texmf-var/web2c/pdflatex.fmt installed.

记下这个位置! 它依赖于系统,当您想要摆脱自定义格式时可能需要它。

假设上述位置,你还应该找到一个名为

/home/mezzetti/.texmf-var/web2c/pdflatex.log

打开它:它应该包含以下几行,大约在第 400 行左右:

===========================================
Local configuration file hyphen.cfg used
===========================================
(/usr/local/texlive/2015/texmf-dist/tex/generic/babel/hyphen.cfg
File: hyphen.cfg 2016/02/24 3.9q Babel hyphens

(/usr/local/texlive/2015/texmf-dist/tex/generic/babel/switch.def
File: switch.def 2016/02/24 3.9q Babel switching mechanism
)
\l@english=\language0

(/usr/local/texlive/2015/texmf-dist/tex/generic/hyphen/hyphen.tex)
\l@usenglish=\language0
\l@USenglish=\language0
\l@american=\language0
\l@dumylang=\language1

(/Users/gustavo/Desktop/FOO/dumyhyph.tex
****************************************************************
*   Custom hyphenation pattern file `dumyhyph.tex' has been    *
*        loaded instead of the original `dumyhyph.tex'!        *
****************************************************************
)

这证实了我们使用了自定义连字文件(是的,它还表明生成此示例的系统不是最新的……)

您已完成。从现在起,将使用包含您自定义模式的格式来代替原始格式:无需使用任何-fmt选项,只需照常编译即可。

当您想要删除自定义格式时,请返回笔记并删除 下的所有内容.../web2c/,包括目录.../web2c本身。例如,假设上面显示的位置,您可以转到

rm -rf /home/mezzetti/.texmf-var/web2c/

再举一个例子,如果你运行后收到的消息mktexfmt

mktexfmt [INFO]: /Users/gustavo/Library/texlive/2015/texmf-var/web2c/pdftex/pdflatex.fmt installed.

你可以发出以下命令

rm -rf /Users/gustavo/Library/texlive/2015/texmf-var/web2c/

恢复分发格式。

相关内容