
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 \fakedsc
en 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/sc
yT1/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í:
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/sc
indefinida (Fuente) usandoT1/lmr/bx/n
en su lugar"si \textsc
se usa). Luego, prueba si la forma de la fuente existe. Por algunas razones, esta prueba es positiva T1/lmss/m/sc
, aunque \textsc
da la advertencia "Forma de fuente T1/lmss/m/sc
en tamaño <10,95> no disponible (Fuente) T1/lmr/m/sc
Se 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
...
¿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:
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 \fakedsc
según lo previsto:
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.