![L7x 字体编码省略号问题](https://linux22.com/image/362933/L7x%20%E5%AD%97%E4%BD%93%E7%BC%96%E7%A0%81%E7%9C%81%E7%95%A5%E5%8F%B7%E9%97%AE%E9%A2%98.png)
有人能解释一下为什么编译器会抛出错误吗
\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
并递归直到堆栈填满。