\newcommand 和 \NewDocumentCommand 宏是否有“shift”指令?

\newcommand 和 \NewDocumentCommand 宏是否有“shift”指令?

我正在寻找一条shift指令,它将旋转传递给 LaTeX 宏的参数。这个想法是,如果省略了可选参数,那么它们应该从开始参数列表的末尾而不是末尾。

这是我的示例用例:

\NewDocumentCommand{\J}{o o}{
    \IfNoValueTF{#2}
    {
        \IfNoValueTF{#1}
        {\tensor{J}{}}
        {\tensor{J}{}({#1})}
    }
    {
        \tensor{J}{^{#1}}({#2})
    }
}

我可以像这样使用该命令:

\begin{equation}
    \J \quad \J[x] \quad \J[\mu][x]
\end{equation}

给出: 在此处输入图片描述

如果我可以使用一条假想指令像这样定义上述命令\J,那么它将更易于阅读\shiftright{n}

\NewDocumentCommand{\J}{o o}{
  \IfNoValueTF{#2}{\shiftright}     % \J[x] --> \J[][x]
  \IfNoValueTF{#1}{\shiftright{2}}  % \J    --> \J[][]
  % \J[\mu][x] --> \tensor{J}{^{\mu}}(x)
  \tensor{J}{^{#1}}{#2}
}

实际上,我甚至不知道是否可以更改#n宏中的值。如果有人能告诉我如何做到这一点,并检查函数的参数数量,那也会很有帮助。然后我可能可以定义自己的\shiftright宏。

或者,还有其他想法可以使上述习语比我的第一个(工作)定义更具表现力和更容易阅读吗?

答案1

据我所知,像这样移位参数是不可能的,即使在 expl3 中也不行(我可能错了)。另外,如果可以的话,那么在您的示例中,打印括号(以提供至少一个参数为条件)会使移位过程复杂化,我认为。

也许更容易阅读的方法是,通过定义辅助宏来明确枚举这三种情况\first\second

\documentclass{article}
\usepackage{tensor}
\usepackage{xparse}
\NewDocumentCommand{\J}{o o}{
  \IfNoValueTF{#1}{\def\first{}\def\second{}}{%          no arguments provided
  \IfNoValueTF{#2}{\def\first{}\def\second{(#1)}}{%      one argument provided
                   \def\first{#1}\def\second{(#2)}}}%  both arguments provided 
  \tensor{J}{^{\first}}{\second}
}
\begin{document}
\begin{equation}
    \J \quad \J[x] \quad \J[\mu][x]
\end{equation}
\end{document}

输出与问题相同。

答案2

更简单的解决方案是将输入格式更改为:

\J \quad \J[x] \quad \J^{\mu}[x]

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{tensor}
\usepackage{xparse}

\NewDocumentCommand{\J}{e{^} o}{
  \tensor{J}
      {^{\IfValueT{#1}{#1}}}
      {\IfValueT{#2}{(#2)}}
}
\begin{document}
\begin{equation}
    \J \quad \J[x] \quad \J^{\mu}[x]
\end{equation}
\end{document}

答案3


如果我理解正确的话,使用“\J[x] --> \J[][x]\J --> \J[][]\J[\mu][x] --> \tensor{J}{^{\mu}}(x)”机制,
几乎相同的分支/分叉(当前取决于)\IfNoValueTF必须取决于[-preceded ]-delimited 参数的空性:
如果第二个可选参数为空,则不希望括号之间没有任何内容。
如果第一个可选参数为空,则不希望上标字符^

所以我不知道你是否真的通过这种方式获得了代码的可读性。

顺便问一下:

\documentclass{article}
\usepackage{tensor}

\NewDocumentCommand{\J}{o o}{%
  \IfNoValueTF{#2}{\tensor{J}{}\IfNoValueF{#1}{({#1})}}%
                  {\tensor{J}{^{#1}}({#2})}%
}%

\begin{document}

\begin{equation}
    \J \quad \J[x] \quad \J[\mu][x]
\end{equation}       

\end{document}

你可以使用 expl3F类型扩展:

\documentclass{article}
\usepackage{tensor}

\ExplSyntaxOn
\NewDocumentCommand{\J}{o o}{%
  \exp_args:Nnf\use:nn
               {\tensor{J}}%
               {\IfNoValueTF{#2}{{}\IfNoValueF{#1}{({#1})}}{{^{#1}}({#2})}}%
}%
\ExplSyntaxOff

\begin{document}

\begin{equation}
    \J \quad \J[x] \quad \J[\mu][x]
\end{equation}       

\end{document}

相关内容