Как сделать эквивалент \DeclareFontShapeChangeRule, который проверяет 4 цели вместо 3?

Как сделать эквивалент \DeclareFontShapeChangeRule, который проверяет 4 цели вместо 3?

Если вам все равно, почему я спрашиваю, пропустите первый раздел...


Проблема:

  1. В LaTeX 2e не определена форма курсива для малых заглавных букв.
  2. \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и отказа от поддержки, специфичной для пакета, полагаясь на стандартную структуру.

Проблема:Если вы поддерживаете (в каком-то даже более вырожденном смысле слова «поддерживаете») пакет font-support-package-support, предлагающий общую структуру для пакетов font-support, которая поддерживает siи scsl, скажем, и вы удаляете код, поддерживающий эти формы, то вы можете сломать пакеты font-support, над которыми вы не имеете никакого контроля и о существовании которых вы можете не знать. Если вы не удалите код, вы сломаете поддержку шрифтов, которые полагаются на новую стандартную структуру, которая может сосуществовать в документах со шрифтами, которым требуется старая.

Идеальное решение:Используя машину времени, вернитесь назад и используйте 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

Что плохого в изменении файла .fd шрифта, о котором идет речь (если вы его поддерживаете), и добавлении формы scit, а затем присвоении псевдонима siформе этой форме (точно так же, как многие шрифты присваивают псевдоним bx) b. После этого старый документ, который явно используется, siдолжен продолжать работать, как и прежде, но новые документы могут просто писать, \textsc{\itshape ...}и это тоже будет работать.

Смешение обоих соглашений не обязательно сработает и приведет к заменам, но я думаю, что это приемлемо.

Я бы не стал создавать правила изменения, потому что, как указал Ульрике, это будет означать, что ваш документ странным образом нарушает работу других пакетов шрифтов. Правила изменения предназначены только для преамбулы, если вам нужно настроить определенный документ или для общей настройки, которая обычно происходит только как часть ядра.

решение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но...

Связанный контент