新命令和与 xparse 对应的星号对应项

新命令和与 xparse 对应的星号对应项

以下工作符合预期:

\newcommand{\engl}[2]{#1 (en. \textsl{#2})\index{en-ro}{#2}}

然而,我想要实现的是一个*只添加索引而不添加可见文本的版本,如下所示:

\newcommand{\engl*}[2]{#1 (en. \textsl{#2})\index{en-ro}{#2}\term{#1!#2}\term{#2!#1}}

当然,这是行不通的(pdf 已经编译好了,但是有很多原始定义中没有的警告),所以我尝试用 xparse 做一些等效的事情:

\usepackage{xparse}
\NewDocumentCommand\engl{sm}{%
  \IfBooleanTF#1
    {\index{en-ro}{#1}\term{#1}}
    {#1 (en. \textsl{#2})\index{en-ro}{#2}\term{#1!#2}\term{#2!#1}}%
}

这也不起作用。

如何正确创建这样的命令及其*对应命令?

答案1

xparse“视角”来看,明星是额外的可选参数。因此,#1是一个布尔值,表示“有一颗星星”,而#2#3是两个强制参数。这导致

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\engl}{smm}{%
  #2 (en. \textsl{#3})\index{en-ro}{#3}%
  \IfBooleanT#1
    {\textrm{#2!#3}\textrm{#3!#2}}%
}
\begin{document}

\engl{X}{aaa}

\engl*{X}{aaa}

\end{document}

我尽可能地共享代码,并且只提供了明星存在的真实情况。

答案2

这是标签但不依赖于 xetex,而且你实际上不需要xparse星号形式,因为 latex 对此提供了相当好的支持。我将其更改\term\textrm,这样它就可以运行了。

只需定义 nostar 和 star 形式,然后定义顶级命令即可在它们之间切换

\documentclass{article}


\newcommand{\englnostar}[2]{#1 (en. \textsl{#2})\index{en-ro}{#2}}

\newcommand{\englstar}[2]{#1 (en. \textsl{#2})\index{en-ro}{#2}\textrm{#1!#2}\textrm{#2!#1}}

\makeatletter
\newcommand\engl{\@ifstar\englstar\englnostar}
\makeatother

\begin{document}

\engl{X}{aaa}



\engl*{X}{aaa}


\end{document}

相关内容