\textbf 中的 \int_step_inline:nn 导致参数编号非法

\textbf 中的 \int_step_inline:nn 导致参数编号非法

以下是 MWE:

\documentclass{article}
\usepackage{expl3}

\begin{document}

\ExplSyntaxOn
\int_step_inline:nn { 1 } {#1} % works fine
\textbf { \int_step_inline:nn { 1 } {#1} } % don't work
\ExplSyntaxOff

\end{document}

会出现错误:“\reserved@a 定义中的参数数量非法。”

看来您无法定义带有参数的宏\textbf(和其他文本字体命令)。

确实有一些方法可以避免这种情况(例如\cs_set:Nn \__my_aux: { \int_step_inline... }或仅使用\int_step_function:nN),但有没有什么方法可以使其发挥\textbf { \int_step_inline:nn { 1 } {#1} }作用?

(我的环境:TeXLive 2021,expl3:发布于 2021-08-27)

答案1

通常,如果#在定义中内联,您可以引用它,##但是 latex2e 文本命令会进行内部定义以检查文本是否为空(这需要 double #),但然后使用原始参数进行排版(这需要 single #),所以没有有效的参数。

一种可能的方法是使用 e-tex 测试来避免空参数的内部定义,

\documentclass{article}
\usepackage{expl3}% only needed with old latex versions

\makeatletter
\def \text@command #1{%
  \if\relax\detokenize{#1}\relax
    \let \check@icl \@empty
    \let \check@icr \@empty
  \else
    \iffalse %\ifx \reserved@a \space % need to think about this one
      \let \check@icl \@empty
      \let \check@icr \@empty
    \else
      \check@nocorr@ #1\nocorr\@nil
    \fi
  \fi
}
\makeatother
\begin{document}

\ExplSyntaxOn
\int_step_inline:nn { 1 } {#1} % works fine

\textbf { \int_step_inline:nn { 1 } {#1} } % don't work
\ExplSyntaxOff

\end{document}

或者更好,更符合原始精神,使用不需要##的定义形式,所以

\documentclass{article}
\usepackage{expl3}% only needed with old latex versions

\makeatletter
\def \text@command #1{%
  \edef \reserved@a {\unexpanded{#1}}%
  \ifx \reserved@a \@empty
    \let \check@icl \@empty
    \let \check@icr \@empty
  \else
    \ifx \reserved@a \space
      \let \check@icl \@empty
      \let \check@icr \@empty
    \else
      \check@nocorr@ #1\nocorr\@nil
    \fi
  \fi
}
\makeatother
\begin{document}

\ExplSyntaxOn
\int_step_inline:nn { 1 } {#1} % works fine

\textbf { \int_step_inline:nn { 1 } {#1} } % don't work
\ExplSyntaxOff

\end{document}

相关内容