
В соответствии сблестящий ответ на этот вопросможно проверить, доступны ли малые заглавные буквы или нет. Однако, пытаясь на самом деле использовать этот код, я получаю странный результат: когда форма шрифтанеопределенныйзамена работает как и ожидалось. Когда форма шрифтанет в наличиитест показывает, что форма шрифта доступна, но 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
по назначению:
Это была тяжелая работа, но я рад, что наконец-то разобрался. Если есть более чистое решение, я был бы рад узнать о нем.
Отказ от ответственности:
Используйте это решение под свою ответственность и только в том случае, если вы можете с этим смириться.ужасныйРезультаты.