以下工作符合预期:
\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}