如何在 LaTeX3 中的命令内构造变量名

如何在 LaTeX3 中的命令内构造变量名

我有这个示例文档结构:

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\begin{document}

\NewDocumentCommand\examplea{mm}{
  \tl_put_right:Nn \my:ns:#1 { #2 }
}

\NewDocumentCommand\exampleb{mm}{
  \tl_put_left:Nn \my:ns:#1 { #2 }
}

\NewDocumentCommand\examplec{mm}{
  \tl_set:Nn \my:ns:#1 { #2 }
}

\NewDocumentCommand\exampled{m}{
  \tl_new:N \my:ns:#1
}

\exampled{a}
\examplec{a}{stuff}
\examplea{a}{~here}
\exampleb{a}{My~}
\typeout{\my:ns:a}

\end{document}

但它给出了这个错误:

! Undefined control sequence.
<write> \my:ns:a

l.33 \typeout{\my:ns:a}

? ^D
! Emergency stop.
<write> \my:ns:a

l.33 \typeout{\my:ns:a}

如果我将其更改为以下文档结构:

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\begin{document}

\NewDocumentCommand\examplea{mm}{
  \tl_put_right:Nn \my:ns:#1 { #2 }
}

\NewDocumentCommand\exampleb{mm}{
  \tl_put_left:Nn \my:ns:#1 { #2 }
}

\NewDocumentCommand\examplec{mm}{
  \tl_set:Nn \my:ns:#1 { #2 }
}

\NewDocumentCommand\exampled{m}{
  \tl_new:N \my:ns:#1
}

\NewDocumentCommand\examplee{m}{
  \NewDocumentCommand{#1}{}
}

\examplee{\my:ns:a}
\exampled{a}
\examplec{a}{stuff}
\examplea{a}{~here}
\exampleb{a}{My~}
\typeout{\my:ns:a}

\end{document}

然后它在控制台中打印以下内容:

\my:ns:a

何时打印:

My stuff here

只有当我将其更改为以下文档结构时,它才能正确打印出来。

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\begin{document}

\NewDocumentCommand\examplea{mm}{
  \tl_put_right:Nn #1 { #2 }
}

\NewDocumentCommand\exampleb{mm}{
  \tl_put_left:Nn #1 { #2 }
}

\NewDocumentCommand\examplec{mm}{
  \tl_set:Nn #1 { #2 }
}

\NewDocumentCommand\exampled{m}{
  \tl_new:N #1
}

\exampled{\my:ns:a}
\examplec{\my:ns:a}{stuff}
\examplea{\my:ns:a}{~here}
\exampleb{\my:ns:a}{My~}
\typeout{\my:ns:a}

\end{document}

我想尝试使 API 如下:

\examplec{a}{stuff}
...

它只是a而不是\my:ns:a。这似乎可能与“扩展”有关,但这对我来说是一个新概念,所以我不知道从哪里开始。想知道如何使它能够像 一样使用它,\examplec{a}{stuff}但它定义了一个更大的变量名,例如\my:ns:a

答案1

构造名称时,需要c函数的类型变体,例如

\tl_put_right:cn { my:ns:#1 } {#2}

此处的令牌列表变量的官方命名方法如下

\tl_put_right:cn { l__my_ns_ #1 _tl } { #2 }

(我假设您的令牌列表变量是内部的,因此__名称中如此。)

相关内容