![删除命令参数内部的所有 {} 实例](https://linux22.com/image/470516/%E5%88%A0%E9%99%A4%E5%91%BD%E4%BB%A4%E5%8F%82%E6%95%B0%E5%86%85%E9%83%A8%E7%9A%84%E6%89%80%E6%9C%89%20%7B%7D%20%E5%AE%9E%E4%BE%8B.png)
是否可以删除作为命令参数的一部分传递的所有 {} 实例?
我想将 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}}