将括号排版到索引

将括号排版到索引

我正在尝试{使用以下方法将其xindy作为索引处理器并xelatex作为排版格式:

\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{fontspec}
\begin{document}
This is a test
\index{\texttt{\{}}
\printindex
\end{document}

但是,我收到以下错误:

Runaway argument?
{\texttt{\{}} \printindex \end{document} 
! File ended while scanning use of \@wrindex.
<inserted text> 
                \par 
<*> test.tex

出了什么问题?如何解决?

答案1

有两个问题:

  • 如果要使用 或类似命令来格式化索引条目\texttt\textbf请使用以下形式的索引条目:

    \index{word@\textbf{word}

  • 对于非字母数字的索引条目,您应该提供排序键。因此,如果您想将左括号排序为braceleft,请使用以下命令:

    \index{braceleft@\texttt{\textbraceleft}}

.ind运行后将创建以下文件

 xindy -L english -C utf8 -M texindy filename.idx

\begin{theindex}
  \providecommand*\lettergroupDefault[1]{}
  \providecommand*\lettergroup[1]{%
      \par\textbf{#1}\par
      \nopagebreak
  }

  \lettergroup{B}
  \item \texttt{\textbraceleft}, 1

\end{theindex}

如果你不想按照某个字母排序,可以使用

\index{\relax@\texttt{\textbraceleft}}

结果是:

\begin{theindex}
  \providecommand*\lettergroupDefault[1]{}
  \providecommand*\lettergroup[1]{%
      \par\textbf{#1}\par
      \nopagebreak
  }

  \lettergroupDefault{default}
  \item \texttt{\textbraceleft}, 1

\end{theindex}

答案2

我可以这样做

\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{fontspec}
\begin{document}
This is a test
\index{\texttt{\textbraceleft}}
\printindex
\end{document}

但这次xindy给出了以下错误信息:

ERROR: CHAR: index 0 should be less than the length of the string

或者

\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{fontspec}
\begin{document}
This is a test
\index{\texttt{\char"007B}}
\printindex
\end{document}

但再次,将(在文件中)xindy转换为(在文件中)可能是因为具有特殊含义而简单地忽略它。\char"007B.idx\char007B.ind"xindyxindy

或者,我可以这样做

\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{fontspec}
\chardef\mylb="007B
\begin{document}
This is a test
\index{\texttt{\mylb}}
\printindex
\end{document}

但这次xindy给出了以下错误信息:

ERROR: CHAR: index 0 should be less than the length of the string

答案3

我发现以下解决方案作者:Heiko Oberdiek:

\documentclass{article}
\usepackage{makeidx}
\makeindex
\begingroup
  \lccode`0=`\{
  \lccode`1=`\}
\lowercase{%
  \endgroup
  \newcommand\BraceLeft{0}%
  \newcommand\BraceRight{1}%
}
\newcommand*{\Index}[1]{%
  \index{#1}%
}

\begin{document}
foo\Index{"\BraceLeft @\string\textbraceleft}
\printindex
\end{document}

我不懂德语,我只是复制了他的 TeX 代码。如果你会说德语,请编辑我的答案并添加一些详细信息。

相关内容