索引页标题、回忆录类条目有误

索引页标题、回忆录类条目有误

我希望索引中的“查看”交叉引用采用以下格式:

这(看那)

因此感谢更改索引“另请参阅”和“参见”格式\seeonly,我使用了下面源文件中所示的定义。

但我还希望索引的页面标题显示每页的第一个和最后一个索引条目。因此,我还定义了\idxmark,使用index页面样式,并使用了文档.ist中描述的索引样式文件memoir(现在也包含在我的源代码中)。

% File indexdoc.tex
\documentclass{memoir}

\newcommand{\idxmark}[1]{#1\markboth{#1}{#1}}

\makepagestyle{index}
\makeheadrule{index}{\textwidth}{\normalrulethickness}
\makeevenhead{index}{\rightmark}{}{\leftmark}
\makeoddhead{index}{\rightmark}{}{\leftmark}
\makeevenfoot{index}{}{\thepage}{}
\makeoddfoot{index}{}{\thepage}{}

\newcommand\gobbleone[1]{}
\newcommand{\seeonly}[2]{\, (\emph{\seename} #1)}
\let\oldindex\index
\renewcommand{\index}[1]{\def\exptoindex{#1}\expandafter\oldindex\expandafter{\exptoindex}}
\newcommand{\indexsee}[2]{\index{#1@#1\protect\gobbleone|seeonly{#2}}}


\begin{filecontents}{indexdoc.ist}
% MakeIndex style file
% output main entry <entry> as: \item \idxmark{<entry>}, 
item_0  "\n\\item \\idxmark{"
delim_0 "}, "
% not forgetting the subitem case
item_x1 "} \n \\subitem "
\end{filecontents}

\makeindex

\begin{document}

This is some text\indexsee{text}{verbiage}. Which is a synonym for verbiage\index{verbiage}. 

\backmatter

\pagestyle{index}
\printindex

\end{document}

唉,这两件事发生了冲突;我收到错误消息:

 Writing index file indexdoc.idx
 (./indexdoc.aux) [1{/Users/user/Library/texlive/2016/texmf-var/fonts/map/
 pdftex/updmap/pdftex.map}] [2] (./indexdoc.ind
 ./indexdoc.ind:3: Argument of \gobbleone has an exra }.Runaway argument?
 ./indexdoc.ind:3: Paragraph ended before \gobbleone was complete.
 <to be read again>
                                 \par
 l.3 \item \idxmark{text\gobbleone }
                                                       , \seeonly{verbiage}{1}
?
<inserted text>
                                 \par
 l.3 \item \idxmark{text\gobbleone }
                                                       , \seeonly{verbiage}{1}
?    

如果没有 的\idxmark定义、索引页样式和 的索引 .ist 样式文件memman.pdf, 的定义\seeonly(就 而言\gobble)不会出现任何问题。

冲突该如何解决?

最初接受的答案在数学上不够稳健

我最初接受了“siracusa”的答案,它重新定义了\idxmark。但是,我现在发现,当第一个参数具有以下形式时,它会导致\indexsee命令失败 — 但对于命令而言是可以的\indexAlso

alfatxt@$alfamath$

(用于在索引中正确地按字母顺序排列数学表达式)。

% File indexdoc2.tex
\documentclass{memoir}

\newcommand{\idxmark}[1]{{\let\gobbleone\relax\markboth{#1}{#1}}#1}

\makepagestyle{index}
\makeheadrule{index}{\textwidth}{\normalrulethickness}
\makeevenhead{index}{\rightmark}{}{\leftmark}
\makeoddhead{index}{\rightmark}{}{\leftmark}
\makeevenfoot{index}{}{\thepage}{}
\makeoddfoot{index}{}{\thepage}{}

\let\oldindex\index
\renewcommand{\index}[1]{\def\exptoindex{#1}\expandafter\oldindex\expandafter{\exptoindex}}

\newcommand\gobbleone[1]{}
\newcommand{\seeonly}[2]{\, (\emph{\seename} #1)}
\newcommand{\indexsee}[2]{\index{#1@#1\protect\gobbleone|seeonly{#2}}}
\newcommand{\Also}[2]{\unskip\emph{See also} #1}
\newcommand{\indexAlso}[2]{\index{#1!zzzz@\protect\gobbleone|Also{#2}}}

\begin{filecontents}{indexdoc2.ist}
% MakeIndex style file
% output main entry <entry> as: \item \idxmark{<entry>}, 
item_0  "\n\\item \\idxmark{"
delim_0 "}, "
% not forgetting the subitem case
item_x1 "} \n \\subitem "
\end{filecontents}

\makeindex

\begin{document}

This is some text\indexsee{text}{verbiage}. Which is a synonym for verbiage\index{verbiage}. 

$\pi$\index{pi@$\pi$ (math constant)} % OK

$\rho$ \indexsee{$\rho$}{density} % OK
$\sigma$ \indexsee{sigma@$\sigma$}{conductivity}    % NO entry in index!

$\mu$ \indexAlso{$\mu$}{magnetic moment} % OK
$\alpha$ \indexAlso{alpha@$\alpha$}{angular acceleration}  % OK !

\backmatter

\pagestyle{index}
\printindex

\end{document}

缺少“参见”和“另请参阅”条目的索引

答案1

请使用以下定义\idxmark

\newcommand{\idxmark}[1]{{\let\gobbleone\relax\markboth{#1}{#1}}#1}

接受\gobbleone一个参数,然后将其从输出中丢弃,在本例中它应该丢弃以下逗号。问题是,通过将调用包装\idxmark在索引文本周围,\gobbleone作为参数的一部分进入此命令。\idxmark调用时的扩展结果如下所示:

text\gobbleone\markboth{text\gobbleone}{text\gobbleone}

不仅如此,现在\markboth被吞噬了,多余的\gobbleones 也完全错误了。为了解决这个问题,我们首先将 plain 移到#1末尾\idxmark,这样 才能\gobbleone真正吞噬后面的逗号。现在\gobbleone必须删除多余的 s,方法是将它们重新定义为\relax(“不执行任何操作”),放在本地组中。现在扩展的结果相当于

\markboth{text\relax}{text\relax}text\gobbleone

编辑:您编辑的问题实际上不是数学问题,而是 的定义\indexsee已经使用了@-syntax 来提供用于排序的附加术语。现在,如果您通过该宏的调用提供另一个术语,则makeindex似乎会感到困惑并拒绝输入。

为了解决这个问题,这里有一个新版本\indexsee

\def\indexsee#1{\indexseeI#1@\end}
\def\indexseeI#1@#2\end{%
  \def\temp{#2}%
  \ifx\temp\empty
    \def\next{\indexseeIII{#1}{#1}}%
  \else
    \def\next{\indexseeII#1@#2\end}%
  \fi
  \next
}
\def\indexseeII#1@#2@\end{\indexseeIII{#1}{#2}}
\def\indexseeIII#1#2#3{\index{#1@#2\protect\gobbleone|seeonly{#3}}}

新版本使用一些辅助宏来检查第一个参数是否已包含@。如果是,则使用提供的术语进行排序。如果@参数中没有出现,则使用原始版本(使用与索引条目相同的术语进行排序)。

以下是新版本的示例输出:

在此处输入图片描述


编辑2:考虑一下,您可能最好只使用定义中不重复参数的版本:

\newcommand{\indexsee}[2]{\index{#1\protect\gobbleone|seeonly{#2}}}

如果您的条目是纯文本,则复制它不会有任何好处。如果它是数学,它会被移动到错误的位置(正如您在示例中看到的那样\mu\rho。因此,对于除纯文本之外的所有其他用途,您可能还是希望自己提供正确的排序术语。

相关内容