![对提供给宏的参数的字符数进行分支](https://linux22.com/image/468657/%E5%AF%B9%E6%8F%90%E4%BE%9B%E7%BB%99%E5%AE%8F%E7%9A%84%E5%8F%82%E6%95%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E6%95%B0%E8%BF%9B%E8%A1%8C%E5%88%86%E6%94%AF.png)
我当前有以下命令:
\newcommand*{\setfontshape}[1]{\@ifnotmtarg{#1}{\csname#1shape\endcsname}}
这帮助我生成命令:\scshape
来自文本sc
。
\scshape
我想修改我的命令,以便它能从文本sc
和文本中生成命令scshape
。其中一种方法是按字符数进行分支:如果小于或等于,则添加shape
,否则按原样处理:
sc
->\scshape
(简短版本)scshape
->\scshape
(完整版)
另一种方法是检查字符串是否已包含shape
,如果不包含,则将其添加到末尾。无论如何,如何修改我的命令以使其适用于短版本和完整版本?
答案1
您可以使用单词shape
作为参数的分隔符,并且shape
在使用长格式时吞噬额外的外观:
\documentclass{article}
\newcommand*\setfontshape[1]{\setfontshapeA #1shape\relax}
\def\setfontshapeA#1shape#2\relax{\csname #1shape\endcsname}
\begin{document}
foo
{\setfontshape{sc} hello}
bar
{\setfontshape{scshape} hello}
baz
\end{document}
答案2
我不确定这个命令是否有用。无论如何……
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\setfontshape}{m}
{
\IfBlankF{#1}
{
\vincent_shape:n { #1 }
}
}
\cs_new_protected:Nn \vincent_shape:n
{
\use:c
{
\str_case:nnF { #1 }
{
{sc}{scshape}
{it}{itshape}
{sl}{slshape}
}
{ #1 }
}
}
\ExplSyntaxOff
\begin{document}
{\setfontshape{sc}AbcDef}
{\setfontshape{scshape}AbcDef}
{\setfontshape{it}AbcDef}
{\setfontshape{itshape}AbcDef}
{\setfontshape{sl}AbcDef}
{\setfontshape{slshape}AbcDef}
\end{document}
以支持你的计数想法的方式:
\documentclass{article}
\usepackage{lmodern}
\ExplSyntaxOn
\NewDocumentCommand{\setfontshape}{m}
{
\IfBlankF{#1}
{
\vincent_shape:n { #1 }
}
}
\cs_new_protected:Nn \vincent_shape:n
{
\use:c { #1 \int_compare:nT { \str_count:n { #1 } < 5 } { shape } }
}
\ExplSyntaxOff
\begin{document}
{\setfontshape{sc}AbcDef}
{\setfontshape{scshape}AbcDef}
{\setfontshape{it}AbcDef}
{\setfontshape{itshape}AbcDef}
{\setfontshape{sl}AbcDef}
{\setfontshape{slshape}AbcDef}
{\setfontshape{sc}\setfontshape{sl}AbcDef}
\end{document}
可能应该如此
\cs_if_exist_use:cF { #1 \int_compare:nT { \str_count:n { #1 } < 5 } { shape } } { \ERROR }
所以如果你犯了错误,你就会被告知。
答案3
使用的方法l3regex
(测试参数是否以“shape”结尾):
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\setfontshape}{ m }{
\tl_if_novalue:nF { #1 } {
\regex_match:nnTF { shape\Z } { #1 } {
\cs:w #1 \cs_end:
}{
\cs:w #1 shape \cs_end:
}
}
}
\ExplSyntaxOff
\begin{document}
foo
{\setfontshape{sc} hello}
bar
{\setfontshape{scshape} hello}
baz
\end{document}
或者,甚至更简单:如果您始终只需要参数的前两个字母,则只需抓住这些字母并丢弃其余字母:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\setfontshape}{ m }{
\tl_if_novalue:nF { #1 } {
\cs:w \str_range:nnn { #1 } { 1 } { 2 } \cs_end:
}
}
\ExplSyntaxOff
\begin{document}
foo
{\setfontshape{sc} hello}
bar
{\setfontshape{scshape} hello}
baz
\end{document}
与上面相同的输出。