如果您不在乎我為什麼問,請跳過第一部分...
問題:
- LaTeX 2e 中沒有定義小寫斜體形狀。
\textsc{\textit{small-caps italic}}
即使定義了小型大寫字母斜體形狀,也不會產生小型大寫字母斜體。
之前的解決方案:不同的包裝對小型大寫字母斜體和/或小型大寫斜體使用不同的形狀代碼。變體包括(至少)si
和scit
。scsl
一些支援包還支援分層的形狀變化,以便\textsc{\textit{small-caps italic} small-caps} \textit{italic \textsc{small-caps}}
達到預期的效果。
為了讓這件事更容易,一些 font-support-package-support 套件為 font-support 套件的作者提供了通用框架,該框架定義了形狀並修改了 LaTeX 的命令,以便分層形狀變更起作用。font-axes
、nfssext
和nfssext-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
但是...