如何在索引中集成表格环境

如何在索引中集成表格环境

在我的日文文档索引中,我希望每个条目包含以下内容:

  1. 日文角色的英文名(左对齐)
  2. 日文字符本身(左对齐)
  3. 相关条目所在的页码(右对齐)

上面括号内的信息给出了每个条目的水平对齐情况。

在摆弄了本文提供的代码之后解决方案,我取得了一些进展,但也遇到了其他问题:

  • 索引没有按照 \makeindex 命令的规定分为 4 列。
  • 索引标题和内容之间有分页符。

我不太擅长构建样式文件,如果能给出一个解决方案并附上清晰的解释(尽可能),我将不胜感激。我还发现下面的表格关联有点难以解释。

下面的代码块是我的 MWE。为了全面起见,我包含了许多索引条目来测试代码的稳健性。

\documentclass[10pt, a4paper]{ltjbook}
\usepackage{luatexja}
\usepackage[left=1.9cm,right=1.9cm,bottom=1.5cm,top=1.5cm]{geometry}
\usepackage{array,longtable,supertabular,booktabs,multicol,multirow}
\usepackage{tabularx}
\usepackage{hhline}
\usepackage{multicol}
\usepackage{blindtext}

\usepackage{imakeidx}
\setlength{\columnseprule}{0.4pt}

\begin{filecontents*}{general.ist}
headings_flag 5
heading_prefix "\n\\rmfamily\\textbf{"heading_suffix "} "
preamble "\\chapter*{\\indexname}%
\\newcommand\\ignoreNL[1]{}%
\\begin{tabular}{llr} "
postamble " \\end{tabular} "
item_0 "\\\\\n "
delim_0 "&"
delim_1 "\\hfill "
group_skip "\n \\\\[5pt] \\ignoreNL "
\end{filecontents*}

\makeindex[name=gen, title={Index of Kanji}, columns=4, columnseprule, options=-s general.ist]

