具有可变数量参数的命令 [*1 个参数] + 根据参数数量和参数类型的不同行为

具有可变数量参数的命令 [*1 个参数] + 根据参数数量和参数类型的不同行为

我想要一些这样的内容...
从这个开始:

  1. \cmd{⟨x_1⟩}
  2. \cmd{⟨x_1⟩,⟨x_2⟩}
  3. \cmd{⟨y_1⟩}
  4. \cmd{⟨y_1⟩,⟨y_2⟩}
  5. \cmd{⟨x_1⟩,⟨y_1⟩}
  6. \cmd{⟨x_1⟩,...,⟨x_n⟩,⟨y_1⟩}
  7. \cmd{⟨x_1⟩,⟨y_1⟩,...,⟨y_n⟩}
  8. \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}

相关内容