我发现 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}
。
不过,我有两个问题:
- 我可以在
expl3
不使用辅助函数的情况下完成此操作\dcp_bar:nn
吗? - 我该如何在 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}