可选参数内的可选参数的语法问题

可选参数内的可选参数的语法问题

以下源给出了预期的结果,如下所示:

\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}

对于 \IfStrEqCase 其他情况,输出 OK 而不设默认值

但如果从行首删除注释符号

%[\nomenclature[z#4]{#2}{#3}]%

然后我得到了奇怪的输出结果-在文档输出的主体中插入额外的内容:

\IfStrEqCase 的输出结果为其他情况的意外值

我的语法有什么问题?我认为

[\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}

相关内容