Definir una nueva macro \XXseries para fuentes claras

Definir una nueva macro \XXseries para fuentes claras

¿Es posible definir una nueva serie con fontspec? Intenté lo siguiente pero...

  1. arroja un error si la fuente no tiene una versión ligera en lugar de reemplazar la fuente, como \bfserieslo hace. En otras palabras, no hay alternativa.
  2. mi \ltseriesno está desactivado por \mdseries.
\documentclass{article}

\usepackage{fontspec}
\setmainfont{Source Sans Pro}
   % http://www.google.com/fonts/specimen/Source+Sans+Pro

\newcommand{\ltseries}{%
   \addfontfeatures{UprightFont={* Light},ItalicFont={* Light Italic}}%
}

\begin{document}
\ltseries
Light

\mdseries
Regular

\bfseries
Bold
\end{document}

Si se encuentraValores posibles para \fontseries y \fontshapepero no dice cómo definir una nueva serie. Además, esto es para LaTeX y es NFSS, mientras que yo uso XeTeX con fontspec.

Respuesta1

No existe una interfaz oficial. Puede hacerlo de esta manera (esta es la sintaxis lualatex, para verificar la sintaxis de xelatex, por ejemplo, eu1lmr.fd). Debe tener en cuenta que no funcionará junto con cambios de fuente locales a través \addfontfeaturesde una local, \fontspecya que esto a menudo crea una nueva familia.

\documentclass{article}

\usepackage{fontspec}
\setmainfont{Source Sans Pro}

\normalfont
\makeatletter
\DeclareFontShape{\f@encoding}{\f@family}{l}{n}%
     {<->    name:sourcesanspro-light:script=latn;+trep;+tlig;
      }{}

\DeclareFontShape{\f@encoding}{\f@family}{l}{it}%
     {<->    name:sourcesanspro-lightit:script=latn;+trep;+tlig;
      }{}
\makeatother

\DeclareRobustCommand{\ltseries}{%
\fontseries{l}\selectfont}

\begin{document}
\ltseries
Light

\mdseries
Regular

\bfseries
Bold

 \normalfont
 {\addfontfeatures{Ligatures=NoCommon} abc \ltseries abc}

\end{document}

Respuesta2

Con una versión reciente de fontspec(v2.5a al momento de escribir este artículo) hay unainterfaz oficialpara declarar nuevas formas de fuente: Se puede usar la FontFaceopción para definir una nueva fuente NFSS:

\documentclass{article}

\usepackage{fontspec}
\setsansfont[
   FontFace = {lt}{n}{SourceSansPro-Light},
   FontFace = {lt}{it}{SourceSansPro-LightIt},
]{Source Sans Pro}

\DeclareRobustCommand{\ltseries}{\fontseries{lt}\selectfont}
\DeclareTextFontCommand{\textsi}{\sishape}

\begin{document}
\ltseries
Light \textit{Italic} (not available) 

\mdseries
Regular \textit{Italic}

\bfseries
Bold \textit{Italic}

\sffamily
\ltseries
Light \textit{Italic}

\mdseries
Regular \textit{Italic}

\bfseries
Bold \textit{Italic}
\end{document}

Esto es mucho más cómodo que usar \DeclareFontShape. En el ejemplo también agregué la definición \textltque faltaba en las otras respuestas.

Respuesta3

La respuesta de Ulrikes funciona bien después de cambiar \DeclareFontShapeen forma XeTeX, así es como se ve:

\documentclass{article}

\usepackage{fontspec}
\setsansfont{Source Sans Pro}
   % http://www.google.com/fonts/specimen/Source+Sans+Pro

\begingroup % \DeclareFontShape acts globally
\makeatletter
\sffamily

\DeclareFontShape{\f@encoding}{\f@family}{l}{n}%
     {<->    "[SourceSansPro-Light]:mapping=tex-text"
      }{}
\DeclareFontShape{\f@encoding}{\f@family}{l}{it}%
     {<->    "[SourceSansPro-LightIt]:mapping=tex-text"
      }{}
\endgroup % removes the effects of \sffamily and \makeatletter

\DeclareRobustCommand{\ltseries}{%
  \fontseries{l}\selectfont}

\makeatother

\begin{document}
\ltseries
Light (not available)

\mdseries
Regular

\bfseries
Bold

\sffamily
\ltseries
Light

\mdseries
Regular

\bfseries
Bold
\end{document}

El \sffamilyantes \DeclareFontShapees necesario para que \f@familytenga el apellido correcto. Al comienzo del documento hay un \normalfontasí \sffamilyque no cambie la fuente del documento aquí...

información relacionada