索引中的页码和脚注编号,使用 texindy

索引中的页码和脚注编号,使用 texindy

我希望我的索引能够以页码加脚注符号的形式显示脚注中的项目,例如137n7第 137 页脚注 7 中的项目。以下https://tex.stackexchange.com/a/55460/3935,我在脚注中使用了一个特殊的索引命令,当使用 MakeIndex 处理文件时,该命令可以正常工作.idx。该命令取决于命令中管道的含义(对于 MakeIndex 来说很特别)\index,以修改索引项的页码。

texindy但是,为了支持外语,我使用 而不是 MakeIndex 来处理索引,并且texindy这些特殊索引条目被忽略。xindy手册页解释道:

对于 LaTeX 语法中的原始索引条目,\index{aaa|bbb}解释不同。对于 MakeIndex 来说,bbb是作为此页码的 LaTeX 标签输出的标记。对于xindy,这是一个位置属性,一个抽象标识符,稍后将与应为该属性输出的标记相关联。

我不明白如何处理xindy位置属性以获得原始效果。在我看来,因为\footnote必须附加,所以这不是可以在原始待索引文件本身之外完成的简单标记。Xindy 标记语法描述Xindy 文档网站

平均能量损失

%!TEX encoding = UTF-8 Unicode

\documentclass[12pt]{scrbook}
\usepackage{makeidx}
\makeindex

\newcommand{\pageandfn}[2]{#2n#1}    % format as <page>n<footnotemark>
\newcommand{\indexfn}[1]{\index{#1@ #1|pageandfn{\thefootnote}}}

\begin{document}
Some text here.%
\footnote{Plain footnote\index{footnote, \texttt{\textbackslash index}}.} %

More text here.\footnote{%
Specially indexed footnote\indexfn{footnote, \texttt{\textbackslash indexfn}}.
}

\printindex
\end{document}

编译一次后的文本

正文

脚注

.idx以下是文件的内容

\indexentry{footnote, \texttt  {\textbackslash index}}{1}
\indexentry{footnote, \texttt  {\textbackslash indexfn}@ footnote, \texttt  {\textbackslash indexfn}|pageandfn{2}}{1}

使用 MakeIndex 处理然后再次编译:

使用 MakeIndex 处理时的索引

处理texindy然后再次编译:

使用 <code>texindy</code> 处理时的索引

答案1

除了将页码写入索引文件外,还可以写入页码和脚注编号的列表,如果要索引的项目不在脚注中,则将后者设置为 0。

以下是该想法如何应用于您的 MWE。它还使用 hyperref 以提供更多便利。

mwe-style.xdy

;; make xindy and hyperindex work together
;; see http://tex.stackexchange.com/questions/80300/how-can-i-convince-hyperref-and-xindy-to-play-together-nicely
;; (the comment by michal.h21)
;; (markup-locref :open "\hyperpage{" :close "}")
;; now taken care of by attribute formatloc


(define-attributes (("formatloc")) )
(markup-locref :attr "formatloc" :open "\formatloc{" :close "}")


(define-location-class "pagefn" :var
     ("arabic-numbers" :sep " "  "arabic-numbers"))

(define-location-class-order ("pagefn"))

;; End

麦格

%!TEX encoding = UTF-8 Unicode

\documentclass[12pt]{scrbook}

\usepackage{etoolbox}
\usepackage{hyperref}

\usepackage[original]{imakeidx}

\makeindex[program=texindy,options=-M mwe-style]

% test to detect we are in a footnote;
% taken from
% http://tex.stackexchange.com/questions/171681/detect-whether-im-in-a-footnote/
\let\svfootnote\footnote
\renewcommand\footnote[2][\thefootnote]{%
  \stepcounter{footnote}%
  \gdef\infootnote{T}%
  \svfootnote[#1]{#2\gdef\infootnote{F}}%
}
\gdef\infootnote{F}

% write the footnote number if we're in one
% and 0 otherwise
\makeatletter
\newcommand{\fnind}{\if T\infootnote
\@currentlabel%
\else 0\fi%
}
\makeatother


% \formatlocc formats the locations as given in the .ind index files
% \formatloc is a wrapper for \formatlocc to permit braces
\newcommand{\formatloc}[1]{\formatlocc #1}
\def\formatlocc #1 #2{%
\ifnumequal{#2}{0}{\hyperpage{#1}}{\hyperpage{#1}n#2}%
}



% http://tex.stackexchange.com/questions/20894/make-index-entries-refer-to-something-other-than-the-page-numbers/20910#20910
\makeatletter
\let\@indexfn\@index
\patchcmd{\@indexfn}{\@wrindex}{\@Wrindex}{}{}
\let\@Wrindex\@wrindex
\patchcmd{\@Wrindex}{\thepage}{\thepage\space\fnind}{}{}
\let\xindexfn\index
\patchcmd{\xindexfn}{\@index}{\@indexfn}{}{}
\patchcmd{\xindexfn}{\@index}{\@indexfn}{}{}
\newcommand{\indexfn}[2][\imki@jobname]{\xindexfn[#1]{#2|formatloc}}
\makeatother



\begin{document}
Some text here.%
\footnote{Plain footnote\index{footnote, \texttt{\textbackslash index}}.} %

More text here.\footnote{%
Specially indexed footnote\indexfn{footnote, \texttt{\textbackslash indexfn}}.
}

\printindex
\end{document}

使用 -shell-escape 标志进行编译,或手动运行 texindy。

相关内容