我正在尝试根据以下条件定制我的索引这个最初的问题。后来我发现,如果涉及交叉引用,hyperref 和 xindy 就不能很好地发挥作用。这就是为什么我尝试遵循这个问题它禁用 indexin 的超链接,并从样式文件中构建链接本身。
尽管我对样式文件和链接不起作用有一些疑问,但这是另一个问题。
我对我的格式中断的原因很感兴趣:我希望页码右对齐,除了每个字母组的最后一行,行稍微向右延伸一点。
markup-letter-group
为什么会这样/我该如何解决这个问题?(我想我可能在xindy 文件底部做错了什么,因为那是自制部分)
%pdflatex
%xindy index.idx -M indexStyle -L english -C utf8
%pdflatex
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{indexStyle.xdy}
(define-location-class "arabic-page-numbers" ("arabic-numbers")
:min-range-length 2)
(define-attributes (("definition" "usage" "default" "hyperpage")))
(define-crossref-class "see")
(markup-crossref-list :class "see" :open "\seelinkk{" :sep "; " :close "}{}")
(define-crossref-class "seealso")
(markup-crossref-layer-list :sep ", ")
(markup-crossref-list :class "seealso" :open "\seealsolinkk{" :sep "; " :close "}{}")
(define-crossref-class "hyperindexformat")
(markup-crossref-list :class "hyperindexformat" :open
"\hyperindexformat{" :sep "; " :close "}{}")
(define-location-class-order (
"arabic-page-numbers"
"see"
"seealso"))
(markup-index :open "~n\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\par\textbf{#1}\par
\nopagebreak
}
\def\tedIDXlvlZero{}
\def\tedIDXlvlOne{}
\def\tedIDXlvlTwo{}
\newcommand{\tedSetter}[1]{
\if\tedLevel0
\def\tedIDXlvlZero{#1}
\else{
\if\tedLevel1
\def\tedIDXlvlOne{#1}
\else
\def\tedIDXlvlTwo{#1}
\fi
}\fi
}
\def\tedLevel{0}
\newcommand{\buildlinktargett}[1]{%
\if\tedLevel0%
index:#1%
\else{%
\if\tedLevel1%
index:\tedIDXlvlZero, #1%
\else%
% \ifx\tedLevel\tedIDXlvlTwo %implicit%
index:\tedIDXlvlZero, \tedIDXlvlOne, #1%
\fi%
}\fi%
}
\newcommand{\targetindexentryy}[1]{\tedSetter{#1}\hypertarget{\buildlinktargett{#1}}{#1}}
\newcommand{\seelinkk}[1]{\see{\hyperlink{index:#1}{#1}}}
\newcommand{\seealsolinkk}[1]{\seealso{\hyperlink{index:#1}{#1}}}
~n"
:close "~n~n\end{theindex}~n"
:tree)
(markup-indexentry :open "~n \def\tedLevel{0} \item " :depth 0)
(markup-indexentry :open "~n \def\tedLevel{1} \subitem " :depth 1)
(markup-indexentry :open "~n \def\tedLevel{2} \subsubitem " :depth 2)
(markup-locref-list :sep ", ")
(markup-locclass-list :open "\dotfill " :close "" ) ;; :sep ", "
(markup-locref :open "\hyperpage{" :close "}")
(markup-locref :open "\hyperpage{" :close "}" :attr "hyperpage")
(markup-keyword-list :open "\targetindexentryy{" :close "}" )
;;;(require "lang/english/utf8.xdy")
(markup-letter-group :open-head "~n~n \vspace{1cm} {\hfill\bf " :close-head "\hfill}" :capitalize)
\end{filecontents*}
\usepackage[xindy, nonewpage]{imakeidx} %nonewpage needed for index entries after \printindex
\makeindex[program=truexindy, intoc, options={-M indexStyle -L english -C utf8}]
\usepackage[hyperindex=false]{hyperref}
\begin{document}
Hello some useless text.\clearpage
\index{foo}
\index{foo!bar}
\index{bar}
\index{cat}
\index{carbon}
\index{combobreaker}
\index{join}
\index{join!hash}
\index{hash join|see{join, hash}}
\printindex
\end{document}
答案1
实际上最后一行是正确的,其他行都太短了:文件xindy
中生成的代码.ind
最终如下所示:
\vspace{1cm} {\hfill\bf F\hfill}
\def\tedLevel{0} \item \targetindexentryy{foo}\dotfill \hyperpage{2}
\def\tedLevel{1} \subitem \targetindexentryy{bar}\dotfill \hyperpage{2}
在读取此代码时,TeX 会用空格替换每行的末尾,因此每个项目的末尾都有一个空格。最后一项的行尾字符的解释不同,因为它后面跟着一个空行,所以它只是结束段落而不是插入空格。这解释了为什么最后一行看起来更长一些:所有其他行的右侧都有一个空格字符。为了避免这种情况,您可以使用 TeX 宏技巧以 a 结尾来%
隐藏此空格:只需替换
(markup-indexentry :open "~n \def\tedLevel{0} \item " :depth 0)
(markup-indexentry :open "~n \def\tedLevel{1} \subitem " :depth 1)
(markup-indexentry :open "~n \def\tedLevel{2} \subsubitem " :depth 2)
和
(markup-indexentry :open "%~n \def\tedLevel{0} \item " :depth 0)
(markup-indexentry :open "%~n \def\tedLevel{1} \subitem " :depth 1)
(markup-indexentry :open "%~n \def\tedLevel{2} \subsubitem " :depth 2)