如何按字母顺序对字典中的条目进行排序?

如何按字母顺序对字典中的条目进行排序?

这是一个后续问题:如何自动化字典(排序、标题)?

我想知道是否有办法按字母顺序对以下代码中的条目进行排序。
我猜想xindyglossaries或者类似的东西应该可以解决问题,但我不知道该怎么做。
顺便说一句,我在 Win7 上使用XeLaTeXTL2012,我的文档是波斯语,这是一种 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 个步骤:

  1. 像往常一样使用 PDFLaTeX,例如pdflatex myDoc.tex从终端/命令提示符或单击前端/文本编辑器上的 PDFLaTeX 按钮。
  2. 运行 Perl 脚本makeglossaries myDoc或显式调用xindy(参见词汇表、术语、符号和缩略词列表更多细节)。
  3. 重复步骤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使用<>[]。将这些字符替换为字典条目不需要的字符(我会使用字节0x010x020x030x04,不要使用多个字节(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

相关内容