我想要一些这样的内容...
从这个开始:
\cmd{⟨x_1⟩}
\cmd{⟨x_1⟩,⟨x_2⟩}
\cmd{⟨y_1⟩}
\cmd{⟨y_1⟩,⟨y_2⟩}
\cmd{⟨x_1⟩,⟨y_1⟩}
\cmd{⟨x_1⟩,...,⟨x_n⟩,⟨y_1⟩}
\cmd{⟨x_1⟩,⟨y_1⟩,...,⟨y_n⟩}
\cmd{⟨x_1⟩,...,⟨x_n⟩,⟨y_1⟩,...,⟨y_m⟩}
更改为:
否则类似于:\cmd{⟨x_1⟩,⟨z⟩}
,\cmd{⟨x_1⟩,⟨x_2⟩,⟨z⟩}
,\cmd{⟨z⟩,⟨y_1⟩}
,\cmd{⟨z⟩,⟨y_1⟩,⟨y_2⟩}
分别代表 1、2、3 和 4。
*下标和省略号不是输入或输出的一部分,尖括号也不是。
**另一个例子。
某物从:\command{Lapple Lbanana Rorgange}
到:苹果、香蕉、*
橙子。[方法 1]
或从:\command{apple banana * organge}
[方法 2]
或者,预先将“苹果”和“香蕉”定义为在左侧,将“橘子”定义为在右侧。[方法 3]
***我被要求更具体一点,而且严格来说,这将是一个参数的命令。很抱歉,我无法正确描述我的问题。以下是我真正希望实现的两类事情:
答案1
您可以定义以下 TeX 宏:
\def\cmd#1{$\def\cmdS{}\let\cmdX=\cmdXA \cmdA#1,⟨⟩,}
\def\cmdA⟨#1⟩,{%
\ifx \relax#1\relax
\ifx\cmdX\cmdXA \Star\fi $%
\else
\isinunder#1_\iffalse \else \cmdX #1\end \fi
\expandafter\cmdC
\fi
}
\def\cmdXA #1#2_#3\end{%
\ifx\relax#2\relax
\ifx#1x\cmdS A_{#3}\def\cmdS{,}
\else \ifx#1y\Star \let\cmdX=\cmdXB \def\cmdS{}\cmdX #1_#3\end \fi
\fi\fi
}
\def\cmdXB #1#2_#3\end{%
\ifx\relax#2\relax
\ifx#1y\cmdS B_{#3}\def\cmdS{,}\fi
\fi
}
\def\cmdC{\futurelet\next\cmdD}
\def\cmdD{\ifx.\next \expandafter\cmdDdots \else \expandafter\cmdA\fi}
\def\cmdDdots...,{,\dots \cmdA}
\def\isinunder#1_#2\iffalse{\ifx\relax#2\relax}
\def\Star{\mathrel{\star}}
%% test:
\cmd{⟨x_1⟩}
\cmd{⟨x_1⟩,⟨x_2⟩}
\cmd{⟨y_1⟩}
\cmd{⟨y_1⟩,⟨y_2⟩}
\cmd{⟨x_1⟩,⟨y_1⟩}
\cmd{⟨x_1⟩,...,⟨x_n⟩,⟨y_1⟩}
\cmd{⟨x_1⟩,⟨y_1⟩,...,⟨y_n⟩}
\cmd{⟨x_1⟩,...,⟨x_n⟩,⟨y_1⟩,...,⟨y_m⟩}
\cmd{⟨x_1⟩,⟨z⟩}; \cmd{⟨x_1⟩,⟨x_2⟩,⟨z⟩}; \cmd{⟨z⟩,⟨y_1⟩}; \cmd{⟨z⟩,⟨y_1⟩,⟨y_2⟩}
\bye
答案2
如果您不介意明确输入星号,您可能可以使用一系列替换来完成:
\ExplSyntaxOn
\NewDocumentCommand\cmd{mmmmm}{
\tl_set:Nn \l_tmpa_tl { #5 }
\tl_replace_all:Nnn \l_tmpa_tl {x}{#1}
\tl_replace_all:Nnn \l_tmpa_tl {y}{#2}
\tl_replace_all:Nnn \l_tmpa_tl {*}{#3}
\tl_replace_all:Nnn \l_tmpa_tl {,}{#4}
\l_tmpa_tl
}
\ExplSyntaxOff
\documentclass{article}
\begin{document}
\[\cmd{A}{B}{\star}{,}{x_1*}\]
\[\cmd{A}{B}{\star}{,}{x_1,x_2*}\]
\[\cmd{A}{B}{\star}{,}{*y_1}\]
\[\cmd{A}{B}{\star}{,}{*y_1,y_2}\]
\[\cmd{A}{B}{\star}{,}{x_1*y_1}\]
\[\cmd{A}{B}{\star}{,}{x_1,x_2,x_3*y_1}\]
\[\cmd{A}{B}{\star}{,}{x_1*y_1,y_2,y_3}\]
\[\cmd{A}{B}{\star}{,}{x_1,x_2,x_3*y_1,y_2,y_3}\]
\[\cmd{A}{B}{\star}{,}{x_1,x_2,x_3*y_1,y_2,y_3*}\]
\end{document}
如果这不符合您的需求,请提供您需要的准确描述。
对于所谓“干净代码”的开发来说,精确的规范是必需的。
\tl_replace_all:Nnn
如果嵌套在花括号中的内容也需要替换,则不起作用。
当然,由 egreg 发布的答案后来已被删除 ;-) ,其结果看起来比我提议的要好得多。
但是,我不愿意通过“漂亮的排版”和任何细微的细节来解决问题,因为可能会通过注释“添加”要求,从而需要更改或完全重写代码。
答案3
您可以像这样迭代令牌列表(我在这里使用x
y
*
和.
作为区分令牌)
\documentclass{article}
\def\cmd#1{\zcmd#1s}
\def\zcmd#1{\csname zcmd#1\endcsname}
\expandafter\def\csname zcmdx\endcsname_#1{A_{#1}\zcmd}
\expandafter\def\csname zcmdy\endcsname_#1{B_{#1}\zcmd}
\expandafter\def\csname zcmd*\endcsname{*\zcmd}
\expandafter\def\csname zcmd.\endcsname{\ldots\zcmd}
\expandafter\def\csname zcmds\endcsname{}
\begin{document}
$\cmd{x_1}$
$\cmd{x_1*}$
$\cmd{*y_1}$
$\cmd{x_1}$
$\cmd{x_1.x_n*y_1.y_n}$
\end{document}