
我想創建一個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
以避免可能出現的不良影響。