如何在命令中使用 xstring IfEq?

如何在命令中使用 xstring IfEq?

我写了一个命令来访问一个硬编码的字符串(“For Reasons™”,因为 xstringStrMid在处理大字符串时速度非常慢),现在想知道

  • 为什么结果可以打印但不能重复使用?
  • 我该如何编写这个命令以便可以进一步使用它?

此代码片段按预期运行并生成以下pdf。

  debug for part two
  \newcounter{debugctr}
  \setcounter{debugctr}{-1}
    {\loop
    \stepcounter{debugctr}
    \edef\tmpinput{\the\numexpr \value{debugctr} - 0}
    \def\tmpchar{\expandafter\lucidcharat\tmpinput}
    (\tmpinput)[\tmpchar],
    %\edef\tmpcharr{\tmpchar}
    \show\tmpchar
    %\typeout{tmpchar is \tmpchar}
    \ifnum \value{debugctr}<3
    \repeat }

在此处输入图片描述

该命令lucidcharat 定义如下:

\newcommand{\lucidcharat}[1]{
\edef\tmpp{#1}
\IfEq{\tmpp}{0}{1}{}%
\IfEq{\tmpp}{1}{2}{}%
\IfEq{\tmpp}{2}{2}{}%
}

并输入到另一个文件中\input{sneakycode}

我认为这一切都与评估的变化无常有关xstring。为了证明我所说的“结果不能进一步使用”的意思,取消注释上面注释的一行,你会发现两者都不起作用typeoutedef它们会出错

!  Undefined control sequence.
\reserved@a ->\def \xs@dessep
{,}\@xs@readdecimalpart
l.617 \repeat

请帮助我理解如何编写内部使用的命令,IfEq 以便可以重复使用,例如用于比较输出以及为什么它当前不起作用。

以下是完整的 MCVE,供您再次复制粘贴(与上面的相同,只是放在一起成为一个文件):

\documentclass{article} \usepackage[utf8]{inputenc}
\usepackage{xstring}

\newcommand{\lucidcharat}[1]{
\edef\tmpp{#1}
\IfEq{\tmpp}{0}{1}{}%
\IfEq{\tmpp}{1}{2}{}%
\IfEq{\tmpp}{2}{2}{}%
}

\begin{document}
  debug for part two
  \newcounter{debugctr}
  \setcounter{debugctr}{-1}
    {\loop
    \stepcounter{debugctr}
    \edef\tmpinput{\the\numexpr \value{debugctr} - 0}
    \def\tmpchar{\expandafter\lucidcharat\tmpinput}
    (\tmpinput)[\tmpchar],
    %\edef\tmpcharr{\tmpchar}
    \show\tmpchar
    %\typeout{tmpchar is \tmpchar}
    \ifnum \value{debugctr}<3
    \repeat }
\end{document}

答案1

目前尚不清楚您想要的输出是什么,但由于您需要它在 edef 中工作,因此您需要可扩展的测试,这用于\ifcase测试参数是 0 1 还是 2,并分别输出 1 2 2。

\documentclass{article} \usepackage[utf8]{inputenc}


\newcommand{\lucidcharat}[1]{%
\ifcase\numexpr#1\relax
1\or2\or2\else\fi}

\begin{document}
  debug for part two
  \newcounter{debugctr}
  \setcounter{debugctr}{-1}
    {\loop
    \stepcounter{debugctr}%
    \edef\tmpinput{\the\numexpr \value{debugctr} - 0}%
    \def\tmpchar{\expandafter\lucidcharat\tmpinput}%
    (\tmpinput)[\tmpchar],
    \edef\tmpcharr{\tmpchar}%
    \show\tmpcharr
    \typeout{tmpchar is \tmpchar}%
    \ifnum \value{debugctr}<3
    \repeat }
\end{document}

相关内容