Если вам все равно, почему я спрашиваю, пропустите первый раздел...
Проблема:
- В 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
и отказа от поддержки, специфичной для пакета, полагаясь на стандартную структуру.
Проблема:Если вы поддерживаете (в каком-то даже более вырожденном смысле слова «поддерживаете») пакет 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
но...