Como posso fazer o equivalente a \DeclareFontShapeChangeRule que testa 4 alvos em vez de 3?

Como posso fazer o equivalente a \DeclareFontShapeChangeRule que testa 4 alvos em vez de 3?

Se você não se importa por que estou perguntando, pule a primeira seção....


Problema:

  1. Nenhuma forma em versalete e itálico foi definida no LaTeX 2e.
  2. \textsc{\textit{small-caps italic}}não produziu letras maiúsculas em itálico, mesmo que uma forma de letras maiúsculas em itálico fosse definida.

Solução anterior:pacotes diferentes usavam códigos de formato diferentes para versalete itálico e/ou versalete oblíqua. Variações incluídas (pelo menos si) scite scsl. Alguns pacotes de suporte também suportavam mudanças de forma em camadas, para que \textsc{\textit{small-caps italic} small-caps} \textit{italic \textsc{small-caps}}se comportassem conforme esperado.

Para tornar isso mais fácil, alguns pacotes font-support-package-support ofereceram aos autores dos pacotes font-support estruturas gerais que definiam as formas e hackeavam os comandos do LaTeX para que as mudanças de forma em camadas funcionassem. font-axes, nfssexte nfssext-cfrsão exemplos.

Solução mais recente:LaTeX define scite suporta camadas de formas itálicas, versaletes e oblíquas.

Problema:Se você mantiver (em algum sentido degenerado de 'manter') um pacote de suporte de fontes que usou sie scsl, digamos, as alterações de forma para suas fontes suportadas serão interrompidas ou as alterações de forma para fontes suportadas pela configuração padrão serão interrompidas.

Solução:Refaça os .fdarquivos para usar scite elimine o suporte específico do pacote, contando com a estrutura padrão.

Problema:Se você mantiver (em um sentido ainda mais degenerado de 'manter') um pacote font-support-package-support oferecendo uma estrutura geral para pacotes de suporte a fontes que suportam sie scsl, digamos, e descartar o código que suporta essas formas, então você pode quebrar pacotes de suporte a fontes sobre os quais você não tem controle e cuja existência você pode ignorar. Se você não descartar o código, você quebrará o suporte para fontes que dependem da nova estrutura padrão, que pode coexistir em documentos com fontes que requerem a antiga.

Solução ideal:Usando sua máquina do tempo, volte e use scitversalete em itálico. Então você pode apontar para sua documentação e alegar que sempre disse às pessoas para usarem scite que não é sua culpa sie/ou scslnão funciona.

Problema:Financiamento para máquina do tempo não disponível.

Solução menos ideal:Adapte seu pacote font-support-package-support para suportar si,scit e scsl.


Ao revisar nfssext-cfr, gostaria de testar quatro formatos de destino ao lidar com mudanças de formato em versalete/itálico/oblíqua em camadas. Suspeito que a única maneira de fazer isso será semelhante ao que nfssextera originalmente, mas não tenho certeza de como garantir que isso funcione bem com a estrutura LaTeX atual.

Por exemplo, a maneira mais direta de implementar o suporte para versalete itálico ( si) e oblíquo ( scsl) seria

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

Mas se eu fizer isso, interromperei as alterações de forma para fontes que usam scitem vez de sie/ou scsl.

Então, na ausência de uma máquina do tempo, o ideal seria ter algo como

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

mas, infelizmente, tal comando não existe. \DeclareFontShapeChangeRulepode testar três alvos de formato, mas quatro estão além de seu poder.

Eu tentei o método consagrado de ignorar o problema por alguns anos, deixando o código parcialmente revisado fermentar e esperando ter uma ideia brilhante, mas meu cérebro até agora não conseguiu captar nem mesmo uma ideia mal iluminada.

Aqui está um MNWE (com comentários traduzidos!):

\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}

Responder1

O que há de errado em alterar o arquivo .fd da fonte em questão (se você o mantiver) e adicionar a scitforma e, em seguida, criar um alias sipara essa forma (assim como muitos alias de fontes bxpara b). Depois daquele documento antigo que uso explicitamente sideveria continuar funcionando como antes, mas novos documentos poderiam simplesmente ser escritos \textsc{\itshape ...}e funcionaria também.

Misturar as duas convenções não funcionaria necessariamente e produziria substituições, mas acho que é aceitável.

Eu não produziria regras de alteração porque, como Ulrike apontou, isso significaria que seu documento quebraria outros pacotes de fontes de maneiras estranhas. As regras de alteração são apenas para preâmbulo se você precisar ajustar um documento específico ou para configuração geral que normalmente só acontece como parte do kernel.

Responder2

Você não pode atualizar os arquivos fd para usar os novos nomes de formas padronizadas, então

fazer

\documentclass{article}


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

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

\end{document}

insira a descrição da imagem aqui

portanto, qualquer documento que acesse compostos como \scshape\textit{Abc}acessará as letras maiúsculas em itálico por meio do novo mecanismo. A regra ShapeChange adicionada afetará apenas o código que estiver solicitando explicitamente a siforma, portanto, não afetará nenhum documento que não a tenha usado anteriormente.

Você precisará de mais algumas regras para lidar com o caso em que a forma existente nainda não existe....

informação relacionada