我想让包的用户定义将填充某些独特内容的命令名称,以便他们可以使用他们喜欢的命令名称来调用该内容。让他们给我一个字符串,我从中创建命令并填充内容(如在\tokify
我的 MWE 中一样)是一种更好的做法吗?还是让他们告诉我实际的(尚未定义的)命令名称,而我只需填充内容(如在\populate
我的 MWE 中一样)更好?
MWE 足够简单,您可能会说“只需让他们创建\def
”,但对于实际应用而言,它将节省更多击键次数,让我创建命令的内容。
\documentclass{article}
\usepackage{stringstrings}
\makeatletter
\newcommand\tokify[1]{%
\expandafter\def\csname#1\endcsname{Content: #1}%
}
\newcommand\populate[1]{%
\edef\sv@name{\expandafter\@gobble\detokenize{#1}}%
\noblanks[q]{\sv@name}%
\expandafter\def\csname\thestring\endcsname{Content: \thestring}%
}
\makeatother
\begin{document}
\tokify{xyz}
\xyz
\populate{\abc}
\abc
\end{document}
答案1
我会使用您认为更自然的任何一个,但使用相同的形式进行声明和使用。
因此 LaTeX 计数器使用名称形式
\newcounter{foo}
\arabic{foo}
\setcounter{foo}{1}
但 LaTeX 长度使用命令形式:
\newlength\foo
\setlength\foo{3pt}
实际上,没有任何逻辑理由可以解释为什么它们会有所不同,但至少它们在个体上是一致的。
同样,使用命令形式的命令
\newcommand\foo{..}
\foo
以及使用名称的环境
\newenviroment{foo}{..}{..}
\begin{foo}
所以我不会
\tokify{xyz}
\xyz
但
\tokify{xyz}
\usething{xyz}
可以。
但在那种情况下,我不会使用\csname#1\endcsname
use\csname my-#1\endcsname
或类似的东西,以避免意外与东西发生冲突(参见使用 c@... 的计数器)