修改现有代码以对缩写列表进行排序

修改现有代码以对缩写列表进行排序

我目前已在 .cls 文件中写入 Latex 代码,以显示如下缩写列表:

\newcommand\listnomenclature{Abbreviations}
\usepackage{longtable}

\newcommand\listofnomenclature[2]{
\btypeout{\listnomenclature}
\addtotoc{\listnomenclature}
    \chapter*{\listnomenclature
      \@mkboth{
          \MakeUppercase\listnomenclature}{\MakeUppercase\listnomenclature}}
\begin{longtable}[c]{#1}#2\end{longtable}\par
    \cleardoublepage
}

其使用方式如下:

\listofnomenclature{ll}{
GHG     &   GreenHouse Gasses \\
CoMP    &   Cooperative Multi-Point \\
ITU     &   International Telecommunication Union \\
}

是否可以修改 .cls 文件中的代码,以便对输出进行排序字母数字而不彻底改变其使用方式?

答案1

只是为了好玩:这里有一个使用 LaTeX3 模块l3sort\pdfstrcmp原始的解决方案。

\documentclass{book}

\newcommand*\listnomenclature{Abbreviations}
\usepackage{longtable}

\usepackage{xparse,expl3}
% make @ letter and switch to expl3 syntax:
\makeatletter\ExplSyntaxOn
% variables:
\prop_new:N \l__ivan_nomenclature_prop
\seq_new:N  \l__ivan_nomenclature_seq

% function for sorting property lists according to keys:
\cs_new:Npn \ivan_sort_prop:N #1
  {
    \seq_clear:N \l_tmpa_seq
    \prop_map_inline:Nn #1
      { \seq_put_right:Nn \l_tmpa_seq { ##1 } }
    \seq_sort:Nn \l_tmpa_seq
      {
        \int_compare:nTF { \pdftex_strcmp:D { ##1 } { ##2 } = -1 }
          { \sort_return_same: }
          { \sort_return_swapped: }
      }
    \prop_clear:N \l_tmpa_prop
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \prop_get:NnN #1 { ##1 } \l_tmpa_tl
        \prop_put:NnV \l_tmpa_prop { ##1 } \l_tmpa_tl
      }
    \prop_set_eq:NN #1 \l_tmpa_prop
  }

% parse the table like input:
\cs_new:Npn \__ivan_add_to_prop:Nw #1#2&#3 \q_stop
  { \prop_put:Nnn #1 { #2 } { #3 } }

% internal list command:
\cs_new:Npn \ivan_list_of_nomenclature:nn #1#2
  {
    \seq_set_split:Nnn \l__ivan_nomenclature_seq { \\ } { #2 }
    \seq_map_inline:Nn \l__ivan_nomenclature_seq
      { \__ivan_add_to_prop:Nw \l__ivan_nomenclature_prop ##1 \q_stop }
    \ivan_sort_prop:N \l__ivan_nomenclature_prop
% \btypeout{\listnomenclature} % unknown command, commented out
% \addtotoc{\listnomenclature} % unknown command, commented out
  \chapter*{ \listnomenclature }
  \@mkboth
    { \MakeUppercase\listnomenclature }
    { \MakeUppercase\listnomenclature }
  \begin{longtable}[c]{#1}
    \prop_map_inline:Nn \l__ivan_nomenclature_prop
      { ##1 & ##2 \\ }
  \end{longtable}
  \cleardoublepage
}

% document level command:
\NewDocumentCommand \listofnomenclature { m+m }
  { \ivan_list_of_nomenclature:nn { #1 } { #2 } }

% switch expl3 syntax off and make @ other again:
\ExplSyntaxOff\makeatother

\begin{document}

\listofnomenclature{ll}{
  GHG  & GreenHouse Gasses \\
  CoMP & Cooperative Multi-Point \\
  ITU  & International Telecommunication Union
}

\end{document}

在此处输入图片描述

答案2

我决定保留一个首字母缩略词数据库,而不是在每个文档中硬编码它们。这样我就可以在其他文档中重复使用它们。附件是我使用词汇表包的代码。我意识到这很简单,但我还是会分享它来帮助任何认为它有用的人。

\usepackage[acronym,nonumberlist,shortcuts]{glossaries}
\glossarystyle{long}
\renewcommand*{\acronymname}{<whatever name you choose>} % rename title
\renewcommand*{\glspostdescription}{}                    % remove dot at the end of description
\makeglossaries

\newcommand\setacronymdb[1]{\loadglsentries{#1}}         % the name of the acronym database

\newcommand\listofnomenclature{
\printglossaries
\par
\cleardoublepage
}

它的用法如下。请注意,在这种情况下,缩写数据库名称是 Abbrev:

\documentclass[a4paper, 12pt, oneside]
\setacronymdb{Abbrev}

\begin{document}

\listofnomenclature

\section{Introduction}
This is how I refer to the samples of acronym in the database named Abbrev: \acs{CO2}.

\end{document}

缩写词数据库只是一个普通的 .tex 文件 (Abbrev.tex),其条目格式如下

\newacronym{<ref>}{<abbreviated form>}{<description>}

例如

\newacronym{CO2}{CO$_{2}$}{Carbon diOxide}
\newacronym{GSM}{GSM}{Global System for Mobile Communications}

希望这可以帮助。

答案3

我发现使用 emacs 宏的解决方案。

这不是使用 Latex 对首字母缩略词列表进行排序的方法,但可以解决问题。

相关内容