我怎樣才能做相當於 \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並支援斜體、小型大寫字母和傾斜形狀的分層。

問題:如果您維護(在某種退化意義上的「維護」)使用的字體支援包,si例如scsl,您支援的字體的形狀變更將中斷,或者預設配置支援的字體的形狀變更將中斷。

解決方案:依賴標準框架重做.fd檔案以使用並刪除特定於套件的支援。scit

問題:si如果您維護(在某種更退化的「維護」意義上)一個 font-support-package-support 包,為支援和的字體支援包提供通用框架,scsl比如說,並且您刪除支援這些形狀的程式碼,那麼您可能會破壞您無法控制且您可能不知道其存在的字體支援包。如果您不刪除程式碼,您將破壞對依賴新標準框架的字體的支持,這些字體可能會與需要舊標準框架的字體共存於文件中。

理想的解決方案:使用時間機器,返回並使用scit斜體小型大寫字母。然後你可以指出你的文件並聲稱你總是告訴人們使用scit,這不是你的錯si和/或scsl不起作用。

問題:時間機器的資金不可用。

不太理想的解決方案:調整您的 font-support-package-support 套件以支援si,scit 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

scit更改相關字體的 .fd 檔案(如果維護它)並添加形狀,然後將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但是...

相關內容