我希望索引中的“查看”交叉引用采用以下格式:
这(看那)
因此感谢更改索引“另请参阅”和“参见”格式\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
被吞噬了,多余的\gobbleone
s 也完全错误了。为了解决这个问题,我们首先将 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
。因此,对于除纯文本之外的所有其他用途,您可能还是希望自己提供正确的排序术语。