对索引中的条目进行分类和对齐

对索引中的条目进行分类和对齐

我正忙着制作一份关于日语汉字符号的文档。

我希望一个索引(以及其他几个索引)具有特定的格式:

  1. 汉字必须按照“笔画数”进行分类
  2. 汉字本身应该在其各自的类别下向左对齐。
  3. 可以找到该汉字的页码应该向右对齐。

这张图片很好地说明了我想要实现的目标: 所需格式

我尝试生成我想要的输出,但坦率地说,它看起来相当丑陋。在下面的代码块中,你会发现一个 MWE:

\documentclass[10pt, a4paper]{ltjbook}
\usepackage{luatexja}
\usepackage{imakeidx}
\makeindex[name=stroke, columns=4, title={Index of 漢字 by Stroke Count}, intoc, columnseprule]
\newcommand{\strindex}[2]{\index[stroke]{#1@#1!#2}}

%-------------------------------------------------------
%-------------------------------------------------------
%-------------------------------------------------------
\begin{document}

The kanji for dry, 干, consists of 3 strokes.\strindex{3}{干}

The kanji for gold, 金, consists of 8 strokes.\strindex{8}{金}

Words > 語 > 14 strokes.\strindex{14}{語}

Gentleman > 士 > 3 strokes.\strindex{3}{士}

Morning > 朝 > 12 strokes.\strindex{12}{朝}

Blue > 青 > 8 strokes.\strindex{8}{青}

Earth > 土 > 3 strokes.\strindex{3}{土}

Hang > 掛 > 11 strokes.\strindex{11}{掛}

Ten Thousand > 万 > 3 strokes.\strindex{3}{万}

\printindex[stroke]
\end{document}

2021/04/29 编辑 1:
除了上述问题之外,了解符合以下格式的解决方案也将非常有帮助此解决方案为了保持一致性。我具体指的包括:

  • “组界线”采用粗体显示,并且字体比属于该组的条目略大。
  • 不同组之间的垂直空白。
  • 一种配置,可防止在“组边界”和其下方的第一个条目之间出现列/页分隔符。

请参阅下图作为参考指南:

在此处输入图片描述

2021/05/01 编辑 2:
参考下图:有什么方法可以修改item_x1以防止新类别与其第一个条目之间出现中断? 在此处输入图片描述

答案1

这是一个解决方案“2021/04/29 编辑 1”

编辑(2021/05/02):现在解决方案也根据2021/05/01 编辑 2。使用\\*或似乎\nopagebreak不是在环境中将事物保持在一起的可靠方法multicols。因此,新解决方案使用强力方法。我们\strokesection在“⟨n⟩笔画”标题前放置一个命令。此命令将该行和下一行(即该标题后的第一个条目)放在一起,因此\parbox它们multicol之间不能放置分栏符。为了正常工作,所有条目都必须以 结束\par。正如item_x中的声明stroke.ist指定要放置什么一个项目,而不是\par,我们还在的末尾multicols和的前面放置了,\strokesection以确保宏总能找到正确的两行。

\documentclass[10pt, a4paper]{ltjbook}
\usepackage{luatexja}
\usepackage{imakeidx}
\usepackage[left=1.9cm,right=1.9cm,bottom=1.5cm,top=1.5cm]{geometry}
\setlength{\columnseprule}{0.4pt}
\setlength{\columnsep}{3em}
\newcommand{\strokeshead}[1]{%
  \rmfamily\large\textbf{#1 stroke\ifnum#1>1 s\fi}%
}
%%%%%% --------------- This is the new solution --------------- %%%%%%
\begin{filecontents*}{stroke.ist}
headings_flag 0
preamble "\\chapter*{\\indexname}%
\\begin{multicols}{4}\\raggedcolumns
\\setlength\\parindent{0pt}
\\setlength\\parskip{0pt}"
postamble "\\par\n\\end{multicols}
"
delim_1 "\\hfill "
item_0 "\\par\n\\strokesection "
item_1 "\\par\n"
item_x1 "\\par\n"
\end{filecontents*}
\newcommand\strokesection{} % to make sure we can use this command
\def\strokesection#1\par#2\par{\vspace{5pt}\par
  \parbox[t]{\linewidth}{{#1}\\#2\strut}\par
}
%%%%%% --------------- End of the new solution --------------- %%%%%%
\makeindex[name=stroke, columns=4, title={Index of 漢字 by Stroke Count}, intoc, columnseprule,options=-s stroke.ist]
\newcommand{\strindex}[2]{\index[stroke]{#1@\strokeshead{#1}!#2}}

\begin{document}

One 一\strindex{1}{一}

The kanji for dry, 干, consists of 3 strokes.\strindex{3}{干}

The kanji for gold, 金, consists of 8 strokes.\strindex{8}{金}

Words > 語 > 14 strokes.\strindex{14}{語}

Gentleman > 士 > 3 strokes.\strindex{3}{士}

Morning > 朝 > 12 strokes.\strindex{12}{朝}

Blue > 青 > 8 strokes.\strindex{8}{青}

Earth > 土 > 3 strokes.\strindex{3}{土}

Hang > 掛 > 11 strokes.\strindex{11}{掛}

Ten Thousand > 万 > 3 strokes.\strindex{3}{万}

\printindex[stroke]
\end{document}

为了进行比较,以下是之前的解决方案:

%%%%%% --------------- This is the previous solution --------------- %%%%%%
\begin{filecontents*}{stroke.ist}
headings_flag 0
preamble "\\chapter*{\\indexname}%
\\begin{multicols}{4}
\\setlength\\parindent{0pt}
\\setlength\\parskip{5pt}"
postamble "\n\\end{multicols}
"
delim_1 "\\hfill "
item_0 "\\par\n"
item_1 "\\\\\n"
item_x1 "\\\\*\n"
\end{filecontents*}
%%%%%% --------------- End of the previous solution --------------- %%%%%%

在此处输入图片描述

答案2

对于页码的对齐,您可以编写一个索引样式文件 ( .ist)。这里重要的键是delim0delim1delim2。您可以将它们设置为\hfill向右对齐,并使用反斜杠进行转义(因此\\hfill)。

为了对齐项目,您可以重新定义\subitem\@idxitem,基本上假装每个单独的汉字都是一个类别,以达到布局目的。

在下面的 MWE 中,.ist文件包含在使用 的 LaTeX 源中filecontents,这只是为了举例。您可以运行一次,也可以手动将内容复制到文件中,然后从代码中删除此部分。请注意,环境的文件名filecontents设置为\jobname.ist,其中宏\jobname默认为不带扩展名的文件名。如果您使用具有不同名称的文件,那么您还应该将中的.tex选项设置更改为实际文件,例如。options=-s \jobname.ist\makeindexoptions=-s mysettings.ist

梅威瑟:

\documentclass[10pt, a4paper]{ltjbook}
\usepackage{luatexja}
\usepackage{imakeidx}
\begin{filecontents*}{\jobname.ist}
delim_0 "\\hfill"
delim_1 "\\hfill"
delim_2 "\\hfill"
\end{filecontents*}
\makeindex[name=stroke, columns=4, title={Index of 漢字 by Stroke Count}, intoc, columnseprule,options=-s \jobname.ist]
\newcommand{\strindex}[2]{\index[stroke]{#1@\textbf{#1 strokes}!#2}}
\makeatletter
\let\subitem\@idxitem
\makeatother
%-------------------------------------------------------
%-------------------------------------------------------
%-------------------------------------------------------
\begin{document}
The kanji for dry, 干, consists of 3 strokes.\strindex{3}{干}

The kanji for gold, 金, consists of 8 strokes.\strindex{8}{金}

Words > 語 > 14 strokes.\strindex{14}{語}

Gentleman > 士 > 3 strokes.\strindex{3}{士}

Morning > 朝 > 12 strokes.\strindex{12}{朝}

Blue > 青 > 8 strokes.\strindex{8}{青}

Earth > 土 > 3 strokes.\strindex{3}{土}

Hang > 掛 > 11 strokes.\strindex{11}{掛}

Ten Thousand > 万 > 3 strokes.\strindex{3}{万}

\printindex[stroke]
\end{document}

结果:

在此处输入图片描述


用一笔编辑汉字:你可以打印s有条件地使用\ifnum

\newcommand{\strindex}[2]{\index[stroke]{#1@\textbf{#1 stroke\ifnum#1>1s\fi}!#2}}

在此处输入图片描述

相关内容