L7x 字体编码省略号问题

L7x 字体编码省略号问题

有人能解释一下为什么编译器会抛出错误吗

\f@encoding=宏:->T1. l.5 \makeatletter\show\f@encoding \makeatother

!TeX 容量超出,抱歉 [输入堆栈大小=5000]。 \textellipsis ->\L7x-cmd \textellipsis \L7x\textellipsis l.6 \dots

如果您确实需要更多容量,您可以请一位巫师来扩大我。

为了这?

\documentclass{article}
\usepackage[L7x,T1]{fontenc}
\usepackage[utf8]{inputenc}
\begin{document}
\makeatletter\show\f@encoding\makeatother
\dots
\fontencoding{L7x}\selectfont
\makeatletter\show\f@encoding\makeatother
\dots
\end{document}

看起来,第一次\dots进入L7x表格时当前的字体编码是T1

这是预期的行为还是错误?

谨致问候,伊万

修复建议

根据@David Carlisle在下面提供的分析,在深入研究了其他编码定义之后,fntguide我想提出我的建议来解决这个问题l7xenc.def。所见即所得可以轻松实现,取代所有这些

\bgroup
  \def\default@family{lmr}%
  \DeclareFontEncoding{L7x}{}{}
\egroup
\@ifundefined{L7x@default@family}{\@namedef{L7x@default@family}{lmr}}{}
\def\hooked@encoding{L7x}
\DeclareRobustCommand\selectfont
  {%
  \ifx\f@linespread\baselinestretch 
  \else
    \set@fontsize\baselinestretch\f@size\f@baselineskip 
  \fi
  \ifx\f@encoding\hooked@encoding
    \expandafter\ifx\csname \f@encoding+\f@family\endcsname\relax
      \edef\reserved@a{\lowercase{\noexpand\IfFileExists{\f@encoding\[email protected]}}}%
      \reserved@a\relax{%
        \expandafter\ifx\csname\f@encoding @default@family\endcsname\relax
    \else
          \@font@info{Failed loading font information for \f@encoding+\f@family.}%
      \expandafter\edef\expandafter\f@family\expandafter{\csname\f@encoding @default@family\endcsname}%
    \fi
    }%
    \fi
  \fi
  \xdef\font@name{\csname\curr@fontshape/\f@size\endcsname}%
  \pickup@font
  \font@name
  \size@update
  \enc@update
  }

仅通过以下三行:

\DeclareFontEncoding{L7x}{}{}
\DeclareErrorFont{L7x}{lmr}{m}{n}{10}
\DeclareFontSubstitution{L7x}{lmr}{m}{n}

为了不收到警告(说cmr被替换lmr),应该\usepackage{lmodern}在调用之前明确使用语句fontenc,满足所写的内容fntguide

在达到之前,<encoding><family><series><shape>必须已经定义了的字体规范。\DeclareFontShape\begin{document}

关闭

我很高兴地通知大家,上述修复建议已包含在lithuanian由 Sigitas Tolušis 维护的最新版本的软件包(版本 2017-12-06)中,同时使babel不受lithuanian字体和字体编码的影响。此外,还定义了 Proof 和 Glossary 中缺失的翻译。

答案1

在文件顶部l7xenc.def 你会发现以下几行

\bgroup
  \def\default@family{lmr}%
  \DeclareFontEncoding{L7x}{}{}
\egroup

在组中定义\default@family并没有多大作用,而在组内定义 L7x 编码根本不起作用,实际上编码没有定义(但定义了足够多的位,可以避免高级错误检查)。

如果你将其更改为

%\bgroup
%  \def\default@family{lmr}%
  \DeclareFontEncoding{L7x}{}{}
%\egroup

那么您的示例可以工作,但是这应该向文件的维护者提出,我不知道原始代码的意图。

具体发生的情况是,任何特定编码的命令都针对通常情况进行了优化,即任何给定的用途通常与以前的用途使用相同的编码,但是它们受到内部命令的保护,\<enc>-cmd该命令检测是否生效不同的编码并切换命令定义。

\textellipsis定义也是如此

\L7x-cmd \textellipsis \L7x\textellipsis

意思是(或者至少应该说)如果编码是 L7x,则使用该编码的优化版本,否则查找当前编码的版本。

不幸的是,在定义之后的行\L7x-cmd中丢失了定义,这使得它被定义为不执行任何操作\egroup\relax

然后再次\textellipsis调用\relax\textellipsis并递归直到堆栈填满。

相关内容