Я пытаюсь использовать пакет listofsymbols
для определения символа, который будет включен в список символов в книге. У меня возникли проблемы с использованием команды \newsym
для определения символа, которая включает команду \cdots
.
Ниже приведено простое определение символа, иллюстрирующее проблему:
\opensymdef
\newsym[A family of sets]{sFam}{A_{1},\cdots,A_{n}}
\closesymdef
При компиляции документа, включающего файл символов, pdflatex
выдаются следующие сообщения об ошибках:
Undefined control sequence.
Undefined control sequence.
Undefined control sequence.
Undefined control sequence.
Undefined control sequence.
Описание ошибки:
... family of sets]{sFam}{A_{1},\cdots,A_{n}}
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.
Если в приведенном выше определении символа \cdots
заменить строку, например, xxxx
или команду, например, , то документ будет скомпилирован.\alpha
pdflatex
Может ли кто-нибудь помочь мне разобраться с этой проблемой? Любая помощь будет высоко оценена.
решение1
Ошибка в listofsymbols
пакете, который использует \immediate\write
, что является неправильным и является причиной ваших проблем.
Загрузка amsmath
после списка новых символов на самом деле не является решением, поскольку это может повлиять на другие команды; например, \sqrt
они не будут работать, какой бы порядок вы ни использовали.
Лучшее — это изменение \immediate\write
в \protected@iwrite
соответствии с определениемодин из моих ответов.
\documentclass{article}
\usepackage{listofsymbols}
\usepackage{amsmath}
\usepackage{xpatch}
\makeatletter
% get a copy of \protected@write
\let\protected@iwrite\protected@write
% patch the copy to add \immediate
\xpatchcmd{\protected@iwrite}{\write}{\immediate\write}{}{}
% patch \addsymline to use \protected@iwrite instead of \immediate\write
\xpatchcmd{\addsymline}
{\immediate\write#5}
{\protected@iwrite{#5}{}}
{}{}
\makeatother
\opensymdef
\newsym[A family of sets]{sFam}{A_{1},\cdots,A_{n}}
\closesymdef
\begin{document}
\listofsymbols
test The symbol \sFam means \sFamdoc
\end{document}
При таком переопределении некоторые символы все еще могут вызывать проблемы; в этом случае добавьте \protect
перед проблемным символом.
Кстати, \cdots
в этом контексте употреблять не следует, а просто \dots
: многоточие между запятыми всегда должно быть с низкими точками.
решение2
Обновлять
как упоминает egreg вhis comment
это лишь частичное решение.
В комментариях к вопросу проблема была сведена к использованию пакета amsmath
вместе с listofsymbols
; этим простым документом
\documentclass{article}
\usepackage[draft]{listofsymbols}
\usepackage{amsmath}
\opensymdef
\newsym[A family of sets]{sFam}{A_{1},\cdots,A_{n}}
\closesymdef
\begin{document}
test The symbol \sFam means \sFamdoc
\end{document}
вызывает сообщение об ошибке
! Undefined control sequence.
\DN@ ->\def \next@
l.6 ...A family of sets]{sFam}{A_{1},\cdots,A_{n}}
?
Проблему можно решить загрузкойamsmath
послевсе определения символов, как в:
\documentclass{article}
\usepackage[draft]{listofsymbols}
\opensymdef
\newsym[A family of sets]{sFam}{A_{1},\cdots,A_{n}}
\closesymdef
\usepackage{amsmath}
\begin{document}
test The symbol \sFam means \sFamdoc
\end{document}