我写了一个命令来访问一个硬编码的字符串(“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
。为了证明我所说的“结果不能进一步使用”的意思,取消注释上面注释的一行,你会发现两者都不起作用typeout
。edef
它们会出错
! 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}