我正忙着制作一份关于日语汉字符号的文档。
我希望一个索引(以及其他几个索引)具有特定的格式:
- 汉字必须按照“笔画数”进行分类
- 汉字本身应该在其各自的类别下向左对齐。
- 可以找到该汉字的页码应该向右对齐。
我尝试生成我想要的输出,但坦率地说,它看起来相当丑陋。在下面的代码块中,你会发现一个 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:
除了上述问题之外,了解符合以下格式的解决方案也将非常有帮助此解决方案为了保持一致性。我具体指的包括:
- “组界线”采用粗体显示,并且字体比属于该组的条目略大。
- 不同组之间的垂直空白。
- 一种配置,可防止在“组边界”和其下方的第一个条目之间出现列/页分隔符。
请参阅下图作为参考指南:
答案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
)。这里重要的键是delim0
、delim1
和delim2
。您可以将它们设置为\hfill
向右对齐,并使用反斜杠进行转义(因此\\hfill
)。
为了对齐项目,您可以重新定义\subitem
为\@idxitem
,基本上假装每个单独的汉字都是一个类别,以达到布局目的。
在下面的 MWE 中,.ist
文件包含在使用 的 LaTeX 源中filecontents
,这只是为了举例。您可以运行一次,也可以手动将内容复制到文件中,然后从代码中删除此部分。请注意,环境的文件名filecontents
设置为\jobname.ist
,其中宏\jobname
默认为不带扩展名的文件名。如果您使用具有不同名称的文件,那么您还应该将中的.tex
选项设置更改为实际文件,例如。options=-s \jobname.ist
\makeindex
options=-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}}