![如何在 LaTeX3 中的命令内构造变量名](https://linux22.com/image/372847/%E5%A6%82%E4%BD%95%E5%9C%A8%20LaTeX3%20%E4%B8%AD%E7%9A%84%E5%91%BD%E4%BB%A4%E5%86%85%E6%9E%84%E9%80%A0%E5%8F%98%E9%87%8F%E5%90%8D.png)
我有这个示例文档结构:
\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 }
(我假设您的令牌列表变量是内部的,因此__
名称中如此。)