字符串中 \(反斜杠)字符的数量

字符串中 \(反斜杠)字符的数量

我正在尝试构建一个代码来计算字符串中的数量\。我的代码可以与任何其他符号一起使用(例如,如果我需要计算“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。


很难说如何在非常复杂(且无法解释)的代码中使用它。

相关内容