Как по-разному отсортировать два глоссария (список сокращений и список символов)?

Как по-разному отсортировать два глоссария (список сокращений и список символов)?

Я использую этот glossariesпакет для создания списка сокращений, а также списка символов.

\usepackage[acronym,style=long]{glossaries}

Для списка символов используется стандартный глоссарий.

Теперь я хочу отсортировать список аббревиатур по алфавиту ( sort=standard), а список символов — по порядку появления ( sort=def). Как это сделать?

Я использую MikTeX 2.9 с TeXnicCenter 2 (бета) на Windows 7. Мой проект включает этот hyperrefпакет.

решение1

Обновлять:

Начиная с glossariesверсии 4.04 (которую я только что загрузил на CTAN) есть три варианта создания глоссариев:

  1. Использование TeX для сортировки глоссариев (новое).
  2. Используется makeindexдля сортировки глоссариев.
  3. Используется xindyдля сортировки глоссариев.

Варианты 2 и 3 по-прежнему не могут использовать независимые методы сортировки для разных глоссариев, но новый вариант может:

\documentclass{article}

\usepackage[acronyms]{glossaries}

\makenoidxglossaries

\newacronym{cd}{CD}{covariant derivative}
\newacronym{gr}{GR}{general relativity}
\newacronym{pnd}{PND}{principle null direction}

\newglossaryentry{vfield}{
  name={\ensuremath{A^a}},
  description={Some vector field}
}

\newglossaryentry{manifold}{
  name={\ensuremath{\mathcal{M}}},
  description={Some manifold}
}

\begin{document}

Einstein developed the theory of \gls{gr}. Take the \gls{cd} and
apply it on the \glspl{pnd}. We define \gls[format=textbf]{manifold} to be some
manifold.

\clearpage

\gls[format=textbf]{vfield} is some vector field on \gls{manifold}
that has nothing to do with the \glspl{pnd}.

\printnoidxglossary[type=acronym,sort=letter]

\printnoidxglossary[sort=use]

\end{document}

Для этого требуется всего два запуска LaTeX (не нужно использовать xindyили makeindex). Список сокращений сортируется по буквам (с использованием datatoolобработчика \dtlletterindexcompare), а основной глоссарий сортируется по использованию. Другие варианты сортировки: word(порядок слов с использованием datatoolобработчика \dtlwordindexcompare), def(порядок определения), case(с учетом регистра с использованием datatoolобработчика \dtlcompare) и nocase(без учета регистра с использованием datatoolобработчика \dtlicompare).

Страница 1:

Изображение страницы 1

Страница 2:

Изображение страницы 2

Основные недостатки:

  • Сортировка выполняется медленнее, чем при использовании makeindex/ xindy(за исключением useметода, который не требует сортировки).
  • Последовательные местоположения не будут преобразованы в диапазон (хотя можно переопределить макрос, отображающий список местоположений).
  • Записи должны быть определены до начала среды document.

Решение с использованием datagidx:

Вот мое оригинальное решение с использованием datagidx(частипакет datatool):

\documentclass{article}

\usepackage{datagidx}
\usepackage[colorlinks]{hyperref}

\newgidx{acronym}{Acronyms}
\newgidx{symbol}{Symbols}

\DTLgidxSetDefaultDB{acronym}

\newacro{html}{hypertext markup language}
\newacro{css}{cascading style sheet}
\newacro{xml}{extensible markup language}

\DTLgidxSetDefaultDB{symbol}

\newterm[description={sample 1}]{B}
\newterm[description={sample 2}]{X}
\newterm[description={sample 3}]{A}
\newterm[description={sample 4}]{C}

\begin{document}

\gls{B}, \gls{X}, \gls{C}, \gls{A}.

\acr{xml}, \acr{html}, \acr{css}.

% default sort is alphabetical
\printterms[database=acronym,columns=1,style=align]

% sort by definition (i.e. don't sort)

\printterms[database=symbol,sort={},columns=1,style=align]

\end{document}

Результат:

Изображение результата

решение2

Спасибо! Я на самом деле только что нашел способ сделать это с помощью пакета glossaries. Это возможно, поскольку я в любом случае определяю команду для всех своих символов...

\documentclass[a4paper,twoside,11pt]{article}

\usepackage[acronym,style=long,sanitize={sort=false}]{glossaries}   % acronyms and list of symbols
\makeglossaries

% sort symbol index in order of appearance
% warning: this is only valid for less than 1000 pages!
\makeatletter
\def\three@digits#1{\ifnum#1<100 0\ifnum#1<10 0\fi\fi\number#1}

% \nomNoPrint declares a new glossary entry
\newcommand{\nomNoPrint}[3]{\newglossaryentry{#1}{
    name={#2},
    symbol={#2},
    description={#3},
    sort={A\three@digits{\value{page}}}
    }\glsadd[format=hyperbf]{#1}}   
\makeatother

% \nom declares the entry and prints the symbol
\newcommand{\nom}[3]{\nomNoPrint{#1}{#2}{#3}#2}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% define some acronyms
\newacronym{cd}{CD}{covariant derivative}
\newacronym{pnd}{PND}{principle null direction}
\newacronym{gr}{GR}{general relativity}

% define some symbols
\newcommand{\manifoldDNA}{\ensuremath{\mathcal{M}}} % the do-not-add definition
\newcommand{\manifold}{\glsadd{manifold}\manifoldDNA}

\newcommand{\vfieldDNA}{\ensuremath{A^a}}
\newcommand{\vfield}{\glsadd{vfield}\vfieldDNA}

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

Einstein developed the theory of \gls{gr}. Take the \gls{cd} and apply it on the \glspl{pnd}. We define
\nom{manifold}{\manifoldDNA}{Some manifold}\ 
to be some manifold.

\clearpage

\nom{vfield}{\vfieldDNA}{Some vector field} is some vector field on \manifold\ that has nothing to do with the \glspl{pnd}.

\printglossary[type=\acronymtype]
\printglossary

\end{document}

Тогда это выглядит так:

введите описание изображения здесь

Это не так удобно, как другой подход, поскольку необходимо определить команды \manifoldDNAи \vfieldDNA, чтобы избежать того, что один и тот же номер страницы будет напечатан в глоссарии дважды (один раз обычным шрифтом, а другой — жирным).

Связанный контент