
Me gustaría crear un NewDocumentCommand
que 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...)
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 \leavevmode
antes \color
para evitar posibles efectos no deseados.