在多个括号内展开

在多个括号内展开

我发现 LaTeX 中的扩展确实令人困惑 :(。

考虑以下expl3代码:

(请注意\l_tmpa_tl\l_tmpb_tl是在其他地方设置的。所以我不能只说\cs_set_nopar:Nn \dcp_baz: { { xyz } { \S 6 } }。我也不能说\cs_set_nopar:Nn \dcp_baz: { { \l_tmpa_tl } { \l_tmpb_tl } }。我需要扩展它。但我不希望它详尽地扩展。我只想恢复变量\l_tmpa_tl和中的内容\l_tmpb_tl。)

\documentclass{article}
\usepackage[T1]{fontenc}
\ExplSyntaxOn
\cs_new_nopar:Nn \dcp_foo:
  {
    \tl_set:Nn \l_tmpa_tl { xyz }
    \tl_set:Nn \l_tmpb_tl { \S 6 }
    \exp_args:NVV \dcp_bar:nn \l_tmpa_tl \l_tmpb_tl
    \dcp_baz:
  }
\cs_new_nopar:Nn \dcp_bar:nn
  {
    \cs_set_nopar:Nn \dcp_baz: { {#1} {#2} }
  }
\cs_set_eq:NN \Foo \dcp_foo:
\ExplSyntaxOff
\begin{document}
\Foo
\end{document}

这就是我想要的,最终\dcp_baz:成为一个包含的宏{xyz}{\S 6}

不过,我有两个问题:

  1. 我可以在expl3不使用辅助函数的情况下完成此操作\dcp_bar:nn吗?
  2. 我该如何在 LaTeX2e 中做到这一点?

答案1

2 和 1 的几个版本

\documentclass{article}

\begin{document}

\newcommand\FooA{\def\dcpBaz{{xyz}{\S 6}}}
\FooA \show\dcpBaz

\newcommand\FooB{%
  \def\tmpa{xyz}%
  \def\tmpb{\S 6}%
  \edef\dcpBaz{%
     {\unexpanded\expandafter{\tmpa}}{\unexpanded\expandafter{\tmpb}}}}
    \FooB \show\dcpBaz

in a pure expl3 universe \verb|\S| would be etex protected not via `\verb|\protect|`
so

\protected\def\newS{\S}


\ExplSyntaxOn
\cs_new_nopar:Nn \dcp_foo:
  {
    \tl_set:Nn \l_tmpa_tl { xyz }
    \tl_set:Nn \l_tmpb_tl { \newS 6 }
    \cs_set_nopar:Nx \dcp_baz: { {\l_tmpa_tl} {\l_tmpb_tl} }
    \show\dcp_baz:
  }
\cs_set_eq:NN \FooC \dcp_foo:
\ExplSyntaxOff

\FooC
\end{document}

相关内容