Reemplazo de versalitas cuando no están definidas o no están disponibles

Reemplazo de versalitas cuando no están definidas o no están disponibles

De acuerdo ala brillante respuesta a esta preguntaes posible comprobar si las versalitas están disponibles o no. Sin embargo, al intentar hacer uso de este código, obtengo un resultado extraño: cuando la forma de la fuente esindefinidoEl reemplazo funciona como se esperaba. Cuando la forma de la fuente esNo disponiblela prueba dice que la forma de fuente está disponible, pero Latex utiliza un reemplazo.

¿Hay alguna forma de utilizar \fakedscen lugar de la versión romana para las versalitas sans serif normales?

En el siguiente código puede ver que las minúsculas se reemplazan cuando T1/lmr/bx/scyT1/lmss/bx/sc se usanindefinido) pero no cuandoT1/lmss/m/sc se usa (No disponible):

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

Los resultados se muestran aquí: Reemplazos

EDITAR:Encontré algo útil en eldocumentación fuente2e. En la parte superior de la página 166 dice:

Si la combinación \curr@fontshape no está disponible (es decir, no está definida), llamamos a la macro \wrong@fontshape para solucionar este caso. De lo contrario, \extract@font cargará la fuente externa por nosotros.

341%\expandafter\ifx

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

343 \try@load@fontshape % intentar siempre

344 %

345 \expandir\ifx

346 \csname\curr@fontshape\endcsname \relax

347 \incorrecto@forma de fuente\else

Para permitir la sustitución llamamos a la macro curr@fontshape que normalmente se expandirá a \relax pero puede contener código para sustitución (consulte la definición de \subst@fontshape).

348 % \csname\curr@fontshape\endcsname

349 \extraer@fuente\fi

Ya casi hemos terminado y sólo debemos restaurar el \escapechar cerrando el grupo.

350 \endgroup}

... entonces la palabra mágica esindefinido, es decir, una solución para una forma de fuente que esNo disponible(según las advertencias de LaTeX todavía son necesarias).

EDITAR2:

Hasta donde yo entiendo,\testsc las pruebas de sustitución (lo que lleva a la advertencia "Forma de fuente T1/lmr/bx/scindefinida (Fuente) usandoT1/lmr/bx/n en su lugar"si \textscse usa). Luego, prueba si la forma de la fuente existe. Por algunas razones, esta prueba es positiva T1/lmss/m/sc, aunque \textscda la advertencia "Forma de fuente T1/lmss/m/scen tamaño <10,95> no disponible (Fuente) T1/lmr/m/scSe probó la forma de fuente en su lugar".¿Se necesita una prueba adicional para este caso? A diferencia de la primera advertencia, no pude descubrir cómo se produce esta advertencia. Encontré una definición de esta advertencia en la página 64 delguía de instalación de fuentes. Parece que la familia se cambia antes de realizar la prueba, solo en este caso.

EDITAR3:

Eché un vistazo más de cerca a "No disponible"advertencia. Resulta que esto es producido port1lmss.fd(ubicado en MiKTeX 2.9/tex/latex/lm). Además de otras sustituciones declara:

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

Al agregar el siguiente código al preámbulo, pude cambiar la sustitución a la forma normal de la fuente sans serif.

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

Esta es la nueva salida: Nuevos reemplazos

¿Es posible realizar también una prueba para este tipo de sustitución o "no declararla"?sin jugar con el archivo .fd?

Descargo de responsabilidad: Soy consciente de los problemas que surgen al falsificar versalitas, pero usar una fuente diferente no es una solución para mí.

Respuesta1

El último paso despuésEDITAR3En realidad fue bastante simple: copiar y pegar el código delt1lmss.fdy elimine el código no deseado en el propio archivo tex. Por lo tanto, la declaración de la forma de la fuente se anula dejando intacto el archivo fd original. El archivo tex completo tiene el siguiente aspecto:

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

Como se puede ver,\sffamily \textsc{Test} ahora da una advertencia de que la forma de la fuente esindefinido:

Advertencias indefinidas

Sin embargo, si se eliminan todas \textsc{Test}las partes, no se muestran advertencias. Tal vez incluso se podría advertir que se utilizan versalitas falsas, si así se desea (para mí, no lo es).

Aun mejor:\sffamily \testsc{Tested} no daNocomo respuesta (lo que significa que la forma de la fuente esno definida) y utiliza \fakedscsegún lo previsto:

Reemplazos exitosos

Fue un trabajo duro, pero estoy feliz de haberlo resuelto finalmente. Si hay una solución más limpia, me encantaría conocerla.

Descargo de responsabilidad:

Utilice esta solución bajo su propia responsabilidad y sólo si puede vivir con lahorribleresultados.

información relacionada