Xindy 的索引,最后一句太长了

Xindy 的索引,最后一句太长了

我正在尝试根据以下条件定制我的索引这个最初的问题。后来我发现,如果涉及交叉引用,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)

相关内容