Определить новый макрос \XXseries для светлых шрифтов

Определить новый макрос \XXseries для светлых шрифтов

Возможно ли определить новую серию с помощью fontspec? Я попробовал следующее, но …

  1. он выдает ошибку, если у шрифта нет облегченной версии, вместо того, чтобы заменить шрифт, как \bfseriesэто делает. Другими словами, нет запасного варианта.
  2. мой \ltseriesне деактивирован \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}

Если нашлиВозможные значения для \fontseries и \fontshapeно он не говорит, как определить новую серию. Кроме того, это для LaTeX и это NFSS, в то время как я использую XeTeX с fontspec.

решение1

Официального интерфейса нет. Вы можете сделать это следующим образом (это lualatex-syntax, для проверки синтаксиса xelatex, например, eu1lmr.fd). Вы должны знать, что это не будет работать вместе с локальными изменениями шрифтов через \addfontfeaturesили local, \fontspecтак как это часто создает новое семейство.

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

решение2

В последней версии fontspec(на момент написания статьи v2.5a) естьофициальный интерфейсдля объявления новых форм шрифта: можно использовать FontFaceопцию для определения нового начертания шрифта 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}

Это гораздо удобнее, чем использовать \DeclareFontShape. В пример я также добавил определение, \textltкоторого не хватало в других ответах.

решение3

Ответ Ульрикса отлично работает после изменения \DeclareFontShapeв XeTeX-way, вот как он выглядит:

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

Перед необходимо иметь правильную фамилию. В начале документа есть так что \sffamilyне меняет шрифт для документа здесь …\DeclareFontShape\f@family\normalfont\sffamily

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