我想创建一个NewDocumentCommand
可以采用可选参数的字体颜色(蓝色、红色)、字体大小(12pt、18pt、可能大、巨大)和字体样式(粗体、斜体、可能粗体+斜体)。如何设置粗体、斜体等关键字选项?
我根据@egreg对以下问题的回答整理了以下代码338364/xparse-processor-带多个参数。我能够使用 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}
(跳过参数似乎不起作用,但我认为对于知道自己在做什么的人来说这是一个简单的修复!也许缺少某种离开模式......)
答案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
以避免可能产生的不良影响。