Проблемы с пакетом номенклатуры: pagenumber gobble

Проблемы с пакетом номенклатуры: pagenumber gobble

Я обнаружил следующую ошибку с nomenclпакетом при использовании \pagenumbering{gobble}. Следующий пример MWE работает нормально, но когда \pagenumbering{gobble}не комментируется, мои элементы номенклатуры отклоняются.

МВЭ document.tex

\documentclass[11pt, a4paper, twoside]{extarticle}
\usepackage{nomencl}
\usepackage{lipsum}
\makenomenclature
\begin{document}
    %\pagenumbering{gobble}
    \nomenclature{$c$}{Speed of light in a vacuum inertial frame}
    \nomenclature{$h$}{Planck constant}
    \lipsum[1]
    \printnomenclature
\end{document}

Выполнение команд:

pdflatex document.tex
makeindex -s nomencl.ist -o document.nls document.nlo
pdflatex document.tex

Почему я использовал \pagenumbering{gobble}?

Из-за популярностиэтот вопрос и ответ.

ОБХОДНОЙ РЕШЕНИЕ

Я нашел следующий способ обойти это, используя \thispagestyle{empty}вместо \pagenumbering{gobble}, хотя это и не объясняет, почему проблема возникла изначально.

\documentclass[11pt, a4paper, twoside]{extarticle}
\usepackage{nomencl}
\usepackage{lipsum}
\makenomenclature
\begin{document}
    \lipsum[1]
    \thispagestyle{empty}
    \clearpage
    \setcounter{section}{0}
    \pagenumbering{arabic}
    \nomenclature{$c$}{Speed of light in a vacuum inertial frame}
    \nomenclature{$h$}{Planck constant}
    \lipsum[1]
    \printnomenclature
\end{document}

решение1

TLDR: Это не ошибка, а результат makeindexтребования действительного номера страницы, поскольку он предназначен для создания индексов.


Пакеты, такие как nomenclglossariesт. д.), должны сортировать и сопоставлять информацию, которая должна отображаться в списке номенклатуры/символов/терминов. TeX на самом деле не предназначен для такого рода обработки данных. (Пакет glossariesимеет опцию, которая делает это, но она страдает от серьезных ограничений, таких как долгое время сборки и хрупкая сортировка.) Это означает, что требуется внешний инструмент. У автора пакета есть два варианта:

  1. Используйте существующий инструмент.
  2. Создайте новый инструмент.

Первый вариант самый простой и принят nomencl. В дистрибутивах TeX есть два основных инструмента, предназначенных для такого рода действий: makeindexи xindy. Однако эти инструменты специально разработаны для индексов, которым требуются номера страниц (местоположения). Из двух xindyболее гибок, но он по-прежнему требует либо действительного местоположения, либо перекрестной ссылки для каждой записи, тогда как makeindexвсегда требует местоположения и распознает только определенный стиль местоположения. (Перекрестные ссылки обрабатываются путем отбрасывания местоположения.)

В случае списков номенклатуры/терминов/символов, имеющих сопроводительное описание, номер страницы часто не отображается (или просто указывается в индексе), но поскольку используется инструмент индексирования, для того, чтобы инструмент принял данные, требуется действительный номер страницы, даже если список местоположений, сформированный приложением индексирования, может игнорироваться LaTeX.

Это фундаментальный недостаток использования инструмента индексирования для чего-то, что похоже на индекс, но не совсем то же самое. Преимущество использования существующего инструмента индексирования (особенно makeindex, который существует уже давно) заключается в том, что большинство дистрибутивов TeX должны иметь установленное и готовое к использованию приложение. В случае makeindex, он также существует достаточно долго, чтобы код был проверен, и теперь считается достаточно безопасным для добавления в список доверенных приложений TeX, что означает, что его можно запустить в ограниченном выходе из оболочки.

В случае \pagenumbering{@gobble}местоположение (полученное путем расширения \thepage) становится пустой строкой, что не является допустимым местоположением, поэтому оно отклоняется makeindex.

Второй вариант (создать новый инструмент) более сложен, особенно для авторов пакетов, которые умеют писать код LaTeX, но не знакомы с языками программирования. Новым приложениям требуется время, чтобы попасть в дистрибутивы TeX:

  • Если они написаны на компилируемом языке (например, C), они работают только в той операционной системе, в которой они были скомпилированы. (Например, если я напишу программу на C, она будет работать только в Linux, но не в Windows и т. д.) Если вы хотите запустить ее в другой операционной системе, вам необходимо портировать код и скомпилировать его для вашей платформы.
  • Если они написаны на интерпретируемом языке (например, Perl) или на языке, который компилируется в код, требующий среды выполнения (например, Java), то они будут работать в любой операционной системе, в которой установлен интерпретатор или среда выполнения.

В любом случае распространение нового приложения ограничено системами, которые могут выполнить скомпилированное приложение или которые могут выполнить интерпретатор/среду выполнения, необходимую для запуска приложения. Это обычно исключает старые операционные системы.

Theglossaries-extrapackage сочетает в себе оба подхода: как и базовый glossariesпакет, его можно использовать с makeindexили xindy, но в отличие от базового пакета его можно использовать также сbib2gls, который был разработан специально для glossaries-extraпакета и, следовательно, допускает пустые местоположения (фактически, он допускает любое местоположение, но он будет формировать диапазоны только тогда, когда сможет определять числовые значения).

МВЭ:

\documentclass[11pt, a4paper, twoside]{extarticle}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@symbol{speedoflight,
  name={\ensuremath{c}},
  description={Speed of light in a vacuum inertial frame}
}

@symbol{planck,
  name={\ensuremath{h}},
  description={Planck constant}
}
\end{filecontents*}

\usepackage{lipsum}
\usepackage[record]{glossaries-extra}% 'record' option required for bib2gls

\GlsXtrLoadResources[
  src={\jobname},% entries in \jobname.bib
  selection={all},% select all defined entries
  sort={none},% don't bother sorting
  save-locations=false% location lists not required
]

\begin{document}
\pagenumbering{gobble}
\lipsum[1]

\printunsrtglossary
\end{document}

Сборка документа (где файл называется test.tex):

pdflatex test
bib2gls test
pdflatex test

Результат:

изображение документа

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