同義語のインデックス作成で複数のエントリが生成されないように設定することは可能ですか?たとえば、テキストに\index{cur}
、、\index{hound}
およびが含まれている場合\index{mutt}
、これらを「dog」というエントリにまとめることはできますか?(これらのキーは自動的に生成されると仮定します。そうでない場合は、次のように入力します。\index{dog}
毎回入力するだけです。)
背景: LaTeX3/expl3 では、関数の特定のバリアントをまとめて定義することができます。(実験的な) クラスに関してはl3doc
、例は次のようになります。
% \begin{macro}[pTF]{\bool_if:N}
% Blah blah blah.
% \begin{macrocode}
\prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF }
{ … }
% \end{macrocode}
% \end{macro}
文書化されたコード リストでは、余白に\bool_if:N(TF)
と の両方が表示されます。生成されたコードでは、 、、 の4つの関数が定義されます。\bool_if_p:N
\bool_if_p:N
\bool_if:NT
\bool_if:NF
\bool_if:NTF
[注: この表記法は、\bool_if:N(TF)
このサイトで私が提供できる実際の表記法に最も近いものですが、この議論には十分近いものです。]
問題は、csnamesの自動インデックス作成がdoc.sty
この行を存在しない関数のインスタンスとしてインデックス付けします\bool_if:N
。
[注記:l3doc
コロンおよびアンダースコアが正しく認識されるように catcodes を調整します。]
それで…関数バリアントが同義語であることをインデックス生成に伝える方法はあるのでしょうか?つまり、コード内でバリアントが使用されているさまざまな場所を 1 つのインデックス エントリに統合できますか? (エントリはおそらく のようになります\bool_if:N(TF), \bool_if_p:N
。)
\bool_if:N
代替オプション: 単一のキーがそれ自体としてではなく、実際に存在する 4 つのバリアントのインスタンスとして認識されるように設定することは可能ですか?
答え1
\index
引数に特別なもの ( や など@
)が必要ない場合は!
、次のように記述すれば問題ありません。
\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{xparse}
\ExplSyntaxOn
\cs_set_eq:NN \solomon_index:n \index
\NewDocumentCommand{\definesynonyms}{ m m }
{
\solomon_define_synonyms:nn { #1 } { #2 }
}
\cs_new_protected:Npn \solomon_define_synonyms:nn #1 #2
{
\clist_map_inline:nn { #2 }
{
\tl_gset:cn { g_solomon_syn_##1_tl } { #1 }
}
}
\RenewDocumentCommand{\index}{ m }
{
\tl_if_exist:cTF { g_solomon_syn_#1_tl }
{
\solomon_index:v { g_solomon_syn_#1_tl }
}
{
\solomon_index:n { #1 }
}
}
\cs_generate_variant:Nn \solomon_index:n { v }
\ExplSyntaxOff
\definesynonyms{dog}{cur,hound,mutt}
\begin{document}
\show\index
A\index{dog}
\newpage
B\index{cur}
\newpage
C\index{hound}
\newpage
D\index{mutt}
\newpage
\printindex
\end{document}
生成されたファイルの内容は次のとおりです.idx
。
\indexentry{dog}{1}
\indexentry{dog}{2}
\indexentry{dog}{3}
\indexentry{dog}{4}