在对齐块中使用 #

在对齐块中使用 #

我有一个chemfig涉及使用的命令#。它可以自行正确编译。

\chemfig{**[135,405,dash pattern=on 2pt off 2pt]6(----#(,0pt)\chembelow[2.5em]{}{+}(-#(0pt)[3]H)(-#(0pt)[1]NO_3)-#(0pt)-)}

但是当我将它放入对齐块时,pdfLaTeX 出现错误。

\begin{align*}
\chemfig{**[135,405,dash pattern=on 2pt off 2pt]6(----#(,0pt)\chembelow[2.5em]{}{+}(-#(0pt)[3]H)(-#(0pt)[1]NO_3)-#(0pt)-)}
\end{align*}

错误信息在这里:http://pastebin.com/3FLzX4RP

梅威瑟:

\documentclass[10pt]{article}
\usepackage[usenames]{color} %used for font color
\usepackage{amssymb} %maths
\usepackage{amsmath} %maths
\usepackage[utf8]{inputenc} %useful to type directly diacritic characters
\usepackage{chemfig}

\pagestyle{empty} 
\begin{document}

\begin{align*}
\chemfig{**[135,405,dash pattern=on 2pt off 2pt]6(----#(,0pt)\chembelow[2.5em]{}{+}(-#(0pt)[3]H)(-#(0pt)[1]NO_3)-#(0pt)-)}
\end{align*}

\end{document}

在 中chemfig#用于调整键的缩短。以下示例来自chemfig 文档,第 6 页 来自 chemfig doc 的示例

我尝试过使用\#(0pt),但它没有调整键,而是直接输出字符串。

答案1

\chemfig命令依赖于类别代码的变化,特别是它变为#“其他字符”(类别代码 12)。此类命令不能出现在另一个命令的参数中。

虽然equationequation*在这方面是安全的,align*但不是:的多行对齐环境将amsmath其内容吸收为命令的参数。尝试时,您会遇到同样的问题\fbox{\chemfig{...}}

不建议使用align*替代equation*,因此在示例中equation*可以使用。但如果您确实需要多行环境,这里有一个技巧:

\documentclass{article}
\usepackage{amsmath,chemfig}

\makeatletter
\newcommand{\chemfigon}{\begingroup\@makeother\#}
\let\chemfigoff\endgroup
\makeatother

\begin{document}

\chemfig{**[135,405,dash pattern=on 2pt off 2pt]6(----#(,0pt)\chembelow[2.5em]{}{+}(-#(0pt)[3]H)(-#(0pt)[1]NO_3)-#(0pt)-)}

\chemfigon
\begin{align*}
\chemfig{**[135,405,dash pattern=on 2pt off 2pt]6(----#(,0pt)\chembelow[2.5em]{}{+}(-#(0pt)[3]H)(-#(0pt)[1]NO_3)-#(0pt)-)}
\end{align*}
\chemfigoff

\end{document}

这会#在输入被抓取作为参数之前创建一个“其他字符”。

在此处输入图片描述

答案2

理论上,\chemfig{<code>}可以写在宏的参数中,因为 的会\CF@chemfig@iv执行。不幸的是,存在一个错误,因为通过,成为宏的参数,而 并未考虑到这种行为。\scantokens<code>\scantokens###\chemfig

例如,如果你写\fbox{\chemfig{A-#(0pt)B}},分子的代码就变成A-##(0pt)B,其中#是 catcode 12。错误在于\CF@grab@bondoffset:此宏期望(第一个 之后有一个 juste 。而当是宏的参数#时情况并非如此。\chemfig

解决方法如下:

\documentclass{article}
\usepackage{chemfig}
\makeatletter
\def\CF@grab@bondoffset#1(#2)#3\@nil{%
    \ifx\@empty#2\@empty
    \else
        \CF@if@instr{#2},%
            {\CF@analyse@bondoffset#2\@nil}%
            {\def\CF@start@offset{#2}}%
    \fi
    \def\CF@remain@afterbond{#3}%
}
\makeatother
\begin{document}
\fbox{\chemfig{A-#(0pt)B}}

\chemfig{A-#(0pt)B}
\end{document}

在此处输入图片描述

相关内容