删除命令参数内部的所有 {} 实例

删除命令参数内部的所有 {} 实例

是否可以删除作为命令参数的一部分传递的所有 {} 实例?

我想将 Tensor 包与 LyX 一起使用。问题是 LyX 总是将下标放在上标之前。Tensor 包有一个命令,\indices它接受像 这样的参数^a_{bc}^{de}_f并正确地为它们留出空格。为了强制 LyX 以正确的顺序接受这些参数,必须{}在适当的位置插入: 。不幸的是,Tensor 包不喜欢这样。我想创建一个中间命令,在将修改后的参数传递给 之前^{a}{}_{bc}{}^{de}{}_f删除多余的s 。我知道这些是具有特殊 catcodes 的特殊字符。我真的不知道从哪里开始。{}\indices

(我了解 Tensind 包。如果能让它发挥作用,我宁愿使用 Tensor。)

好的。这是一个简短的例子:

\documentclass[tikz]{article}
\usepackage{tensor}

\newcommand{\newindices}[1]{\indices{#1}} % would like to rewrite to remove every instance of {} from argument

\begin{document}%

\[
L\newindices{^{\mu}_{\nu}} %works
%L\newindices{^{\mu}{}_{\nu}} %does not work
\]
\end{document}

答案1

这个循环通过参数删除{}但注意不要扩展它在指数中找到的任何宏。

\documentclass[tikz]{article}
\usepackage{tensor}

\newcommand{\newindices}[1]{%
  \expanded{\noexpand\xindices{\zapempty#1\relax}}}
% would like to rewrite to remove every instance of {} from argument
\def\zapempty#1{%
\ifx\relax#1\space
\else
\ifx$#1$\else
\ifx^#1^\else
\ifx_#1_\else
\unexpanded{{#1}}%
\fi
\fi
\fi
\expandafter\zapempty
\fi}

\def\xindices#1{%
%\def\q{#1}\show\q% debugging
\indices{#1}}
\begin{document}%

\[
L\newindices{^{\mu}_{\nu}} %works
L\newindices{^{\mu}{}_{\nu}} %does not work
\]
\end{document}

答案2

我们可以使用\def\macro#1#顺序来首先扫描参数{,然后我们可以测试它是否{...}包含某些内容或不包含任何内容。

以下宏{}从其参数中删除所有出现的:

\def\newindices#1{\expandafter\indices\expandafter{\expanded{\newindicesA#1{\end}}}}
\def\newindicesA#1#{#1\newindicesB}
\def\newindicesB#1{%
   \ifx\end#1\empty \else 
      \ifx\relax#1\relax \else {#1}\fi 
      \expandafter\newindicesA
   \fi
}

\newindices{^{\mu}{}_{\nu}} % runs \indices{^{\mu}_{\nu}}

相关内容