对提供给宏的参数的字符数进行分支

对提供给宏的参数的字符数进行分支

我当前有以下命令:

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

与上面相同的输出。

相关内容