用於字體大小和樣式的 NewDocumentCommand

用於字體大小和樣式的 NewDocumentCommand

我想創建一個NewDocumentCommand帶有可選參數的字體,例如字體顏色(藍色,紅色),字體大小(12pt,18pt,也許大,巨大)和字體樣式(粗體,斜體,也許粗體+斜體)。如何設定關鍵字選項(如粗體和斜體)?

我根據@egreg的回答整理了以下程式碼338364/xparse-處理器與多個參數。我能夠使用 xcolor 包中的顏色關鍵字和 pt 中的字體大小來獲取顏色和字體大小,但我不確定如何最好地為字體樣式設定可選關鍵字(例如 bf 為粗體,為斜體)。我正在考慮也許用 進行調節\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}

(跳過參數似乎不起作用,但我懷疑對於知道自己在做什麼的人來說這是一個簡單的修復!也許缺少某種離開模式...)

在此輸入影像描述

答案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以避免可能出現的不良影響。

在此輸入影像描述

相關內容