NewDocumentCommand para tamaño y estilo de fuente

NewDocumentCommand para tamaño y estilo de fuente

Me gustaría crear un NewDocumentCommandque tomaría argumentos opcionales como el color de fuente (azul, rojo), el tamaño de fuente (12 puntos, 18 puntos, tal vez grande, enorme) y el estilo de fuente (negrita, cursiva, tal vez negrita+cursiva).¿Cómo configurar opciones de palabras clave como negrita y cursiva?

He elaborado el siguiente código, basado en la respuesta de @egreg a338364/xparse-procesador-con-múltiples-argumentos. Pude hacer que el color y el tamaño de fuente funcionaran, usando palabras clave de color del paquete xcolor y tamaño de fuente en pt, pero no estoy seguro de cuál es la mejor manera de configurar palabras clave opcionales para el estilo de fuente (por ejemplo, bf para negrita, está en cursiva). Estoy pensando en quizás acondicionar con \IfValueT, pero antes de experimentar, agradecería sugerencias. Naturalmente, sería bueno si este comando pudiera tomar matemáticas y colorearlo y todo eso, pero si eso es demasiado codicioso, me conformaré con algo que funcione con texto.

\documentclass{article}
\usepackage{xparse,xcolor}
\usepackage{verbatim}

\ExplSyntaxOn

\keys_define:nn { mystyle }
{
  color .tl_set:N = \l__mystyle_color_tl,
  size  .tl_set:N = \l__mystyle_size_tl,
  skip  .tl_set:N = \l__mystyle_skip_tl,
  color .initial:n = red,
  size  .initial:n = 12pt,
  skip  .initial:n = 14.5pt,
}
\NewDocumentCommand{\stress}{O{}m}
{
  \group_begin:
  \keys_set:nn { mystyle } { #1 }
  \clist_map_inline:nn { #2 }
  {
    \mystyle:VVVn
    \l__mystyle_color_tl
    \l__mystyle_size_tl
    \l__mystyle_skip_tl
    {##1}
  }
  \group_end:
}
\cs_new_protected:Nn \mystyle:nnnn
{
  \color{#1}\fontsize{#2}{#3}\selectfont#4
}
\cs_generate_variant:Nn \mystyle:nnnn { VVV }
\ExplSyntaxOff

\begin{document}

\stress{emphasize this sentence with default values}

\stress[color=green,size=18pt]{emphasize this sentence with custom values}

\stress[color=blue,size=10pt,skip=50pt]{\textit{emphasize this sentence with custom values}}

Could I modify the command to:

\verb|\stress[style=it]{blabla}| to select italic, 

\verb|\stress[style=bf]{blabla}| to select bold,

\verb|\stress[style=bfit]{blabla}| to select bold+italic

or even \verb|\stress[style=bf+it]{blabla}| to combine styles...

\end{document}

(El argumento de omisión no parece funcionar, ¡pero sospecho que es una solución fácil para alguien que sabe lo que está haciendo! Tal vez falte algún tipo de modo de salida...)

ingrese la descripción de la imagen aquí

Respuesta1

Quiere definir una .choice:clave.

\RequirePackage{fix-cm}
\documentclass{article}
\usepackage{xcolor}
\usepackage{verbatim}

\ExplSyntaxOn

\tl_new:N \l__mystyle_style_tl

\keys_define:nn { mystyle }
 {
  color .tl_set:N = \l__mystyle_color_tl,
  size  .tl_set:N = \l__mystyle_size_tl,
  skip  .tl_set:N = \l__mystyle_skip_tl,

  style .choice:,
  style/it .code:n = \tl_set:Nn \l__mystyle_style_tl { \itshape },
  style/bf .code:n = \tl_set:Nn \l__mystyle_style_tl { \bfseries },
  style/bfit .code:n = \tl_set:Nn \l__mystyle_style_tl { \bfseries\itshape },
  style/unknown .code:n = \tl_set:Nn \l__mystyle_style_tl { #1 },

  color .initial:n = red!75,
  size  .initial:n = 12pt,
  skip  .initial:n = 14.5pt,
 }
\NewDocumentCommand{\stress}{O{}m}
 {
  \group_begin:
  \keys_set:nn { mystyle } { #1 }
  \mystyle:VVVVn
    \l__mystyle_color_tl
    \l__mystyle_size_tl
    \l__mystyle_skip_tl
    \l__mystyle_style_tl
    {#2}
  \group_end:
 }
\cs_new_protected:Nn \mystyle:nnnnn
 {
  \leavevmode\color{#1}\fontsize{#2}{#3}#4\selectfont#5
 }
\cs_generate_variant:Nn \mystyle:nnnnn { VVVV }

\ExplSyntaxOff

\begin{document}

\stress{emphasize this sentence with default values}

\stress[color=green!60!red,size=18pt]{emphasize this sentence with custom values}

\stress[color=blue!80,size=10pt,skip=50pt,style=it]{emphasize this sentence with custom values}

\stress[style=it]{blabla}

\stress[style=bf]{blabla}

\stress[style=bfit]{blabla}

\stress[style=\scshape]{blabla}

\end{document}

Es necesario definir de antemano la combinación posible, pero es posible hacer algo también para otros estilos, expresados ​​con los comandos de fuente habituales.

Agregué un \leavevmodeantes \colorpara evitar posibles efectos no deseados.

ingrese la descripción de la imagen aquí

información relacionada