在我的日文文档索引中,我希望每个条目包含以下内容:
- 日文角色的英文名(左对齐)
- 日文字符本身(左对齐)
- 相关条目所在的页码(右对齐)
上面括号内的信息给出了每个条目的水平对齐情况。
在摆弄了本文提供的代码之后解决方案,我取得了一些进展,但也遇到了其他问题:
- 索引没有按照 \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 "