Замена малых заглавных букв, если они не определены или недоступны

Замена малых заглавных букв, если они не определены или недоступны

В соответствии сблестящий ответ на этот вопросможно проверить, доступны ли малые заглавные буквы или нет. Однако, пытаясь на самом деле использовать этот код, я получаю странный результат: когда форма шрифтанеопределенныйзамена работает как и ожидалось. Когда форма шрифтанет в наличиитест показывает, что форма шрифта доступна, но Latex вместо этого использует замену.

Есть ли способ использовать \fakedscвместо римской версии обычные гротесковые заглавные буквы?

В следующем коде вы можете видеть, что заглавные буквы заменяются при использовании T1/lmr/bx/scи (обаT1/lmss/bx/scнеопределенный) но не тогда, когда T1/lmss/m/scиспользуется (нет в наличии):

\documentclass{scrartcl} 

\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{relsize}
\usepackage{etoolbox}

\newcommand{\fakedsc}[3][1]{#2\begingroup\smaller[#1]{\MakeUppercase{#3}}\endgroup}

\makeatletter
\def\define@newfont{%
    \begingroup
    \let\typeout\@font@info
    \escapechar\m@ne
    \expandafter\expandafter\expandafter
    \split@name\expandafter\string\font@name\@nil
    \try@load@fontshape % try always
    \expandafter\ifx
    \csname\curr@fontshape\endcsname \relax
    \expandafter\gdef\csname \curr@fontshape/sub\endcsname{}% new      
    \wrong@fontshape\else
    \extract@font\fi
    \endgroup}

\newcommand\testsc[3][1]{%
    \ifcsname \f@encoding/\f@family/\f@series/sc/sub\endcsname
    no \fakedsc[#1]{#2}{#3}
    \else 
    \ifcsname \f@encoding/\f@family/\f@series/sc\endcsname  yes \textsc{#2#3} \else no \fakedsc[#1]{#2}{#3} \fi
    \fi   
    }
\makeatother

\begin{document}

    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test successful, no replacement

    {\bfseries
    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

    \sffamily
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test \textbf{not successful}, auto replacement

    {\bfseries
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

\end{document}

Результаты показаны здесь: Замены

РЕДАКТИРОВАТЬ:Я нашел кое-что полезное вдокументация source2e. В верхней части страницы 166 написано:

Если комбинация \curr@fontshape недоступна (т.е. не определена), мы вызываем макрос \wrong@fontshape, чтобы позаботиться об этом случае. В противном случае \extract@font загрузит для нас внешний шрифт.

341 % \expandafter\ifx

342 % \csname\curr@fontshape\endcsname \relax

343 \try@load@fontshape % пытаться всегда

344 % \фи

345 \expandafter\ifx

346 \csname\curr@fontshape\endcsname \relax

347 \неправильная@форма_шрифта\иначе

Чтобы разрешить замену, мы вызываем макрос curr@fontshape, который обычно расширяется до \relax, но может содержать код для замены (см. определение \subst@fontshape).

348 % \csname\curr@fontshape\endcsname

349 \extract@font\fi

Мы почти закончили и осталось только восстановить \escapechar, закрыв группу.

350 \endgroup}

... так что волшебное слово -неопределенный, что означает решение для формы шрифта, котораянет в наличии(согласно предупреждениям LaTeX все еще необходимо).

ПРАВКА2:

Насколько я понимаю,\testsc тесты на подмену (что приводит к предупреждению "Форма шрифта T1/lmr/bx/scне определена(Шрифт) T1/lmr/bx/nвместо этого используется" если \textscиспользуется). Затем он проверяет, существует ли форма шрифта. По некоторым причинам этот тест положителен, T1/lmss/m/scхотя, при \textscэтом выдается предупреждение "Шрифт T1/lmss/m/scразмером <10.95> недоступен(Шрифт) T1/lmr/m/scВместо него пробовали шрифт".Нужен ли дополнительный тест в этом случае? В отличие от первого предупреждения, мне не удалось выяснить, как это предупреждение создается. Я нашел определение этого предупреждения на странице 64руководство по установке шрифта. Похоже, что семейство было изменено до проведения тестирования, только в этом случае.

РЕДАКТИРОВАНИЕ3:

Я поближе рассмотрел "нет в наличии" предупреждение. Оказывается, это производитсяt1lmss.fd(находится в MiKTeX 2.9/tex/latex/lm). Помимо других замен он объявляет:

\DeclareFontShape{T1}{lmss}{m}{sc}
{<->sub*lmr/m/sc}{}

Добавив следующий код в преамбулу, мне удалось изменить подстановку на обычную форму шрифта без засечек.

\documentclass{scrartcl} 

\usepackage[utf8]{inputenc}
\usepackage{lmodern} \sffamily\selectfont
\usepackage[T1]{fontenc}
\usepackage{relsize}
\usepackage{etoolbox}

\DeclareFontShape{T1}{lmss}{m}{sc}
{<->sub*lmss/m/n}{}
\normalfont
...

Вот новый результат: Новые замены

Можно ли провести тест и на этот вид замены, или «отменить» его?не возясь с файлом .fd?

Отказ от ответственности: Я знаю о проблемах, которые возникают при подделке маленьких заглавных букв, но использование другого шрифта для меня не является решением.

решение1

Последний шаг послеРЕДАКТИРОВАТЬ3на самом деле было довольно просто: скопируйте и вставьте код изt1lmss.fdи удалить нежелательный код в самом tex-файле. Таким образом, объявление формы шрифта переопределяется, оставляя исходный fd-файл нетронутым. Полный tex-файл выглядит следующим образом:

\documentclass{scrartcl} 

\usepackage[utf8]{inputenc}
\usepackage{lmodern} %\sffamily\selectfont % (not needed if the whole fd file is inserted, which uses \DeclareFontFamily{T1}{lmss}{})
\usepackage[T1]{fontenc}
\usepackage{relsize}
\usepackage{etoolbox}

%%% taken from the .fd file (MiKTeX 2.9\tex\latex\lm\t1lmss.fd) -- this overrides the definitions in the fd file while leaving the original file untouched
\DeclareFontFamily{T1}{lmss}{}
\DeclareFontShape{T1}{lmss}{m}{n}
{<-8.5> ec-lmss8
    <8.5-9.5> ec-lmss9      <9.5-11>  ec-lmss10
    <11-15.5> ec-lmss12     <15.5-> ec-lmss17
}{}
\DeclareFontShape{T1}{lmss}{m}{it}
{<->ssub*lmss/m/sl}{}
\DeclareFontShape{T1}{lmss}{m}{sl}
{<-8.5> ec-lmsso8
    <8.5-9.5> ec-lmsso9      <9.5-11>  ec-lmsso10
    <11-15.5> ec-lmsso12     <15.5-> ec-lmsso17
}{}
%%%%%%% Font/shape undefined, therefore substituted
%\DeclareFontShape{T1}{lmss}{m}{sc}     % <-- deleted
%{<->sub*lmr/m/sc}{}                    % <-- deleted
\DeclareFontShape{T1}{lmss}{b}{n}
{<->ssub * lmss/bx/n}{}
\DeclareFontShape{T1}{lmss}{b}{sl}
{<->ssub * lmss/bx/sl}{}
\DeclareFontShape{T1}{lmss}{b}{it}
{<->ssub * lmss/bx/it}{}
%%%%%%%% semibold condensed series
\DeclareFontShape{T1}{lmss}{sbc}{n}
{<-> ec-lmssdc10}{}
\DeclareFontShape{T1}{lmss}{sbc}{sl}
{<-> ec-lmssdo10}{}
\DeclareFontShape{T1}{lmss}{sbc}{it}
{<->ssub*lmss/sbc/sl}{}
%%%%%%%%% bold extended series
\DeclareFontShape{T1}{lmss}{bx}{n}
{<-> ec-lmssbx10}{}
\DeclareFontShape{T1}{lmss}{bx}{sl}
{<-> ec-lmssbo10}{}
\DeclareFontShape{T1}{lmss}{bx}{it}
{<->ssub*lmss/bx/sl}{}
%%% end of fd file
\normalfont

\newcommand{\fakedsc}[3][1]{#2\begingroup\smaller[#1]{\MakeUppercase{#3}}\endgroup}

\makeatletter
\def\define@newfont{%
    \begingroup
    \let\typeout\@font@info
    \escapechar\m@ne
    \expandafter\expandafter\expandafter
    \split@name\expandafter\string\font@name\@nil
    \try@load@fontshape % try always
    \expandafter\ifx
    \csname\curr@fontshape\endcsname \relax
    \expandafter\gdef\csname \curr@fontshape/sub\endcsname{}% new      
    \wrong@fontshape\else
    \extract@font\fi
    \endgroup}

\newcommand\testsc[3][1]{%
    \ifcsname \f@encoding/\f@family/\f@series/sc/sub\endcsname
    no \fakedsc[#1]{#2}{#3}
    \else 
    \ifcsname \f@encoding/\f@family/\f@series/sc\endcsname  yes \textsc{#2#3} \else no \fakedsc[#1]{#2}{#3} \fi
    \fi   
    }
\makeatother

\begin{document}

    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test successful, no replacement

    {\bfseries
    \detokenize{\rmfamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

    \sffamily
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est} => test finally successful, \detokenize{\fakedsc} used!!!

    {\bfseries
    \detokenize{\sffamily} \textsc{Test} -- \testsc{T}{ested} -- without \fakedsc{T}{est}} => test successful, replaced

\end{document}

Как вы видите, \sffamily \textsc{Test}теперь выдается предупреждение о том, что форма шрифтанеопределенный:

Неопределенные предупреждения

Однако, если \textsc{Test}удалить все части, никаких предупреждений не будет. Возможно, можно было бы даже предупредить, что используются поддельные малые заглавные буквы, если это желательно (для меня это не так).

Еще лучше: \sffamily \testsc{Tested}нет, даетнетв качестве ответа (имеется в виду форма шрифтане определен) и использует \fakedscпо назначению:

Успешные замены

Это была тяжелая работа, но я рад, что наконец-то разобрался. Если есть более чистое решение, я был бы рад узнать о нем.

Отказ от ответственности:

Используйте это решение под свою ответственность и только в том случае, если вы можете с этим смириться.ужасныйРезультаты.

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