Chemstyle:重新定义 schemeref 来处理化合物的自动声明

Chemstyle:重新定义 schemeref 来处理化合物的自动声明

这是按化合物在方案中出现的顺序对其进行编号(bpchem 或类似物)

我遇到了与上一个问题作者相同的问题,我尝试了@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}}%
}

或者...其他任何方式。

相关内容