以下是 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}