如何解析包含 \let 的宏?

如何解析包含 \let 的宏?

我的情况与以下情况类似,但希望有所不同如何将控制序列“扩展”\let为字符?,因为这个问题不允许肯定的答案。如果可以避免的话,我想解析,而不是扩展,但不是逐个字符地解析(例如逐个字符地解析宏参数以进行条件执行)。现有的解析器如是否可以定义一个可扩展的命令来从其参数中删除控制序列?不幸的是,它们似乎对我来说不起作用(好吧,也就是说,我无法让它们工作)。

考虑以下内容:有这样的\let定义

\newif\ifintheway
\inthewayfalse
\show\inthewayfalse % ->\let \ifintheway \iffalse .

它位于一个宏中\parseme,我想从中提取文本17

\def\parseme{\inthewayfalse 17}

我怎样才能做到这一点?

显然,使用扩展宏\edef\parsedmacro{\parseme}不起作用,我收到了投诉

! Incomplete \iffalse; all text was ignored after line 5.

\fi但是,在中添加\edef也无济于事。我还能做些什么吗?

在我的处境下,我甚至知道障碍是什么。它总是\intheway。然后是我的文本(我知道它是一个数字),然后宏结束。最后,作为一个额外的障碍,\parseme实际上是一个`\csname b\@citeb\endcsname。

(肯定的回答也会解决在 Babel 存在的情况下,scrltt2 的自定义带字母编号的 \thebibliography 不起作用,至少部分如此。)

答案1

可以扩展明确的数字而不改变它,并且可以重新定义不需要的命令序列以使其在扩展时消失:

% Setup
\makeatletter
\newif\ifintheway
\def\@citeb{foobar}
\def\bfoobar{\inthewayfalse 17}

% Extract the number from \csname b\@citeb\endcsname
% and store it in the macro \mynumber    
\begingroup
  \let\inthewayfalse\@empty
  \edef\x{\endgroup
    \def\noexpand\mynumber{%
      \csname b\@citeb\endcsname
    }%
  }%
\x

% Show the result in the console:
\typeout{My number is "\mynumber".}
\stop

关键部分是:

\let\inthewayfalse\@empty
% same as:
\def\inthewayfalse{}
% or
\newcommand*{\inthewayfalse}{}

并且扩展去掉了\intheway

\edef\mynumber{\csname b\@citeb\endcsname}

该示例将其放在一个组中以保持本地的重新定义\inthewayfalse

相关内容