我有一个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 页
我尝试过使用\#(0pt)
,但它没有调整键,而是直接输出字符串。
答案1
该\chemfig
命令依赖于类别代码的变化,特别是它变为#
“其他字符”(类别代码 12)。此类命令不能出现在另一个命令的参数中。
虽然equation
和equation*
在这方面是安全的,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}