以下源给出了预期的结果,如下所示:
\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{xstring}
\usepackage[refpage,nocfg]{nomencl}
\renewcommand*{\pagedeclaration}[1]{\unskip, #1}
\newcommand{\nom}[4][]{%
\IfStrEqCase{#1}{%
{logic}{\nomenclature[a#4]{#2}{#3}}%
{set}{\nomenclature[e#4]{#2}{#3}}%
}%
%[\nomenclature[z#4]{#2}{#3}]%
}
\makenomenclature
\begin{document}
\nom[logic]{$p\implies q$}{if $p$ then $q$}{1}
\nom[set]{$x \in A$}{$x$ is an element of $A$}{1}
\printnomenclature[0.75in]
\end{document}
但如果从行首删除注释符号
%[\nomenclature[z#4]{#2}{#3}]%
然后我得到了奇怪的输出结果-在文档输出的主体中插入额外的内容:
我的语法有什么问题?我认为
[\nomenclature[z#4]{#2}{#3}]
将构成整个构造的“其他情况代码” \IfStrEqCase
。
笔记:这是摘录。在实际文档中,我通过 定义了几个命名“组” \nomgroup
,每个组都有自己的标题。该命令的可选(第一个)参数\nom
将指示该项目所属的组\nomenclature
。
答案1
您的默认参数
[\nomenclature[z#4]{#2}{#3}]
有一个]
内部(之后#4
),这样就完成了参数,其余的只是插入到文档中的文本。
解决方案:将其括在括号中:
[{\nomenclature[z #4]{#2}{#3}}]%
答案2
您不能嵌套可选参数(位于 catcode-12 括号中),就像强制参数(位于 catcode-1 开括号和 catcode-2 闭括号中)一样。
可选参数将作为分隔参数处理,使用左括号和右括号作为参数分隔符。
当嵌套可选参数时,(La)TeX 的分隔参数机制“不知道”如何正确匹配左括号和右括号。
如果您希望在可选参数中嵌套可选参数,请确保将整个可选参数的内容包裹在一对附加括号中。当可选参数被包裹在一对括号中时,LaTeX 会在进一步处理这些可选参数之前默默地删除这些括号。因此这些括号是无害的。
例如,
\documentclass[12pt]{article}
\newcommand\Foo[2][Optional]{%
This is Foo' s optional:\parbox[t]{.6\textwidth}{(\\#1\\)}\\%
This is Foo's mandatory:\parbox[t]{.6\textwidth}{(\\#2\\)}%
}
\newcommand\Bar[2][Optional]{%
This is Bar's optional:(#1)\\%
This is Bar's mandatory:(#2)%
}
\begin{document}
\noindent
% This works because \Foo's optional argument is nested into an
% additional pair of braces.
\Foo[{\Bar[BarOptional]{BarMandatory}}]{FooMandatory}
% This does not work as (La)TeX' delimited argument-mechanism doesn't
% "know" how to match opening and closing brackets correctly:
% \Foo[\Bar[BarOptional]{BarMandatory}]{FooMandatory}
\end{document}
只有在获得这些知识之后,才明显
\newcommand{\nom}[4][]{%
\IfStrEqCase{#1}{%
{logic}{\nomenclature[a#4]{#2}{#3}}%
{set}{\nomenclature[e#4]{#2}{#3}}%
}%
[\nomenclature[z#4]{#2}{#3}]%
}
应改为:
\newcommand{\nom}[4][]{%
\IfStrEqCase{#1}{%
{logic}{\nomenclature[a#4]{#2}{#3}}%
{set}{\nomenclature[e#4]{#2}{#3}}%
}%
[{\nomenclature[z#4]{#2}{#3}}]%
}
你的整个例子变成如下的样子:
\documentclass[12pt]{article}
%\IfFileExists{\jobname.nlo}%
% {\immediate\write18{makeindex \jobname.nlo -s nomencl.ist -o \jobname.nls}}%
% {}
\usepackage{amsmath}
\usepackage{xstring}
\usepackage[refpage,nocfg]{nomencl}
\renewcommand*{\pagedeclaration}[1]{\unskip, #1}
\newcommand{\nom}[4][]{%
\IfStrEqCase{#1}{%
{logic}{\nomenclature[a#4]{#2}{#3}}%
{set}{\nomenclature[e#4]{#2}{#3}}%
}%
[{\nomenclature[z#4]{#2}{#3}}]%
}
\makenomenclature
\begin{document}
Some text for ensuring that \LaTeX' output-routine comes into action.\\
Otherwise .nlo-files do not get generated.
\nom[logic]{$p\implies q$}{if $p$ then $q$}{1}
\nom[set]{$x \in A$}{$x$ is an element of $A$}{1}
\nom{$x =y $}{$x$ and $y$ are different designators for the same item of cognizance}{1}
\printnomenclature%[0.75in]
\end{document}