创建用户定义命令名称的最佳实践

创建用户定义命令名称的最佳实践

我想让包的用户定义将填充某些独特内容的命令名称,以便他们可以使用他们喜欢的命令名称来调用该内容。让他们给我一个字符串,我从中创建命令并填充内容(如在\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\endcsnameuse\csname my-#1\endcsname或类似的东西,以避免意外与东西发生冲突(参见使用 c@... 的计数器)

相关内容