我遇到了与上一个问题作者相同的问题,我尝试了@Werner 提出的解决方案:它几乎完美地工作了。无论如何,有一个小问题我想解决(但最重要的是,我想了解为什么它不能像我预期的那样工作)。
这是我的代码:
\documentclass{article}
\usepackage[runs=2]{auto-pst-pdf}
\usepackage{bpchem}
\usepackage[tracking=bpchem]{chemstyle}
\usepackage[version=3]{mhchem}
\usepackage{letltxmacro}% http://ctan.org/pkg/letltxmacro
\LetLtxMacro\oldschemeref\schemeref
\DeclareRobustCommand{\schemeref}[2][]{%
\CNlabelnoref{#2}%
\oldschemeref[#1]{#2}%
}
\begin{document}
\begin{scheme}
\schemeref{comp1}
\schemeref{comp2}
\schemeref{comp3}
\includegraphics{scheme1}
\end{scheme}
Compound number \CNref{comp1}, compound number \CNref{comp2}.
\end{document}
它的代码与上一个问题几乎相同,只有一点不同:\schemeref
此处使用的命令没有可选参数[TMPX]
。如果我添加可选参数(由于我的方案具有标准标签 TMP1、TMP2、ecc...,因此我不需要它),则一切正常:输出 pdf 在方案中具有正确的化合物编号,在测试中具有正确的化合物引用。如果我删除选项参数,文本中的引用将继续正常工作(命令\CNref
将替换为相应化合物的编号),但方案中的标签 TMP1、TMP2、ecc... 不再替换为预期编号!它们保持原样,TMP1、TMP2...
我想知道为什么重新定义\schemeref
不能正确处理空的可选参数......Latex 没有错误或警告。
我是 StackEschange 的意大利新用户,所以请原谅我犯的任何错误!
感谢您的任何帮助。
答案1
您需要测试可选参数是否为空并调用\oldschemeref
没有可选参数(如果是)。您可以通过多种方式执行此操作。手动:
\DeclareRobustCommand{\schemeref}[2][]{%
\CNlabelnoref{#2}%
\if\relax\detokenize{#1}\relax
\oldschemeref{#2}%
\else
\oldschemeref[{#1}]{#2}%
\fi
}
加载etoolbox
和使用\ifblank
:
\usepackage{etoolbox}
\renewrobustcmd{\schemeref}[2][]{%
\CNlabelnoref{#2}%
\ifblank{#1}
{\oldschemeref{#2}}
{\oldschemeref[{#1}]{#2}}%
}
使用xparse
:
\usepackage{xparse}
\RenewDocumentCommand{\schemeref}{om}{%
\CNlabelnoref{#2}%
\IfNoValueTF{#1}
{\oldschemeref{#2}}
{\oldschemeref[{#1}]{#2}}%
}
或者...其他任何方式。