我怎样才能做到与 \DeclareFontShapeChangeRule 等效的操作,即测试 4 个目标而不是 3 个?

我怎样才能做到与 \DeclareFontShapeChangeRule 等效的操作,即测试 4 个目标而不是 3 个?

如果您不关心我为什么询问,请跳过第一部分...


问题:

  1. LaTeX 2e 中没有定义小型斜体形状。
  2. \textsc{\textit{small-caps italic}}即使定义了小型斜体形状,也不会产生小型斜体。

先前的解决方案:不同的软件包对小型斜体和/或小型倾斜使用不同的形状代码。变体包括(至少)siscitscsl。一些支持软件包还支持分层形状更改,以便能够\textsc{\textit{small-caps italic} small-caps} \textit{italic \textsc{small-caps}}按照预期运行。

为了使这更容易,一些 font-support-package-support 包为 font-support 包的作者提供了通用框架,这些框架定义了形状并破解了 LaTeX 的命令,使得分层形状变化起作用。font-axesnfssextnfssext-cfr就是例子。

较新的解决方案:LaTeX 定义scit并支持斜体、小型大写字母和倾斜形状的分层。

问题:如果您维护(在某种退化的“维护”意义上)一个使用和的字体支持包siscsl那么,要么您支持的字体的形状更改将会中断,要么默认配置支持的字体的形状更改将会中断。

解决方案:重新做.fd文件以使用scit并删除特定于包的支持,依赖于标准框架。

问题:如果您维护(在“维护”的某种更退化的意义上)一个字体支持包支持包,该包为支持和的字体支持包提供了一个通用框架,si并且scsl您删除了支持这些形状的代码,那么您可能会破坏您无法控制的字体支持包,并且您可能不知道它的存在。如果您不删除代码,您将破坏对依赖新标准框架的字体的支持,这些字体可能会与需要旧框架的字体共存于文档中。

理想的解决方案:使用你的时间机器,回到过去,使用scit斜体小写字母。然后你可以指出你的文档,声称你总是告诉人们使用scit,这不是你的错si和/或scsl不起作用。

问题:时间机器的资金尚未到位。

不太理想的解决方案:调整您的 font-support-package-support 包以支持siscit scsl


在修改时nfssext-cfr,我想在处理分层小写字母/斜体/倾斜形状变化时测试四种目标形状。我怀疑这样做的唯一方法是看起来与nfssext原来的类似,但我不确定如何确保它与当前的 LaTeX 框架很好地兼容。

例如,实现对小型斜体 ( si) 和倾斜 ( scsl) 的支持的最直接的方法是

\DeclareFontShapeChangeRule {it}{sc}{si}{scsl}
\DeclareFontShapeChangeRule{sl}{sc}{scsl}{si}
\DeclareFontShapeChangeRule {sc}{it} {si} {scsl}
\DeclareFontShapeChangeRule {sc}{sl} {scsl} {si}

但如果我这样做,我会破坏使用scit而不是si和/或 的字体的形状变化scsl

因此,如果没有时光机,我理想的做法是

\DeclareFontShapeChangeRule {it}{sc}{si}{scsl}{scit}
\DeclareFontShapeChangeRule{sl}{sc}{scsl}{si}{scit}
\DeclareFontShapeChangeRule {sc}{it} {si} {scsl}{scit}
\DeclareFontShapeChangeRule {sc}{sl} {scsl} {si}{scit}

但不幸的是,这样的命令并不存在。\DeclareFontShapeChangeRule可以测试三种形状的目标,但四种超出了它的能力。

我曾经尝试过一种古老的方法,即在几年内忽略这个问题,让部分修改的代码发酵,并希望我能有一个好主意,但是到目前为止,我的大脑还没有捕捉到哪怕一个微弱的灵感。

这是一个 MNWE(带有翻译的评论!):

