NewDocumentCommand para tamanho e estilo da fonte

NewDocumentCommand para tamanho e estilo da fonte

Gostaria de criar um NewDocumentCommandque aceitasse argumentos opcionais como cor da fonte (azul, vermelho), tamanho da fonte (12pt, 18pt, talvez grande, enorme) e estilo da fonte (negrito, itálico, talvez negrito + itálico).Como configurar opções de palavras-chave como negrito e itálico?

Elaborei o código a seguir, com base na resposta de @egreg para338364/xparse-processador-com-múltiplos-argumentos. Consegui fazer com que a cor e o tamanho da fonte funcionassem, usando palavras-chave coloridas do pacote xcolor e tamanho da fonte em pt, mas não tenho certeza da melhor forma de definir palavras-chave opcionais para o estilo da fonte (digamos bf para negrito, para itálico). Estou pensando em talvez condicionar \IfValueT, mas antes de experimentar, gostaria de receber dicas. Naturalmente seria bom se este comando pudesse pegar matemática e colori-la e tudo mais, mas se isso for muito ganancioso, vou me contentar com algo que funcione com 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}

(o argumento skip não parece funcionar, mas suspeito que seja uma solução fácil para alguém que sabe o que está fazendo! talvez algum tipo de modo de licença esteja faltando...)

insira a descrição da imagem aqui

Responder1

Você deseja definir uma .choice:chave.

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

Você precisa definir antecipadamente a combinação possível, mas é possível fazer algo também para outros estilos, expressos com os comandos usuais de fontes.

Adicionei um \leavevmodeantes \colorpara evitar possíveis efeitos indesejados.

insira a descrição da imagem aqui

informação relacionada