我有一个命令,它以字符串作为参数并对其应用某种格式。我还希望在某些情况下(当计数器达到某个值时)它只打印参数的第一个字母。我该怎么做?
我知道如何管理计数器,但不知道如何将输出更改为参数的首字母。我会使用正则表达式,但我不知道如何实现它。环顾四周,我发现l3regex
,但它看起来没有文档,如果没有它,我就无法理解我在其他答案中找到的例子。
附言:我也不知道该用什么标签来回答这个问题。如果你想编辑它们,欢迎你。
答案1
提取某个字符首字母的最简单方法是使用如下命令
\def\firstletter#1#2@{#1}
将此命令与要从中提取首字母的单词一起使用,后跟字符@
:\firstletter hello@
。调用此命令时#1
,即h
,将被打印,而#2
,即ello
,将被丢弃。此命令中的 的功能@
只是标记字符串的结尾,以便#2
可以提取字符串首字符和结尾之间的所有内容。您可以使用任何内容代替@
此处的内容,但您应该使用不应出现在“单词” 中的内容#1#2
。
我不太清楚您想如何使用它,但您谈到应用某种格式并根据计数器的值打印第一个字母。以下命令符合此描述:
\newcommand\VagueCommand[1]{%
\refstepcounter{mycounter}%
\ifnum\value{mycounter}=5\firstletter#1@%
\else\textbf{#1}%
\fi%
}
因此,\VagueCommand
将其内容排版为粗体,但第五次迭代打印的第一个字母除外#1
。有了这个,下面的 MWE 输出:
以下是完整内容最小工作示例:
\documentclass{article}
\newcounter{mycounter}% define a new counter
\def\firstletter#1#2@{#1} % print first token in #1#2
\newcommand\VagueCommand[1]{%
\refstepcounter{mycounter}% increment counter
\ifnum\value{mycounter}=5\firstletter#1@% test for mycounter=5
\else\textbf{#1}% otherwise in bold
\fi%
}
\begin{document}
\VagueCommand{one}
\VagueCommand{two}
\VagueCommand{three}
\VagueCommand{four}
\VagueCommand{five}
\VagueCommand{six}
\VagueCommand{seven}
\VagueCommand{eight}
\end{document}
答案2
@Andrew 的回答一般情况下是可行的,但在某些情况下会出现问题。我能做的最好的事情(感谢@Schrödinger 的猫评论)是这样的:
\documentclass{article}
\usepackage{xstring}
\newcounter{mycounter}
\newcommand{\mycommand}[1]{
\addtocounter{mycounter}{1}
\ifnum\value{mycounter}<3
\textbf{#1}
\else
\emph{\StrChar{#1}{1}}
\fi
}
\begin{document}
\mycommand{foo}
\mycommand{bar}
\mycommand{lorem}
\mycommand{ipsum}
\end{document}
输出: