我正在寻找一条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}