我想将一个字符串拆分成两部分,第一个字母在第一部分,其余字母在第二部分。然后我想将整个字符串转换为大写,并将第二部分写入 \scriptsize。现在,这些命令可以单独运行,但如果我开始将它们混合成一个命令,它就不再起作用了。
\documentclass{article}
\usepackage{amsmath,xstring}
\newcommand{\first}[1]{\StrLeft{#1}{1}}
\newcommand{\last}[1]{\StrGobbleLeft{#1}{1}}
\newcommand{\UP}[1]{\MakeUppercase{#1}}
\newcommand{\script}[1]{\scriptsize{#1}}
\newcommand{\getsc}[1]{\MakeUppercase{\first{#1}\script{\last{#1}}}}
\begin{document}
{\scriptsize Text}, \first{Theorem}, \last{Definition}, \UP{small case text}, {\script{SOME text}},
%\getsc{Theorem}
\end{document}
但以下并没有结束编译
\documentclass{article}
\usepackage{amsmath,xstring}
\newcommand{\first}[1]{\StrLeft{#1}{1}}
\newcommand{\last}[1]{\StrGobbleLeft{#1}{1}}
\newcommand{\UP}[1]{\MakeUppercase{#1}}
\newcommand{\script}[1]{\scriptsize{#1}}
\newcommand{\getsc}[1]{\MakeUppercase{\first{#1}\script{\last{#1}}}}
\begin{document}
{\scriptsize Text}, \first{Theorem}, \last{Definition}, \UP{small case text}, {\script{SOME text}},
\getsc{Theorem}
\end{document}
答案1
换句话说,您想要伪造\textsc
,可能是因为您的字体不支持小型大写字母。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\fakesc}{m}
{
\text_uppercase:n { \tl_head:n { #1 } }
{\scriptsize\text_uppercase:n { \tl_tail:n { #1 } }}
}
\ExplSyntaxOff
\begin{document}
\fakesc{Theorem}
\fakesc{theorem}
\end{document}
您的方法不起作用,因为\StrLeft{#1}{1}
这是一组用于生成(和打印)第一个令牌的指令。
如果你想要使用xstring
(我不推荐)
\documentclass{article}
\usepackage{xstring}
\newcommand{\getsc}[1]{%
\StrLeft{#1}{1}[\headtoken]%
\StrGobbleLeft{#1}{1}[\tailtokens]%
\MakeUppercase{\headtoken\scriptsize\tailtokens}%
}
\begin{document}
\getsc{Theorem}
\getsc{theorem}
\end{document}
答案2
有很多方法可以做到这一点,但在这种情况下我不会使用 xstring 包。
使用分隔宏,您可以非常轻松地拾取字符串的头和尾。
\documentclass{article}
\begin{document}
\def\head#1{{\Huge #1}\ignorespaces}
\def\tail#1{{\scriptsize#1}}
\def\myfancymacro#1{%
\def\temp##1##2;{%
\head{##1}
\tail{##2}
}
\expandafter\MakeUppercase{\temp#1;}
}
\myfancymacro{theorem}
\end{document}
还有许多其他方法。Xparse 和 l3 模块都有很多命令可以实现这一点。