NewDocumentCommand для размера и стиля шрифта

NewDocumentCommand для размера и стиля шрифта

Я хотел бы создать , NewDocumentCommandкоторый будет принимать необязательные аргументы, такие как цвет шрифта (синий, красный), размер шрифта (12pt, 18pt, возможно, большой, огромный) и стиль шрифта (жирный, курсив, возможно, жирный+курсив).Как настроить параметры ключевых слов, такие как жирный шрифт и курсив?

Я составил следующий код, основываясь на ответе @egreg на338364/xparse-процессор-с-множеством-аргументов. Мне удалось заставить работать цвет и размер шрифта, используя ключевые слова цвета из пакета xcolor и размер шрифта в pt, но я не уверен, как лучше всего подойти к установке дополнительных ключевых слов для стиля шрифта (например, bf для жирного, it для курсива). Я думаю, возможно, обусловить с помощью \IfValueT, но прежде чем экспериментировать, я бы приветствовал указатели. Конечно, было бы неплохо, если бы эта команда могла брать математику, раскрашивать ее и все такое, но если это слишком жадно, я соглашусь на что-то, что работает с текстом.

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

(аргумент skip, похоже, не работает, но я подозреваю, что это легко исправить для того, кто знает, что делает! возможно, отсутствует какой-то режим выхода...)

введите описание изображения здесь

решение1

Вы хотите определить .choice:ключ.

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

Вам необходимо заранее определить возможную комбинацию, но можно сделать что-то и для других стилей, выраженных с помощью обычных команд шрифта.

Я добавил « \leavevmodeдо» \color, чтобы избежать возможных нежелательных эффектов.

введите описание изображения здесь

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