\documentclass{article}
\usepackage[T1]{fontenc}
\makeatletter
\renewcommand \rmdefault {clm}
\renewcommand \sfdefault {cmr}
\newcommand*{\sidefault}{si}% anniffiniedig
% better to test si & then scit but I don't know how to do that with the new stuff ...
\DeclareRobustCommand{\sishape}{%
  \not@math@alphabet\sishape\relax
  \fontshape\sidefault\selectfont}
% it would be better to try si, scit and scsl, but that doesn't seem possible
% the need for overwriting could be avoided by changing the .fd files, but that would break code I don't know about ...
\DeclareFontShapeChangeRule {it}{sc}{si}{scsl}% current; request (& third); first choice; second choice
\DeclareFontShapeChangeRule{sl}{sc}{scsl}{si}
\DeclareFontShapeChangeRule {sc}{it} {si} {scsl}
\DeclareFontShapeChangeRule {sc}{sl} {scsl} {si}
% the following are unproblematic because they don't interfere with anything
\DeclareFontShapeChangeRule {si}{it} {si} {}
\DeclareFontShapeChangeRule {si}{sl} {scsl} {si}
\DeclareFontShapeChangeRule {scsl}{sl} {scsl} {}
\DeclareFontShapeChangeRule {scsl}{it} {si} {scsl}
\DeclareFontShapeChangeRule {si}{sc} {si} {}
\DeclareFontShapeChangeRule {si}{ulc} {it} {}
\DeclareFontShapeChangeRule {si}{up} {sc} {}
% avoid spurious warnings for the example
\DeclareFontShapeChangeRule {n}{up}{n}{}
\DeclareFontShapeChangeRule {sc}{up}{n}{}
\DeclareFontShapeChangeRule {it}{up}{n}{}
% \def\DeclareFontShapeChangeRule #1#2#3#4{% latex.ltx
%   \@namedef{shape@#1@#2}{{#3}{#4}}}
% \DeclareFontShapeChangeRule abcd % \shape@a@b -> {c}{d}
\makeatother
\begin{document}
\texttt{clm}:

\rmfamily\sishape Italic Small-Caps 

\upshape Small-Caps 

\itshape Italic Small-Caps 

\normalfont Upright standard 

\itshape\scshape Italic Small-Caps 

\normalfont \slshape\scshape Slanted Small-Caps -> Italic 

\texttt{cmr}:

\sffamily\sishape Italic Small-Caps 

\upshape Small-Caps 

\itshape Italic Small-Caps 

\normalfont Upright standard 

\itshape\scshape Italic Small-Caps 

\normalfont \slshape\scshape Slanted Small-Caps -> Italic 
\end{document}

答案1

更改相关字体的 .fd 文件(如果您维护它)并添加形状scit,然后将si形状别名为该形状(就像许多字体别名bx为 一样b),这有什么问题吗? 之后,明确使用的旧文档si应该继续像以前一样工作,但新文档可以写入\textsc{\itshape ...},它也可以工作。

混合两种惯例不一定能起作用并产生替代,但我认为这是可以接受的。

我不会制定变更规则,因为正如 Ulrike 指出的那样,这意味着您的文档会以奇怪的方式破坏其他字体包。变更规则仅适用于需要调整特定文档或通常仅作为内核一部分发生的常规设置的情况。

答案2

你不能更新 fd 文件以使用新的标准化形状名称吗?

\documentclass{article}


\usepackage[T1]{fontenc}
\DeclareFontShapeChangeRule {n}{si} {scit}      {scsl}
\begin{document}

{\scshape Abc \textit{Abc}} {\fontshape{si}\selectfont Abc}

\end{document}

在此处输入图片描述

因此,任何访问复合字体(例如)的文档\scshape\textit{Abc}都将通过新机制访问斜体小型大写字母。添加的 ShapeChange 规则将仅影响明确请求形状的代码,si因此不会影响任何之前未使用该形状的文档。

您将需要更多规则来处理现有形状不存在的情况n......

相关内容