假设我有一些字符串This~is a ~test
。我需要计算字符数~
。在 LaTeX 中有什么方法可以做到这一点吗?
答案1
使用expl3
你可以分割代币列表进入项目然后计算项目(减1):
二
四
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% \CountSubStr{<substring>}{<string>}
\NewDocumentCommand{\CountSubStr}{ m m }{
\seq_set_split:Nnn \l_tmpa_seq { #1 } { #2 }
\int_eval:n {(\seq_count:N \l_tmpa_seq) - 1 }
}
\ExplSyntaxOff
\begin{document}
\CountSubStr{~}{This~is a ~test}% 2
\CountSubStr{yes}{a yes b yes c yes deyesfg yehs ij}% 4
\end{document}
答案2
为了更好地衡量,基于 LuaLaTeX 的解决方案:
\documentclass{article}
\usepackage{luacode} % for '\luastring' and '\luaexec' macros
\newcommand\tildecount[1]{\luaexec{
_ , count = string.gsub ( \luastring{#1} , "~" , "~" )
tex.sprint ( count ) }}
\begin{document}
\tildecount{This~is a ~test}
\tildecount{~~~~----&&&&****____####~~~~$$$$~~~~}
\end{document}
附录:该\tildecount
宏可以很容易地推广到接受第二个输入,即,应计算其出现次数的字符串。通用宏的代码如下:
\newcommand\StringCount[2]{\luaexec{
_ , count = string.gsub ( \luastring{#2} , \luastring{#1} , "" )
tex.sprint ( count ) }}
例如,该宏可以用作
\StringCount{yes}{a yes b yes c yes desyesfg mess ij}
(结果:4)或
\StringCount{es}{a yes b mesh c best less xxDavieszz mess ij}
(结果:6)。
答案3
一种listofitems
方法。
\documentclass{article}
\usepackage{listofitems}
\newcommand\countem[2]{%
\setsepchar{#1}%
\readlist\countlist{#2}%
\the\numexpr\listlen\countlist[]-1\relax
}
\begin{document}
\countem{~}{This~is a ~test}
\countem{es}{a yes b mesh c best less xxDavieszz mess ij}
\end{document}
MWE 给出了2
和的适当答案6
。
答案4
考虑substr.sty
。
添加\usepackage{substr}
并尝试
\CountSubStrings{~}{This~is a ~test} % -> 2
或者
\newcounter{foo}
\SubStringsToCounter{foo}{;}{1;2;3;4}
\stepcounter{foo}
% \thefoo -> 4