我正在尝试构建一个代码来计算字符串中的数量\
。我的代码可以与任何其他符号一起使用(例如,如果我需要计算“a”的数量,那就可以了)。我已经尝试将反斜杠符号的 catcode 修改为 12,但没有成功。
有任何想法吗?
我的(不完整的)解决方案:
\newcounter{alternatives}
\renewcommand\thealternatives{\alph{alternatives}}
\makeatletter
\def\endtab{\vspace{-4 mm}}
\def\endtabi{\endtab}
\newcount\testcount
\def\gobblechar{\let\char= }
\newcount\slashcount
\def\countunlessnil
{%
\let\a=0
\let\\=\a
\ifx\char\a
% \slashcount=
\advance\slashcount by 1
\fi
\ifx\char\nil
\let\next=\relax%
\else%
\let\next=\auxcountchar%
\fi
\let\\=\\
\next
}%
\def\auxcountchar{%
\afterassignment\countunlessnil\gobblechar%
}
\def\countchar#1{\edef\xx{#1} \expandafter\auxcountchar\xx\nil}
\def\analyze#1{%
\countchar{#1}%
}
\newlength{\alternativessize}
\newlength{\abcde}
\settowidth{\abcde}{a)~b)~c)~d)~e)}
\WithSuffix\DeclareRobustCommand\tab+{\@tabbb}
\def\@tabbb#1 \endtab
{
\tabiiii#1
\endtab\\
\analyze{dfgreggegewg\a}
\the\testcount
% \setcounter{alternatives}{0}
\settowidth{\alternativessize}{#1}
\setlength{\alternativessize}{\linewidth - \alternativessize}
\setlength{\alternativessize}{\alternativessize - \abcde}
\the\value{alternatives}\\[4 mm]
\ifthenelse{\equal{\value{alternatives}}{5}}
{
\setlength{\alternativessize}{0.17\alternativessize}
}
{
\setlength{\alternativessize}{0.27\alternativessize}
}
\setcounter{alternatives}{0}
% \setlength{\alternativessize}{0.18\alternativessize}
\begin{minipage}[t]{\linewidth}
\tabiii#1
\end{minipage}\vspace{-2 mm}\\
\endtab\\
\setcounter{alternatives}{0}
}
\def\tabiii#1\\
{
\def\tempa{#1}
\ifx\tempa\endtabi
\endtab
\else
\if\relax\detokenize{#1}\relax
\else
\stepcounter{alternatives}\thealternatives)~~\@ifnextchar {_}{}#1
\hspace{\alternativessize}
\fi
\expandafter\tabiii
\fi
}
\def\tabiiii#1\\
{
\def\tempa{#1}
\ifx\tempa\endtabi
\endtab
\else
\if\relax\detokenize{#1}\relax
\else
\stepcounter{alternatives}\thealternatives)~~\@ifnextchar {_}{}#1
\hspace{\alternativessize}
\fi
\expandafter\tabiii
\fi
}
\makeatother
当调用 tabiii 时,它会对序列进行去标记化:
aaaaa\\
bbbbb\\
ccccc\\
ddddd\\
等等,在每行前面放置一个标记 a)、b)、c)。我需要计算 \ 的数量,或者获取 的数量\thealternative
。原因:我正在尝试编写一个不能在同一行中放置 4 或 5 个替代方案的代码,但我需要在 TeX 读取之前知道字符串大小。这就是我调用 tabiii 和 tabiiii 的原因:tabiiii 读取句子以计算空格的大小,tabiii 将内容打印在 PDF 文件上。有什么想法吗?
答案1
xstring
以下是涉及(为了计算出现次数)和 catcode 更改的解决方案:
\documentclass{article}
\usepackage{xstring}
\begingroup
\catcode`\|0
|catcode`|\12
|makeatletter
|gdef|mymacro{|begingroup|catcode`|\12 |mymacro@i}
|gdef|mymacro@i#1{|endgroup|StrCount{#1}\}
|endgroup
\begin{document}
\mymacro{\ifnum`\\=0 \textbf{0}\else\textif{non zero}\fi}
\end{document}
答案2
有两种方法可以获取\\
参数中的标记数。在这两种情况下,计数器\l_cnobs_count_int
都将包含该数字(本例中为 3)。
第一种方式(使用 token 列表)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\countbstl}{m}
{
\cnobs_main_one:n { #1 }
}
\int_new:N \l_cnobs_count_int
\cs_new_protected:Npn \cnobs_main_one:n #1
{
\int_zero:N \l_cnobs_count_int
\tl_map_inline:nn { #1 }
{
\tl_if_eq:nnT { ##1 } { \\ } { \int_incr:N \l_cnobs_count_int }
}
\int_show:N \l_cnobs_count_int
}
\ExplSyntaxOff
\countbstl{aaa\\ bbb \\ ccc \\}
\stop
第二种方法(使用正则表达式)
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\countbsregex}{m}
{
\cnobs_main_two:n { #1 }
}
\int_new:N \l_cnobs_count_int
\cs_new_protected:Npn \cnobs_main_two:n #1
{
\int_zero:N \l_cnobs_count_int
\regex_count:nnN { \c{ \\ } } { #1 } \l_cnobs_count_int
\int_show:N \l_cnobs_count_int
}
\ExplSyntaxOff
\countbsregex{aaa\\ bbb \\ ccc \\}
\stop
可以很容易地修改它来计算控制序列的数量;通过将行更改\regex_count:nnN
为
\regex_count:nnN { \c{ .* } } { #1 } \l_cnobs_count_int
输入如下
\countbsregex{\textbf{aaa}\\ bbb \\ ccc \\}
将在计数器中存储 4。进一步改变
\regex_count:nnN { \c{ .* } | \cA. } { #1 } \l_cnobs_count_int
也会计算活跃角色,因此
\countbsregex{\textbf{aaa}\\ bbb~bbb \\ ccc \\}
在计数器中存储 5。
很难说如何在非常复杂(且无法解释)的代码中使用它。