这是一个后续问题:如何自动化字典(排序、标题)?
我想知道是否有办法按字母顺序对以下代码中的条目进行排序。
我猜想xindy
,glossaries
或者类似的东西应该可以解决问题,但我不知道该怎么做。
顺便说一句,我在 Win7 上使用XeLaTeX
TL2012,我的文档是波斯语,这是一种 RTL 语言,而且我更愿意在不使用其他软件包的情况下执行此操作。
以下是代码:
\documentclass[twoside]{article}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage[bf,sf,center]{titlesec}
% Headers and footers
\fancyhead[L]{\textsf{\rightmark}}
\fancyhead[R]{\textsf{\leftmark}}
\fancyfoot[C]{\textbf{\textsf{\thepage}}}
\renewcommand{\headrulewidth}{1.4pt}
\renewcommand{\footrulewidth}{1.4pt}
% Entry command : \dict{<word>}{<gender>}{<text>}
\newcommand{\dict}[3]{%
\markboth{#1}{#1}%
\par\vspace{0.25\baselineskip}%
\textbf{\textsf{#1}} \textit{- #2 -} #3%
}
\pagestyle{fancy}
% For testing
\usepackage{lipsum}
\begin{document}
\section*{A}
\begin{multicols}{2}
\dict{adequate}{n}{\lipsum[1]}
\dict{adhere}{n}{\lipsum[2]}
\dict{adherence}{n}{\lipsum[3]}
\dict{adhesion}{n}{\lipsum[4]}
\dict{adhesive}{n}{\lipsum[5]}
\dict{adjacent}{n}{\lipsum[6]}
\dict{adjective}{n}{\lipsum[1]}
\dict{adjoin}{n}{\lipsum[2]}
\dict{adjourn}{n}{\lipsum[3]}
\dict{adjournment}{n}{\lipsum[4]}
\dict{adjunt}{n}{\lipsum[5]}
\dict{adjust}{n}{\lipsum[6]}
\end{multicols}
\section*{M}
\begin{multicols}{2}
\dict{main}{n}{\lipsum[3]}
\dict{material}{n}{\lipsum[1]}
\dict{mathematic}{n}{\lipsum[2]}
\dict{more}{n}{\lipsum[2]}
\end{multicols}
\section*{Z}
\begin{multicols}{2}
\dict{zebra}{n}{\lipsum \lipsum \lipsum}
\dict{zero}{n}{\lipsum[4]}
\end{multicols}
\end{document}
编辑:
我 应该 提到 , 我必须只使用xindy
, 因为 波斯语 有 一些 问题 与 其他 程序 , 如makeindex
.
答案1
我知道您不想使用任何其他软件包,但如果没有其他答案适合您,请按照以下方法使用glossaries
和进行操作xindy
。首先是 LaTeX 代码:
\documentclass[twoside]{article}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage[bf,sf,center]{titlesec}
% Headers and footers
\fancyhead[L]{\textsf{\rightmark}}
\fancyhead[R]{\textsf{\leftmark}}
\fancyfoot[C]{\textbf{\textsf{\thepage}}}
\renewcommand{\headrulewidth}{1.4pt}
\renewcommand{\footrulewidth}{1.4pt}
\pagestyle{fancy}
% For testing
\usepackage{lipsum}
\usepackage[xindy]{glossaries}
\makeglossaries
% The optional argument is in case you can't use the name as a label
\newcommand{\dict}[4][]{%
\newglossaryentry{#2}%
{%
name=#2,%
symbol=#3,%
description=#4,%
#1%
}%
\glsadd{#2}%
}
\newglossarystyle{dict}%
{%
\renewenvironment{theglossary}{}{\end{multicols}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{%
\section*{##1}%
\begin{multicols}{2}%
}%
\renewcommand*{\glsgroupskip}{\end{multicols}}%
\renewcommand{\glossaryentryfield}[5]{%
\markboth{##2}{##2}%
\par\vspace{0.25\baselineskip}%
\textbf{\textsf{##2}} \textit{- ##4 -} ##3%
}%
}%
\renewcommand*{\glossarysection}[2][]{}
\begin{document}
\dict{zero}{n}{\lipsum[4]}
\dict{adhesive}{n}{\lipsum[5]}
\dict{adhere}{n}{\lipsum[2]}
\dict{adhesion}{n}{\lipsum[4]}
\dict{adjacent}{n}{\lipsum[6]}
\dict{adjust}{n}{\lipsum[6]}
\dict{main}{n}{\lipsum[3]}
\dict{material}{n}{\lipsum[1]}
\dict{more}{n}{\lipsum[2]}
\dict{zebra}{n}{\lipsum \lipsum \lipsum}
\dict{adherence}{n}{\lipsum[3]}
\dict{adjective}{n}{\lipsum[1]}
\dict{adjoin}{n}{\lipsum[2]}
\dict{mathematic}{n}{\lipsum[2]}
\dict{adjourn}{n}{\lipsum[3]}
\dict{adjournment}{n}{\lipsum[4]}
\dict{adjunt}{n}{\lipsum[5]}
\dict{adequate}{n}{\lipsum[1]}
\printglossary[style=dict]
\end{document}
要创建 PDF,您需要执行 3 个步骤:
- 像往常一样使用 PDFLaTeX,例如
pdflatex myDoc.tex
从终端/命令提示符或单击前端/文本编辑器上的 PDFLaTeX 按钮。 - 运行 Perl 脚本
makeglossaries myDoc
或显式调用xindy
(参见词汇表、术语、符号和缩略词列表更多细节)。 - 重复步骤1。
答案2
基于 的解决方案makeindex
。
%%% test.tex %%%
\documentclass[twoside]{article}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage[bf,sf,center]{titlesec}
% Headers and footers
\fancyhead[L]{\textsf{\rightmark}}
\fancyhead[R]{\textsf{\leftmark}}
\fancyfoot[C]{\textbf{\textsf{\thepage}}}
\renewcommand{\headrulewidth}{1.4pt}
\renewcommand{\footrulewidth}{1.4pt}
% Entry command : \dictb{<word>}{<gender>}{<text>}
\newcommand{\dictb}[3]{%
\par\vspace{0.25\baselineskip}%
\leavevmode
\markboth{#1}{#1}%
\textbf{\textsf{#1}} \textit{- #2 -} #3%
}
\pagestyle{fancy}
% further formatting commands
\newenvironment{thedict}{}{}
\newenvironment*{dictsection}[1]{%
\section*{#1}%
\begin{multicols}{2}%
}{\end{multicols}}
\newcommand*{\dictitem}[4]{%
\dictb{#1}{#2}{#3}%
}
\usepackage{makeidx}
\makeindex
\makeatletter
\newcommand*{\dict}{%
\begingroup
\@sanitize
\@dblarg\@dict
}
\def\@dict[#1]#2#3#4{%
\index{#1|{#2}{#3}{#4}}%
\endgroup
}
\makeatother
% For testing
\usepackage{lipsum}
\begin{document}
\dict{adequate}{n}{\lipsum[1]}
\dict{adhere}{n}{\lipsum[2]}
\dict{adherence}{n}{\lipsum[3]}
\dict{adhesion}{n}{\lipsum[4]}
\dict{adhesive}{n}{\lipsum[5]}
\dict{adjacent}{n}{\lipsum[6]}
\dict{adjective}{n}{\lipsum[1]}
\dict{adjoin}{n}{\lipsum[2]}
\dict{adjourn}{n}{\lipsum[3]}
\dict{adjournment}{n}{\lipsum[4]}
\dict{adjunt}{n}{\lipsum[5]}
\dict{adjust}{n}{\lipsum[6]}
\dict{main}{n}{\lipsum[3]}
\dict{material}{n}{\lipsum[1]}
\dict{mathematic}{n}{\lipsum[2]}
\dict{more}{n}{\lipsum[2]}
\dict{zebra}{n}{\lipsum \lipsum \lipsum}
\dict{zero}{n}{\lipsum[4]}
\printindex
\end{document}
%%% test.tex %%%
该.idx
文件以以下样式生成dict.ist
:
% Begin: Use characters not needed
encap '<'
level '>'
escape '['
quote ']'
% End: Use characters not needed
actual '|'
headings_flag 1
heading_prefix "\\begin{dictsection}{"
heading_suffix "}"
group_skip "\n\\end{dictsection}\n"
preamble "\\begin{thedict}\n"
postamble "\n\\end{dictsection}\n\\end{thedict}\n"
item_0 "\n \\dictitem"
delim_0 "{"
delim_t "}"
其思想是,LaTeX 编写的索引字符串以排序键开头,然后|
是分隔符,然后是实际使用和设置的内容。不需要诸如页码封装命令、索引级别和引用/转义等功能。因此dict.ist
使用<
、>
、[
、]
。将这些字符替换为字典条目不需要的字符(我会使用字节0x01
、0x02
、0x03
、0x04
,不要使用多个字节(UTF-8))。
Also\dict
的定义方式是,它逐字读取其参数并使用可选参数作为排序键。第一个强制参数用作可选参数的默认值( 的特性\@dblarg
)。
然后test.idx
看起来像:
\indexentry{adequate|{adequate}{n}{\lipsum[1]}}{1}
\indexentry{adhere|{adhere}{n}{\lipsum[2]}}{1}
\indexentry{adherence|{adherence}{n}{\lipsum[3]}}{1}
\indexentry{adhesion|{adhesion}{n}{\lipsum[4]}}{1}
\indexentry{adhesive|{adhesive}{n}{\lipsum[5]}}{1}
\indexentry{adjacent|{adjacent}{n}{\lipsum[6]}}{1}
\indexentry{adjective|{adjective}{n}{\lipsum[1]}}{1}
\indexentry{adjoin|{adjoin}{n}{\lipsum[2]}}{1}
\indexentry{adjourn|{adjourn}{n}{\lipsum[3]}}{1}
\indexentry{adjournment|{adjournment}{n}{\lipsum[4]}}{1}
\indexentry{adjunt|{adjunt}{n}{\lipsum[5]}}{1}
\indexentry{adjust|{adjust}{n}{\lipsum[6]}}{1}
\indexentry{main|{main}{n}{\lipsum[3]}}{1}
\indexentry{material|{material}{n}{\lipsum[1]}}{1}
\indexentry{mathematic|{mathematic}{n}{\lipsum[2]}}{1}
\indexentry{more|{more}{n}{\lipsum[2]}}{1}
\indexentry{zebra|{zebra}{n}{\lipsum \lipsum \lipsum}}{1}
\indexentry{zero|{zero}{n}{\lipsum[4]}}{1}
makeindex -s dict.ist test
生成test.ind
:
\begin{thedict}
\begin{dictsection}{A}
\dictitem{adequate}{n}{\lipsum[1]}{1}
\dictitem{adhere}{n}{\lipsum[2]}{1}
\dictitem{adherence}{n}{\lipsum[3]}{1}
\dictitem{adhesion}{n}{\lipsum[4]}{1}
\dictitem{adhesive}{n}{\lipsum[5]}{1}
\dictitem{adjacent}{n}{\lipsum[6]}{1}
\dictitem{adjective}{n}{\lipsum[1]}{1}
\dictitem{adjoin}{n}{\lipsum[2]}{1}
\dictitem{adjourn}{n}{\lipsum[3]}{1}
\dictitem{adjournment}{n}{\lipsum[4]}{1}
\dictitem{adjunt}{n}{\lipsum[5]}{1}
\dictitem{adjust}{n}{\lipsum[6]}{1}
\end{dictsection}
\begin{dictsection}{M}
\dictitem{main}{n}{\lipsum[3]}{1}
\dictitem{material}{n}{\lipsum[1]}{1}
\dictitem{mathematic}{n}{\lipsum[2]}{1}
\dictitem{more}{n}{\lipsum[2]}{1}
\end{dictsection}
\begin{dictsection}{Z}
\dictitem{zebra}{n}{\lipsum \lipsum \lipsum}{1}
\dictitem{zero}{n}{\lipsum[4]}{1}
\end{dictsection}
\end{thedict}
运行示例,例如:
pdflatex test
- 或者,编辑
dict.ist
以将前四个设置的字符更改为不需要的单字节字符。 makeindex -s dict.ist test
pdflatex test