我正在尝试使用包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}