% \section{Changes to the NFSS}
%
%    \begin{macrocode}
%<*fontspec>
%    \end{macrocode}
%
%
% \subsection{Italic small caps and so on} \label{sec:sishape}
%
% \begin{macro}{\sishape}
% \begin{macro}{\textsi}
% These commands for actually selecting italic small caps have been defined for many years; I'm inclined to drop them.
% They're probably used very infrequently; I personally prefer just writing
% |\textit{\textsc{...}}| instead.
%
%    \begin{macrocode}
\providecommand*\itscdefault{\itdefault\scdefault}
\providecommand*\slscdefault{\sldefault\scdefault}
\DeclareRobustCommand{\sishape}
 {
  \not@math@alphabet\sishape\relax
  \fontshape{\itscdefault}\selectfont
 }
\DeclareTextFontCommand{\textsi}{\sishape}
%    \end{macrocode}
% \end{macro} \end{macro}
%
% \LaTeX's `shape' font axis needs to be overloaded to support italic small caps and slanted small caps.
% These are the combinations to support:
%    \begin{macrocode}
\cs_new:Nn \@@_shape_merge:nn { c_@@_shape_#1_#2_tl }
\tl_const:cn { \@@_shape_merge:nn \itdefault   \scdefault } {\itscdefault}
\tl_const:cn { \@@_shape_merge:nn \sldefault   \scdefault } {\slscdefault}
\tl_const:cn { \@@_shape_merge:nn \scdefault   \itdefault } {\itscdefault}
\tl_const:cn { \@@_shape_merge:nn \scdefault   \sldefault } {\slscdefault}
\tl_const:cn { \@@_shape_merge:nn \slscdefault \itdefault } {\itscdefault}
\tl_const:cn { \@@_shape_merge:nn \itscdefault \sldefault } {\slscdefault}
\tl_const:cn { \@@_shape_merge:nn \itscdefault \updefault } {\scdefault}
\tl_const:cn { \@@_shape_merge:nn \slscdefault \updefault } {\scdefault}
%    \end{macrocode}
%
% \begin{macro}{\fontspec_merge_shape:n}
% These macros enable the overload on the |\..shape| commands.
% First, a shape `new+current' (prefix) or `current+new' (suffix) is tried.
% If not found, fall back on the `new' shape.
%    \begin{macrocode}
\cs_new:Nn \fontspec_merge_shape:n
  {
    \@@_if_merge_shape:nTF {#1}
      { \fontshape { \tl_use:c { \@@_shape_merge:nn {\f@shape} {#1} } } \selectfont }
      { \fontshape {#1} \selectfont }
  }
%    \end{macrocode}
% The following is rather specific; it only returns true if the merged shape exists,
% but more importantly also if the merged shape is defined for the current font.
%    \begin{macrocode}
\prg_new_conditional:Nnn \@@_if_merge_shape:n {TF}
  {
    \bool_lazy_and:nnTF
      { \tl_if_exist_p:c { \@@_shape_merge:nn {\f@shape} {#1} } }
      {
        \cs_if_exist_p:c
          {
            \f@encoding/\f@family/\f@series/
            \tl_use:c { \@@_shape_merge:nn {\f@shape} {#1} }
          }
      }
    \prg_return_true: \prg_return_false:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\itshape} \begin{macro}{\scshape} \begin{macro}{\upshape} \begin{macro}{\slshape}
% The original |\..shape| commands are redefined to use the merge shape macro.
%    \begin{macrocode}
\DeclareRobustCommand \itshape
 {
  \not@math@alphabet\itshape\mathit
  \fontspec_merge_shape:n\itdefault
 }
\DeclareRobustCommand \slshape
 {
  \not@math@alphabet\slshape\relax
  \fontspec_merge_shape:n\sldefault
 }
\DeclareRobustCommand \scshape
 {
  \not@math@alphabet\scshape\relax
  \fontspec_merge_shape:n\scdefault
 }
\DeclareRobustCommand \upshape
 {
  \not@math@alphabet\upshape\relax
  \fontspec_merge_shape:n\updefault
 }
%    \end{macrocode}
% \end{macro} \end{macro} \end{macro} \end{macro}
%
%
%
% \subsection{Emphasis}
%
% \begin{macro}{\emfontdeclare}
%    \begin{macrocode}
\cs_new_protected:Npn \emfontdeclare #1
  {
    \prop_clear:N    \g_@@_em_prop
    \int_zero:N      \l_@@_emdef_int
    \bool_set_true:N \g_@@_em_normalise_slant_bool

    \tl_if_in:nnT {#1} {\slshape}
      {
        \tl_if_in:nnT {#1} {\itshape}
          {
            \bool_set_false:N \g_@@_em_normalise_slant_bool
          }
      }

    \group_begin:
      \normalfont
      \clist_map_inline:nn {\emreset,#1}
        {
          ##1
          \prop_gput_if_new:NxV \g_@@_em_prop { \f@shape } { \l_@@_emdef_int }
          \prop_gput:Nxn \g_@@_em_prop { switch-\int_use:N \l_@@_emdef_int } { ##1 }
          \int_incr:N \l_@@_emdef_int
        }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\em}
%    \begin{macrocode}
\DeclareRobustCommand \em
  {
    \@nomath\em
    \tl_set:Nx \l_@@_emshape_query_tl { \f@shape }

    \bool_if:NT \g_@@_em_normalise_slant_bool
      {
        \tl_replace_all:Nnn \l_@@_emshape_query_tl {/sl} {/it}
      }

%<debug> \typeout{Emph~ level:~\int_use:N \l_@@_em_int}
    \prop_get:NxNT \g_@@_em_prop { \l_@@_emshape_query_tl } \l_@@_em_tmp_tl
      {
        \int_set:Nn \l_@@_em_int { \l_@@_em_tmp_tl }
%<debug> \typeout{Shape~ (\l_@@_emshape_query_tl)~ detected;~ new~ level:~\int_use:N \l_@@_em_int}
      }

    \int_incr:N \l_@@_em_int

    \prop_get:NxNTF \g_@@_em_prop { switch-\int_use:N \l_@@_em_int } \l_@@_em_switch_tl
      { \l_@@_em_switch_tl }
      {
        \int_zero:N \l_@@_em_int
        \emreset
      }

  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\emph}
% \begin{macro}{\emshape}
% \begin{macro}{\eminnershape}
% \begin{macro}{\emreset}
%    \begin{macrocode}
\DeclareTextFontCommand{\emph}{\em}
\cs_set:Npn \emreset { \upshape }
\cs_set:Npn \emshape { \itshape }
\cs_set:Npn \eminnershape { \upshape }
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{Strong emphasis}
%
% \begin{macro}{\strongfontdeclare}
%    \begin{macrocode}
\cs_new_protected:Npn \strongfontdeclare #1
  {
    \prop_clear:N    \g_@@_strong_prop
    \int_zero:N      \l_@@_strongdef_int

    \group_begin:
      \normalfont
      \clist_map_inline:nn {\strongreset,#1}
        {
          ##1
          \prop_gput_if_new:NxV \g_@@_strong_prop { \f@series } { \l_@@_strongdef_int }
          \prop_gput:Nxn \g_@@_strong_prop { switch-\int_use:N \l_@@_strongdef_int } { ##1 }
          \int_incr:N \l_@@_strongdef_int
        }
    \group_end:
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\strongenv}
%    \begin{macrocode}
\DeclareRobustCommand \strongenv
  {
    \@nomath\strongenv

%<debug> \typeout{Strong~ level:~\int_use:N \l_@@_strong_int}
    \prop_get:NxNT \g_@@_strong_prop { \f@series } \l_@@_strong_tmp_tl
      {
        \int_set:Nn \l_@@_strong_int { \l_@@_strong_tmp_tl }
%<debug> \typeout{Series~ (\f@series)~ detected;~ new~ level:~\int_use:N \l_@@_strong_int}
      }

    \int_incr:N \l_@@_strong_int

    \prop_get:NxNTF \g_@@_strong_prop { switch-\int_use:N \l_@@_strong_int } \l_@@_strong_switch_tl
      { \l_@@_strong_switch_tl }
      {
        \int_zero:N \l_@@_strong_int
        \strongreset
      }

  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\strong}
% \begin{macro}{\strongreset}
%    \begin{macrocode}
\DeclareTextFontCommand{\strong}{\strongenv}
\cs_set:Npn \strongreset {}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\reset@font}
% Ensure nesting resets when necessary:
%    \begin{macrocode}
\cs_set:Npn \reset@font
  {
    \normalfont
    \int_zero:N \l_@@_em_int
    \int_zero:N \l_@@_strong_int
  }
%    \end{macrocode}
% \end{macro}
%
% Programmer's interface for setting nesting levels:
%    \begin{macrocode}
\cs_new:Nn \fontspec_set_em_level:n     { \int_set:Nn \l_@@_em_int     {#1} }
\cs_new:Nn \fontspec_set_strong_level:n { \int_set:Nn \l_@@_strong_int {#1} }
%    \end{macrocode}
%
% Defaults:
%    \begin{macrocode}
\strongfontdeclare{ \bfseries }
\emfontdeclare{ \emshape, \eminnershape }
%    \end{macrocode}
%
%    \begin{macrocode}
%</fontspec>
%    \end{macrocode}