\newcommand{\gindex}[2]{\index[gen]{#1 & #2}}

\begin{document}
\Blindtext
\gindex{One}{一}

\gindex{Two}{二}

\gindex{Three}{三}

\Blindtext
\gindex{Four}{四}

\gindex{Five}{五}

\gindex{Six}{六}

\gindex{Seven}{七}

\gindex{Eight}{八}

\gindex{Nine}{九}

\blindtext
\gindex{Ten}{十}

\gindex{Eleven}{十一}

\gindex{Twelve}{十二}

\gindex{Thirteen}{十三}

\gindex{Fourteen}{十四}

\gindex{Fifteen}{十五}

\gindex{Sixteen}{十六}

\gindex{Seventeen}{十七}

\gindex{Eighteen}{十八}

\gindex{Nineteen}{十九}

\gindex{Twenty}{二十}

\gindex{Mouth}{口}

\gindex{Neck}{首}

\gindex{Head}{頭}

\gindex{Lips}{唇}

\gindex{Arms}{腕}

\gindex{Feet}{足}

\gindex{Sunday}{日曜日}

\gindex{Monday}{月曜日}

\gindex{Tuesday}{火曜日}

\gindex{Wednesday}{水曜日}

\gindex{Thursday}{木曜日}

\gindex{Friday}{金曜日}

\gindex{Saturday}{土曜日}

\gindex{Wind}{風}

\gindex{Water}{水}

\gindex{Fire}{火}

\gindex{Flower}{花}

\blindtext
\gindex{East}{東}

\gindex{South}{南}

\gindex{North}{北}

\blindtext
\gindex{West}{西}


\printindex[gen]

\end{document}

该图显示索引插入了不需要的分页符,并且没有拆分到多个列

>>编辑:2022 年 1 月 29 日<<

处理完整个文档后,索引的第一页出现异常,如下所示。有什么帮助吗? 在此处输入图片描述

答案1

您的索引位于 内tabular,它不会跨页拆分,也不会跨列拆分。因此,您必须使用可拆分的表,例如longtable。要获取longtable内表multicols,您必须使用技巧,例如这个答案

这让我想到了这个解决方案(出于某种原因,我必须multicols自己做;但似乎\makeindex不行。

编辑:我摆弄了一下以general.ist防止组字母和下一个条目之间出现列/页中断。

编辑2:\\makeatother为了安全起见,我加了一个。

编辑 2022/01/30似乎longtable破坏了内部 LaTeX 参数\@colroom,该multicols参数需要将文本分成列,至少当文本不适合页面时。在环境\@colroom开始时就计算multicols,在环境内部处理任何文本之前。对于后续页面,它会再次计算,因此这些页面不受影响。我通过\@colroom在之前保存longtable并在之后恢复它来解决这个问题。我还做了一些其他小改进。我做得\tabcolsep更小一些,以便更好地适应列中的索引。

\documentclass[10pt, a4paper]{ltjbook}
\usepackage{luatexja}
\usepackage[left=1.9cm,right=1.9cm,bottom=1.5cm,top=1.5cm]{geometry}
\usepackage{array,longtable,supertabular,booktabs,multicol,multirow}
\usepackage{tabularx}
\usepackage{hhline}
\usepackage{blindtext}
\usepackage{imakeidx}
\setlength{\columnseprule}{0.4pt}
\newsavebox\ltmcbox
\newlength\mysavecolroom
% This command inhibits a column break after a group letter in the index
% It also swallows the following \\, because the \\ is here before the \nopagebreak.
\newcommand{\dontbreak}[1]{\\\nopagebreak} % Swallow the following \\
\begin{filecontents*}{general.ist}
headings_flag 5
heading_prefix "\n\\rmfamily\\textbf{"
heading_suffix "}\\dontbreak "
preamble "\\chapter*{\\indexname}%
\\newcommand\\ignoreNL[1]{}%
\\begin{multicols}{4}
\\makeatletter\\mysavecolroom=\\@colroom\\makeatother
\\setbox\\ltmcbox\\vbox{
\\makeatletter\\col@number\\@ne\\makeatother
\\setlength\\tabcolsep{4pt}
\\begin{longtable}[l]{@{}llr@{}}"
postamble "\n\\end{longtable}
\\unskip
\\unpenalty
\\unpenalty}
\\makeatletter\\@colroom=\\mysavecolroom\\makeatother
\\unvbox\\ltmcbox
\\end{multicols}
"
item_0 "\\\\\n "
delim_0 "&"
delim_1 "\\hfill "
group_skip "\n \\\\[5pt] \\ignoreNL "
\end{filecontents*}

\makeindex[name=gen, title={Index of Kanji}, columns=4, columnseprule, options=-s general.ist]

\newcommand{\gindex}[2]{\index[gen]{#1 & #2}}

\begin{document}
\Blindtext
\gindex{One}{一}

\gindex{Two}{二}

\gindex{Three}{三}

\Blindtext
\gindex{Four}{四}

\gindex{Five}{五}

\gindex{Six}{六}

\gindex{Seven}{七}

\gindex{Eight}{八}

\gindex{Nine}{九}

\blindtext
\gindex{Ten}{十}

\gindex{Eleven}{十一}

\gindex{Twelve}{十二}

\gindex{Thirteen}{十三}

\gindex{Fourteen}{十四}

\gindex{Fifteen}{十五}

\gindex{Sixteen}{十六}

\gindex{Seventeen}{十七}

\gindex{Eighteen}{十八}

\gindex{Nineteen}{十九}

\gindex{Twenty}{二十}

\gindex{Mouth}{口}

\gindex{Neck}{首}

\gindex{Head}{頭}

\gindex{Lips}{唇}

\gindex{Arms}{腕}

\gindex{Feet}{足}

\gindex{Sunday}{日曜日}

\gindex{Monday}{月曜日}

\gindex{Tuesday}{火曜日}

\gindex{Wednesday}{水曜日}

\gindex{Thursday}{木曜日}

\gindex{Friday}{金曜日}

\gindex{Saturday}{土曜日}

\gindex{Wind}{風}

\gindex{Water}{水}

\gindex{Fire}{火}

\gindex{Flower}{花}

\blindtext
\gindex{East}{東}

\gindex{South}{南}

\gindex{North}{北}

\blindtext
\gindex{West}{西}

  \printindex[gen]

\end{document}

编辑 4(2022 年 1 月 31 日):

这是general.ist我发现的另一种更清洁的解决方案。它不需要\newlength\mysavecolroom

headings_flag 5
heading_prefix "\n\\rmfamily\\textbf{"
heading_suffix "}\\dontbreak "
preamble "\\chapter*{\\indexname}%
\\newcommand\\ignoreNL[1]{}%
\\setbox\\ltmcbox\\vbox{
\\setlength\\tabcolsep{4pt}
% \\hsize=(\\linewidth-(n-1)\\columnsep)/n
% where n = number of columns
\\setlength{\\hsize}{\\dimexpr(\\linewidth-3\\columnsep)/4}
\\begin{longtable}[l]{@{}llr@{}}"
postamble "\\end{longtable}
\\unskip
\\unpenalty
\\unpenalty}
\\begin{multicols}{4}
\\unvbox\\ltmcbox
\\end{multicols}
"
item_0 "\\\\\n "
delim_0 "&"
delim_1 "\\hfill "
group_skip "\n \\\\[5pt] \\ignoreNL "

在此处输入图片描述

相关内容